【发布时间】:2021-04-03 13:03:44
【问题描述】:
我在以下位置找到了一个很棒的变换反馈教程: https://open.gl/feedback
我想要的是能够读取几何着色器发出的顶点,而不是使用几何着色器的输出变量。我可以使用 out 变量,但这有点小技巧。
这可能吗?
代码是:
const GLchar* vertexShaderSrc = R"glsl(
#version 150 core
in float inValue;
out float geoValue;
void main()
{
geoValue = sqrt(inValue);
}
)glsl";
// Geometry shader
const GLchar* geoShaderSrc = R"glsl(
#version 150 core
layout(points) in;
layout(triangle_strip, max_vertices = 3) out;
in float[] geoValue;
out float outValue;
void main()
{
for (int i = 0; i < 3; i++) {
outValue = geoValue[0] + i;
EmitVertex();
}
EndPrimitive();
}
)glsl";
...
// Create query object to collect info
GLuint query;
glGenQueries(1, &query);
// Perform feedback transform
glEnable(GL_RASTERIZER_DISCARD);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tbo);
glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query);
glBeginTransformFeedback(GL_TRIANGLES);
glDrawArrays(GL_POINTS, 0, 5);
glEndTransformFeedback();
glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
glDisable(GL_RASTERIZER_DISCARD);
glFlush();
// Fetch and print results
GLuint primitives;
glGetQueryObjectuiv(query, GL_QUERY_RESULT, &primitives);
GLfloat feedback[15];
glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(feedback), feedback);
printf("%u primitives written!\n\n", primitives);
for (int i = 0; i < 15; i++) {
printf("%f\n", feedback[i]);
}
【问题讨论】:
-
the vertices emitted by the geometry shader, rather than using the geometry shader's out variables您认为读取输出值和获取发出的 vetices 之间的区别是什么? -
@shawn_halayka 输出被写入Transform Feedback Buffer。这是“简单”的溃败,没有捷径。哪些“额外变量”?
-
except that it doesn't read the primitives directly在您询问顶点的问题中,现在您谈论基元。目前还不清楚你想要实现什么。直接穿线是什么意思?在您看来,什么比读取几何着色器的输出值更直接? -
@shawn_halayka “如果你不知道你能不能做到,那也没关系。” - 我们不在这里猜测。我们知道这是不可能的。我们只是试图找出您想要实现的目标。
-
@shawn_halayka:这个问题毫无意义。 GS 的输出变量定义 GS 发射的顶点。写入输出变量是 GS 写入顶点的方式。两者没有区别。这个问题就像问你是否可以在不使用光子的情况下看到某物是什么颜色。