射影纹理和延期照明

在我之前的问题中 ,我问是否可以用延期照明进行投影纹理化。 现在(半年以后)我在执行同样的事情时遇到了问题。 我正在尝试将这种技术应用于光传。 (我的投影机不会影响反照率)。 我有这台投影机查看投影matrix:

Matrix projection = Matrix.CreateOrthographicOffCenter(-halfWidth * Scale, halfWidth * Scale, -halfHeight * Scale, halfHeight * Scale, 1, 100000); Matrix view = Matrix.CreateLookAt(Position, Target, Vector3.Up); 

其中halfWidthhalfHeight是纹理宽度和高度的一半, Position是投影机的位置, target是投影机的目标。 这似乎是好的。 我正在用这个着色器画全屏:

 float4x4 InvViewProjection; texture2D DepthTexture; texture2D NormalTexture; texture2D ProjectorTexture; float4x4 ProjectorViewProjection; sampler2D depthSampler = sampler_state { texture = <DepthTexture>; minfilter = point; magfilter = point; mipfilter = point; }; sampler2D normalSampler = sampler_state { texture = <NormalTexture>; minfilter = point; magfilter = point; mipfilter = point; }; sampler2D projectorSampler = sampler_state { texture = <ProjectorTexture>; AddressU = Clamp; AddressV = Clamp; }; float viewportWidth; float viewportHeight; // Calculate the 2D screen position of a 3D position float2 postProjToScreen(float4 position) { float2 screenPos = position.xy / position.w; return 0.5f * (float2(screenPos.x, -screenPos.y) + 1); } // Calculate the size of one half of a pixel, to convert // between texels and pixels float2 halfPixel() { return 0.5f / float2(viewportWidth, viewportHeight); } struct VertexShaderInput { float4 Position : POSITION0; }; struct VertexShaderOutput { float4 Position :POSITION0; float4 PositionCopy : TEXCOORD1; }; VertexShaderOutput VertexShaderFunction(VertexShaderInput input) { VertexShaderOutput output; output.Position = input.Position; output.PositionCopy=output.Position; return output; } float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 { float2 texCoord =postProjToScreen(input.PositionCopy) + halfPixel(); // Extract the depth for this pixel from the depth map float4 depth = tex2D(depthSampler, texCoord); //return float4(depth.r,0,0,1); // Recreate the position with the UV coordinates and depth value float4 position; position.x = texCoord.x * 2 - 1; position.y = (1 - texCoord.y) * 2 - 1; position.z = depth.r; position.w = 1.0f; // Transform position from screen space to world space position = mul(position, InvViewProjection); position.xyz /= position.w; //compute projection float3 projection=tex2D(projectorSampler,postProjToScreen(mul(position,ProjectorViewProjection)) + halfPixel()); return float4(projection,1); } 

在像素着色器的第一部分从G缓冲区恢复位置(我在其他着色器中使用的这个代码没有任何问题),然后转换到投影机视图投影空间。 问题是没有出现投影。 这是我的情况的一个形象:

问题的形象

绿线是渲染的投影仪的平截头体。 我的错误隐藏在哪里? 我正在使用XNA 4.感谢您的建议,并对我的英语感到抱歉。

编辑:

以上着色器正在工作,但投影太小。 当我将Scale属性更改为一个较大的值(例如100)时,会出现投影。 但是当照相机向投影方向移动时,投影就会扩大,就像在YouTube上看到的那样。

在着色器中,您需要移除position.xyz /= w; 因为这是造成您的resize的问题:

 // Transform position from screen space to world space position = mul(position, InvViewProjection); position.xyz /= position.w; <<-- Comment this out 

这应该够了吧。

如果你得到的结果太小,达到这个尺寸,可能是因为锥体仍然在1到-1的空间或0到1或类似的? 这是平截头体的基础吗?