[英]Is it possible to use transform feedback to retrieve the triangles generated by an OpenGL vertex-geometry shader?
I found a great transform feedback tutorial at: https://open.gl/feedback我在以下位置找到了很棒的转换反馈教程: https://open.gl/feedback
What I want is to be able to read the vertices emitted by the geometry shader, rather than using the geometry shader's out variables.我想要的是能够读取几何着色器发出的顶点,而不是使用几何着色器的输出变量。 I can use the out variables, but it's a bit of a hack.
我可以使用 out 变量,但这有点麻烦。
Is this possible?这可能吗?
The code is:代码是:
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]);
}
Thanks again for all of the comments.再次感谢所有评论。 A working code can be found at https://github.com/sjhalayka/opengl_gs_transform_feedback
可在https://github.com/sjhalayka/opengl_gs_transform_feedback找到工作代码
The geometry shader is:几何着色器是:
#version 430 core
layout (points) in;
layout (triangle_strip) out;
layout (max_vertices = 6) out;
out vec3 vert;
in VS_OUT
{
vec4 position;
} gs_in[];
void main(void)
{
vec3 vertex0 = vec3(1, 2, 3);
vec3 vertex1 = vec3(4, 5, 6);
vec3 vertex2 = vec3(7, 8, 9);
vert = vertex0;
EmitVertex();
vert = vertex1;
EmitVertex();
vert = vertex2;
EmitVertex();
EndPrimitive();
vertex0 = vec3(10, 11, 12);
vertex1 = vec3(13, 14, 15);
vertex2 = vec3(16, 17, 18);
vert = vertex0;
EmitVertex();
vert = vertex1;
EmitVertex();
vert = vertex2;
EmitVertex();
EndPrimitive();
}
The pertinent C++ code is too long to be useful here.相关的 C++ 代码太长,在这里没有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.