我控制片段着色器调用的数量
VkPipelineInputAssemblyStateCreateInfo.topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST
通过将 gl_PointSize 设置为 3 来实现 9 次调用。理想情况下我只需要 8 个,但如果我遇到 9 个,我可以扔掉一个。
现在我需要唯一标识每个调用,以便我可以为每个调用执行不同的逻辑。
vec2 gl_PointCoord 生成 9 个不同的唯一值,这很好,但它们在点与点之间不是相同的值。
例如:
对于第56点
gl_PointCoord[0]:<0.000000,0.000000> gl_PointCoord[1]:<0.333333,0.000000> gl_PointCoord[2]:<0.666667,0.000000> gl_PointCoord[3]:<0.000000,0.333333> gl_PointCoord[4]:<0.000000,0.666667> gl_PointCoord[5]:<0.333333,0.333333> gl_PointCoord[6]:<0.666667,0.333333> gl_PointCoord[7]:<0.333333,0.666667> gl_PointCoord[8]:<0.666667,0.666667>
对于第8点
gl_PointCoord[0]:<0.222656,0.110677> gl_PointCoord[1]:<0.555990,0.110677> gl_PointCoord[2]:<0.222656,0.444010> gl_PointCoord[3]:<0.555990,0.444010> gl_PointCoord[4]:<0.222656,0.777344> gl_PointCoord[5]:<0.555990,0.777344> gl_PointCoord[6]:<0.889323,0.110677> gl_PointCoord[7]:<0.889323,0.444010> gl_PointCoord[8]:<0.889323,0.777344>
如果我能让每个点都相同,那么我就可以测试 8 个独特的位置。
我也尝试过子组,但我无法让 gl_SubgroupInitationID 的范围为 0-7。 例如:
对于第56点
gl_子组调用ID[0]:3 gl_SubgroupInitationID[1] :6 gl_SubgroupInitationID[2] :7 gl_SubgroupInitationID[3] :1 gl_SubgroupInitationID[4] :3 gl_SubgroupInspirationID[5] :4 gl_SubgroupInitationID[6] :5 gl_SubgroupInitationID[7] :6 gl_SubgroupInitationID[8] :7
对于第8点
gl_子组调用ID[0]:18 gl_SubgroupInitationID[1] :19 gl_SubgroupInitationID[2] :20 gl_SubgroupInspirationID[3] :21 gl_SubgroupInitationID[4] :22 gl_SubgroupInitationID[5] :23 gl_SubgroupInitationID[6] :26 gl_SubgroupInitationID[7] :28 gl_SubgroupInitationID[8] :30
任何想法将不胜感激。
如果您希望每个点具有相同的
gl_PointCoord
值集,那么您需要确保您是在相对于像素中心的相同位置从顶点着色器发出点坐标,否则光栅化器样本点将在内部移动重点。
由于几何管道中的浮点舍入,获得相对于像素中心完全相同的值可能并不容易,因此您可能需要一个小的 epsilon 边距来提供一些摆动。