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