【问题标题】:Why am I getting this error in HLSL error X8000为什么我在 HLSL 错误 X8000 中收到此错误
【发布时间】:2020-07-21 10:11:22
【问题描述】:

错误 X8000:验证错误:声明的输出顶点数 (348) 乘以声明的输出数据的标量组件总数 (4) 等于 1392。此值不能大于 1024。

当我在 DirectX 的 HLSL 文件中编码我的 3D 圆柱体时出现上述错误

【问题讨论】:

  • 能否请您添加着色器的代码? stackoverflow.com/help/minimal-reproducible-example
  • #define SEGMENTS 10 cbuffer MatrixBuffer { matrix worldMatrix; matrix viewMatrix; matrix projectionMatrix; }; struct GeometryInputType { float4 position : POSITION; float2 tex:TEXCOORD0; float3 normal:NORMAL; }; struct PixelInputType { float4 position : SV_POSITION; float2 tex:TEXCOORD0; float3 normal:NORMAL; }; struct coords { float x,y,z; }; [maxvertexcount(6 * SEGMENTS+(2*(3* (SEGMENTS-2))))]

标签: visual-c++ directx-11 hlsl geometry-shader


【解决方案1】:

这是 Direct3D specification 中几何着色器的已知限制之一。 第 13.3 节几何着色器输出

几何着色器必须声明着色器调用将输出的最大顶点数。几何着色器调用可以产生的数据总量是 1024 32 位 值。具有一个或多个流的流输出记录的计算如下:假设每个流在其自己的完整输出寄存器集的全新视图中声明其输出,总输出记录大小是联合中的标量数所有流声明。此大小乘以最大输出顶点数不得超过 1024。使用几何着色器实例化时,流输出记录大小限制分别适用于每个实例

d3d11.h 标头中声明了许多此类常量:

#define D3D11_GS_INPUT_REGISTER_COUNT   ( 32 )

#define D3D11_REQ_GS_INVOCATION_32BIT_OUTPUT_COMPONENT_LIMIT    ( 1024 )

这些适用于功能级别 11.0 Direct3D 硬件。 Direct3D 硬件功能级别 10.0 的限制位于 d3d10.h 标头中。主要是 #define D3D10_GS_INPUT_REGISTER_COUNT ( 16 )#define D3D11_GS_OUTPUT_REGISTER_COUNT ( 32 )

总体限制仍然是每次调用 1024 个 32 位值:D3D10_REQ_GS_INVOCATION_32BIT_OUTPUT_COMPONENT_LIMIT ( 1024 )

【讨论】:

  • 但是如果我需要更多的输出顶点标量,即 >1024,那有什么替代方案呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 2018-05-13
  • 2018-06-22
  • 2016-01-01
  • 2012-04-26
  • 1970-01-01
相关资源
最近更新 更多