Direct3d HLSL投影着色器

Direct3d HLSL投影着色器,direct3d,hlsl,Direct3d,Hlsl,我将场景渲染为纹理,然后使用投影绘制具有该纹理的水平面。我在web上看到的大多数示例都在视图/投影矩阵中传递到顶点着色器并变换顶点,然后在像素着色器中执行以下操作: projection.x = input.projectionCoords.x / input.projectionCoords.w / 2.0 + 0.5; projection.y = input.projectionCoords.y / input.projectionCoords.w / 2.0 + 0.5; 我有一个着色

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

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矩阵):

像素着色器:

float2 projectedTexCoord = (input.reflectionTexCoord.xy / input.reflectionTexCoord.z);
(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*(output.position.w+output.position.x)
0.5*(output.position.w-output.position.y)
。这是如何产生相同的效果的?w分量在这里是什么意思?

过了一会儿,我意识到它最终是一样的:

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

0.5 * output.position.w + 0.5 * output.position.x
然后在像素着色器中:

float2 projectedTexCoord = (input.reflectionTexCoord.xy / input.reflectionTexCoord.z);
(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);