SSAO随相机角度发生巨大变化

太空人1701

我一直在OpenGL中使用SSAO。我决定从OpenGL中的教程中为我的延迟渲染器实现SSAO 不幸的是,我一直无法正常工作。被SSAO变暗的区域根据相机的位置而变化很大。我知道当相机移动时,SSAO的输出可能会有一些变化,但这比我在其他SSAO实现中观察到的要大得多。

这是片段着色器代码

void main() {

    vec3 origin = positionFromDepth(texture2D(gDepth, samplePosition));
    vec3 normal = texture2D(gNormal, samplePosition).xyz; //multiplying this 
//by 2 and subtracting 1 doesn't seem to help
    vec2 random = getRandom(samplePosition);

    float radius = uRadius/origin.z;
    float occlusion = 0.0;
    int iterations = samples/4;

    for (int i = 0; i<iterations; i++) {
        vec2 coord1 = reflect(kernel[i], random)*radius;
        vec2 coord2 = vec2(coord1.x*0.707 - coord1.y*0.707, coord1.x*0.707 + coord1.y*0.707);
        occlusion += occlude(samplePosition, coord1 * 0.25, origin, normal);
        occlusion += occlude(samplePosition, coord2 * 0.50, origin, normal);
        occlusion += occlude(samplePosition, coord1 * 0.75, origin, normal);
        occlusion += occlude(samplePosition, coord2, origin, normal);
    }

    color = vec4(origin, 1);

}

positionFromDepth()函数:

vec3 positionFromDepth(float depth) {
    float near = frustrumData.x;
    float far = frustrumData.y;
    float right = frustrumData.z;
    float top = frustrumData.w;
    vec2 ndc;           
    vec3 eye;             
    eye.z = near * far / ((depth * (far - near)) - far);
    ndc.x = ((gl_FragCoord.x/buffersize.x) - 0.5) * 2.0; 
    ndc.y = ((gl_FragCoord.y/buffersize.y) - 0.5) * 2.0;
    eye.x = (-ndc.x * eye.z) * right/near;
    eye.y = (-ndc.y * eye.z) * top/near;
    return eye;
}

occlude()功能:

float occlude(vec2 uv, vec2 offsetUV, vec3 origin, vec3 normal) {
    vec3 diff = positionFromDepth(texture2D(gDepth,(uv+offsetUV)))-origin;
    vec3 vec = normalize(diff);
    float dist = length(diff)/scale;
    return max(0.0,dot(normal,vec)-bias)*(1.0/(1.0+dist))*intensity;
}

我觉得问题可能出在positionFromDepth()功能上,除了我在渲染器的照明阶段使用相同的代码外,它可以完美地工作(我认为)。我已经看过这个代码一千遍了,还没有发现任何错误的地方。我试过了各种的价值观biasradiusintenisty,和scale,但似乎并不成为问题。我担心我的法线或位置错误,所以下面是其中的一些屏幕截图:

重构位置:在此处输入图片说明和普通缓冲区:在此处输入图片说明

我会添加一个遮挡缓冲区的图像,但是问题仅在相机移动时才很明显,而图像却无助于显示。

有人知道这是怎么回事吗?

安东·科尔曼(Andon M.Coleman)

奇怪的是,乘以2并减去1对您的法线贴图没有帮助。通常这样做是为了克服与以无符号/标准化纹理格式存储法线有关的问题。除非您的普通G缓冲区是有符号/非规格化格式,否则您可能需要* 0.5 + 0.5在首次写入* 2.0 - 1.0纹理对纹理进行采样时使用来打包和解压缩正常

无论如何,SSAO有多种方法,许多甚至根本不使用表面法线。因此,关于将法线存储在哪个向量空间上的讨论经常被忽略。

我强烈怀疑您的法线是在视野空间中,而不是在世界空间中。如果将法线与顶点着色器中的“法线矩阵”相乘(就像许多教程一样),则法线将在视图空间中。

事实证明,视图空间法线的确没有那么有用,因为如今的后处理效果的数量在使用世界空间法线的情况下效果更好。大多数现代延迟着色引擎(例如,虚幻引擎4,CryEngine 3等)都将常规G缓冲区存储在世界空间中,然后在像素着色器中将其转换为视图空间(如果需要)。


顺便说一句,我包括了一些代码,这些代码用于从传统的深度缓冲区重建对象空间的位置。您似乎正在使用视图空间位置/法线。您可能想尝试对象/世界空间中的所有内容。

平放在mat4 inv_mv_mat;
     在vec2 uv中;

...

浮动linearZ(float z)
{
#ifdef INVERT_NEAR_FAR
  const float f = 2.5;
  const float n = 25000.0;
#别的
  const float f = 25000.0;
  const float n = 2.5;
#万一

  返回n /(f-z *(f-n))* f;
}

vec4
Constructor_pos(以浮动深度为单位)
{
  深度= linearZ(深度);

  vec4 pos = vec4(uv *深度,-depth,1.0); 
  vec4 ret =(inv_mv_mat * pos);

  返回ret / ret.w;
}

在延期着色光照过程的顶点着色器阶段需要一些额外的设置,如下所示:

#version 150核心

在vec4中vtx_pos;
在vec2中vtx_st;

统一的mat4 modelview_mat; //构建G-Buffer时使用的矩阵
统一的mat4 camera_matrix; //用于在视口上拉伸G缓冲区的矩阵

统一浮点buffer_res_x;
统一浮点buffer_res_y;

     出vec2 tex_st;
