繁体   English   中英

DX11精灵麻烦

[英]DX11 sprite troubles

我在dx11中渲染精灵时遇到问题,我只是从基础开始。 这是我简单的着色器代码:

//Shader Model 4.0
//Default shaders for rendering a point sprite

Texture2D DiffuseTexture : register( t0 );

SamplerState DiffuseTextureSampler : register( s0 );

cbuffer cbViewProj : register( b0 )
{
    float3x3 ViewProjection;
}

struct VS_INPUT
{
    float2 Pos : POSITION;
    float2 Tex : TEXCOORD0;
};

struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD0;
};

PS_INPUT VS( VS_INPUT input )
{
    PS_INPUT output;
    float3 oVec = float3(input.Pos.x, input.Pos.y, 1.0f);   
    oVec = mul(oVec, ViewProjection);

    output.Pos = float4(oVec.x, oVec.y, 0.0f, 1.0f);
    output.Tex = input.Text;

    return output;
}

float4 PS( PS_INPUT input) : SV_Target
{
    return DiffuseTexture.Sample( DiffuseTextureSampler, input.Tex );
}

如您所见,它只有极小的最小值,甚至还没有移动精灵的世界矩阵。 我的“ ViewProjection”矩阵是2D正交矩阵。 我将此设置与Directx9配合使用,一切正常。

进入dx11我遇到了麻烦。 我相信我设置ViewProjection矩阵的方式或在着色器中读取矩阵的方式有问题。

首先,我使用PIX检查我的顶点缓冲区/顶点进入顶点着色器的顺序: BadSprite1

这样看来还好。 接下来,我添加了viewprojection矩阵以将顶点投影到屏幕空间中,如我发布的着色器代码所示。 结果... BadSprite1

因此,如您所见,顶点投影不正确。 对于初学者:

  • prim0vert0 = prim0vert1
  • prim1vert4 = prim1vert5

这对我来说没有意义,因为正在处理不同的顶点值。 通过查看UV坐标,可以告诉顶点以与我的初始测试相同的顺序进入。 这是我的3x3 ViewProjection矩阵缓冲区的外观:

在此处输入图片说明

我在顶部手动写下了缓冲区值对应的矩阵行/列。 底部的三个值只是填充以确保我的缓冲区大小是16的倍数。所以...就像在DirectX中一样:

  • m00 =矩阵第1列,第1列
  • m01 =矩阵第1列,第2列
  • 等等

右边的红色值表示我的ViewProjection矩阵如何访问hlsl代码中的缓冲区。

由于某种原因,它会将其视为float4x4吗? 可能是我的问题...还是我在解决问题时如愿以偿

-UPDATE-

我做了一些研究,现在假设在将float3x3存储在寄存器中时会变得碎片化(因为它以4个float的形式打包)。

现在看来,即使我的应用程序是完全2D的,由于这种令人讨厌的行为,我仍然应该使用4x4矩阵。 这是正确的吗,还是我不知道有什么解决方法?

现代图形硬件经过设计/优化,可与4x4字节向量一起使用,即4个浮点值。 即使使用float3向量,在内部它仍会占用一个保存float4的寄存器。

为了使矢量数学正常工作,每个点都必须从16字节对齐的地址开始,这在使用float3xN时会出现问题,因为第二个点将从字节12开始

因此,您必须将数据填充为16字节对齐。 尝试使用float4x3。 在内部,您的float3x3操作仍会占用float4x3的空间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM