使用Direct3D10进行奇怪的渲染

时间:2013-02-27 15:30:56

标签: c++ directx shader direct3d hlsl

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

D3D9: Torus rendered by D3D9 module.

D3D10: Torus rendered by D3D10 module

两种情况下的视图,投影和世界矩阵都是相同的。唯一不同的是设备初始化代码和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( ) ) );            
    }
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

不确定导致问题的原因,但您可以查看以下内容:

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

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

答案 2 :(得分:0)

在将矩阵设置为着色器常量之前,需要转置矩阵。如果您正在使用xnamath,请在将每个世界,视图和投影矩阵设置到常量缓冲区之前使用XMMatrixTranspose()函数。