Tagged: 

Viewing 4 reply threads
  • Author
    Posts
    • #7716 Score: 0
      Blaze火神
      Participant

      为了消除msaa的黑边,我加上了frame_buf()背景色,然而黑边还在。

      于是我删去了一个像素中需要更新的子像素块数!=0的限制条件,并改变了clear函数上色的值。出现以下两张图,可以看到上层三角形的包围盒直接把下层的遮挡掉了,说明frame_buf中没用储存上一个draw函数中的三角形的颜色。但在set_pixel后面cout的时候是有颜色的,生成两个三角形之间可能调用了clear函数,但在代码中我并没有发现这样的情况,非常困惑。(虽然多半是我一是抽住了,但目前真的不太清楚怎么解决了)

      Attachments:
      You must be logged in to view attached files.
    • #7719 Score: 0
      Blaze火神
      Participant

      以这个点为参考点,奇怪的事情出现了。
      可以看到先经行了rasterizer三角形一次,但没用触发set_pixel函数,说明先画的反而是前一个绿三角形。
      然后后一个三角形画之前固然没颜色(全白),set_pixel之后变蓝色了,然后就一直蓝色了。说明frame_buf是有用的,只是我先入为主地认为先画后一个三角形所以难以理解。

      Attachments:
      You must be logged in to view attached files.
    • #7722 Score: 0
      Blaze火神
      Participant

      破案了,但反而更难受了,这个问题可能是MSAA必然的问题,或者说如果要解决没那么轻松。

      情况是这样的,先画前一个图(离摄像机近的物体)后画后一个图就和出线异色边。
      如图,绿色三角形和像素P(白色大框)的位置关系是这样的。开始MSAA

      首先,画绿三角形的时候身后的蓝色三角形还没画,那么这个处在绿三角形边界的像素P就自然和黑色背景求平均了,于是变成深绿色,同时记录了z-Buffer的值。

      然后画蓝三角形,但如图所见,像素P位置记录的z-Buffer值更小,因此像素P上根本就不进行蓝三角形的绘制,根本不会调用set_pixel函数,更不会去求平均了。而这个像素上之前的颜色是深绿色,之后也不会改变了。

      于是边界出就出现了一条深色线。

      总结以下,因为先画近三角形,所以像素P这个点之会画一次。而在这唯一一次画的时机点,应该成为背景的后三角形还没开始画,并不存在,于是就只能和背景色做平均。这就造成了MSAA的黑边。。。

    • #7723 Score: 0
      Blaze火神
      Participant

      刚刚图忘记发了,补上了

      Attachments:
      You must be logged in to view attached files.
    • #7727 Score: 0
      Blaze火神
      Participant

      花两个小时用一个骚路子解决了先渲染近物体再渲染远物体时出现的黑边。

      大致来说就是用RGB小数点后的数字记录前一个像素的4个子像素在三角形的内的数量,然后特殊化处理前一个三角形的边界,记录成可识别的z-Buffer值(依旧一个非常大的值)

      只是针对作业2这样先渲染近物体的情况的化,可以完美解决。(如图1)然而如果先渲染远物体,又反而不行了,会出现白边。(如图2)

      真实状况就是不知道先渲染啥物体的,所以我的改进其实无用。然后就是黑边和白边的特征完全相同,无法通过边界特殊处理区分,穿模效果可能更不好。归根结底,问题还是z—buffer只做了取最值,而没用做排序,因此感觉可能也无法通过这种方法规避这个问题。

      Attachments:
      You must be logged in to view attached files.
Viewing 4 reply threads
  • You must be logged in to reply to this topic.