在OpenGL3核心配置文件中使用矩阵作为顶点属性

时间:2013-06-27 23:44:55

标签: glsl vbo opengl-3

我在OSX上使用OpenGL3.2 Core Profile。 我想做实例绘图(glDrawArraysInstanced),我为每个实例传递一个矩阵。

我的顶点着色器构建得很好:

#version 150
in mediump vec4 position;
in mediump mat4 trf;
in lowp vec4 rgb;
out lowp vec4 colour;
uniform highp mat4 modelcamviewprojmat;
void main()
{
    mediump vec4 tpos = trf * position;
    gl_Position = modelcamviewprojmat * tpos;
    colour = rgb;
}

'trf'的绑定很顺利:

glBindAttribLocation(program, ATTRIB_TRF, "trf" );

但我怎样才能传递我的数据? glVertexAttribPointer无法传递大于4个浮点数的值。 所以这次调用失败了:

glVertexAttribPointer( ATTRIB_TRF,   16, GL_FLOAT, 0, 16 * sizeof(float), ... );

我怀疑我需要用4次调用glVertexAttribPointer来替换它,每次调用4次浮点数。 但是我可以将什么价值用于'指数'(第一个参赛)?我是否需要使用4个向量属性,并在GLSL顶点着色器中组合四个向量?如果是这样,什么样的GLSL代码实现了这一点?或者我可以使用BindAttribLocation的返回值并对所有行使用val + 0,val + 1,val + 2和val + 3吗?

1 个答案:

答案 0 :(得分:13)

根据this page以及我目前在游戏中实现的硬件实例化,正确的方法是mat4属性占用4个属性位置。你绑定的那个和后面的3个。

int pos = glGetAttribLocation(shader_instancedarrays.program, "transformmatrix");
int pos1 = pos + 0; 
int pos2 = pos + 1; 
int pos3 = pos + 2; 
int pos4 = pos + 3; 
glEnableVertexAttribArray(pos1);
glEnableVertexAttribArray(pos2);
glEnableVertexAttribArray(pos3);
glEnableVertexAttribArray(pos4);
glBindBuffer(GL_ARRAY_BUFFER, VBO_containing_matrices);
glVertexAttribPointer(pos1, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(0));
glVertexAttribPointer(pos2, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(sizeof(float) * 4));
glVertexAttribPointer(pos3, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(sizeof(float) * 8));
glVertexAttribPointer(pos4, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(sizeof(float) * 12));
glVertexAttribDivisor(pos1, 1);
glVertexAttribDivisor(pos2, 1);
glVertexAttribDivisor(pos3, 1);
glVertexAttribDivisor(pos4, 1);