DirectX 11编译Geometry Shader报错X3514缺少最大顶点计数如何解决
错误X3514根因
DirectX的HLSL几何着色器强制要求显式声明最大输出顶点数、输入图元类型、输出图元类型三类属性,你当前代码缺少这些声明,且几何着色器的函数签名规则和顶点/像素着色器不同,不能直接单入单出。
修复后的完整着色器代码
//////////////////////////////////////////////////////////////////////////////// // Filename: light.gs //////////////////////////////////////////////////////////////////////////////// ////////////// // TYPEDEFS // ////////////// struct GeometryInputType { float4 position : POSITION; float2 tex : TEXCOORD0; float3 normal : NORMAL; }; struct PixelInputType { float4 position : SV_POSITION; float2 tex : TEXCOORD0; float3 normal : NORMAL; }; //////////////////////////////////////////////////////////////////////////////// // Geometry Shader //////////////////////////////////////////////////////////////////////////////// // 声明单个GS实例最多输出3个顶点(和输入三角形顶点数一致,满足直通场景需求) [maxvertexcount(3)] void LightGeometryShader( // 声明输入图元为三角形,对应输入是长度为3的顶点数组 triangle GeometryInputType input[3], // 声明输出为三角形流,输出顶点格式为PixelInputType inout TriangleStream<PixelInputType> OutputStream ) { PixelInputType output; // 原样输出输入的3个顶点,实现直通逻辑 for(uint i = 0; i < 3; ++i) { output.position = input[i].position; output.tex = input[i].tex; output.normal = input[i].normal; OutputStream.Append(output); } // 输出完一个三角形后重启条带 OutputStream.RestartStrip(); }
核心配置说明
[maxvertexcount(N)]:报错要求的必填属性,N根据你的业务逻辑设置,如果你需要对每个输入三角形额外生成顶点,就把N改成对应最大值即可,例如做法线可视化需要每个三角形生成6个顶点展示法线,就填6。- 输入图元前缀:可选值包括
point(点,输入数组长度1)、line(线,输入数组长度2)、triangle(三角形,输入数组长度3)等,和输入装配阶段的图元拓扑对应即可。 - 输出流类型:如果输出线就用
LineStream,输出点就用PointStream,输出三角形就用TriangleStream。
内容的提问来源于stack exchange,提问作者Mi Po
相关产品推荐
相关产品推荐

