opengl 知识点2

glViewport(0, 0, width, height); // 重置当前的视口


下一行启用smooth shading(阴影平滑)。阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑。
glShadeModel(GL_SMOOTH); // 启用阴影平滑

下一行设置清除屏幕时所用的颜色。如果您对色彩的工作原理不清楚的话,我快速解释一下。色彩值的范围从0.0f到1.0f。0.0f代表最黑的情况,1.0f就是最亮的情况。glClearColor 后的第一个参数是Red Intensity(红色分量),第二个是绿色,第三个是蓝色。最大值也是1.0f,代表特定颜色分量的最亮情况。最后一个参数是Alpha值。当它用来清除屏幕的时候,我们不用关心第四个数字。现在让它为0.0f。

glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景

接下来的三行必须做的是关于depth buffer(深度缓存)的。将深度缓存设想为屏幕后面的层。深度缓存不断的对物体进入屏幕内部有多深进行跟踪。我们本节的程序其实没有真正使用深度缓存,但几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。它的排序决定那个物体先画。这样您就不会将一个圆形后面的正方形画到圆形上来。深度缓存是OpenGL十分重要的部分。

glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告诉系统对透视进行修正

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵

我们使用ChangeDisplaySettings(NULL,0)回到原始桌面。将NULL作为第一个参数,0作为第二个参数传递强制Windows使用当前存放在注册表中的值(缺省的分辨率、色彩深度、刷新频率,等等)来有效的恢复我们的原始桌面。切换回桌面后,我们还要使得鼠标指针重新可见。


ChangeDisplaySettings(NULL,0); // 是的话,切换回桌面
ShowCursor(TRUE); // 显示鼠标指针

glColor3f(r,g,b)//括号中的三个参数依次是红、绿、蓝三色分量。取值范围可以从0,0f到1.0f

glTexCoord2f 的第一个参数是X坐标。 0.0f 是纹理的左侧。 0.5f 是纹理的中点, 1.0f 是纹理的右侧。 glTexCoord2f 的第二个参数是Y坐标。 0.0f 是纹理的底部。 0.5f 是纹理的中点, 1.0f 是纹理的顶部。

//直线可以指定宽度
void glLineWidth(GLfloat width);

//画虚线
使用glEnable(GL_LINE_STIPPLE);来启动虚线模式(使用glDisable(GL_LINE_STIPPLE)可以关闭之)
使用glLineStipple来设置虚线的样式。
void glLineStipple(GLint factor, GLushort pattern);

//=======================================
着色描述表
设备描述表

//=======================================
模型变换
模型变换的目的是设置模型的位置和方向,例如可以对模型进行旋转、移动和缩放,或者联合这几种操作。


其实旋转平移变换等命令的作用本质是给坐标乘上一个变换矩阵。矩阵乘法出现的顺序跟代码中命令的出现顺序刚好是相反的(矩阵乘法是有顺序的)。

这几个函数是OpenGL图形开发包自带的函数。
glTranslatef(0.0f,-20.0f,-40.0f)表示将当前图形向x轴平移0,向y轴平移-20,向z轴平移-40
glScaled(10.0f,10.0f,10.0f)表示将当前图形沿x,y,z轴分别放大为原来的10倍
glRotatef(-80.0f,10.0f,1.0f,0.0f)表示将当前图形沿方向向量(-10,1,0)顺时针旋转80度。

glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z)

glRotatef(45,1,0,0)
物體如何旋转?想象:从 坐标(0,0,0)即原点,引出一条线到(1,0,0),用右手握住这条线,这时,你会问,如何握?右手大拇指指向 (0,0,0)至(1,0,0)的方向 才握。另外四个手指的弯曲指向 即是物体旋转方向。

1.glScalef() ——模型变换函数 缩放
void glScalef(GLfloat  x,  GLfloat  y,  GLfloat  z);
这个函数表示模型在各轴上是如果进行缩放的。举个例子:
glScalef (1.0, 2.0, 1.0);//表示y坐标值扩大两倍,这样原本方的物体就变成长的了。


2.glTranslatef() ——模型变换函数 移动
void glTranslatef(GLfloat  x,  GLfloat  y,  GLfloat  z);
这个函数表示模型是怎样移动的。举个例子:
glTranslatef(-1.0,0.0,-2.0);//表示物体沿x负方向移动1.0,沿z轴负方向移动2.0。所以就好像能看见侧面一样
//注意在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。其作用就是将你绘点坐标的原点在当前原点的基础上平移一个(x,y,z)向量

3.glRotatef()——模型变换函数  旋转
void glRotatef(GLfloat  angle,  GLfloat  x,  GLfloat  y,  GLfloat  z);
angle表示旋转的角度(注意单位不是弧度),(x,y,z)表示转轴。举个例子:
glRotatef(45.0, 0.0, 0.0, 1.0);//表示模型沿着(0,0,1)这个轴旋转45°。
//与glTranslatef(x, y, z)类似,glRotatef(angle, x, y, z)也是对坐标系进行操作。
旋转轴经过原点,方向为(x,y,z),旋转角度为angle,方向满足右手定则。


4.glFrustum() ——投影变换函数 透视投影

前四个参数表示裁剪范围,后两个参数(要求为正数)表示近的面和远的面离眼睛的距离。有点儿像调焦。裁剪完后拉伸铺满整个屏幕。

5.glPerspective() ——投影变换函数 透视投影
void gluPerspective(GLdouble  fovy,  GLdouble  aspect,  GLdouble  zNear,  GLdouble  zFar);
第一个参数表示在y方向上的视角度数。个人理解:比如45,表示眼睛和模型中心这个条线与y轴的夹角。
第二个参数表示纵横比。x/y。比如2表示x、y本来都是1个长度,现在x可以当两个长度用,这样,模型就好像被x方向压缩了一样。
后两个参数glFrustum()中后两个相近。要求都是正数。


6.glLoadIdentity() //将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作

这个空间可以是“正投影”的(使用glOrtho或gluOrtho2D),也可以是“透视投影”的(使用glFrustum或gluPerspective)

矩阵有自己的“堆栈”,方便进行保存和恢复。这在绘制复杂图形时很有帮助。使用的函数是glPushMatrix和glPopMatrix。















































猜你喜欢

转载自blog.csdn.net/u012278016/article/details/79904272