C++ DX11雪碧故障

C++ DX11雪碧故障,c++,directx,2d,sprite,directx-11,C++,Directx,2d,Sprite,Directx 11,我在dx11中渲染精灵时遇到问题,我刚刚开始学习基础知识。以下是我的简单着色器代码: //Shader Model 4.0 //Default shaders for rendering a point sprite Texture2D DiffuseTexture : register( t0 ); SamplerState DiffuseTextureSampler : register( s0 ); cbuffer cbViewProj : register( b0 ) {

我在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 );
}
正如你所看到的,它只有最小值,甚至没有一个世界矩阵来移动精灵。我的“视图投影”矩阵是二维正交矩阵。我在directx9上使用了这个设置,一切都很好

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

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

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

如您所见,顶点投影不正确。首先:

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

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

  • m00=矩阵第1行第1列
  • m01=矩阵第1行第2列
右侧的红色值表示我的ViewProjection矩阵如何访问hlsl代码中的缓冲区

出于某种原因,它将其视为浮动4x4?这可能是我的问题吗。。。还是我在解决问题时偏离了轨道

-更新-

我做了一些研究,现在工作的假设是float3x3存储在寄存器中时会变得支离破碎(因为它是以4个float为一组打包的)


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

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

要使向量数学正常工作,每个点必须从16字节对齐的地址开始,这在使用float3xN时是一个问题,因为中的第二点将从字节12开始


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

是否有机会查看如何将矩阵发送到着色器?截断/转置可能是个问题。
float3x3视图投影
不应该是
矩阵视图投影
,输入位置是float4吗?很可能您将ViewProjection矩阵视为3d矩阵代码端,而这将其视为2d矩阵。为了回答您的更新,我将始终使用4x4矩阵,即使是2d-我会尝试将管道中2d的“概念”限制为正交投影矩阵的设置。另一方面,由于预变换顶点格式(使用D3DFVF_XYZRHW或D3DDECLUSAGE_POSITIONT),我在从FFP移动到着色器时遇到了很多问题,据我所知,预变换顶点的概念不适用于DX10+。它最终打开了DX9中FFP的一部分,因此可能会使DX10/11中看似相似的代码在引擎盖下表现出截然不同的行为。