OpenGL 4x中多光片段着色器的打包数据

时间:2013-04-01 19:21:05

标签: c++ opengl glsl

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

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

0 个答案:

没有答案