我有一个用C ++和OpenGL 4.x编写的3D渲染器我有一个可以正常工作的前照灯系统。但我认为如何优化它,因为我相信我的瓶颈是我在客户端打包灯光的方式。 / p>
在片段着色器中,我有一个像这样的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;
}
}
我可以看到我必须进行字符串连接和数字到字符串转换,这可能会增加一些开销。 是否有更有效的方法将此数据传递给着色器?