我正在开发一个简单的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
这是你似乎无法解决的非常恼人的问题之一。根据我的经验,这些类型的错误通常最终都是由非常小的东西造成的......大声笑
我检查了常量缓冲区,看起来它们设置正确。我在这里难过......发生了什么事?任何帮助将不胜感激!
答案 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