c++ - DX11 Sprite 问题

标签 c++ directx 2d sprite directx-11

我在 dx11 中渲染 sprite 时遇到问题,我刚刚开始学习基础知识。这是我的简单着色器代码:

//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 );
}

如您所见,它具有最低限度,甚至还没有用于移动 Sprite 的世界矩阵。我的“ViewProjection”矩阵是一个二维正交矩阵。我将此设置与 directx9 一起使用,一切正常。

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

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

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

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

  • prim0vert0 = prim0vert1
  • prim1vert4 = prim1vert5

这对我来说没有意义,因为正在处理不同的顶点值。您可以通过查看 UV 坐标来判断顶点的进入顺序与我最初测试的顺序相同。 这是我的 3x3 viewprojection 矩阵缓冲区的样子:

enter image description here

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

  • m00 = 矩阵 row1, column1
  • m01 = 矩阵 row1, column2
  • 等等

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

出于某种原因,它将其视为 float4x4?这可能是我的问题......还是我在解决我的问题方面做得很好

-更新-

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

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

最佳答案

现代图形硬件被设计/优化为使用 4x4 字节 vector ,即 4 个浮点值。即使当您使用 float3 vector 时,它在内部仍然占用一个保存 float4 的寄存器。

为了使 vector 数学正常工作,每个点都必须从 16 字节对齐的地址开始,当您使用 float3xN 时这是一个问题,因为第 2 个点将从字节 12 开始

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

关于c++ - DX11 Sprite 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13871013/

相关文章:

c++ - DirectX Vertex 中的 THE 是什么

c++ - 旋转相机时,DirectX 原语不会在屏幕上移动

wpf - System.Drawing.Point和System.Windows.Point有什么区别?

2d - 在 gekko 的 bspline 函数中格式化 x 和 y 数据时出现问题

graphics - 开罗路径上的 bool 运算?

c++ - 如何存储 VARIANT

c++ - 包含动态分配数组的结构中的复制构造函数是否总是必要的?

c++ - 如何重置我的 DirectX 9 设备?

c++ - 嵌套命名空间,纠正静态库设计问题

c++ - unable to determine cause of "no match for ' operator <'"编译错误