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;
}
}
ご覧のとおり、文字列の連結と数値から文字列への変換を行う必要があるため、おそらくオーバーヘッドが追加されます。このデータをシェーダーに渡すより効率的な方法はありますか?