OPENGL画3D管线遇到的问题
我用4边形逼近3D管线,管线的外型没问题,但是在加光照的时候,四边形之间相交的部分颜色会比较明显,总是看得出一条一条的交线,该怎么样让表面变得更平滑呢?我计算顶点法线的方法是该顶点所在的所有平面的法线的平均值,或者用该顶点的坐标减去该顶点所在圆的圆心的坐标,再单位化做为顶点法线。两个方法我都试过,效果一样,实际上两种方法算出来的法线是差不多一样的。
你所说的效果是不是像地板砖一样,地板砖之间的连接处很明显,很容易分别出一块块地板砖?
如果是这样,请先检查你用来画边框的线,他的颜色是否与四边形中填充的颜色相同(设置成透明的也可)?是否设置了遮盖效果(就是被挡住的部分不必画,交线会被画两次,它重叠了),透明度设置是否正确?还有,画边框的线是否设置了成最细的。这在一定程度上可以改进画面的效果。但这种方法也是治标不治本。
该问题的根源在于交线处光线变化太明显,与其相关的两个平面的法线是不变的,但在交线处有了突变(当然如果这两个四边型在同一个平面上就不会有问题,如果有问题那就是我上面说的那些参数没设好,这可以用来检查你的参数设置),因此光照不是均匀变化,突变之处当然效果明显。解决这个问题的根本办法就是让光照的变化变成均匀变化,方法有如下两种:
1.单位面积上用更多的四边形模拟,即增加四边形的个数,减小四边行的大小,这样可以使过渡更加平滑。缺点是运算量增大。
2.对于管线,我们可以这么想,我们截取一小段,可以近似的把它看成是一个圆柱,而不去管这个圆柱是由哪几个四边形组成的,那么我们很容易得到圆柱侧面的任意一点的顶点法线,我们就用这个圆柱的光照参数(他是渐变的,就看你分成几个等分去算,分的越多,效果越好)去替代原来的光照参数,(就是图行照旧,但光照重新算,不与画出的图形相关。就像画好了图形但不给光照,但用一个有光照的透明圆柱体把它给罩起来。)至于这个圆柱取多高,应根据具体情况定。如果你用16个四变形模拟逼近一个圆柱,那么算光照时,至少要将圆柱分成16等分来算,否则效果变化不大,一般情况下要大一倍,即分成32分来算。
我更加倾向于第一种方法,它有更好的图形效果,用你的程序也更好实现一些。第二种方法是在不增加四边行的情况下改善光照效果。第一种方法是图形光照一起改,第二种只改善光照。也可以2种方法同时用。