glShadeModel,glClearDepth,glHint

本文深入探讨了OpenGL中的glShadeModel和glClearDepth函数的作用,通过实例展示了它们如何影响渲染效果。重点解析了glShadeModel用于控制颜色过渡模式,以及glClearDepth在深度缓存中的应用,帮助开发者理解如何模拟现实世界的遮挡效果。
 
glShadeModel,glClearDepth (2011-07-18 12:59)
标签 target  blank  class  分类: opengl

glShadeModel

glShadeModel函数用于控制opengl中绘制指定两点间其他点颜色的过渡模式

参数一般为GL_SMOOTH(默认),GL_FLAT

opengl默认是将制定的两点颜色进行插值,绘制之间的其他点

如果两点的颜色相同,使用两个参数效果相同

如果两点颜色不同,GL_SMOOTH会出现过渡效果,GL_FLAT 则只是以指定的某一点的单一色绘制其他所有点

如图可以对比GL_SMOOTH与GL_FLAT的区别

http://blog.youkuaiyun.com/wadejr/article/details/4504112


 

glClearDepth

opengl里面的深度缓存


在现实生活中,一个实心物体挡在另外一个实心物体的前面, 后面的那个物体有部分会被遮盖掉

那么opengl里面如何模拟这个情况呢? 每个物体的每个像素都有一个深度缓存的值(在0到1之间,可以想象成是z轴的距离)

如果glDepthFunc启用了GL_LESS(现实生活中的前景), 那么当前个物体挡住后个物体时, 由于前个物体深度值小(越靠近人的), 所以它就被画了出来, 后面的物体被挡住的像素就被忽略掉了。(当然你如果启用了GL_GREATER, 那么情况就反过来了)

这个时候再来说glClearDepth, 它给深度缓冲指定了一个初始值,缓冲中的每个像素的深度值都是这个, 比如1,这个时候你往里面画一个物体, 由于物体的每个像素的深度值都小于等于1, 所以整个物体都被显示了出来。 如果初始值指定为0, 物体的每个像素的深度值都大于等于0, 所以整个物体都不可见。 如果初始值指定为0.5, 那么物体就只有深度小于0.5的那部分才是可见的
 
 
 
glHint

glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

真正精细的透视修正。这一行告诉OpenGL我们希望进行最好的透视修正。这会十分轻微的影响性能。但使得透视图看起来好一点。

这个函数中,我们对OpenGL进行所有的设置。我们设置清除屏幕所用的颜色,打开深度缓存,启用smooth shading(阴影平滑),等等。这个例程直到OpenGL窗口创建之后才会被调用。

http://y150988451.iteye.com/blog/813008 

// 提示:在合适的地方修改或添加代码 #include <GL/freeglut.h> #include<stdio.h> #include<iostream> // 评测代码所用头文件-开始 #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace std; // 评测代码所用头文件-结束 // 请在此添加你的代码 /********** Begin ********/ GLfloat points1[4][3] = { }; GLfloat Colors1[4][3] = { }; int vertice1[4][3] = { }; /********** End **********/ void InitGL(GLvoid) { glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_COLOR_MATERIAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } void Create() //创建三棱锥 { glBegin(GL_TRIANGLES); for (int i = 0; i < 4; i++) { glColor3fv(Colors1[i]); for (int j = 0; j < 3; j++) { int VtxId = vertice1[i][j]; glVertex3fv(points1[VtxId]); } } glEnd(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // 请在此添加你的代码 /********** Begin ********/ /********** End **********/ Create(); //三棱锥 glPopMatrix(); glutSwapBuffers(); } void reshape(int width, int height) { if (height == 0) height = 1; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("几何变换示例"); InitGL(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoopEvent();
最新发布
11-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值