Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenGL4X中为多灯光片段着色器打包数据 我有一个用C++和OpenGL 4。x编写的3D渲染器,我有一个前向照明系统,它可以正常工作。但是我想如何优化它,因为我相信我的瓶颈是我在客户端上安装灯光参数的方式。_C++_Opengl_Glsl - Fatal编程技术网

在OpenGL4X中为多灯光片段着色器打包数据 我有一个用C++和OpenGL 4。x编写的3D渲染器,我有一个前向照明系统,它可以正常工作。但是我想如何优化它,因为我相信我的瓶颈是我在客户端上安装灯光参数的方式。

在OpenGL4X中为多灯光片段着色器打包数据 我有一个用C++和OpenGL 4。x编写的3D渲染器,我有一个前向照明系统,它可以正常工作。但是我想如何优化它,因为我相信我的瓶颈是我在客户端上安装灯光参数的方式。,c++,opengl,glsl,C++,Opengl,Glsl,在片段着色器中,我有一组灯光结构,如下所示: #define numLights 10; struct Light { int lightType; vec4 position; vec4 ambient; vec4 diffuse; vec4 specular; }; uniform Light lights[numLights]; 假设场景中有10个灯光,因此我有一个方法填充上面的阵列并将其发送到着色器程序: void LightCollecto

在片段着色器中,我有一组灯光结构,如下所示:

 #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;
    }
 }
void LightCollector::UpdateLights(const GLuint&program)const{
size\u t vecSize=\u lights.size();
对于(size_t i=0;i lightDirty)继续;
//在此设置每个灯光道具的结构阵列
std::string lt=std::string(“lights[”)+boost::lexical_cast(i)+“].lightType”;
glUniform1i(glGetUniformLocation(程序,lt.c_str),直射光);
..............
...................
........................
…结构中的每个灯光道具也是如此
_lights[i]->lightDirty=false;
}
}
可以看出,我必须进行字符串连接和数字到字符串的转换,这可能会增加一些开销。
是否有更有效的方法将此数据传递给着色器?

供参考:灯光没有环境光、漫反射或镜面反射颜色。除非你认为太阳发出特殊的“环境”光……我不知道你在说什么。关于OpenGL中点光源的每本书都介绍了Ka、Kd、Ks…;)我想他的意思是,有一个“照明模型”,光线发出一种颜色,但材料具有漫反射和镜面反射特性。Ambient当然是一个模糊因子/近似值,比如可以应用于材质或全局环境的光能传递。除此之外,我还有两组参数:灯光(有颜色)和材质。您可以设置一次材质,然后在着色器中迭代灯光。我也有材质道具,对于正在使用的材质,我只传递一次。除了材质颜色外,还需要灯光结构中的道具来调整每个灯光颜色。我实现的灯光模型与通常在3d图形中实现的稍有不同。此外,我的问题有点不同:)