Home Forums GAMES在线课程(现代计算机图形学入门)讨论区 两个三角形的覆盖次序问题

Viewing 10 reply threads
  • Author
    Posts
    • #3288 Score: 2
      Curry
      Participant
      1 pt

      为什么我的效果是这样的呢?大家有知道的嘛?

      This post has received 2 votes up.
      Attachments:
      You must be logged in to view attached files.
    • #3291 Score: 1
      JZZ
      Keymaster
      2 pts

      可能是没有维护depth_Buffer,渲染的时候先渲染近的,再渲染远的object;导致远的物体覆盖在近的物体之上,最终结果和逻辑就相反了(不过实际上渲染器渲染第一个物体好像是随机的)

      This post has received 1 vote up.
    • #3294 Score: 0
      MiaoYu
      Participant
      1 pt

      我的三角形也是这样…不知道为什么。

      • #3335 Score: 0
        Curry
        Participant
        1 pt

        你的最后处理好了吗?

    • #3297 Score: 0
      MrPhD
      Participant
      1 pt

      我之前也出现过这个问题,我测试了代码的其他地方,发现rasterizer.cpp中//Viewport transformation注释下的vert.z() = vert.z() * f1 + f2;
      我反正把这句话注释掉,然后在与z-buffer判断前把z取反变成正的,这是z越小,离镜头就越近,就正确了。

    • #3299 Score: 2
      Abyss
      Participant

      这句话注不注释没关系,你这里transform完的本质上是延-z方向的值,也就是越靠近相机值越大,所以只要在z-buffer判断的地方取反代表越靠近越小就行了(无论正负都无所谓,上面f1,f2的修正只是同比放大+便宜,不影响大小关系)。其实都不取反,zbuffer取大值,初始化成-inf也行,只是不太符合常规。

      This post has received 2 votes up.
    • #3310 Score: 0
      bc13900
      Participant

      我认为你这个结果没有错,不出意外的话你作业1的三角形应该是向下的,你套用了作业1的透视投影矩阵。你是不是把main函数里n和f改为负了,如果改了的话就是关于原点对称了(如果没改,结果应该是向下,但压盖顺序是对的)。

      • #3332 Score: -1
        Curry
        Participant
        1 pt

        现在main函数里是正的,三角形向下,但是压盖顺序还是错的。实在很难懂。。。

        This post has received 1 vote down.
    • #3328 Score: 2
      戴皓天
      Participant
      9 pts

      仔细看了看源码解决了,其实pdf里也讲了,是depth_buff初始化的问题,框架里是初始化成了最大值INF,我们要做的就是把初始化改回负的INF即可,然后深度检测就按部就班,按正常的来,即正常地把z看作是负数

      具体改法:

      1.在rasterizer.cpp的clear函数

      void rst::rasterizer::clear(rst::Buffers buff)
      {
          if ((buff & rst::Buffers::Color) == rst::Buffers::Color)
          {
              std::fill(frame_buf.begin(), frame_buf.end(), Eigen::Vector3f{0, 0, 0});
          }
          if ((buff & rst::Buffers::Depth) == rst::Buffers::Depth)
          {
              std::fill(depth_buf.begin(), depth_buf.end(), std::numeric_limits<float>::infinity());
          }
      }

      改成

      void rst::rasterizer::clear(rst::Buffers buff)
      {
          if ((buff & rst::Buffers::Color) == rst::Buffers::Color)
          {
              std::fill(frame_buf.begin(), frame_buf.end(), Eigen::Vector3f{0, 0, 0});
          }
          if ((buff & rst::Buffers::Depth) == rst::Buffers::Depth)
          {
              std::fill(depth_buf.begin(), depth_buf.end(),,std::numeric_limits<float>::infinity()*(-1.0f));//*这里改动*
          }
      }

      2.在写入z-buffer前的判断应该是:目标像素的当前深度值大于z-buffer里的对应位置的深度->写入z-buffer
      (因为我们这时候是把各点的z值看作是负的来看,当然实际上也是负的,所以z越大越接近摄像机)

      This post has received 2 votes up.
      • This reply was modified 4 years, 8 months ago by 戴皓天.
      • This reply was modified 4 years, 8 months ago by 戴皓天.
      • #3334 Score: 0
        Curry
        Participant
        1 pt

        我改了,也没有用。。

        • #3364 Score: 0
          o_o_o_o_o
          Participant
          -1 pt

          楼上说的是对的,或者你可以尝试改你的projection matrix,根本原因就还是是因为作业文档中的粗体字部分:

          请注意我们是如何初始化 depth buffer 和注意 z values 的符号。为了方便 同学们写代码,我们将 z 进行了反转,保证都是正数,并且越大表示离视点越远

          • #3369 Score: 0
            o_o_o_o_o
            Participant
            -1 pt

            修正

            发现是我自己的projection matrix 有一点符号问题,o(╯□╰)o

            按照代码生成的的确就是这样的顺序

      • #3623 Score: 0
        Keneyr
        Participant
        7 pts

        我按照这个层主的方法改了,然后结果和pdf的图一样了。原理如下:
        把初始化的depth_buf变成了负无穷,然后判断三角形的深度,三角形z_value>depth_buf,写入depth_buf。
        pdf里面,绿色的三角形z=-2,蓝色的三角形z=-5,所以绿色的在蓝色的前面。(没问题)

        但是!!!我觉得pdf说的有问题啊!!!!!:
        我在程序得到中间输出了一下,
        发现经过mvp变换以后,绿色三角形的z=7,蓝色三角形的z=10。
        经过viewport变换以后,绿色三角形的z=50.8,蓝色三角形的z=50.6
        然后pdf的材料说:z值越大表示离视点越远。。。。那50.8>50.6,意思就是绿色离视点远呗?按pdf的意思,应该蓝色在绿色的前面。。

        还有个问题,就是三角形的z值,经过mvp变换以后,不应该就固定了吗?viewport还需要改变
        z值的大小吗??????????????

        Attachments:
        You must be logged in to view attached files.
    • #3383 Score: 0
      sublimation
      Participant
      3 pts

      代码里应该是没有对z进行翻转,目前应该依然是z越小,深度越深。

    • #3604 Score: 0
      Keneyr
      Participant
      7 pts

      这楼咋没有助教回复呢???我的更奇葩

      Attachments:
      You must be logged in to view attached files.
    • #3607 Score: 0
      Keneyr
      Participant
      7 pts

      这个源代码不是按照右手系来写的吗?。。那就按照右手系来规定z-buffer呗。。为啥还搞了个z反转。。。

    • #3622 Score: 0
      matrix
      Participant

      我碰到了跟你一样的问题,主要是左右手坐标系的问题。我改了两个地方,一个是depth_buffer的初始化问题,应该初始化为负无穷大。二是投影矩阵,将投影矩阵改为右手系,即opengl投影矩阵。

      • #3946 Score: 0
        Keneyr
        Participant
        7 pts

        老哥你是对的。谢谢~

        • #7212 Score: 0
          AIWhu
          Participant

          老哥你怎么改的,我和你一模一样的结果

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