Delphi中的CreateVertexDeclaration错误

用户名

我有简单的声明:

uses ...
  Winapi.Direct3D9, Winapi.DXTypes, Winapi.D3DX9,

var
  g_pVertexDeclaration: IDirect3DVertexDeclaration9 = nil;
const
  decl: array [0 .. 4] of TD3DVertexElement9 = (
    (Stream: 0; Offset: 0; _Type: D3DDECLTYPE_FLOAT3; Method: D3DDECLMETHOD_DEFAULT;
    Usage: D3DDECLUSAGE_POSITION; UsageIndex: 0),
    (Stream: 0; Offset: 3 * sizeof(single); _Type: D3DDECLTYPE_FLOAT3; Method: D3DDECLMETHOD_DEFAULT;
    Usage: D3DDECLUSAGE_NORMAL; UsageIndex: 0),
    (Stream: 0; Offset: 6 * sizeof(single); _Type: D3DDECLTYPE_FLOAT2; Method: D3DDECLMETHOD_DEFAULT;
    Usage: D3DDECLUSAGE_TEXCOORD; UsageIndex: 0),
    (Stream: 0; Offset: 8 * sizeof(single); _Type: D3DDECLTYPE_FLOAT2; Method: D3DDECLMETHOD_DEFAULT;
    Usage: D3DDECLUSAGE_TEXCOORD; UsageIndex: 0),
    (Stream: $FF; Offset: 0; _Type: D3DDECLTYPE_UNUSED; Method: TD3DDeclMethod(0);
    Usage: TD3DDeclUsage(0); UsageIndex: 0) //({D3DDECL_END})
    );

记录错误的功能

function CheckDxError(e: dword): boolean;
begin
  if Failed(e) then begin
    raise Exception.Create(format('dx error %d: %s, %s', [(e shr 16) and $7FFF, DXGetErrorString9(e),
      DXGetErrorDescription9(e)]));
    exit(false);
  end;
  result := true;
end;

dx error 0: E_FAIL, An Undetermined error occured

  CheckDxError(m_pd3dDevice.CreateVertexDeclaration(@decl, g_pVertexDeclaration));

DirectX 9,设备等在调用之前进行了初始化(并且代码没有着色器,我试图研究着色器),使用只有第一个位置和D3DDECL_END的decl数组,此代码中没有错误。但是我的顶点着色器包含4个输入值,并且使用DirectX SDK中的fxc.exe进行编译时没有错误。

struct VSInput
{
    float3 Pos : POSITION;
    float3 Normal : NORMAL;
    float2 TexcoordUV : TEXCOORD0;
    float2 TexcoordST : TEXCOORD1;
};

为什么会发生此错误,以及如何避免?

大卫·赫弗南(David Heffernan)

您的第二个TEXCOORD需要UsageIndex设置为1

的文档D3DDECLUSAGE确实涵盖了这一点:

D3DDECLUSAGE_TEXCOORD

纹理坐标数据。使用D3DDECLUSAGE_TEXCOORD,n在固定函数顶点处理和ps_3_0之前的像素着色器中指定纹理坐标。这些可用于传递用户定义的数据。

的值n是使用情况索引,如果要具有相同用法的多个顶点元素,则需要为它们指定不同的使用情况索引。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章