После прочтения и попытки применения рекомендации от How to enable Hardware Percentage Closer Filtering? в моем пиксельном шейдере, при некоторых отладках у меня получились очень странные результаты: в том, что все пиксели имели очень низкие значения RGB, хотя шейдер вернул некоторые более высокие значения RGB float4
.HLSL: Конечный цвет пикселя отличается от вычисленного возвращаемого значения пиксельного шейдера
Эта проблема проявилась только при использовании аппаратного обеспечения (GPU), и вел себя корректно при принуждении WARP (через панель управления DirectX). Я думал, что это проблема с драйвером, но протестирована на двух разных компьютерах, одна с мобильным графическим процессором nVidia, другая с настольной картой AMD, а поведение одинаково с обоими - оно работает только с WARP.
Заканчивать следующие скриншоты отладки пиксельных шейдеров, которые я думаю, очень информативно о моей обнаруженной проблеме:
Отладки пиксельного шейдера с регулярным аппаратным запуском:
Взгляните на возвращаемое значение - и справа - в «Графической пиксельной истории» в значениях RGB пиксельных шейдеров и значениях результата - как они выглядят так? Почти деление на 3 фактора.
Теперь посмотрит на те же отладки - на аналогичный затененный пикселе - при запуске же шейдера - только теперь с помощью WARP вместо запуска на GPU:
Как вы можете видеть, значение почти идентичны - и я думаю, что небольшие различия связаны с тем, что целью рендеринга является 8 бит на канал, а float
- 4 байта (32 бита).
Моя предыдущая версия шейдера была вдохновлена этим блога и фрагментами, а также: https://takinginitiative.wordpress.com/2011/05/25/directx10-tutorial-10-shadow-mapping-part-2/
Я реализовал 16-водопроводный PCF - с 16 образцов с функцией Sample
вместо использования SampleCmpLevelZero
FUNC и делают сравнение с целевым значением самостоятельно, в шейдере - для определения степени затенения пикселя. После прочтения вопроса, упомянутого выше, я изменил свой шейдер, чтобы использовать SampleCmpLevelZero
, и вот тогда появились мои проблемы, и мои шейдеры вел себя так, как ожидалось, с WARP.
Может ли кто-нибудь дать мне какое-то предложение о том, что еще нужно проверить для дальнейшего отладки этой ситуации?