【问题标题】:XNA Distance Vector to HLSL float2XNA 距离向量到 HLSL float2
【发布时间】:2019-10-15 16:12:27
【问题描述】:

我使用这个像素着色器对纹理应用了噪点效果。

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】:

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

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

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

    【讨论】:

      【解决方案2】:

      自从我找到解决方案后更新此内容。我最终得到以下结果:

          camMove.X = ((_cam.Position.X % GameOptions.PrefferedBackBufferWidth) / (GameOptions.PrefferedBackBufferWidth));
          camMove.Y = ((_cam.Position.Y % GameOptions.PrefferedBackBufferHeight) / (GameOptions.PrefferedBackBufferHeight));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多