TES阶段如何识别当前顶点的ID?
How to identify the ID of the current vertex during the TES stage?
我正在沿着管道发送一个三角形,并希望将其镶嵌成一个 sierpinski 垫圈。感觉使用几何着色器的实例化会容易得多,因此请告诉我使用曲面细分着色器的想法是否完全错误。
在曲面细分控制期间,我根据 0-11
检查 ID 并将顶点位置和颜色存储在当前 ID 的位置。
我为我的曲面细分控制着色器定义了 glPatchParameteri(GL_PATCH_VERTICES, 3);
和 layout(vertices = 12) out;
,因为我希望每个三角形细分为 4 个三角形。
在我的曲面细分评估着色器中,in vec3 tcPosition[];
和 in vec3 tcColor[];
数组似乎包含正确顺序的正确 12
值。但是:如何在评估期间正确关联它们?镶嵌评估期间是否有类似 gl_primitiveID
的内容?我需要替换 gl_primitiveID
,即所有生成的顶点的 0
,因为它们是从同一个补丁生成的。目前我只使用前三个顶点的信息(0
、1
、2
),但我需要在每个生成的三角形后将这些索引移动 3。
void main(){
vec3 p0 = gl_TessCoord.x * tcPosition[0];
vec3 p1 = gl_TessCoord.y * tcPosition[1];
vec3 p2 = gl_TessCoord.z * tcPosition[2];
tePosition = p0 + p1 + p2;
teColor = gl_TessCoord.x * tcColor[0] + gl_TessCoord.y * tcColor[1] + gl_TessCoord.z * tcColor[2];
gl_Position = mvp * vec4(tePosition, 1);
}
非常感谢任何关于如何巧妙地细分三角形以便我以后能够使用变换反馈进行乒乓渲染的见解或想法。
I am sending a triangle down the pipeline and want to tessellate it into an sierpinski gasket.
停止。你不能那样做。
三角形镶嵌不是以允许您生成的方式完成的。 旨在使边连接起来更容易。它还旨在使自适应和平滑的曲面细分成为可能。
Sierpinski triangles 没有这些属性。
如果您需要对镶嵌的确切方式进行如此严格的控制,我建议在 CPU 上进行镶嵌。 GS 无法足够精细地镶嵌三角形;大多数 OpenGL 实现不允许 GS 输出那么多三角形,即使 geometry shader instancing.
关于您问题的具体情况:
I define glPatchParameteri(GL_PATCH_VERTICES, 3);
and layout(vertices = 12) out; for my tesselation control shader as I want each triangle tesselated into 4 triangles.
曲面细分不是这样工作的。
每个达到 tessellation primitive generator(TCS 之后的步骤)的补丁,无论它有多少个顶点,都被认为是要细分的 单个基元 。你的 TCS 在一个补丁中输出 12 个顶点,但补丁本身仍然是一个三角形。
允许您控制顶点的数量允许您定义 "vertex" 对您的曲面细分算法意味着什么。例如,一个贝塞尔曲面有 16 个 控制点 个顶点,但它仍然是一个四边形。这允许基于贝塞尔曲线的 TES 在生成顶点位置时将所有 16 个控制点作为输入。
此外,根据询问您得到了多少 三角形 ,曲面细分不起作用。它根据您想要的 细分 程度来工作。这就是外部和内部细分级别定义的内容:三角形的边缘将被细分成的段数。
However: How do I associate them correctly during evaluation?
TES 的输入与 TCS 写入的相同的值。同样的顺序。
镶嵌的工作方式是被镶嵌的不是 您的顶点 由 TCS 编写。被镶嵌的是 abstract patch。曲面细分图元生成器针对抽象补丁生成 "vertices"。
gl_TessCoord
允许您检测特定 TES 调用在抽象补丁中的 位置。然后,您将其与 TCS 的输出数据(作为 TES 的输入)相结合,以生成该坐标所需的每个顶点值。
I would need a replacement for gl_primitiveID which is 0 for all generated vertices as they are spawned from the same patch.
它已经做到了。 gl_PrimitiveID
对于单个补丁中的每个 TES 调用都是相同的。
我正在沿着管道发送一个三角形,并希望将其镶嵌成一个 sierpinski 垫圈。感觉使用几何着色器的实例化会容易得多,因此请告诉我使用曲面细分着色器的想法是否完全错误。
在曲面细分控制期间,我根据 0-11
检查 ID 并将顶点位置和颜色存储在当前 ID 的位置。
我为我的曲面细分控制着色器定义了 glPatchParameteri(GL_PATCH_VERTICES, 3);
和 layout(vertices = 12) out;
,因为我希望每个三角形细分为 4 个三角形。
在我的曲面细分评估着色器中,in vec3 tcPosition[];
和 in vec3 tcColor[];
数组似乎包含正确顺序的正确 12
值。但是:如何在评估期间正确关联它们?镶嵌评估期间是否有类似 gl_primitiveID
的内容?我需要替换 gl_primitiveID
,即所有生成的顶点的 0
,因为它们是从同一个补丁生成的。目前我只使用前三个顶点的信息(0
、1
、2
),但我需要在每个生成的三角形后将这些索引移动 3。
void main(){
vec3 p0 = gl_TessCoord.x * tcPosition[0];
vec3 p1 = gl_TessCoord.y * tcPosition[1];
vec3 p2 = gl_TessCoord.z * tcPosition[2];
tePosition = p0 + p1 + p2;
teColor = gl_TessCoord.x * tcColor[0] + gl_TessCoord.y * tcColor[1] + gl_TessCoord.z * tcColor[2];
gl_Position = mvp * vec4(tePosition, 1);
}
非常感谢任何关于如何巧妙地细分三角形以便我以后能够使用变换反馈进行乒乓渲染的见解或想法。
I am sending a triangle down the pipeline and want to tessellate it into an sierpinski gasket.
停止。你不能那样做。
三角形镶嵌不是以允许您生成的方式完成的。
Sierpinski triangles 没有这些属性。
如果您需要对镶嵌的确切方式进行如此严格的控制,我建议在 CPU 上进行镶嵌。 GS 无法足够精细地镶嵌三角形;大多数 OpenGL 实现不允许 GS 输出那么多三角形,即使 geometry shader instancing.
关于您问题的具体情况:
I define
glPatchParameteri(GL_PATCH_VERTICES, 3);
and layout(vertices = 12) out; for my tesselation control shader as I want each triangle tesselated into 4 triangles.
曲面细分不是这样工作的。
每个达到 tessellation primitive generator(TCS 之后的步骤)的补丁,无论它有多少个顶点,都被认为是要细分的 单个基元 。你的 TCS 在一个补丁中输出 12 个顶点,但补丁本身仍然是一个三角形。
允许您控制顶点的数量允许您定义 "vertex" 对您的曲面细分算法意味着什么。例如,一个贝塞尔曲面有 16 个 控制点 个顶点,但它仍然是一个四边形。这允许基于贝塞尔曲线的 TES 在生成顶点位置时将所有 16 个控制点作为输入。
此外,根据询问您得到了多少 三角形 ,曲面细分不起作用。它根据您想要的 细分 程度来工作。这就是外部和内部细分级别定义的内容:三角形的边缘将被细分成的段数。
However: How do I associate them correctly during evaluation?
TES 的输入与 TCS 写入的相同的值。同样的顺序。
镶嵌的工作方式是被镶嵌的不是 您的顶点 由 TCS 编写。被镶嵌的是 abstract patch。曲面细分图元生成器针对抽象补丁生成 "vertices"。
gl_TessCoord
允许您检测特定 TES 调用在抽象补丁中的 位置。然后,您将其与 TCS 的输出数据(作为 TES 的输入)相结合,以生成该坐标所需的每个顶点值。
I would need a replacement for gl_primitiveID which is 0 for all generated vertices as they are spawned from the same patch.
它已经做到了。 gl_PrimitiveID
对于单个补丁中的每个 TES 调用都是相同的。