小编mp8*_*p87的帖子

OpenGL GLSL SSAO实现

我尝试基于此处的R5演示实现屏幕空间环境光遮挡(SSAO):http://blog.nextrevision.com/?p = 76

事实上,我尝试调整他们的SSAO - 线性着色器以适应我自己的小引擎.

1)我计算View Space曲面法线和线性深度值. 我使用以下着色器将它们存储在RGBA纹理中:

顶点:

varNormalVS = normalize(vec3(vmtInvTranspMatrix * vertexNormal));
depth = (modelViewMatrix * vertexPosition).z;
depth = (-depth-nearPlane)/(farPlane-nearPlane);
gl_Position = pvmtMatrix * vertexPosition;
Run Code Online (Sandbox Code Playgroud)

分段:

gl_FragColor = vec4(varNormalVS.x,varNormalVS.y,varNormalVS.z,depth)
Run Code Online (Sandbox Code Playgroud)

对于我的线性深度计算,我提到:http://www.gamerendering.com/2008/09/28/linear-depth-texture/

这是对的吗?纹理似乎是正确的,但也许不是吗?

在此输入图像描述

2)实际的SSAO实施: 如上所述,原文可以在这里找到:http://blog.nextrevision.com/?p = 76

或更快:在pastebin http://pastebin.com/KaGEYexK上

与原始相比,我只使用2个输入纹理,因为我的一个纹理存储了两个,法线为RGB和线性Depht als Alpha.

我的第二个纹理,即随机正常纹理,如下所示:http: //www.gamerendering.com/wp-content/uploads/noise.png

我使用几乎完全相同的实现,但我的结果是错误的.

在详细介绍之前,我想首先澄清一些问题:

1)ssao着色器使用projectionMatrix和它的逆矩阵.

由于它是通过正投影渲染到对准四边形的屏幕上的后处理效果,因此投影矩阵是正交矩阵.正确还是错?

2)具有组合的法线和深度纹理而不是两个单独的纹理.

在我看来,这是R5实现和我的实现尝试之间的最大区别.我认为这不应该是一个大问题,但是,由于不同的深度纹理,这最有可能导致问题.

请注意,R5_clipRange看起来像这样

vec4 R5_clipRange = vec4(nearPlane, farPlane, nearPlane * farPlane, farPlane - nearPlane);
Run Code Online (Sandbox Code Playgroud)

原版的:

float GetDistance (in vec2 …
Run Code Online (Sandbox Code Playgroud)

opengl glsl ssao

13
推荐指数
1
解决办法
1万
查看次数

标签 统计

glsl ×1

opengl ×1

ssao ×1