处理多个灯光和GLSL着色器程序
Handling multiple lights and GLSL shader programs
我有一个点光影贴图程序,但在如何控制多灯光场景方面有点迷失。如何设置多个灯光,每个灯光是否都有自己的"深度纹理"?如果是,它们是如何组合在一起以进行场景的最终渲染的(显然,并非所有灯光都会一直处于活动状态)?
当考虑到这一点时,与用于整个场景的深度立方体贴图相比,拥有单独的(小)深度立方体贴图似乎更合乎逻辑(尤其是对于近距离级别,而不是开放式场景),但实现这样的系统只会让我盯着屏幕看。
谢谢。
有很多方法可以实现您想要的。方法取决于你的确切需要。如果使用OpenGL 2.1或更早版本,可以通过启用多个OpenGL灯光来设置多个灯光:
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, <light 0 settings>);
glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT1, <light 1 settings>);
...etc. with up to GL_MAX_LIGHTS lights
例如,如果需要多个GL_MAX_LIGHTS灯光,或者使用OpenGL 3或更高版本,则需要将灯光数据作为统一数据传递到着色器程序中。
当我过去处理阴影时,我会使用每个灯光的深度纹理。
为了组合它们,您通常针对每种光线测试每个片段。如果碎片对灯光可见(即不在阴影中),则添加灯光的贡献。如果碎片处于阴影中(灯光不可见),则不添加该灯光的贡献。
如果您需要数百个灯光或类似的东西,也可以查看"延迟着色"。(另请参阅维基百科上关于延迟着色的条目。)
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- Shaderc在android上调用glsl到spv程序集时崩溃
- 与GLSL相关的OpenGL应用程序代码
- 无法编译由 stdafx.h 引起的 GLSL 程序
- 有没有办法使用 GLSL 程序作为过滤器
- GLSL着色器正在编译,但程序未链接
- 如何从GLSL程序中获得uvec4输出
- 无法链接GLSL程序
- GLSL问题:一个程序中有多个着色器
- GLSL统一访问导致程序故障
- 处理多个灯光和GLSL着色器程序
- GLSL - 程序链接错误:插槽 0 在布局位置请求中不可用