C# 为什么有效纹理无法到达着色器?(Direct3D9)

C# 为什么有效纹理无法到达着色器?(Direct3D9),c#,direct3d,slimdx,C#,Direct3d,Slimdx,大家好,我正在尝试使用c#和SlimDX为我的图形引擎创建延迟渲染器。作为一种资源,我使用了教程,尽管它是针对XNA的,但它非常有用。 但现在我被卡住了。。。 我已经设置了渲染器来绘制所有几何体的颜色、法线和深度,以分离渲染目标纹理。这很有效。我可以将结果纹理作为精灵绘制到恢复后的backbuffer上,我可以看到它们包含了它们应该包含的内容。但当我尝试将这些纹理传递给另一个着色器(在本例中是创建灯光贴图)时,奇怪的事情就会发生。以下是我如何绘制一帧: public bool RenderFra

大家好,我正在尝试使用c#和SlimDX为我的图形引擎创建延迟渲染器。作为一种资源,我使用了教程,尽管它是针对XNA的,但它非常有用。 但现在我被卡住了。。。 我已经设置了渲染器来绘制所有几何体的颜色、法线和深度,以分离渲染目标纹理。这很有效。我可以将结果纹理作为精灵绘制到恢复后的backbuffer上,我可以看到它们包含了它们应该包含的内容。但当我尝试将这些纹理传递给另一个着色器(在本例中是创建灯光贴图)时,奇怪的事情就会发生。以下是我如何绘制一帧:

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本身,因为传递其他常规纹理也不起作用。

我的问题的答案很简单,因为问题很愚蠢。这种奇怪的行为是由两种不同的错误引起的:

  • 我只是在看PIX中的错误事件。我们正确地将纹理传递到着色器,但我没有看到它,因为它在BeginPass事件中“隐藏”(在“+”后面)
  • 我试图执行的像素着色器从未被调用,因为我用来渲染的全屏四边形的顶点是按顺时针顺序绘制的。。。我的模式也设置为顺时针方向
    感谢所有读过这个问题的人

    您是否在控制面板中启用了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);