Pasando los parámetros de sombreador directo3D dinámicamente
-
27-10-2019 - |
Pregunta
Quiero hacer que mi brillo y contraste cambien el sombreador cambiando dinámicamente los parámetros de compensación, pero no quiero recompilar mi sombreador cada vez que estoy cambiando el búfer de sombreador.
El código del sombreador actual es
char shaderCode[] = " \
sampler2D screen: register(s0); \
\
float offsetBrightness = 0.0f; \
float offsetContrast = 0.9f; \
float4 PSBrightnessContrast(float2 inCoord : TEXCOORD0) : COLOR0\
{\
return (tex2D(screen, inCoord.xy) + offsetBrightness) * (1.0 + offsetContrast);\
}\
\
technique brightness \
{ \
pass p1 \
{ \
PixelShader = compile ps_2_0 PSBrightnessContrast(); \
} \
} \
";
Cómo puedo pasar el offsetBrightness
y offsetContrast
¿dinamicamente?
Solución
En HLSL, todas las variables declaradas la función exterior se pueden cambiar entre cada llamada de sorteo.
Para cambiar su valor, puede usar el siguiente setter de id3dxeffect:
HRESULT SetFloat(
[in] D3DXHANDLE hParameter,
[in] FLOAT f
);
donde el hparámetro puede ser el nombre como char * o el mango consultado usando GetParameterHandle()
Entonces en tu ejemplo:
effet-> setfloat ("offsetBrightness", 0.5f);
Si estás dentro de un Begin()/End()
, necesitas llamar CommitChanges()
Para aplicar esos valores