我正在编写一个在屏幕上呈现图形的应用程序。该应用程序可以在Direct3D9和Direct3D10图形模块之间切换(我编写了包含D3D9和D3D10的DLL)。当尝试渲染测试网格(在D3DX9中作为库存网格的圆环和在DXX库中可以在DirectX10样本中找到)时,Direct3D10模块表现得相当奇怪。这就是我得到的。
D3D9:
D3D10:
两种情况下的视图,投影和世界矩阵都是相同的。唯一不同的是设备初始化代码和HLSL效果文件(为简单起见,我只应用环境颜色,不使用高级照明,纹理等)。这可能是因为设备初始化错误还是因为着色器不正确?我会感激任何提示。我可以按要求发布任何代码。
Game Dev 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( ) ) );
}
}
答案 0 :(得分:2)
确保您的vPos.w = 1.0f。 如果不是这种情况,矩阵乘法会变得疯狂并产生奇怪的结果。
答案 1 :(得分:1)
不确定导致问题的原因,但您可以查看以下内容:
编辑:将一些简单的网格放入缓冲区,例如立方体(甚至是三角形)并检查它是否正确绘制也可能是个好主意。
答案 2 :(得分:0)
在将矩阵设置为着色器常量之前,需要转置矩阵。如果您正在使用xnamath,请在将每个世界,视图和投影矩阵设置到常量缓冲区之前使用XMMatrixTranspose()函数。