Home › Forums › GAMES在线课程(现代计算机图形学入门)讨论区 › 两个三角形的覆盖次序问题
Tagged: triangle order
- This topic has 21 replies, 12 voices, and was last updated 4 years, 2 months ago by AIWhu.
-
AuthorPosts
-
-
可能是没有维护depth_Buffer,渲染的时候先渲染近的,再渲染远的object;导致远的物体覆盖在近的物体之上,最终结果和逻辑就相反了(不过实际上渲染器渲染第一个物体好像是随机的)
This post has received 1 vote up. -
我的三角形也是这样…不知道为什么。
-
你的最后处理好了吗?
-
-
我之前也出现过这个问题,我测试了代码的其他地方,发现rasterizer.cpp中//Viewport transformation注释下的vert.z() = vert.z() * f1 + f2;
我反正把这句话注释掉,然后在与z-buffer判断前把z取反变成正的,这是z越小,离镜头就越近,就正确了。 -
AbyssParticipant
这句话注不注释没关系,你这里transform完的本质上是延-z方向的值,也就是越靠近相机值越大,所以只要在z-buffer判断的地方取反代表越靠近越小就行了(无论正负都无所谓,上面f1,f2的修正只是同比放大+便宜,不影响大小关系)。其实都不取反,zbuffer取大值,初始化成-inf也行,只是不太符合常规。
This post has received 2 votes up. -
bc13900Participant
我认为你这个结果没有错,不出意外的话你作业1的三角形应该是向下的,你套用了作业1的透视投影矩阵。你是不是把main函数里n和f改为负了,如果改了的话就是关于原点对称了(如果没改,结果应该是向下,但压盖顺序是对的)。
-
现在main函数里是正的,三角形向下,但是压盖顺序还是错的。实在很难懂。。。
This post has received 1 vote down.
-
-
仔细看了看源码解决了,其实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.-
我改了,也没有用。。
-
楼上说的是对的,或者你可以尝试改你的projection matrix,根本原因就还是是因为作业文档中的粗体字部分:
请注意我们是如何初始化 depth buffer 和注意 z values 的符号。为了方便 同学们写代码,我们将 z 进行了反转,保证都是正数,并且越大表示离视点越远
-
修正
发现是我自己的projection matrix 有一点符号问题,o(╯□╰)o
按照代码生成的的确就是这样的顺序
-
-
-
我按照这个层主的方法改了,然后结果和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.
-
-
代码里应该是没有对z进行翻转,目前应该依然是z越小,深度越深。
-
这楼咋没有助教回复呢???我的更奇葩
Attachments:
You must be logged in to view attached files.-
-
插入链接总是失败。。直接复制试试
-
-
这个源代码不是按照右手系来写的吗?。。那就按照右手系来规定z-buffer呗。。为啥还搞了个z反转。。。
-
matrixParticipant
我碰到了跟你一样的问题,主要是左右手坐标系的问题。我改了两个地方,一个是depth_buffer的初始化问题,应该初始化为负无穷大。二是投影矩阵,将投影矩阵改为右手系,即opengl投影矩阵。
-
老哥你是对的。谢谢~
-
AIWhuParticipant
老哥你怎么改的,我和你一模一样的结果
-
-
-
AuthorPosts
- You must be logged in to reply to this topic.