您的位置:首页 > 其它

OGL点参数圆形衰减/贴花/多边形偏移技术

2016-08-08 10:23 393 查看

OGL点参数

1.可以用设置点图元达到想要的物体形状和光照效果。

主要用:glPointParameterfv来设置:

 glPointParameterfv(GL_DISTANCE_ATTENUATION_EXT, linear);

glPointSize (psize);

#define GL_POINT_SIZE_MIN_EXT 0x8126 // 设置最小值
#define GL_POINT_SIZE_MAX_EXT 0x8127 // 设置最大值
#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 // 且启用了多重采样,那么用于计算衰减亮度
#define GL_DISTANCE_ATTENUATION_EXT 0x8129  // 设置大小和亮度的衰减

具体设置网上查询。



2.OGL点图元是方形的,为了获得圆形的点图元因此需要启用点抗锯齿功能:

  glEnable(GL_POINT_SMOOTH);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

多边形偏移

1.贴花技术中应用的GL_FILL,GL_LINE

为了着重显示物体的轮廓,可以用GL_FILL绘制这个物体,然后用GL_LINE用一种不同的颜色再绘制一遍物体
在用GL_LINE绘制物体的时候,偏移下物体的z值在透视投影模式下,让它比实体物体的z值更小些,显示的时候就会在物体的边缘。
地面或者楼层等表面的贴花技术,就可以用多边形偏移来做到。隐藏直线消除,也就是绘制物体的轮廓且填充物体内部,让内部和边缘轮廓都感觉平滑,其实直接用前景色绘制物体轮廓,用多边形填充物体内部,且对多边形进行偏移避免覆盖轮廓即可;或者用模板缓存区也可以实现,但是stencil性能相对较差且复杂。

2.贴花的通用实现技术

目的是让贴图B一定全部在A上面渲染。
一般用stencil buffer来实现:
1)对模板缓冲区进行配置,在深度测试通过的地方写入1,未通过写入0,然后渲染A.
2)对模板缓冲区进行配置,使模板值不会变化(不然变成B的了),但只渲染模板值为1的地方,禁止深度换冲区的测试和更新(B不管深度一定绘制出来),然后渲染B.
3)启用深度测试,关闭模板测试。
OGL 图形效果的实现,都是吸收业内常用的做法,和为了实现目标效果,结合自己对图像渲染管道的理解,进行组合设计得到想要的效果。

3.多边形偏移的设置

启用多边形偏移:

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glEnable(GL_POLYGON_OFFSET_FILL);

设置多边形的偏移:

glPolygonOffset(polyfactor, polyunits);

偏移量的计算公式为:offset = m * factor + r * units;
m是多边形的最大深度斜率(在光栅化过程中计算的),r是保证能够产生可解析区别的窗口坐标深度值的最小值,不同的OGL实现会不一样。
深度斜率:为:m = max( z/x, z/y).
对于深度斜率接近于0的多边形,polyfactor= 0, polyunits=1即可。
对于深度斜率很大的多边形接近1,那么polyfactor= 0.75或1.0, polyunits=1即可。
由于深度值在使用透视投影时,并不是均匀地变换到窗口坐标中,因此靠近近裁剪面的多边形需要的偏移要小于靠近远裁剪面的多边形。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: