我正在写一个在屏幕上渲染图形的应用程序。应用程序可以在Direct3D9和Direct3D10图形模块之间切换(我编写了包装D3D9和D3D10的DLL)。当尝试渲染一个测试网格(一个圆环,在D3DX9和DXUT库中,你可以在DirectX10示例中找到它)时,Direct3D10模块的行为相当奇怪。这就是我所得到的。
D3D9:

D3D10:

视图、投影和世界矩阵对于这两种情况都是相同的。唯一不同的是设备初始化代码和HLSL效果文件(为了简单起见,我只应用环境色,而不使用高级照明、纹理等)。这可能是因为错误的设备初始化还是因为错误的着色器?如果有任何提示,我将不胜感激。我可以根据要求发布任何代码片段。
游戏开发者StackExchange上的一个家伙建议,这可能是因为转置了投影矩阵。
提前谢谢。编辑:这是.fx文件。你可以忽略PS,那里没有什么有趣的事情发生。
//Basic ambient light shader with no textures
matrix World;
matrix View;
matrix Projection;
float4 AmbientColor : AMBIENT = float4(1.0, 1.0, 1.0, 1.0);
float AmbientIntensity = 1.0;
struct VS_OUTPUT
{
float4 Position : SV_POSITION; // vertex position
float4 Color : COLOR0; // vertex color
};
RasterizerState rsWireframe { FillMode = WireFrame; };
VS_OUTPUT RenderSceneVS( float4 vPos : POSITION)
{
VS_OUTPUT output;
matrix WorldProjView = mul(World, mul(View, Projection));
vPos = mul(vPos, WorldProjView);
output.Position = vPos;
output.Color.rgb = AmbientColor * AmbientIntensity;
output.Color.a = AmbientColor.a;
return output;
}
struct PS_OUTPUT
{
float4 RGBColor : SV_Target; // Pixel color
};
PS_OUTPUT RenderScenePS( VS_OUTPUT In )
{
PS_OUTPUT output;
output.RGBColor = In.Color;
return output;
}
technique10 Ambient
{
pass P0
{
SetRasterizerState( rsWireframe );
SetVertexShader( CompileShader( vs_4_0, RenderSceneVS( ) ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, RenderScenePS( ) ) );
}
}发布于 2013-02-28 20:22:43
确保你的vPos.w = 1.0f。如果不是这样,矩阵乘法将变得疯狂并产生奇怪的结果。
发布于 2013-02-27 23:56:45
不确定导致问题的原因,但您可以检查以下内容:
编辑:这可能也是一个好主意,只是把一些简单的网格到缓冲区,例如立方体(甚至一个三角形),并检查它是否正确绘制。
发布于 2013-02-28 06:49:35
在将矩阵设置为着色器常量之前,需要转置矩阵。如果使用xnamath,则在将世界、视图和投影矩阵设置到常量缓冲区之前,对每个世界、视图和投影矩阵使用XMMatrixTranspose()函数。
https://stackoverflow.com/questions/15115918
复制相似问题