Shader Depth Offset [Polygon Offset]
2016-07-11 15:19
330 查看
Offset Factor, Units
factor
Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
units
Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
When
GL_POLYGON_OFFSET_FILL,
GL_POLYGON_OFFSET_LINE,
or
GL_POLYGON_OFFSET_POINTis enabled, each fragment's depth value
will be offset after it is interpolated from the depth values of the appropriate vertices. The
value of the offset is factor×DZ+r×unitsfactor×DZ+r×units,
where DZDZ is
a measurement of the change in depth relative to the screen area of the polygon, and rr is
the smallest value that is guaranteed to produce a resolvable offset for a given implementation. The offset is added before the depth test is performed and before the value is written into the depth buffer.
如果英文不太好理解,请参考:
每一个Fragment的深度值都会增加如下所示的偏移量:
offset = (m * factor)
+ (r * units)
m是多边形的深度的斜率(在光栅化阶段计算得出)中的最大值。这句话难以理解,你只需知道,一个多边形越是与近裁剪面(near clipping plan)平行,m就越接近0。
r是能产生在窗口坐标系的深度值中可分辨的差异的最小值,r是由具体实现OpenGL的平台指定的一个常量。
一个大于0的offset 会把模型推到离你(摄像机)更远一点的位置,相应地,一个小于0的offset 会把模型拉近。
注:因为深度缓存的值是非线性的,所以使用Offset的话,当相机比较近的时候,相对深度偏移(深度偏移相对于物体本身的深度值)会比较小,相机比较远时,相对深度偏移会比较大(如覆盖在本来不应该覆盖的物体上面).所以如果我们是需要设置Offset的值比较大的时候,建议直接设置相机空间或者Clip空间的Z值(线性),保证Z值的偏移总是符合预期。
深度缓存计算参考:
a= zFar/( zFar- zNear)
b= zFar* zNear/( zNear- zFar)
z= distancefrom the eye to theobject
z_buffer_value=
a+ b/
z
参考:
https://docs.unity3d.com/Manual/SL-CullAndDepth.html https://www.opengl.org/archives/resources/faq/technical/polygonoffset.htm https://www.opengl.org/sdk/docs/man/html/glPolygonOffset.xhtml http://www.cnblogs.com/bitzhuwei/p/polygon-offset-for-stitching-andz-fighting.html
相关文章推荐
- 解决Vista系统OpenGL驱动问题的方法整理
- Delphi下OpenGL2d绘图之画四边形的方法
- Delphi下OpenGL2d绘图之画点的方法
- Delphi下OpenGL2d绘图之初始化流程详解
- javascript中offset、client、scroll的属性总结
- jquery用offset()方法获得元素的xy坐标
- Jquery中offset()和position()的区别分析
- jquery offset函数应用实例
- Delphi使用OpenGL2d绘图之画图片Bmp的方法
- 通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸
- VC运用OPENGL加载BMP纹理图的实现方法汇总
- Javascript 运动中Offset的bug解决方案
- unity实现多点触控代码
- jquery根据锚点offset值实现动画切换
- java实现OpenGL ES纹理映射的方法
- 在Unity中实现动画的正反播放代码
- Unity UGUI教程之实现滑页效果
- unity实现摄像头跟随
- java基于OpenGL ES实现渲染实例
- android调用GLES20.glGenerateMipmap报错glError 1280