使用GL_SEPARATE_ATTRIBS缓冲区模式的OpenGl变换反馈

wbgh16ku  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(95)

我使用OpenGl的转换反馈(第3版,以保持与macos的兼容性)从其他顶点生成顶点。例如,在这个场景中,生成的顶点至少是源顶点的两倍。顶点也有颜色,但我希望顶点坐标和它们相关的颜色在两个独立的VBO中。
在尝试在着色器中实现颜色之前,计算如下所示:

#version 330 core

in vec3 vertex;

out vec3 v0;
out vec3 v1;

void main()
{
    vec4 var0;
    vec4 var1;

    //Implementation of calculation

    ...

    v0 = vec3(var0.x, var0.y, var0.z);
    v1 = vec3(var1.x, var1.y, var1.z);
}

字符串
而在OpenGl实现中(Java代码):

glTransformFeedbackVaryings(programId, new String[] {"v0","v1"}, GL_INTERLEAVED_ATTRIBS);

...

glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tbo1);


而且效果很好。
但是为了实现颜色,我还没有找到任何可以解释如何配置输出变量及其关联VBO之间的链接的信息。因此,我尝试通过接口块传递输出变量,但它没有传递到着色器编译,并给出以下错误消息(“Could not find transform feedback binding for 'coords_out.”“与“Could not find transform feedback binding for 'colors_out.”“):

#version 330 core

in vec3 vertex;
in int color;

out COORDS_OUT
{
    vec3 v0;
    vec3 v1;
} coords_out;

out COLORS_OUT
{
    int c0;
    int c1;
} colors_out;

void main()
{
    vec4 var0;
    vec4 var1;

    //Implementation of calculation

    ...

    coords_out.v0 = vec3(var0.x, var0.y, var0.z);
    coords_out.v1 = vec3(var1.x, var1.y, var1.z);
    
    colors_out.c0 = color;
    colors_out.c1 = color;
}


而在OpenGl实现中(Java代码):

glTransformFeedbackVaryings(programId, new String[] {"coords_out","colors_out"}, GL_SEPARATE_ATTRIBS);

...

glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tbo1);        
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1, tbo2);


我开始相信我想做的事情是不可能的,同时希望我是错的。

icomxhvb

icomxhvb1#

您使用的是OpenGL 3.x。未扩展的变换反馈有两种方式将变量输出到缓冲区:要么所有变量都进入同一个缓冲区(交错),要么所有变量都进入不同的缓冲区(单独)。
其他任何内容都需要更高的GL版本/扩展。
将输出变量放在接口块中对转换反馈的操作方式没有影响。glTransformFeedbackVaryings采用输出变量的名称,而coords_out不命名变量。它命名接口块。coords_out.c0命名输出变量。

相关问题