Forum Replies Created
-
AuthorPosts
-
Fragment应该就是光栅化着色的函数吧。
看起来像是在着色的时候,frame_buffer的index没有算对。
你的正交投影矩阵,orth1的(3,3)位置应该是1,否则齐次坐标最后一项变为0.
变换完了以后,还需要将齐次坐标的最后一项变为1。然后就一样了。
插入链接总是失败。。直接复制试试
楼上说的是对的,pixel_color 更新的那行从深度的判断条件里移出来。
原因是,即使当前亚像素的深度是比之前的图形深度“深”,同样也需要对当前像素的最终颜色做出贡献,加上之前的颜色。多谢你的资料,我觉得很有道理,MSAA的确可以这样优化,而且优化力度很大。从算法的角度来看,这可以说是,将静态空间O(H*W*4),进行了优化,改为动态的空间维护。
不过关于“这也就是MSAA与超采样的区别,MSAA里,每个像素只有一次深度和颜色采样(或说光照计算),而超采样需要per sub-pixel都做颜色和深度采样。体现在代码中,应该是per pixel只有一次getColor和compute_z。”
这里我觉得还是需要进行每个亚像素的采样的,我的采样表示需要计算深度和颜色,否则如何处理融合的颜色呢?在你的配图中,也是计算了每个亚像素的颜色和深度的。或者,我们只需要沿着每个图形的边界扫一边,然后维护一下。其余地方,计算单个像素即可。
这是两种解决方案。
不正常,应该只是进行了旋转
大概率是大小不匹配的矩阵矩阵/矩阵向量/向量向量相乘了。
关于投影矩阵的函数,目前看到有两个问题,在求进行缩放变换的矩阵时,1.应该要取绝对值。2.对y的缩放的那一项,1/(tan(alpha/2)*zNear),括号的位置加错了。
这样做是有问题的。
如果是在边界之前的颜色应该会混合有黑色,但是如果新加入的图形将黑色挡住,那么应该不再混有之前的黑色了。如果这里也维护一下,我觉得也可以实现。不过我觉得比较麻烦,如果有三、四种颜色混合(三个不同颜色图形+黑色),就不太容易维护了。ps:k要/4
This post has received 1 vote up.- This reply was modified 4 years, 8 months ago by sublimation.
C++里面的逗号表达式不能这样用,你可以用连等
可能不太正确,交界处的黑色有点奇怪。这里应该融合两个三角形的颜色。
明白了,感谢耐心解释。^^
我觉得这个错误看起来像是判断像素是否在三角形内部的函数出了问题?
可否分享一下之前的错误?是代码实现的问题吗?因为一直在关注你的这个问题。我用了同样的做法却没有出现这个黑边,但是我觉得你的分析有点道理。不过多个颜色平均以后应该没有变深?谢谢啦~
- This reply was modified 4 years, 8 months ago by sublimation.
噗,不好意思我误解了你的意思。只挂在硬盘可能不太容易,你需要一个可以管理环境的东西,这就不太会了,不好意思啦。可能可以试试docker?
好的好的,谢谢啦~辛苦了!
okok,理解了,十分感谢耐心解答,很清晰。
我同意你的观点,图形学最在意的不是物理上的准则,而是看起来的效果,这才是目的。看起来准确,能“骗人”,那就是正确的。
ps:早晨上课也问了一下老师,老师说后面的课会涉及到~没错,我的理解和推导是这样的!
+1,我的理解也是不在的。而且应该是不符合预期的。
假设n,f为正。将视锥压到长方体的时候,三角形的顶点坐标是在视锥外的,而且是视锥相对在原点的对侧,做了同样的变换后,感觉像是关于原点的小孔成像一样的变换(比例不太一样)。所以,再经过正交投影后可以有图形,我觉得是一个巧合,恰好经过将视锥压到长方体的矩阵计算后,还落在了被压缩的视锥体得到的长方体内,这样才在最后的结果有了成像(假如点在视锥外,z的改变,可能会造成变换后不在这个长方体内,可能就看不到了。而且如果这个z是接近于0,那么三角形会非常大,如果趋近于无穷,又会非常小)代码里应该是没有对z进行翻转,目前应该依然是z越小,深度越深。
助教好,我想请教您一下,这里vert.z() = vert.z() * f1 + f2,应该是对z进行了缩放和平移,请问一下翻转的代码在哪里表示呢?就是使得z越大,深度越深的反转。谢谢啦!
我就是这样干的,linux装的virtualbox。从官网直接下的deb安装就行。
参考:https://zhuanlan.zhihu.com/p/80527572请教一下,为什么不考虑着色点到人眼的衰减呢?谢谢啦
哈哈哈,好吧,我现在发现,填完以后需要等一下,好像会好,但是不能太久或太短,否则会出现这个问题。
是的,反复尝试输入了很多次,大概10次,会出现9次错误。
我也是一开始少了绝对值,改为负以后还是朝下,但是我是如Angus同学所说,差在了正交投影的x,y。如果是正交投影的Z方向,应该不会造成x,y关于原点中心对称,他会使得原三角形关于xOy对称。
所以我推测这也就解释了,为什么一开始你只是修改了”透视->正交变换矩阵 M’ 的最后一行就成为了 (0, 0, -1, 0)”却很合理。
解释一下:
如果直接按照n,f为正计算,有几个地方有问题:
1.将视锥压到长方体的时候,三角形的顶点坐标是在视锥外的,而且是视锥相对在原点的对侧,做了同样的变换后,感觉像是关于原点的小孔成像一样的变换(比例不太一样)。所以,再经过正交投影后可以有图形,我觉得是一个巧合,恰好经过将视锥压到长方体的矩阵计算后,还落在了被压缩的视锥体得到的长方体内,这样才在最后的结果有了成像(假如点在视锥外,z的改变,可能会造成变换后不在这个长方体内,可能就看不到了。而且如果这个z是接近于0,那么三角形会非常大,如果趋近于无穷,又会非常小)
2.如果n,f是正的,那么f->1;n->-1,如果n,f是负的,那么n->1;f->-1。(这个我是自己推断,不知道是否真的是这样)所以,修改了”透视->正交变换矩阵 M’ 的最后一行就成为了 (0, 0, -1, 0)”。关于1,可以看做恰好,是等价于了压缩[-f,-n]部分的视锥。然后关于2,n,f是正的,你的正交投影矩阵并没有变化,所以导致依旧是f->1;n->-1,这里再次翻转。最后恰好使得结果正确。
最后,感谢一下这个错误,可以获得和各位优秀的同学讨论的机会。以及,对透视投影的理解更加深刻。
-
AuthorPosts