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

问题描述 投票:0回答:1

我使用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 之间的链接的内容。所以我尝试通过接口块传递输出变量,但它不会传递到着色器编译并给出此错误消息(“无法找到‘coords_out’的转换反馈绑定。”和“无法找到‘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);    

我开始相信我正在尝试做的事情是不可能的,同时希望我错了。

opengl glsl transform-feedback
1个回答
0
投票

您正在使用 OpenGL 3.x。未扩展的变换反馈恰好有两种方式将变量输出到缓冲区:要么全部进入同一个缓冲区(交错),要么全部进入不同的缓冲区(单独)。

其他任何东西都需要更高的 GL 版本/扩展。

将输出变量放入接口块中不会影响变换反馈的运行方式。

glTransformFeedbackVaryings
获取输出变量的名称,
coords_out
不命名变量。它命名一个接口块。
coords_out.c0
命名输出变量

© www.soinside.com 2019 - 2024. All rights reserved.