Я применил эффект шума к текстуре, используя этот пиксельный шейдер.
float2 noisePower;
float noiseFrequency;
float camMoveX;
float camMoveY;
texture noiseTexture;
sampler2D noiseSampler = sampler_state
{
Texture = <noiseTexture>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
texture water;
sampler2D waterSampler = sampler_state
{
Texture = <water>;
};
float4 MainPS(float4 pos : SV_POSITION, float4 color1 : COLOR0, float2 texCoord : TEXCOORD0) : COLOR
{
float2 camMove = float2(camMoveX, camMoveY);
//float4 camMoveTransform = mul(WorldViewProjection, camMove);
float4 noise = tex2D(noiseSampler, texCoord.xy * noiseFrequency);
float2 offset = (noisePower * (noise.xy - 0.5f) * 2.0f);
float4 color = tex2D(waterSampler, texCoord.xy + offset.xy);
return color;
}
technique oceanRipple
{
pass P0
{
PixelShader = compile PS_SHADERMODEL MainPS();
}
};
Я пытаюсь компенсировать шум движением моей камеры в игре.
Я думаю, это выглядело бы примерно так:
float4 noise = tex2D(noiseSampler, (texCoord.xy - camMove.xy) * noiseFrequency);
Так что, если камера перемещается по вектору (1, 0) на один кадр (в мировом пространстве), я быНадеемся сместить, где шум будет измеряться этой величиной, чтобы он перемещал ту же самую мировую позицию воды, когда камера перемещается.
У меня проблемы с преобразованием этого вектора расстояния в то, что HLSL может использовать.
Поскольку HLSL рассматривает координаты как нормализованные между 0 и 1, я попытался установить camMoveX и Y примерно так в XNA:
camDisX = (camMove.X / GameOptions.PrefferedBackBufferWidth)
и затем передать эти значения в шейдер.
К сожалению, это не работает. Как мне преобразовать этот вектор расстояния во что-то, что HLSL может использовать? Должен ли я использовать вершинный шейдер и матрицу worldViewProj для решения этой проблемы?
Вот короткий клип для демонстрации.