mirror of
https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git
synced 2025-08-23 20:55:27 +08:00
05-09 + Minor tweaks to other sections
This commit is contained in:
@@ -37,9 +37,9 @@ G缓冲(G-buffer)是对所有用来储存光照相关的数据,并在最后的
|
||||
- 所有光源的位置和颜色向量
|
||||
- 玩家或者观察者的位置向量
|
||||
|
||||
有了对这些(每个片段独立的)变量的处置权,我们就能够计算我们很熟悉的(布林-)冯氏光照(Blinn-Phong Lighting)了。光源的位置,颜色,和玩家的观察位置可以通过uniform变量来设置,但是其它变量对于每个对象的片段都是不同的。如果我们能以某种方式传输完全相同的数据到最终的延迟光照处理阶段中,我们就能计算与之前相同的光照效果了,尽管我们只是在渲染一个2D方形的片段。
|
||||
有了这些(逐片段)变量的处置权,我们就能够计算我们很熟悉的(布林-)冯氏光照(Blinn-Phong Lighting)了。光源的位置,颜色,和玩家的观察位置可以通过uniform变量来设置,但是其它变量对于每个对象的片段都是不同的。如果我们能以某种方式传输完全相同的数据到最终的延迟光照处理阶段中,我们就能计算与之前相同的光照效果了,尽管我们只是在渲染一个2D方形的片段。
|
||||
|
||||
OpenGL并没有限制我们能在纹理中能存储的东西,所以现在你应该清楚在一个或多个屏幕大小的纹理中储存所有(对于每个片段独立的)数据并在之后光照处理阶段中使用的可行性了。因为G缓冲纹理将会和光照处理阶段中的2D方形一样大,我们会获得和正向渲染设置完全一样的片段数据,但在光照处理阶段这里是一对一映射。
|
||||
OpenGL并没有限制我们能在纹理中能存储的东西,所以现在你应该清楚在一个或多个屏幕大小的纹理中储存所有逐片段数据并在之后光照处理阶段中使用的可行性了。因为G缓冲纹理将会和光照处理阶段中的2D方形一样大,我们会获得和正向渲染设置完全一样的片段数据,但在光照处理阶段这里是一对一映射。
|
||||
|
||||
整个过程在伪代码中会是这样的:
|
||||
|
||||
@@ -128,9 +128,9 @@ void main()
|
||||
{
|
||||
// 存储第一个G缓冲纹理中的片段位置向量
|
||||
gPosition = FragPos;
|
||||
// 同样存储对每个片段独立的法线到G缓冲中
|
||||
// 同样存储对每个逐片段法线到G缓冲中
|
||||
gNormal = normalize(Normal);
|
||||
// 和漫反射对每个片段独立的颜色
|
||||
// 和漫反射对每个逐片段颜色
|
||||
gAlbedoSpec.rgb = texture(texture_diffuse1, TexCoords).rgb;
|
||||
// 存储镜面强度到gAlbedoSpec的alpha分量
|
||||
gAlbedoSpec.a = texture(texture_specular1, TexCoords).r;
|
||||
@@ -143,7 +143,7 @@ void main()
|
||||
|
||||
请记住,因为有光照计算,所以保证所有变量在一个坐标空间当中至关重要。在这里我们在世界空间中存储(并计算)所有的变量。
|
||||
|
||||
如果我们现在想要渲染一大堆纳米装战士对象到`gBuffer`帧缓冲中,并通过一个一个分别投影它的颜色缓冲到填充屏幕的四边形中尝试将他们显示出来,我们会看到向下面这样的东西:
|
||||
如果我们现在想要渲染一大堆纳米装战士对象到`gBuffer`帧缓冲中,并通过一个一个分别投影它的颜色缓冲到铺屏四边形中尝试将他们显示出来,我们会看到向下面这样的东西:
|
||||
|
||||

|
||||
|
||||
@@ -216,7 +216,7 @@ void main()
|
||||
|
||||
光照处理阶段着色器接受三个uniform纹理,代表G缓冲,它们包含了我们在几何处理阶段储存的所有数据。如果我们现在再使用当前片段的纹理坐标采样这些数据,我们将会获得和之前完全一样的片段值,这就像我们在直接渲染几何体。在片段着色器的一开始,我们通过一个简单的纹理查找从G缓冲纹理中获取了光照相关的变量。注意我们从`gAlbedoSpec`纹理中同时获取了`Albedo`颜色和`Spqcular`强度。
|
||||
|
||||
因为我们现在已经有了必要的(每个片段独立的)变量(和相关的uniform变量)来计算布林-冯氏光照(Blinn-Phong Lighting),我们不需要对光照代码做任何修改了。我们在延迟着色法中唯一需要改的就是获取光照输入变量的方法。
|
||||
因为我们现在已经有了必要的逐片段变量(和相关的uniform变量)来计算布林-冯氏光照(Blinn-Phong Lighting),我们不需要对光照代码做任何修改了。我们在延迟着色法中唯一需要改的就是获取光照输入变量的方法。
|
||||
|
||||
运行一个包含32个小光源的简单Demo会是像这样子的:
|
||||
|
||||
|
Reference in New Issue
Block a user