【问题标题】:Is it possible to use transform feedback to retrieve the triangles generated by an OpenGL vertex-geometry shader?是否可以使用变换反馈来检索由 OpenGL 顶点几何着色器生成的三角形?
【发布时间】: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 写入顶点的方式。两者没有区别。这个问题就像问你是否可以在不使用光子的情况下看到某物是什么颜色。

标签: c++ opengl


【解决方案1】:

再次感谢所有 cmets。可以在https://github.com/sjhalayka/opengl_gs_transform_feedback找到工作代码

几何着色器是:

#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();
}

相关的 C++ 代码太长,无法在此处使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多