Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL GLSL SSAO实现_Opengl_Glsl_Ssao - Fatal编程技术网

OpenGL GLSL SSAO实现

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)/

我尝试基于以下R5演示实现屏幕空间环境光遮挡(SSAO):

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

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

顶点:

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) 具有结合的法线和深度纹理而不是两个分开的纹理 一个


不,那不会引起问题的。这是一种常见的做法。

因为我还不能回答自己的文章:结果如下: