gpt4 book ai didi

glsl - 在 OpenGL3 Core Profile 中使用矩阵作为顶点属性

转载 作者:行者123 更新时间:2023-12-04 10:08:14 24 4
gpt4 key购买 nike

我在 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' 的绑定(bind)很顺利:
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?

最佳答案

根据this page以及我当前在游戏中实现的硬件实例化,正确的做法是 mat4属性占用4个属性位置。您绑定(bind)的那个和下面的 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);

关于glsl - 在 OpenGL3 Core Profile 中使用矩阵作为顶点属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17355051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com