我有一个用 C++ 和 OpenGL 4.x 编写的 3d 渲染器我有一个工作正常的前向照明系统。但我认为如何优化它,因为我相信我的瓶颈是我在客户端打包灯光参数的方式。
在片段着色器中,我有一个 Light 结构数组,如下所示:
#define numLights 10;
struct Light {
int lightType;
vec4 position;
vec4 ambient;
vec4 diffuse;
vec4 specular;
};
uniform Light lights[numLights];
假设我在场景中有 10 盏灯,所以我有一个方法可以填充上面的数组并将其发送到着色器程序:
void LightCollector:: UpdateLights(const GLuint& program)const{
size_t vecSize =_lights.size();
for(size_t i = 0; i <vecSize; ++i) {
if(!_lights[i]->lightDirty) continue;
// set struct array of each light props here
std::string lt=std::string("lights[") + boost::lexical_cast<std::string>(i) + "].lightType";
glUniform1i(glGetUniformLocation(program,lt.c_str ),DIR_LIGHT);
..............
...................
........................
... the same goes for each Light prop in the struct
_lights[i]->lightDirty=false;
}
}
正如人们所看到的,我必须进行字符串连接和数字到字符串的转换,这可能会增加一些开销。有没有更有效的方法将此数据传递给着色器?