TEXCOORD0 в моем шейдере HLSL всегда указывает на (0,0)

#directx #hlsl #directx-9

Вопрос:

я работаю над directx9 и пытаюсь разобраться в шейдерах, вот мой шейдер:

 sampler texLastPass : register( s0 );

float4 main(in float2 t : TEXCOORD0) : COLOR
{
    float4 color = tex2D(texLastPass, t);
    return float4(color.rgb, 1.0f);
}
 

Теоретически с этим не должно быть никаких изменений, но вместо этого все мои объекты заполнены пикселями, которые находятся в позиции (0, 0) в текстуре.

Так почему же предоставленные шейдеру координаты пикселей неверны?

Комментарии:

1. Вы, вероятно, хотите TEXCOORD0 вместо TEXCOORD1

2. Моя ошибка, я вставил код из некоторого тестирования, на самом деле я использую TEXCOORD0 в шейдере.

3. Вы пытались отладить свой шейдер? если ваш код верен, и вы не передаете нули шейдеру, но все ваши координаты в шейдере равны 0,0, то шейдер, вероятно, вообще не получает никаких координат, поэтому у вас проблема с буферами, idk, что может быть причиной, например, это может быть проблема с выравниванием.

Ответ №1:

В вашем шейдерном коде есть сэмплер, но где текстура? Из Microsoft Docs:

 Three things are required to sample a texture:

* A texture
* A sampler (with sampler state)
* A sampling instruction
 

Поскольку у вас отсутствует привязка к текстуре, Direct3D 9 предоставит вам значение 0,0,0 для всех ссылок на текстуры.

 texture tex0 : register( t0 );
 

Без этого он все равно строится, потому что неявно предполагает, что вы имеете в виду t0 .

Вы используете «явную привязку» в этом шейдере, что совершенно нормально и рекомендуется, если вы избегаете использования устаревшей системы эффектов. Тем не менее, учебные материалы и образцы для разработчиков Direct3D 9 были в значительной степени основаны на эффектах, которые используют несколько иной синтаксис и, следовательно, являются источником путаницы.

Вы не показываете свой код C/C , поэтому он также может быть связан с вашим кодом привязки.

Обратите внимание, что при написании кода Direct3D 9 в наши дни следует иметь в виду несколько важных вещей:

  • SDK DirectX устарел и устарел, и его использование настоятельно не рекомендуется. См. Документы Microsoft. У него есть ряд известных проблем, и его сложно даже установить.
  • Основные заголовки для Direct3D 9 являются частью пакета SDK для Windows, поэтому они уже являются частью Visual Studio 2012 или более поздней версии. Вам не нужен SDK DirectX для создания кода Direct3D 9.
  • Библиотека утилит D3DX9 также устарела, но на самом деле это единственный способ получить код поддержки Direct3D 9. Начиная с начала этого года, теперь вы можете использовать его из NuGet с помощью простого параллельного перераспределения, а не полагаться на устаревший SDK DirectX или устаревший список времени выполнения для конечных пользователей DirectX. Смотрите это сообщение в блоге.
  • Устройство отладки Direct3D 9 не поддерживается в Windows 8, Windows 8.1 или Windows 10.
  • Все образцы Direct3D 9 из устаревшего SDK DirectX можно найти на GitHub.

Вам следует взглянуть на DirectX 11 как на лучшую отправную точку, которая имеет гораздо лучшую поддержку отладки, поддержку инструментов и библиотеки с открытым исходным кодом. Смотрите это сообщение в блоге.

Комментарии:

1. Эй, я знаю, что прошло 3 месяца, но очень ценю ваш ответ! Таким образом, я смог решить свою проблему, перейдя к системе эффектов и написав свой вершинный шейдер. Что касается Dx11, я бы хотел работать с чем-то более новым, чем Dx9, но я работаю в существующей среде и недостаточно хорош для обновления.