2012-01-30 38 views
13

我尝试基于R5的演示实现屏幕空间环境光遮蔽(SSAO),在这里找到:http://blog.nextrevision.com/?p=76OpenGL的GLSL 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) 

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

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

enter image description here

2)实际SSAO实现: 由于原来如上所述可以在这里找到:http://blog.nextrevision.com/?p=76

或更快:上引擎收录http://pastebin.com/KaGEYexK

与此相反的原来我只使用2输入纹理,因为我的纹理之一存储两个,法线作为RGB和线性解构als阿尔法。

我的第二个纹理,随机法线贴图,看起来是这样的: http://www.gamerendering.com/wp-content/uploads/noise.png

我使用几乎一模一样的实现,但我的结果是错误的。

之前细谈我想先明确几个问题:

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; 

正确或错误?

回答

11

你的正常纹理看起来不对。我的猜测是你的vmtInvTranspMatrix是一个模型视图矩阵。但它应该是模型视图投影矩阵(注意你需要屏幕空间法线,而不是查看空间法线)。深度计算是正确的。

我实现SSAO一次,通常的纹理看起来是这样的(注意没有蓝在这里):

screen space normal

1)SSAO着色器使用projectionMatrix和它的逆矩阵。 由于它是通过正交投影呈现在屏幕对齐的四边形上的后处理效果,因此projectionMatrix是正交矩阵。正确还是错误?

如果你的意思是你正在渲染一个quad来计算实际的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)具有组合的正常和深度纹理,而不是两个单独 那些。

不,这不会导致问题。这样做是常见的做法。

+0

谢谢你很多:) – mp87 2012-01-30 16:13:10

+0

因为我还不能回答我自己的文章: 这里是结果:http://i42.tinypic.com/35ceko5.jpg – mp87 2012-01-30 16:19:09