• 理论基础
    多边形偏移:有时候我们需要着重显示多边形的边缘,一般做法是先绘制实心的再在同一位置绘制空心的,这样就可以突出边缘。但是,由于直线与多边形的光栅化并不完全相同,即使在同一位置绘制它们的深度值也不一定相同,这样绘制的直线可能忽浓忽淡。这时我们就可以激活多边形偏移来解决这个问题,其原理就是给实体或线框的深度加上一个偏移值。即把实体推向远处或把线框拉近,具体偏移值多少是通过设置glPolygonOffset(factor,units)算出的,其底层公式是这样:offset = m * factor + r * units.

  • 实例代码
#include "GLTools.h"
#include "GLShaderManager.h"#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endifGLuint list;
GLint spinx = 0;
GLint spiny = 0;
GLfloat tdist = 0.0;
GLfloat polyfactor = 1.0;
GLfloat polyunits = 1.0;void display (void)
{GLfloat gray[] = { 0.8, 0.8, 0.8, 1.0 };GLfloat black[] = { 0.0, 0.0, 0.0, 1.0 };glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix ();glTranslatef (0.0, 0.0, tdist);glRotatef ((GLfloat) spinx, 1.0, 0.0, 0.0);glRotatef ((GLfloat) spiny, 0.0, 1.0, 0.0);//在开启光照与多边形偏移下,绘制一个实心球体glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gray);glMaterialfv(GL_FRONT, GL_SPECULAR, black);glMaterialf(GL_FRONT, GL_SHININESS, 0.0);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_POLYGON_OFFSET_FILL);//激活多边形偏移glPolygonOffset(polyfactor, polyunits);//计算出一个偏移值,以后每个片段的深度值都加上这个值glCallList (list);//在关闭光照与多边形偏移下,同一位置绘制一个线框球体glDisable(GL_POLYGON_OFFSET_FILL);//关闭多边形偏移glDisable(GL_LIGHTING);glDisable(GL_LIGHT0);glColor3f (1.0, 1.0, 1.0);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glCallList (list);glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glPopMatrix ();glFlush ();
}void gfxinit (void)
{GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };GLfloat global_ambient[] = { 0.2, 0.2, 0.2, 1.0 };glClearColor (0.0, 0.0, 0.0, 1.0);list = glGenLists(1);glNewList (list, GL_COMPILE);glutSolidSphere(1.0, 20, 12);glEndList ();glEnable(GL_DEPTH_TEST);glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse);glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular);glLightfv (GL_LIGHT0, GL_POSITION, light_position);glLightModelfv (GL_LIGHT_MODEL_AMBIENT, global_ambient);
}void reshape(int width, int height)
{glViewport (0, 0, width, height);glMatrixMode (GL_PROJECTION);glLoadIdentity ();gluPerspective(45.0, (GLdouble)width/(GLdouble)height,1.0, 10.0);glMatrixMode (GL_MODELVIEW);glLoadIdentity ();gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}void mouse(int button, int state, int x, int y) {switch (button) {case GLUT_LEFT_BUTTON:switch (state) {case GLUT_DOWN:spinx = (spinx + 5) % 360;glutPostRedisplay();break;default:break;}break;case GLUT_RIGHT_BUTTON:switch (state) {case GLUT_DOWN:spiny = (spiny + 5) % 360;glutPostRedisplay();break;default:break;}break;default:break;}
}void keyboard (unsigned char key, int x, int y)
{switch (key) {//调节观察点距离case 't':if (tdist < 4.0) {tdist = (tdist + 0.5);glutPostRedisplay();}break;case 'T':if (tdist > -5.0) {tdist = (tdist - 0.5);glutPostRedisplay();}break;//调节计算偏移值的两个参数case 'F':polyfactor = polyfactor + 0.1;printf ("polyfactor is %f\n", polyfactor);glutPostRedisplay();break;case 'f':polyfactor = polyfactor - 0.1;printf ("polyfactor is %f\n", polyfactor);glutPostRedisplay();break;case 'U':polyunits = polyunits + 1.0;printf ("polyunits is %f\n", polyunits);glutPostRedisplay();break;case 'u':polyunits = polyunits - 1.0;printf ("polyunits is %f\n", polyunits);glutPostRedisplay();break;default:break;}
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutCreateWindow(argv[0]);glutReshapeFunc(reshape);glutDisplayFunc(display);glutMouseFunc(mouse);glutKeyboardFunc(keyboard);gfxinit();glutMainLoop();return 0;
}

下面是没有开启多边形偏移与开启了多边形偏移下的表现:

OpenGL--多边形偏移相关推荐

  1. 六、OpenGL 渲染技巧:深度测试、多边形偏移、 混合

    OpenGL + OpenGL ES +Metal 系列文章汇总 深度测试 在上一篇五.OpenGL 渲染技巧:正背面剔除中,文末还遗留一个问题未解决,在解决之前,先说说这种现象产生的原因 甜甜圈缺口 ...

  2. opengles 2.0 点精灵 多边形偏移等备忘

    opengles 2.0 点精灵 多边形偏移等备忘 opengl es 2.0只支持三种绘画单元:     三角形,直线和点精灵.         GL_TRIANGLES     GL_TRIANG ...

  3. 多边形偏移算法c语言,多边形的偏移填充算法

    多边形的偏移填充算法- 简书 www.jianshu.com/p/8c7e7c1afcb6 2017年9月10日 - 前言多边形偏移(polygon offset) 算法可能我们印象不深,不过用过au ...

  4. webgl中解决深度冲突-多边形偏移

    1.webgl中解决深度冲突-多边形偏移 1.什么是深度冲突? 就是当几何图形或者物体的两个表面极为接近时,就会使得表面看上去斑斑点点,这种现象就是 深度冲突. 看看这个缓冲区渲染出的效果 缓冲区数据 ...

  5. OpenGL之正背面剔除、深度测试与多边形偏移

    绘制"甜甜圈" 一.绘制流程 图元的渲染显示就不再重复,现在贴出部分主要绘制代码: 定义部分绘制需要用到的全局变量: GLShaderManager shaderManager; ...

  6. opengl 多边形线框_opengl基础学习专题 (三) 多边形绘制的几种样式

    题外话 聪明人之所以不会成功,是由于他们缺乏坚韧的毅力. --艾萨克·牛顿(1643年1月4日-1727年3月31日)英国 也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向 ...

  7. opengl 多边形线框_OpenGL - 在纹理多边形上创建边框

    我正在使用cocos2d-x 2.0.4.我通过这两个图像来说明我想要做的事情. 我想要的是以编程方式创建一个模糊的边框或带有渐变的边框.我有两个想法,但我不确定这是否是正确的方法.第一种解决方案是对 ...

  8. opengl 深度详解_OpenGL中的深度测试

    什么是深度测试? 深度是指该像素点在3D世界中距离摄像机位置的Z值.深度测试就是将距离观察者最近(当观察者在Z轴的正面,z值越大越靠近观察者,当观察者在Z轴的负面,z值越小越靠近观察者)的值和其对应的 ...

  9. OpenGL之图元描边的绘制流程

    立体图元的绘制与渲染,之前的文章已经完全实现了图元的"颜色填充",图元边框的绘制也有接触,详情可参考:OpenGL之矩阵堆栈绘制立体图元. 这里具体的介绍一下图元边框的绘制原理和流 ...

  10. OpenGL基础渲染

    基础图形管线 客户端-服务器 着色器 创建坐标系 使用存储着色器 存储着色器的分类 将点连接起来 点和线 单独的三角形 一个简单的批次容器 不希望出现的图形 多边形偏移 裁剪 混合 多重采样 基础图形 ...

最新文章

  1. 宏基因组扩增子最新分析流程QIIME2:官方中文帮助文档
  2. 微服务前端开发框架React-Admin
  3. 重拾-Spring Transaction
  4. zentao这php,ZenTaoPHP后面计划
  5. 2018/Province_Java_A/2/星期一
  6. MySQL——binlog,redo log
  7. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第19篇]Shamir密钥交换场景
  8. kbengine连接mysql报错
  9. spark work启动失败
  10. linux面试题与参考答案(转)
  11. 推荐系统算法工程师-从入门到就业
  12. 我要偷偷的学Python,然后惊呆所有人(第六天)
  13. 神的战争god无法显示服务器,神的战争GOD
  14. 全息投影手机Alo将引领未来趋势!全息3d 网
  15. easy-rules规则引擎最佳落地实践
  16. Ubuntu20.04裸机上配置单机 Pulsar2.7.0 成功并生产消费消息
  17. 安防 为农村公路系上“安全带”
  18. 调用openssl api函数C代码生成证书
  19. 冰河远程控制软件使用
  20. python3 word转pdf

热门文章

  1. 隐私泄露下的数据暗网,分类标签中的爱恨一生
  2. Word中表格相关的操作
  3. 读《哈佛情商课》有感
  4. 数据分析面试、笔试题汇总+解析(二)
  5. Docker学习笔记(2)--Docker常用命令
  6. 基于物理的渲染理论基础(PBR渲染)
  7. 数据库为什么要分库分表
  8. kali如何切换成中文
  9. 系统集成项目管理工程师高频考点(第一章)
  10. c语言拆礼盒,拆礼盒、个人中心功能优化