Viewing 5 reply threads
  • Author
    Posts
    • #6816 Score: 0
      UkonnRa
      Participant

      在考虑 SSAA 的时候,作业中说:“对于像素内的每一个样本都需要维护它自己的深度值,即每一个像素都需要维护一个 sample list”。但我想是否可以在 set_pixel 之前进行 SSAA 的计算呢?

      比如当没有 SSAA 的时候,若点的 z 较小,则显示:

      
      if (point.z() < depth_buf[depth_ind]) {
        depth_buf[depth_ind] = point.z();
        set_pixel(point, t.getColor());
      }
      

      当 SSAA 的时候:

      
      if (point.z() < depth_buf[depth_ind]) {
        depth_buf[depth_ind] = point.z();
      
        // Without SSAA:
        // set_pixel(point, t.getColor());
      
        int count = 0;
      
        // 已有 auto steps = std::array{0.25f, 0.75f};
        for (auto delta_x: steps) {
          for (auto delta_y: steps) {
            float x = raw_x + delta_x;
            float y = raw_y + delta_y;
            if (insideTriangle(x, y, t.v)) {
              count ++;
            }
          }
        }
        float percent = std::min(1.0f, 1.0f * count / (steps.size() * steps.size()));
        set_pixel(point, percent * t.getColor());
      }
      

      没有理解 维护一个 sample list 之后应该怎么复用里面的数据?即使把每个超采样点的深度缓存起来了,也没有什么用吧。

      • This topic was modified 1 year, 6 months ago by UkonnRa.
    • #6890 Score: 0
      jadehare
      Participant

      照我的理解是目前的两个平面三角形上采样点的深度值没什么用处,采样点的深度值和像素的深度值是一致的。但是在两个相交的三角形上记录深度值可以得出每个采样点的颜色情况,再取几个采样点的均值算出像素的颜色。

    • #7018 Score: 0
      oxine
      Participant
      6 pts

      是这样的,你一个像素拆四个像素,这四个像素的深度值不一定一样啊,三角形又不是永远正对着你,你要做下差值再运算的

    • #7019 Score: 0
      oxine
      Participant
      6 pts

      你这样理解,ssaa就是个暴力法,4xssaa就是像素x4,其他流程不变,最后做个平均

    • #7114 Score: 0
      decay
      Participant

      我和你碰到了类似的问题,我想了很久也想不出怎么只靠深度buffer的sample list就得出一个像素点的各采样点颜色信息(因为这些采样点很属于多个深度不同的三角形),我最后的解法是把frame_buffer也给扩充,每个像素维护一个sample list

    • #7687 Score: 0
      白菊花瓣
      Participant

      我是这么做的:
      将深度缓存扩大 4 倍,这样每个采样点都可以保存深度和进行深度测试
      创建一个比 帧缓存大 4 倍的 临时缓存
      然后对每个采样点进行 是否在三角形内部的判断 和 深度测试,通过的写入深度缓存 并把 颜色存入 临时缓存。
      像素都操作完毕后,再进行一次后处理操作,再次遍历所有像素,从 临时缓存中拿到 4 个采样点的颜色 进行混合(这一步存在大量无效操作,如果能只在三角形边缘进行混合操作就好了)。因为如果采样点的颜色混合在第一次遍历像素时就进行,那么在绘制第一个三角形时,在两个三角形的交界处,由于另一个三角形还没有绘制出来,所以在交界处会出现 与背景的黑色进行混合,从而产生黑边。
      所以需要一个 sample list(在这里我相当于把它拆成了 temp_frame_buffer 和 depth_buffer) 来存储采样点的信息,并在最后做混合。
      从深度测试的角度来看,如果一个像素内四个采样点的深度都设为一个值,那么同样在两个三角形交界处会有问题,位于后面的三角形 本来应该有采样点要通过深度测试 却会被 前面的三角形的一整块像素给遮挡,导致混合结果不正确。

Viewing 5 reply threads
  • You must be logged in to reply to this topic.