我尝试基于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/
这是对的吗? 纹理似乎是正确的,但也许它不是?
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;
正确或错误?
谢谢你很多:) – mp87 2012-01-30 16:13:10
因为我还不能回答我自己的文章: 这里是结果:http://i42.tinypic.com/35ceko5.jpg – mp87 2012-01-30 16:19:09