2013-02-26 151 views
2

我正在渲染一個場景到紋理,然後使用投影繪製具有該紋理的水平面。最我所看到的幅材上的樣品通過在視圖/投影矩陣的頂點着色器和變換頂點,然後在像素着色器他們這樣做: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組件在這裏的含義是什麼?

回答

2

過了一會我意識到,它最終被同樣的事情:

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