uniform vec3 light[4];在Qt5.12.4中,我该向light赋值?
时间: 2024-09-14 11:16:35 浏览: 35
在Qt5.12.4中,uniform变量`light`是一个可以存储颜色向量的数组,通常用于处理光照效果。在C++中,你需要通过设置`QOpenGLBuffer`来填充这个数组。首先,你需要创建一个缓冲区,然后将颜色向量数据添加到缓冲区中。假设你有四个颜色向量`vec3 color1`, `color2`, `color3`, 和 `color4`,你可以这样做:
```cpp
QOpenGLBuffer vertexBuffer; // 或者根据需求创建其他类型的缓冲区
vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
// 将颜色向量转换为float型数据,因为glUniformfv需要浮点数
const float* colors = {color1.r(), color1.g(), color1.b(),
color2.r(), color2.g(), color2.b(),
color3.r(), color3.g(), color3.b(),
color4.r(), color4.g(), color4.b()};
// 设置缓冲区大小,并上传数据
size_t size = sizeof(float) * 3 * 4; // 因为每个light元素有3个分量,总共有4个
vertexBuffer.allocate(size, colors);
vertexBuffer.bind();
// 绑定到指定位置
shaderProgram.bind();
// 更新 uniforms
int location = glGetUniformLocation(shaderProgram.programId(), "light");
if (location != -1) { // 检查位置是否找到
glUniform1iv(location, 4, (GLint*) vertexBuffer.map()); // 使用映射的缓冲区数据
vertexBuffer.unmap(); // 解绑缓冲区
}
shaderProgram.release();
```
注意,这里的代码假定了`light`在着色器中的索引从0开始,对应于`light[0]`到`light[3]`。记得替换`shaderProgram`为你实际使用的程序对象。
阅读全文