2017-02-23 3 views
2

После прочтения и попытки применения рекомендации от How to enable Hardware Percentage Closer Filtering? в моем пиксельном шейдере, при некоторых отладках у меня получились очень странные результаты: в том, что все пиксели имели очень низкие значения RGB, хотя шейдер вернул некоторые более высокие значения RGB float4.HLSL: Конечный цвет пикселя отличается от вычисленного возвращаемого значения пиксельного шейдера

Эта проблема проявилась только при использовании аппаратного обеспечения (GPU), и вел себя корректно при принуждении WARP (через панель управления DirectX). Я думал, что это проблема с драйвером, но протестирована на двух разных компьютерах, одна с мобильным графическим процессором nVidia, другая с настольной картой AMD, а поведение одинаково с обоими - оно работает только с WARP.

Заканчивать следующие скриншоты отладки пиксельных шейдеров, которые я думаю, очень информативно о моей обнаруженной проблеме:

Отладки пиксельного шейдера с регулярным аппаратным запуском: enter image description here

Взгляните на возвращаемое значение - и справа - в «Графической пиксельной истории» в значениях RGB пиксельных шейдеров и значениях результата - как они выглядят так? Почти деление на 3 фактора.

Теперь посмотрит на те же отладки - на аналогичный затененный пикселе - при запуске же шейдера - только теперь с помощью WARP вместо запуска на GPU: enter image description here

Как вы можете видеть, значение почти идентичны - и я думаю, что небольшие различия связаны с тем, что целью рендеринга является 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.

Может ли кто-нибудь дать мне какое-то предложение о том, что еще нужно проверить для дальнейшего отладки этой ситуации?

ответ

1

После включения отладки D3D Device - следующие ценные инструкции от here - я получил следующее сообщение - и, следовательно, узнал причину моего вопроса:

D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: The Shader Resource View in slot 1 of the Pixel Shader unit is using the Format (R16_FLOAT). This format does not support 'SampleCmp' or 'SampleCmpLevelZero', at least one of which is being used on the Resource by the shader. This mismatch is invalid if the shader actually uses the view (e.g. it is not skipped due to shader code branching). [ EXECUTION ERROR #372: DEVICE_DRAW_RESOURCE_FORMAT_SAMPLE_C_UNSUPPORTED]

Это ВЕ моей глубины текстуры, для который я установил опцию DXGI_FORMAT_R16_FLOAT. Изменение на DXGI_FORMAT_R32_FLOAT устранило проблему и позволило включить PCF через SampleCmpLevelZero.

Я предполагаю, что морально то, что очень полезно включить отладку устройства DirectX, чтобы узнать, не закончилось ли ваше исполнение в коррумпированном или ошибочном состоянии.

Смежные вопросы