在编译使用glslc编译器读取gl_PrimitiveID的glsl片段着色器时,我获得了启用几何功能的spirv-1.0,这在技术上是正确的,正如螺旋规范中所述。Vulkan1.0规范指出,如果启用了geometryShader功能,必须支持几何功能。
因此,我假设,除非启用了geometryShader,否则就不能使用gl_PrimitiveID。具体来说,在gl_PrimitiveID上使用moltenVK是不可能的,因为它不支持这个特性,不是吗?
在我的管道中,我使用gl_PrimitiveID从全局ssbo中获取每个面的数据,并将face呈现为附件以供以后重用。如果没有gl_PrimitiveID,是否有可能达到类似的效果?
发布于 2019-12-29 17:02:11
在某种程度上,生成gl_PrimitiveID的机制似乎是基于使几何着色成为可能的硬件。
OpenGL ES 3.1包含计算着色器,但不包含几何着色器(或镶嵌)。但它没有gl_PrimitiveID。相反,ES3.2包含GS和gl_PrimitiveID。桌面OpenGL 3.1vs.3.2和它的GS功能也是如此。拥有GS和能够识别序列中的原语似乎是同一通用功能的一部分。
在我的管道中,我使用gl_PrimitiveID从全局ssbo中获取每个面的数据,并将face呈现为附件以供以后重用。
没有硬件功能,就没有计算原语计数的通用方法。只有针对具体情况的具体解决办法。
例如,如果您使用三角形列表的非索引呈现,那么您可以使用gl_VertexID / 3来计算一个基本ID。显然,这是一个非常严格的限制,但在这种情况下可以工作。
您还可以为每个顶点提供一个每个顶点的面ID。VS将使用flat插值输出此值。通过仔细地将脸ID与基元拓扑的触发顶点匹配,可以有效地将脸ID分配给脸。这对索引三角形列表最有效,因为您可以更多地使用三角形中的索引顺序,而不是条带。基本上,你必须决定哪个顶点映射到哪个面,并确保该面使用这个顶点作为第一个顶点。
https://computergraphics.stackexchange.com/questions/9449
复制相似问题