gpt4 book ai didi

opengl - 这是在 OpenGL 中渲染多个灯光的好方法吗?

转载 作者:行者123 更新时间:2023-12-03 19:42:44 27 4
gpt4 key购买 nike

我目前正在按照几个在线教程在 OpenGL 中编写图形渲染器。我最终得到了一个引擎,它有一个渲染管道,它基本上包括使用一个简单的 Phong 着色器渲染一个对象。我的 Phong Shader 有一个基本的顶点着色器,它根据转换和片段着色器修改顶点,看起来像这样:

// PhongFragment.glsl
uniform DirectionalLight dirLight;
...
vec3 calculateDirLight() { /* Calculates Directional Light using the uniform */ }
...
void main() {
gl_FragColor = calculateDirLight();

我的对象的实际绘图如下所示:
// Render a Mesh
bindPhongShader();
setPhongShaderUniform(transform);
setPhongShaderUniform(directionalLight1);
mesh->draw(); // glDrawElements using the Phong Shader

这种技术效果很好,但有一个明显的缺点,除非我使用均匀阵列,否则我只能拥有一个定向光。我可以这样做,但我想看看还有哪些其他解决方案可用(主要是因为我不想在着色器中制作大量灯光的阵列,并且其中大部分都是空的),我偶然发现了这个一个,这似乎效率很低,但我不确定。它基本上涉及每次使用新光源重新绘制网格,如下所示:
// New Render
bindBasicShader(); // just transforms vertices, and sets the frag color to white.
setBasicShaderUniform(transform); // Set transformation uniform
mesh->draw();
// Enable Blending so that all light contributions are added up...
bindDirectionalShader();
setDirectionalShaderUniform(transform); // Set transformation uniform
setDirectionalShaderUniform(directionalLight1);
mesh->draw(); // Draw the mesh using the directionalLight1
setDirectionalShaderUniform(directionalLight2);
mesh->draw(); // Draw the mesh using the directionalLight2
setDirectionalShaderUniform(directionalLight3);
mesh->draw(); // Draw the mesh using the directionalLight3

不过,这对我来说似乎非常低效。我不是一遍又一遍地重绘所有网格几何体吗?我已经实现了这个,它确实给了我我想要的结果,多个定向灯,但帧速率已经大幅下降。这是渲染多个灯光的愚蠢方式,还是与使用着色器统一数组相当?

最佳答案

对于在与主要几何处理相同的着色器中处理光照的前向渲染引擎,唯一真正有效的方法是生成大量着色器,这些着色器可以处理光照下的光源、光数和 Material 的各种组合.

在您的情况下,您将有一个用于 1 个灯的着色器,一个用于 2 个灯,一个用于 3 个灯等。就着色器数量而言,这是一个组合噩梦,但您真的不想多次发送所有网格(特别是如果您正在为移动设备编写游戏 - 几何图形占用的带宽非常大,并且会消耗电池电量)。

另一种常见的方法是延迟照明方案。这些方案将反照率、法线、 Material 属性等存储到“几何缓冲区”(例如一组多渲染目标 FBO 附件)中,然后在事后应用照明作为一组后处理操作。复杂几何体被发送一次,结果数据作为一组纹理数据存储在 MRT+深度渲染目标中。然后将光照作为一组基本几何体(通常是球体或 2D 四边形)应用,使用深度纹理作为裁剪和剔除光源的手段,并使用其他 MRT 附件来计算光照强度和颜色。对于 SO 帖子来说,这是一个很长的主题 - 但网上有很多来自 GDC 和 Sigraph 的优秀演示文稿。

这里概述的基本思想:

https://en.wikipedia.org/wiki/Deferred_shading

关于opengl - 这是在 OpenGL 中渲染多个灯光的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41094452/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com