我使用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);
型
我开始相信我想做的事情是不可能的,同时希望我是错的。
1条答案
按热度按时间icomxhvb1#
您使用的是OpenGL 3.x。未扩展的变换反馈有两种方式将变量输出到缓冲区:要么所有变量都进入同一个缓冲区(交错),要么所有变量都进入不同的缓冲区(单独)。
其他任何内容都需要更高的GL版本/扩展。
将输出变量放在接口块中对转换反馈的操作方式没有影响。
glTransformFeedbackVaryings
采用输出变量的名称,而coords_out
不命名变量。它命名接口块。coords_out.c0
命名输出变量。