整理mat4 inv_mv_mat;
     出vec2 uv;


//硬编码45度FOV
// const float fovy = 0.78539818525314331; //下面的行中有NV恶作剧!
// const float fovy =弧度(45.0);
// const float tan_half_fovy = tan(fovy * 0.5);

const float tan_half_fovy = 0.41421356797218323;

      浮动方面= buffer_res_x / buffer_res_y;
      vec2 inv_focal_len = vec2(tan_half_fovy *方面,
                                    tan_half_fovy);

const vec2 uv_scale = vec2(2.0,2.0);
const vec2 uv_translate = vec2(1.0,1.0);


void main(无效)
{
  inv_mv_mat =逆(modelview_mat);
  tex_st = vtx_st;
  gl_Position = camera_matrix * vtx_pos;
  uv =(vtx_st * uv_scale-uv_translate)* inv_focal_len;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

提交到队列后,MPI程序的时间发生了巨大变化

来自分类Dev

是什么导致与8.0.2相比,8.1中的自转发生了巨大变化?

来自分类Dev

响应式Web设计,布局发生了巨大变化

来自分类Dev

提交到队列后,MPI程序的时间发生了巨大变化

来自分类Dev

删除图像后,为什么链接的位置会发生巨大变化?

来自分类Dev

R mtcars 数据集模型选择 - 包含 am 时模型会发生巨大变化

来自分类Dev

拔下笔记本电脑时,亮度和对比度会发生巨大变化

来自分类Dev

Android drawLine的起点随角度变化

来自分类Dev

移动最大变化

来自分类Dev

位置发生重大变化-我们有什么保证?

来自分类Dev

依赖于SOAP API的服务设计会发生很大变化

来自分类Dev

与2011年相比,SQL发生了很大变化吗?

来自分类Dev

自2002年以来,C ++模板标准是否发生了重大变化?

来自分类Dev

为什么线性调频频率的微小变化会导致快速傅立叶变换输出发生重大变化?

来自分类Dev

什么是软件的重大变化?

来自分类Dev

检测数据的重大变化

来自分类Dev

ServiceStack在4.0.22.0中发生重大变化,CredentialsAuthProvider.OnAuthenticated现在返回一些信息

来自分类Dev

GUI 元素随 MS Outlook 11.0 对象库 + Outlook 2016 Ver 1702 发生变化

来自分类Dev

服务中会发生角度变化检测吗?

来自分类Dev

确定斜坡上的重大变化

来自分类Dev

如何解决飞行的重大变化?

来自分类Dev

.net二进制格式化程序反序列化其定义已发生很大变化的对象

来自分类Dev

与C ++ 14相比,C ++ 1z中的第12.3.2节[class.conv.fct] / 1发生了重大变化。是否有意义?

来自分类Dev

为什么我的代码需要这么长时间才能运行,为什么它的运行时会发生重大变化?

来自分类Dev

UITextField光标位置随方向变化而变化

来自分类Dev

角度变化

来自分类Dev

为随相机移动的Libgdx制作UI

来自分类Dev

如何阻止位置光随相机移动

来自分类Dev

AngularJS 1.2和1.4之间有重大变化吗?

Related 相关文章

  1. 1

    提交到队列后,MPI程序的时间发生了巨大变化

  2. 2

    是什么导致与8.0.2相比,8.1中的自转发生了巨大变化?

  3. 3

    响应式Web设计,布局发生了巨大变化

  4. 4

    提交到队列后,MPI程序的时间发生了巨大变化

  5. 5

    删除图像后,为什么链接的位置会发生巨大变化?

  6. 6

    R mtcars 数据集模型选择 - 包含 am 时模型会发生巨大变化

  7. 7

    拔下笔记本电脑时,亮度和对比度会发生巨大变化

  8. 8

    Android drawLine的起点随角度变化

  9. 9

    移动最大变化

  10. 10

    位置发生重大变化-我们有什么保证?

  11. 11

    依赖于SOAP API的服务设计会发生很大变化

  12. 12

    与2011年相比,SQL发生了很大变化吗?

  13. 13

    自2002年以来,C ++模板标准是否发生了重大变化?

  14. 14

    为什么线性调频频率的微小变化会导致快速傅立叶变换输出发生重大变化?

  15. 15

    什么是软件的重大变化?

  16. 16

    检测数据的重大变化

  17. 17

    ServiceStack在4.0.22.0中发生重大变化,CredentialsAuthProvider.OnAuthenticated现在返回一些信息

  18. 18

    GUI 元素随 MS Outlook 11.0 对象库 + Outlook 2016 Ver 1702 发生变化

  19. 19

    服务中会发生角度变化检测吗?

  20. 20

    确定斜坡上的重大变化

  21. 21

    如何解决飞行的重大变化?

  22. 22

    .net二进制格式化程序反序列化其定义已发生很大变化的对象

  23. 23

    与C ++ 14相比,C ++ 1z中的第12.3.2节[class.conv.fct] / 1发生了重大变化。是否有意义?

  24. 24

    为什么我的代码需要这么长时间才能运行,为什么它的运行时会发生重大变化?

  25. 25

    UITextField光标位置随方向变化而变化

  26. 26

    角度变化

  27. 27

    为随相机移动的Libgdx制作UI

  28. 28

    如何阻止位置光随相机移动

  29. 29

    AngularJS 1.2和1.4之间有重大变化吗?

热门标签

归档