简体   繁体   English

是否可以使用变换反馈来检索由 OpenGL 顶点几何着色器生成的三角形?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM