我正在编写一个在屏幕上呈现图形的应用程序。应用程序可以在 Direct3D9 和 Direct3D10 图形模块之间切换(我编写了包装 D3D9 和 D3D10 的 DLL)。在尝试渲染测试网格(D3DX9 和 DXUT 库中您可以在 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( ) ) );
}
}