首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Direct3D10进行奇怪的渲染

使用Direct3D10进行奇怪的渲染
EN

Stack Overflow用户
提问于 2013-02-27 23:30:56
回答 3查看 297关注 0票数 0

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

D3D9:

D3D10:

视图、投影和世界矩阵对于这两种情况都是相同的。唯一不同的是设备初始化代码和HLSL效果文件(为了简单起见,我只应用环境色,而不使用高级照明、纹理等)。这可能是因为错误的设备初始化还是因为错误的着色器?如果有任何提示,我将不胜感激。我可以根据要求发布任何代码片段。

游戏开发者StackExchange上的一个家伙建议,这可能是因为转置了投影矩阵。

提前谢谢。编辑:这是.fx文件。你可以忽略PS,那里没有什么有趣的事情发生。

代码语言:javascript
复制
//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( ) ) );            
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-28 20:22:43

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

票数 2
EN

Stack Overflow用户

发布于 2013-02-27 23:56:45

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-02-28 06:49:35

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15115918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档