Можно ли * получить * целочисленные данные из кода шейдера? - PullRequest
2 голосов
/ 13 ноября 2010

У меня простой вопрос, который нужно задать. Это одна из первых вещей, которые вы узнаете о шейдерах при использовании их с XNA, когда вы можете передавать переменные из C # в код шейдера через функцию Effect.Parameters. Например:

Effect.Parameters["shaderVariable"].SetValue(someValue);

В приведенной выше строке вы отправляете значение, хранящееся в someValue, в переменную шейдера shaderVariable.

Можем ли мы сделать и обратное? Как, например, вы хотите отладить внутреннюю работу кода шейдера и хотите отправить обратно некоторые числовые данные в ваше приложение C #, тогда есть ли еще подобный, но противоположный функционал отношения?

Ответы [ 3 ]

4 голосов
/ 14 ноября 2010

Не совсем.Проблема в том, что пиксельный шейдер выполняется один раз на пиксель, а вершинный шейдер - один раз на вершину.Итак, у вас есть потенциально сотни экземпляров вашей программы на выбор, когда вы рисуете, так откуда вы знаете, из какого вы хотите получить выходное значение?

Единственный реальный способ получить выходные данные изшейдер через изображение, которое он в конечном итоге выводит (кроме GPGPU).

Но - если все, что вы хотите сделать, это отладка шейдера, используйте PIX в DirectX SDK.

0 голосов
/ 19 апреля 2014

Да, вы можете получить данные из шейдера (по крайней мере, в XNA 4.0), например:

var projection = <your effect>.Parameters["projection"].GetValueMatrix();
0 голосов
/ 27 ноября 2010

Графический конвейер будет только идти вперед, CPU -> Vertex -> Pixel -> Frame.Если в вашем пиксельном шейдере есть значение, которое вы хотите проверить, просто измените свой шейдер так, чтобы он возвращал это значение в виде цвета.Например, вы можете вернуть значения xy для texCoord в виде каналов красного и зеленого цветов в вашем изображении.

...