XNA到HLSL float2的距离矢量

问题描述 投票:0回答:1

我已使用此像素着色器将噪波效果应用于纹理。

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之间被规范化,所以我试图像在XNA中那样设置camMoveX和Y:

camDisX = (camMove.X / GameOptions.PrefferedBackBufferWidth) 

然后将这些值传递给着色器。

不幸的是,这不起作用。我应该如何将这个距离向量转换为HLSL可以使用的东西?我应该使用顶点着色器和worldViewProj矩阵来解决此问题吗?

这里是short clip来演示。

camera xna monogame hlsl pixel-shader
1个回答
0
投票

不是使用帧之间的摄像机移动距离来计算偏移量,而是使用摄像机位置,可以从视图矩阵转置的最后一列中提取摄像机位置,也可以通过累积每帧摄像机的移动来计算摄像机位置。

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

从直觉上讲,这更有意义:如果相机距离某个原点(a,b)较远,则纹理也需要在远离该原点(a,b)处进行采样,以使其看起来静止。这与相机移动的速度无关。

© www.soinside.com 2019 - 2024. All rights reserved.