HLSL投影着色器

我正在渲染一个场景到纹理,然后使用投影绘制具有该纹理的水平面。最我所看到的幅材上的样品通过在视图/投影矩阵的顶点着色器和变换顶点,然后在像素着色器他们这样做:HLSL投影着色器

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

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

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

顶点着色器:(世界是一个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组件在这里的含义是什么?

回答:

过了一会我意识到,它最终被同样的事情:

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); 

以上是 HLSL投影着色器 的全部内容, 来源链接: utcz.com/qa/258090.html

回到顶部