GLSL使用与多个程序相同的布局位置

时间:2015-06-27 00:44:21

标签: c++ opengl glsl

我可以使用以下代码使用多个程序进行渲染:

来自main.cpp

中主循环近端的片段
. . .

glUseProgram( programID1 );

glEnableVertexAttribArray( 0 );
glBindBuffer( GL_ARRAY_BUFFER, vertuvbuffer[0] );
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 20, (void*)0 );
    //only needed XY coordinates for the simple 2D I'm making
glEnableVertexAttribArray( 1 );
glBindBuffer( GL_ARRAY_BUFFER, vertuvbuffer[0] );
glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 20, (void*)8 );
    //the third 'UV' coordinate chooses a tile from my 2d texture array
glDrawArrays( GL_TRIANGLES, 0, sizeof( vertuvbuffer0_data ) / 5 );
    //every vertex takes 5 floats, so to get total number I divide by 5
glDisableVertexAttribArray( 0 );
glDisableVertexAttribArray( 1 );

glUseProgram( programID2 );
glEnableVertexAttribArray( 2 );
glBindBuffer( GL_ARRAY_BUFFER, vertuvbuffer[1] );
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 20, (void*)0 );
glEnableVertexAttribArray( 3 );
glBindBuffer( GL_ARRAY_BUFFER, vertuvbuffer[1] );
glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 20, (void*)8 );
glDrawArrays( GL_TRIANGLES, 0, sizeof( vertuvbuffer1_data ) / 5 );
...
glDisableVertexAttribArray( 2 );
glDisableVertexAttribArray( 3 );

. . .

这显然是在不同着色器内部使用单独的布局,我遇到的麻烦就是尝试这样做:

. . .

glUseProgram( programID1 );

glEnableVertexAttribArray( 0 );
glBindBuffer( GL_ARRAY_BUFFER, vertuvbuffer[0] );
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 20, (void*)0 );
glEnableVertexAttribArray( 1 );
glBindBuffer( GL_ARRAY_BUFFER, vertuvbuffer[0] );
glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 20, (void*)8 );
glDrawArrays( GL_TRIANGLES, 0, sizeof( vertuvbuffer0_data ) / 5 );
glDisableVertexAttribArray( 0 );
glDisableVertexAttribArray( 1 );

glUseProgram( programID2 );
glEnableVertexAttribArray( 0 );
glBindBuffer( GL_ARRAY_BUFFER, vertuvbuffer[1] );
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 20, (void*)0 );
glEnableVertexAttribArray( 1 );
glBindBuffer( GL_ARRAY_BUFFER, vertuvbuffer[1] );
glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 20, (void*)8 );
glDrawArrays( GL_TRIANGLES, 0, sizeof( vertuvbuffer1_data ) / 5 );
...
glDisableVertexAttribArray( 0 );
glDisableVertexAttribArray( 1 );

. . .

顶点着色器具有各自的布局位置。

我不确定如何实现类似的功能,如果没有办法做到这一点我将不得不为我想要绘制的每个对象编写不同的顶点着色器,我可以'可以想象会出现这种情况。

我希望这是有道理的,那么我现在可以做些什么呢?

修改
在我的代码中挖掘后,我决定重写所有~500行实际代码,这是我的主程序。它完全被破坏了,无法进行拯救,在整个地方混合随意评论,奇怪的行为对我来说根本不起作用。我还选择使用VAO而不是直接使用VBO和glVertexAttribPointer()进行渲染,因为这实际上只适用于我的代码混乱中的单个VAO。现在我可以使用相同的程序/顶点着色器渲染多个VBO(以及几个VAO),这是我想要的行为。

1 个答案:

答案 0 :(得分:0)

使用以下代码:

在着色器创建中链接程序之前:

glBindAttribLocation( ProgramID, 0, "in_Position" );
//0 being the lication in the shader and
//"in_Position" being the name inside the shader

之前"做什么"循环:

. . .
GLuint vao[2];
glGenVertexArrays( 2, vao );

glBindVertexArray( vao[0] );
GLfloat vbo0_data[] = {
//   Positions
    -1.0f, -1.0f,
     1.0f, -1.0f,
     0.0f,  1.0f
}
GLuint vbo[2];
glGenBuffers( 2, vbo );

glBindBuffer( GL_ARRAY_BUFFER, vbo[0] );
glBufferData( GL_ARRAY_BUFFER, sizeof( vbo0_data ), vbo0_data, GL_STATIC_DRAW );

glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );

glEnableVertexAttribArray( 0 );

glBindVertexArray( vao[1] );
GLfloat vbo1_data[] = {
//   Positions
    -1.0f,  1.0f,
     1.0f,  1.0f,
     0.0f, -1.0f
}
glBindBuffer( GL_ARRAY_BUFFER, vbo[1] );
glBufferData( GL_ARRAY_BUFFER, sizeof( vbo1_data ), vbo1_data, GL_STATIC_DRAW );

glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );

glEnableVertexAttribArray( 0 );
. . .

内部绘图循环:

. . .
glClear( GL_COLOR_BUFFER_BIT );

glUseProgram( ProgramID );

glBindVertexArrays( vao[0] );
glDrawArrays( GL_TRIANGLES, 0, 3 );

GlBindVertexArrays( vao[1] );
glDrawArrays( GL_TRIANGLES, 0, 3 );
. . .

直通着色器只是写出半透明的红色,在三角形相交的地方变成纯红色,我知道我可以将VAO放在一个循环中用于绘图但这更像是一个概念证明表明它对我有用。
现在是重写其余代码的繁琐部分......