#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, но я работаю в существующей среде и недостаточно хорош для обновления.