【问题标题】:HLSL projection shaderHLSL 投影着色器
【发布时间】:2013-03-08 07:12:11
【问题描述】:

我正在将场景渲染为纹理,然后使用投影绘制具有该纹理的水平面。我在网上看到的大多数示例都在视图/投影矩阵中传递给顶点着色器并转换顶点,然后在像素着色器中进行:

projection.x = input.projectionCoords.x / input.projectionCoords.w / 2.0 + 0.5;
projection.y = input.projectionCoords.y / input.projectionCoords.w / 2.0 + 0.5;

我有一个着色器,它可以执行以下操作,它也可以工作,但我不知道我在哪里找到了这个特定的代码,也不知道它如何与上面的代码给出相同的结果。这是我的代码

顶点着色器:(world是一个identityMatrix,viewProj是我的相机组合的viewProjection矩阵):

output.position3D =  mul(float4(vsin.position,1.0), world).xyz;
output.position = mul(float4(output.position3D,1.0), viewProj);

output.reflectionTexCoord.x = 0.5 * (output.position.w + output.position.x);
output.reflectionTexCoord.y = 0.5 * (output.position.w - output.position.y);
output.reflectionTexCoord.z = output.position.w;

像素着色器:

float2 projectedTexCoord = (input.reflectionTexCoord.xy / input.reflectionTexCoord.z);

让我困惑的是0.5 * (output.position.w + output.position.x)0.5 * (output.position.w - output.position.y) 的用法。这怎么会有同样的效果,这里的 w 分量是什么意思?

【问题讨论】:

    标签: direct3d hlsl


    【解决方案1】:

    过了一会儿,我意识到它最终是同一件事:

    0.5 * (output.position.w + output.position.x);
    
    0.5 * output.position.w + 0.5 * output.position.x
    

    然后在像素着色器中:

    (0.5 * output.position.w + 0.5 * output.position.x) / output.position.w
    
    (0.5 * output.position.w)/output.position.w + (0.5 * output.position.x) / output.position.w
    

    第一部分变成0.5:

    0.5 + 0.5 * ( output.position.x / output.position.w)
    

    这等于:

    (output.position.x / output.position.w) / 2 + 0.5
    

    我相信将此计算移至顶点着色器会更有效,因此我将其留在那里。

    要将计算完全移出着色器,可以在客户端计算矩阵:

    XMMATRIX v = XMLoadFloat4x4(&view);
    XMMATRIX p = XMLoadFloat4x4(&projection);
    
    XMMATRIX t(
        0.5f, 0.0f, 0.0f, 0.0f,
        0.0f, -0.5f, 0.0f, 0.0f,
        0.0f, 0.0f, 1.0f, 0.0f,
        0.5f, 0.5f, 0.0f, 1.0f);
    
    XMMATRIX reflectionTransform = v * p * t;
    XMStoreFloat4x4(&_reflectionTransform, XMMatrixTranspose(reflectionTransform));
    

    那么顶点着色器要做的就是:

    output.reflectionTexCoord = mul(float4(output.position3D,1.0), reflectionProjectionMatrix);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      相关资源
      最近更新 更多