我使用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 3.x。未扩展的变换反馈恰好有两种方式将变量输出到缓冲区:要么全部进入同一个缓冲区(交错),要么全部进入不同的缓冲区(单独)。
其他任何东西都需要更高的 GL 版本/扩展。
将输出变量放入接口块中不会影响变换反馈的运行方式。
glTransformFeedbackVaryings
获取输出变量的名称,coords_out
不命名变量。它命名一个接口块。 coords_out.c0
命名输出变量。