C # Как изменить значение с плавающей точкой внутри шейдера (HLSL)

#c# #hlsl

#c# #hlsl

Вопрос:

Эй, у меня очень простая проблема.

Я хочу изменить значение float внутри функции шейдера и отправить его обратно в основную программу

Шейдер выглядит следующим образом

 float size; // THE VARIABLE...

float4 PS_COLOR(float2 texCoord: TEXCOORD0) : COLOR
{
    size = 3.0f; // AFTER THIS CALL IT SHOULD RETURN 3 IN THE MAIN PROGRAM
    return 1.0f;
} 

technique LangweiligerShader
{
   pass pass0
   {
      PixelShader = compile ps_2_0 PS_COLOR();
   }
}
  

в моей основной функции я устанавливаю переменную size следующим образом:

 effect.SetValue(EffectHandle.FromString("size"), 1000f);
  

Затем я вызываю метод Draw, который применяет шейдер (он загружен правильно и работает, поскольку нарисованная текстура белая)

И после этого я получаю переменную size с

 effect.GetValueFloat(EffectHandle.FromString("size"))
  

Вот в чем проблема… Переменная равна 1000, но она должна быть равна 3

есть предложения?

Ответ №1:

Я не думаю, что то, что вы пытаетесь, возможно. Пиксельный шейдер вызывается для каждого пикселя в области экрана вывода. Таким образом, переменная будет устанавливаться много раз в каждом кадре. Если переменная зависит от вычисления в функции пиксельного шейдера, было бы записано много разных результатов.

Если вы хотите использовать графический процессор для вычислений, которые возвращают какие-либо значения, я предлагаю вам изучить некоторые фреймворки, такие как CUDA или OpenCL.

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

1. Чтобы повторить то, что сказал константиниус, как только мы доберемся до вершинного шейдера, а затем пиксельного шейдера, мы обрабатываем то, что находится во внутренних буферах видеокарты. Думайте об этом как о «разгрузке» на GPU.