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

Bra*_*ram 7 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;
}
Run Code Online (Sandbox Code Playgroud)

'trf'的绑定很好:

glBindAttribLocation(program, ATTRIB_TRF, "trf" );
Run Code Online (Sandbox Code Playgroud)

但是我如何传递我的数据呢?glVertexAttribPointer无法传递大于4个浮点数的值.所以这个调用失败了:

glVertexAttribPointer( ATTRIB_TRF,   16, GL_FLOAT, 0, 16 * sizeof(float), ... );
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ani 15

根据这个页面以及我目前在我的游戏中实现的硬件实例化,正确的方法是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);
Run Code Online (Sandbox Code Playgroud)