OpenGL GLSL SSAO实现
我尝试基于以下R5演示实现屏幕空间环境光遮挡(SSAO): 事实上,我试图调整他们的SSAO线性着色器,以适应我自己的小引擎 1)我计算视图空间曲面法线和线性深度值。 我使用以下着色器将它们存储在RGBA纹理中: 顶点:OpenGL GLSL SSAO实现,opengl,glsl,ssao,Opengl,Glsl,Ssao,我尝试基于以下R5演示实现屏幕空间环境光遮挡(SSAO): 事实上,我试图调整他们的SSAO线性着色器,以适应我自己的小引擎 1)我计算视图空间曲面法线和线性深度值。 我使用以下着色器将它们存储在RGBA纹理中: 顶点: varNormalVS = normalize(vec3(vmtInvTranspMatrix * vertexNormal)); depth = (modelViewMatrix * vertexPosition).z; depth = (-depth-nearPlane)/
varNormalVS = normalize(vec3(vmtInvTranspMatrix * vertexNormal));
depth = (modelViewMatrix * vertexPosition).z;
depth = (-depth-nearPlane)/(farPlane-nearPlane);
gl_Position = pvmtMatrix * vertexPosition;
片段:
gl_FragColor = vec4(varNormalVS.x,varNormalVS.y,varNormalVS.z,depth)
对于我的线性深度计算,我提到:
对吗?
纹理似乎是正确的,但也许不是
2)SSAO的实际实施:
如上所述,可在此处找到原件:
或更快:粘贴箱上的
与原始纹理不同,我只使用2个输入纹理,因为我的一个纹理同时存储RGB法线和线性深度Alpha
我的第二个纹理,随机法线纹理,如下所示:
我使用几乎完全相同的实现,但我的结果是错误的
在详细讨论之前,我想先澄清一些问题:
1) ssao着色器使用projectionMatrix及其逆矩阵
由于它是通过正交投影渲染到屏幕对齐四边形上的后处理效果,因此projectionMatrix是正交矩阵。对还是错
2) 有一个合并的法线和深度纹理而不是两个分开的纹理
在我看来,这是R5实现和我的实现尝试之间最大的区别。我认为这应该不是一个大问题,但是,由于不同的深度纹理,这是最有可能导致问题
请注意,R5_clipRange看起来像这样
vec4 R5_clipRange = vec4(nearPlane, farPlane, nearPlane * farPlane, farPlane - nearPlane);
原件:
float GetDistance (in vec2 texCoord)
{
//return texture2D(R5_texture0, texCoord).r * R5_clipRange.w;
const vec4 bitSh = vec4(1.0 / 16777216.0, 1.0 / 65535.0, 1.0 / 256.0, 1.0);
return dot(texture2D(R5_texture0, texCoord), bitSh) * R5_clipRange.w;
}
我必须承认我不理解代码片段。我的深度存储在我的纹理的阿尔法中,我认为这样做应该足够了
return texture2D(texSampler0, texCoord).a * R5_clipRange.w;
正确还是错误?您的正常纹理似乎是错误的。我猜您的
vmtinvTransportMatrix
是一个模型视图矩阵。但是,它应该是模型视图投影矩阵(注意,您需要屏幕空间法线,而不是视图空间法线)。深度计算是正确的
我已经实现过一次SSAO,正常纹理如下所示(注意这里没有蓝色):
1) ssao着色器使用projectionMatrix及其逆矩阵。
由于它是通过正交投影渲染到屏幕对齐四边形上的后处理效果,因此projectionMatrix是正交矩阵。对还是错
如果您指的是第二次渲染四边形以计算实际SSAO,则是。可以完全避免正交投影矩阵的乘法。如果渲染[x,y]维度范围为-1到1的屏幕四边形,则可以使用非常简单的顶点着色器:
const vec2 madd=vec2(0.5,0.5);
void main(void)
{
gl_Position = vec4(in_Position, -1.0, 1.0);
texcoord = in_Position.xy * madd + madd;
}
2) 具有结合的法线和深度纹理而不是两个分开的纹理
一个
不,那不会引起问题的。这是一种常见的做法。因为我还不能回答自己的文章:结果如下: