C# 为什么有效纹理无法到达着色器?(Direct3D9)
大家好,我正在尝试使用c#和SlimDX为我的图形引擎创建延迟渲染器。作为一种资源,我使用了教程,尽管它是针对XNA的,但它非常有用。 但现在我被卡住了。。。 我已经设置了渲染器来绘制所有几何体的颜色、法线和深度,以分离渲染目标纹理。这很有效。我可以将结果纹理作为精灵绘制到恢复后的backbuffer上,我可以看到它们包含了它们应该包含的内容。但当我尝试将这些纹理传递给另一个着色器(在本例中是创建灯光贴图)时,奇怪的事情就会发生。以下是我如何绘制一帧:C# 为什么有效纹理无法到达着色器?(Direct3D9),c#,direct3d,slimdx,C#,Direct3d,Slimdx,大家好,我正在尝试使用c#和SlimDX为我的图形引擎创建延迟渲染器。作为一种资源,我使用了教程,尽管它是针对XNA的,但它非常有用。 但现在我被卡住了。。。 我已经设置了渲染器来绘制所有几何体的颜色、法线和深度,以分离渲染目标纹理。这很有效。我可以将结果纹理作为精灵绘制到恢复后的backbuffer上,我可以看到它们包含了它们应该包含的内容。但当我尝试将这些纹理传递给另一个着色器(在本例中是创建灯光贴图)时,奇怪的事情就会发生。以下是我如何绘制一帧: public bool RenderFra
public bool RenderFrame(FrameInfo fInfo){
if(!BeginRender()) //checks Device, resizes buffers, calls BeginScene(), etc.
return false;
foreach(RenderQueue queue in fInfo.GetRenderQueues()){
RenderQueue(queue);
}
EndRender(); //currently only calls EndScene, used to do more
ResolveGBuffer();
DrawDirectionalLight(
new Vector3(1f, -1f, 0),
new Color4(1f,1f,1f,1f),
fi.CameraPosition,
SlimMath.Matrix.Invert(fi.ViewProjectionMatrix));
}
private void ResolveGBuffer() {
if(DeviceContext9 == null || DeviceContext9.Device == null)
return;
DeviceContext9.Device.SetRenderTarget(0, _backbuffer);
DeviceContext9.Device.SetRenderTarget(1, null);
DeviceContext9.Device.SetRenderTarget(2, null);
}
private void DrawDirectionalLight(Vector3 lightDirection, Color4 color, SlimMath.Vector3 cameraPosition, SlimMath.Matrix invertedViewProjection) {
if(DeviceContext9 == null || DeviceContext9.Device == null)
return;
DeviceContext9.Device.BeginScene();
_directionalLightShader.Shader.SetTexture(
_directionalLightShader.Parameters["ColorMap"],
_colorTexture);
_directionalLightShader.Shader.SetTexture(
_directionalLightShader.Parameters["NormalMap"],
_normalTexture);
_directionalLightShader.Shader.SetTexture(
_directionalLightShader.Parameters["DepthMap"],
_depthTexture);
_directionalLightShader.Shader.SetValue<Vector3>(
_directionalLightShader.Parameters["lightDirection"],
lightDirection);
_directionalLightShader.Shader.SetValue<Color4>(
_directionalLightShader.Parameters["Color"],
color);
_directionalLightShader.Shader.SetValue<SlimMath.Vector3>(
_directionalLightShader.Parameters["cameraPosition"],
cameraPosition);
_directionalLightShader.Shader.SetValue<SlimMath.Matrix>(
_directionalLightShader.Parameters["InvertViewProjection"],
invertedViewProjection);
_directionalLightShader.Shader.SetValue<Vector2>(
_directionalLightShader.Parameters["halfPixel"],
_halfPixel);
_directionalLightShader.Shader.Technique =
_directionalLightShader.Technique("Technique0");
_directionalLightShader.Shader.Begin();
_directionalLightShader.Shader.BeginPass(0);
RenderQuad(SlimMath.Vector2.One * -1, SlimMath.Vector2.One);
_directionalLightShader.Shader.EndPass();
_directionalLightShader.Shader.End();
DeviceContext9.Device.EndScene();
}
现在我的大问题是为什么?没有打印到调试输出的错误消息
编辑:
渲染目标/纹理的创建方式如下:
_colorTexture = new Texture(DeviceContext9.Device,
DeviceContext9.PresentParameters.BackBufferWidth,
DeviceContext9.PresentParameters.BackBufferHeight,
1,
Usage.RenderTarget,
Format.A8R8G8B8,
Pool.Default);
_colorSurface = _colorTexture.GetSurfaceLevel(0);
_normalTexture = new Texture(DeviceContext9.Device,
DeviceContext9.PresentParameters.BackBufferWidth,
DeviceContext9.PresentParameters.BackBufferHeight,
1,
Usage.RenderTarget,
Format.A8R8G8B8,
Pool.Default);
_normalSurface = _normalTexture.GetSurfaceLevel(0);
_depthTexture = new Texture(DeviceContext9.Device,
DeviceContext9.PresentParameters.BackBufferWidth,
DeviceContext9.PresentParameters.BackBufferHeight,
1,
Usage.RenderTarget,
Format.A8R8G8B8,
Pool.Default);
_depthSurface = _depthTexture.GetSurfaceLevel(0);
编辑2:
问题似乎在于directionalLightShader本身,因为传递其他常规纹理也不起作用。我的问题的答案很简单,因为问题很愚蠢。这种奇怪的行为是由两种不同的错误引起的:
感谢所有读过这个问题的人 您是否在控制面板中启用了directx日志记录?据我回忆,当您在调试器中运行时,日志也可能不会显示。是的,我确实得到了调试输出,但它抱怨的只是冗余的“SetSamplerState”s哦,我使用DebugView查看输出,以及在创建纹理时指定了哪些标志?将代码添加到问题中一般来说,此类问题很难调试。我倾向于不断地从程序中删除东西,直到PIX输出看起来像预期的那样。例如,可以在使用纹理之前跳过对纹理的渲染。
_colorTexture = new Texture(DeviceContext9.Device,
DeviceContext9.PresentParameters.BackBufferWidth,
DeviceContext9.PresentParameters.BackBufferHeight,
1,
Usage.RenderTarget,
Format.A8R8G8B8,
Pool.Default);
_colorSurface = _colorTexture.GetSurfaceLevel(0);
_normalTexture = new Texture(DeviceContext9.Device,
DeviceContext9.PresentParameters.BackBufferWidth,
DeviceContext9.PresentParameters.BackBufferHeight,
1,
Usage.RenderTarget,
Format.A8R8G8B8,
Pool.Default);
_normalSurface = _normalTexture.GetSurfaceLevel(0);
_depthTexture = new Texture(DeviceContext9.Device,
DeviceContext9.PresentParameters.BackBufferWidth,
DeviceContext9.PresentParameters.BackBufferHeight,
1,
Usage.RenderTarget,
Format.A8R8G8B8,
Pool.Default);
_depthSurface = _depthTexture.GetSurfaceLevel(0);