0

我有一个用 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;
    }
 }

正如人们所看到的,我必须进行字符串连接和数字到字符串的转换,这可能会增加一些开销。有没有更有效的方法将此数据传递给着色器?

4

0 回答 0