Вектор расстояния XNA до HLSL float2 - PullRequest
0 голосов
/ 15 октября 2019

Я применил эффект шума к текстуре, используя этот пиксельный шейдер.

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 для решения этой проблемы?

Вот короткий клип для демонстрации.

1 Ответ

0 голосов
/ 29 октября 2019

Вместо того чтобы использовать расстояние перемещения камеры между кадрами для вычисления смещения, используйте вместо этого положение камеры, которое можно извлечь из последнего столбца транспонирования матрицы вида или можно рассчитать путем накопления движения камеры на кадр.

float4 noise = tex2D(noiseSampler, (texCoord.xy + camPos.xy) * noiseFrequency);

Интуитивно это имеет больше смысла: если камера находится (a, b) вдали от некоторой исходной точки, текстуры должны быть отобраны на расстоянии (a, b) от этой исходной точки какхорошо бы казаться стационарным. Это независимо от скорости движения камеры.

...