SlimDX 3D图形Pixelshader问题

时间:2013-11-17 23:43:22

标签: 3d slimdx pixel-shader

我正在开发一个简单的3D应用程序,它将使用SlimDX绘制一个立方体。目前它应该在屏幕上绘制一个三角形,但它什么都不做。

如果我使用VS2012中的图形调试器功能检查事物,我可以看到顶点着色器阶段的输出是预期的三角形。但是我们跳过像素着色器并直接进入OutputMerger。

我已将cullmode设置为none,但它仍然拒绝运行像素着色器。这是初始化投影和视图矩阵的代码。

        m_ProjectionMatrix = Matrix.PerspectiveFovLH(0.7853982f, //1.570796f, // this is 90 degrees in radians
                                                     (float) m_Form.Width / (float) m_Form.Height,
                                                     m_Viewport.MinZ,
                                                     m_Viewport.MaxZ);

        m_ViewMatrix = Matrix.LookAtLH(new Vector3(3, 1, -10),
                                       new Vector3(0, 0, 0),
                                       new Vector3(0, 1, 0));

三角形本身位于原点,因为我没有对其应用任何平移。这是顶点数据,存储在自定义顶点结构中。我现在只使用位置数据,直到我能解决这个问题。然后我会搞乱我添加的其他值。但这里是顶点数据:

    Vertex[] vertexData =
    {
        new Vertex() { Position = new Vector4(-1.0f, 1.0f, 0.0f, 0.0f), Color = new Color4(1.0f, 0.0f, 0.0f, 1.0f), TexCoord = new Vector2(0, 0) },
        new Vertex() { Position = new Vector4(1.0f, 1.0f, 0.0f, 0.0f), Color = new Color4(1.0f, 0.0f, 1.0f, 0.0f), TexCoord = new Vector2(1, 0) },
        new Vertex() { Position = new Vector4(0.0f, -1.0f, 0.0f, 0.0f), Color = new Color4(1.0f, 1.0f, 0.0f, 0.0f), TexCoord = new Vector2(0.5f, 1) },
    };

以下是着色器代码:

cbuffer cbPerResize : register( b0 )
{
    matrix Projection;
};

cbuffer cbPerFrame : register( b1 )
{
    matrix View;
};

cbuffer cbPerObject : register( b2 )
{
    matrix World;
};


Texture2D ObjTexture;
SamplerState ObjSamplerState;


//--------------------------------------------------------------------------------------
struct VS_INPUT
{
    float4 Pos : POSITION;
    float4 Color : COLOR;
    float2 TexCoord: TEXCOORD;
};

struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR;
    float2 TexCoord: TEXCOORD;
};






PS_INPUT Vertex_Shader( VS_INPUT input )
{
    PS_INPUT output = (PS_INPUT) 0;

    output.Color = input.Color;
    output.TexCoord = input.TexCoord;

    output.Pos = mul( input.Pos, World );
    output.Pos = mul( output.Pos, View );
    output.Pos = mul( output.Pos, Projection );

    return output;
}

float4 Pixel_Shader_Color(PS_INPUT input) : SV_TARGET
{
    return float4(0.0f, 0.0f, 1.0f, 1.0f);   
}

这是我的RenderScene()方法中的绘图代码。立方体的世界矩阵目前只是单位矩阵:

    // Clear the screen before we draw the next frame.
    m_DeviceContext.ClearRenderTargetView(m_RenderTargetView, m_ClearColor);


    // Send the cube's world matrix to the changes per object constant buffer.
    m_DataStream.Position = 0;
    m_DataStream.Write(Matrix.Transpose(m_CubeWorldMatrix));
    m_DataStream.Position = 0;
    m_Device.ImmediateContext.UpdateSubresource(new DataBox(0, 0, m_DataStream),
                                                m_CbChangesPerObject,
                                                0);


    // Draw the triangle that we created in our vertex buffer.
    m_DeviceContext.Draw(3, 0);


    // Present the frame we just rendered to the user.
    m_SwapChain.Present(0,
                        PresentFlags.None);

这是InputAssembler阶段的输出。顶点值似乎很棘手。

# Visual Studio - VsPix
# Version: 11
# Vertex shader mesh
#
# Generated data
# object insideShape
g insideShape
v -Infinity Infinity NaN
v Infinity Infinity NaN
v NaN -Infinity NaN
f 1 2 3

这是你似乎无法解决的非常恼人的问题之一。根据我的经验,这些类型的错误通常最终都是由非常小的东西造成的......大声笑

我检查了常量缓冲区,看起来它们设置正确。我在这里难过......发生了什么事?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

从您看来,您使用m_Viewport.MinZ和m_Viewport.MaxZ作为投影矩阵的近/远平面。

在视口中,它们通常为0-> 1,但投影矩阵中的值不同,因此如果在投影中设置MaxZ = 1,则会剪裁三角形(因为您的外观z为-10)。

尝试将您的投影设置为接近= 0.5且远= 200(类似于此)。

编辑: 我还注意到你的顶点位置是-1.0f,1.0f,0.0f,0.0f

最后一个组件应为1.0f