我在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)
| 归档时间: |
|
| 查看次数: |
5088 次 |
| 最近记录: |