0

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

D3D9: 由 D3D9 模块渲染的圆环。

D3D10: 由 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( ) ) );            
    }
}
4

3 回答 3

2

确保您的 vPos.w = 1.0f。如果不是这种情况,矩阵乘法将变得疯狂并产生奇怪的结果。

于 2013-02-28T12:22:42.543 回答
1

不确定是什么导致了问题,但您可以检查以下内容:

  • 确保带有转换矩阵的常量缓冲区是“用某些东西初始化的”,而不是一些垃圾数据
  • 如果您在顶点缓冲区中使用法线/切线,还请确保您没有在其中放置一些垃圾数据(每个顶点),但它会导致纹理问题
  • 确保您的顶点布局描述与顶点着色器 (.hlsl) 中的输入相匹配,有时即使不匹配,它也会编译并运行,但会显示一些意外的网格。
  • 我不知道它在 DX9 中如何,但也许还有一些坐标,将某些变换矩阵中的顶点缓冲区中的 z 乘以 -1 可能会有所帮助

编辑:将一些简单的网格放入缓冲区可能也是个好主意,例如立方体(甚至是三角形)并检查它是否正确绘制。

于 2013-02-27T15:56:44.833 回答
0

您需要先转置矩阵,然后再将它们设置为着色器常量。如果您使用 xnamath,请在每个世界上使用 XMMatrixTranspose() 函数,在将它们设置到常量缓冲区之前查看和投影矩阵。

于 2013-02-27T22:49:35.227 回答