【问题标题】:SlimDX 3D Graphics Pixelshader IssueSlimDX 3D 图形像素着色器问题
【发布时间】:2013-11-17 23:43:22
【问题描述】:

我正在开发一个简单的 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

这是您似乎无法解决的非常恼人的问题之一。根据我的经验,这些类型的错误通常最终是由非常小的东西引起的......哈哈

我检查了常量缓冲区,看起来它们设置正确。我被难住了……这是怎么回事?任何帮助将不胜感激!

【问题讨论】:

    标签: 3d slimdx pixel-shader


    【解决方案1】:

    您似乎使用 m_Viewport.MinZ 和 m_Viewport.MaxZ 作为投影矩阵的近/远平面。

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

    尝试将您的投影设置为 near = 0.5 和 far = 200(类似的值)。

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

    最后一个组件应该是 1.0f

    【讨论】:

    • 我将投影更改为接近 0.5 和远至 200,但它仍然在做同样的事情。像素着色器仍未运行。 :(
    • 这可能是对问题的提示。如果我单击图形调试器中的输入汇编器阶段,我可以看到它正在输出什么,并将其添加到上面的帖子中。此输出中的 Vertex 行充满了无穷大和 NaN 值,这似乎不正确。
    • 如果您将所有矩阵都设置为恒等式会怎样?
    • 我试过这个(将视图和投影矩阵设置为身份),结果是整个窗口都充满了蓝色。即使我将相机的 Z 位置移回 -1000。所以像素着色器现在显然正在运行。但这不是三角形。大声笑
    • 就是这样!我将每个顶点的 w 分量更改为 1.0f。我现在在屏幕上看到一个蓝色的倒三角形!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    相关资源
    最近更新 更多