【openGL】环境配置vs2013+openGL / 实验一

openGL环境包

https://download.csdn.net/download/qq_42417182/11057969

我不知道怎么选积分。。。它自动变成5分了,想要的话自己问我要吧嘻嘻嘻

环境配置步骤:

  1. .h文件(GL文件夹直接赋值)放到 C:\Program Files (x86)\Microsoft Visual Studio 12\VC\include\GL文件中。(如果没有GL文件夹,可以自己创建一个,这样可以方便使用头文件)
  2. .dll文件放到C:\Windows\System32 和 C:\Windows\SysWOW64 文件夹里,以管理员身份运行
  3. .lib文件放到C:\Program Files (x86)\Microsoft Visual Studio 12\liib文件夹里
  4. 在vs2013中创建或打开项目,在项目属性\链接器\输入\附加依赖项中加入一下依赖项

配置错误及解决方法

可能是因为我的vs2013没有安装到C盘,而且还装了microsoft c++ 2010,配置文件放的目录可能不是我想要的vs2013的目录,总是出现无法打开“glut32.lib”文件的错误提示。

所以我只能。。。用一个蠢办法,就是每次创建项目的时候,添加附加库目录。

运行正常


实验一1.0:在窗口中绘制一个小正方形(win32控制台应用程序)

#include <gl\glut.h>
#include <stdlib.h>

void display()
{
    /* 清除颜色缓存 */
	glClear(GL_COLOR_BUFFER_BIT);

	/* glColor3f(1.0, 1.0, 1.0);  --> 白色  */
	glColor3f(1.0, 1.0, 1.0);

    /**/
	glBegin(GL_POLYGON);
	    glVertex3f(0.25, 0.25, 0.0);
	    glVertex3f(0.75, 0.25, 0.0);
	    glVertex3f(0.75, 0.75, 0.0);
	    glVertex3f(0.25, 0.75, 0.0);
	glEnd();
    /**/

	glFlush();
}

void init()
{
	/* 制定清除颜色 */
	glClearColor(0.0, 0.0, 0.0, 0.0);

	/* 设置投影变换方式 */
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0.0, 1.0, 0.0, 1.0, -1.1, 1.0);

}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(250, 250);
	glutInitWindowPosition(100, 100);
	glutCreateWindow("hello");
	init();
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

(1)void glClear(GLbitfield mask):glClear()函数的作用是用当前缓冲区清除值,也就是glClearColor或者glClearDepth、glClearIndex、glClearStencil、glClearAccum等函数所指定的值来清除指定的缓冲区,也可以使用glDrawBuffer一次清除多个颜色缓存。

GLbitfield:可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲。有以下标志位:

  • GL_COLOR_BUFFER_BIT:    当前可写的颜色缓冲
  • GL_DEPTH_BUFFER_BIT:    深度缓冲
  • GL_ACCUM_BUFFER_BIT:   累积缓冲
  • GL_STENCIL_BUFFER_BIT: 模板缓冲

glClear(GL_COLOR_BUFFER_BIT):表示实际完成了把整个窗口清除为黑色的任务,glClear()的唯一参数表示需要被清除的缓冲区。

参考文章:https://blog.csdn.net/siyue0211/article/details/74783966

(2)void glColor3f(GLfloat red, GLfloat green, GLfloat blue):3f表示有三个浮点参数。其中0.0表示不使用该种颜色,而1.0表示将该种颜色用到最多

glColor3f(1.0, 1.0, 1.0);  --> 白色  

注意:如果在glBegin()与glEnd()函数之间多次连续调用颜色函数,那么,只会显示出最后一次的颜色

参考文章:https://www.cnblogs.com/tjulym/p/5037124.html

 (3)void glBegin(GLenum mode)

          void glEnd(void)                             :glBegin和glEnd函数限定了一组或多组图元的定点定义

mode:创建图元的类型。可以是以下数值

  • GL_POINTS:把每一个顶点作为一个点进行处理,顶点n即定义了点n,共绘制N个点
  • GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段
  • GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段
  • GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,总共绘制n条线段
  • GL_TRIANGLES:把每个顶点作为一个独立的三角形,顶点3n-2、3n-1和3n定义了第n个三角形,总共绘制N/3个三角形
  • GL_TRIANGLE_STRIP:绘制一组相连的三角形,对于奇数n,顶点n、n+1和n+2定义了第n个三角形;对于偶数n,顶点n+1、n和n+2定义了第n个三角形,总共绘制N-2个三角形
  • GL_TRIANGLE_FAN:绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点1、n+1和n+2定义了第n个三角形,总共绘制N-2个三角形
  • GL_QUADS:绘制由四个顶点组成的一组单独的四边形。顶点4n-3、4n-2、4n-1和4n定义了第n个四边形。总共绘制N/4个四边形
  • GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n-1、2n、2n+2和2n+1定义了第n个四边形,总共绘制N/2-1个四边形
  • GL_POLYGON绘制一个凸多边形。顶点1到n定义了这个多边形。

参考文章:https://blog.csdn.net/shuaihj/article/details/7231627

参考文章:https://blog.csdn.net/u010270148/article/details/52787012

(4)glVertex3f(GLfloat x, GLfloat y, GLfloat z):glVertex()函数用在glBegin()和glEnd()之间。用来指定点、线和多边形的顶点。当调用glVertex时,可以为该顶点指定颜色、法线量和纹理坐标。当只指定x,y时,z缺省为0.0

(5)void glFlush( void ):用于强制刷新缓冲,保证绘图命令将被执行,而不是存储在缓冲区中等待其他的openGL命令

(6)glClearColor () :glClearColor () 的作用是指定刷新颜色缓冲区时所用的颜色,所以完成一个刷新的过程是要 glClearColor ( COLOR)  与glClear ( GL_COLOR_BUFFER_BIT) 配合使用。

参考文章https://blog.csdn.net/hebbely/article/details/69951068

(7)void glMatrixMode(GLenum mode):glMatrixMode()命令将当前矩阵设置成参数所指定的模式,以满足不同绘图所需执行的矩阵变换。与glLoadIdentity()一同使用,glLoadIdentity()功能是重置当前指定的矩阵为单位矩阵

mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值: 

  • GL_MODELVIEW:对模型视图矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,输出自己的物体图形了。
  • GL_PROJECTION:对投影矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,为我们的场景增加透视。
  • GL_TEXTURE:对纹理矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,为我们的图形增加纹理贴图。

在需要绘制出对象或要对所绘制对象进行几何变换时,需要将变换矩阵设置成模型视图模式

当需要对绘制的对象设置某种投影方式时,则需要将变换矩阵设置成投影模式

只有在进行纹理映射时,才需要将变换矩阵设置成纹理模式。

我们生活在一个三维的世界——如果要观察一个物体,我们可以:
1、从不同的位置去观察它。(视图变换)
2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)
3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)
4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)

参考文章:https://blog.csdn.net/caoshangpa/article/details/80266028

(8)void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far): 设置或修改修剪空间的范围

-

-->glOrtho(0.0, 1.0, 0.0, 1.0, -1.1, 1.0);<---

参考文章:https://blog.csdn.net/andy20081251/article/details/38822451

参考文章:https://www.baidu.com/linkurl=88cQmPI9882ZrmEskYLd31jU0CAmGgsOsVw1e4mdDvS_jXiPwXL8YTj2MO8Ftt0URa51zCeuKXQEzBUvJTEk1waExCH8nwiTOCDwFiicHlq&wd=&eqid=9cfe90770001fa8e000000055c989361

glViewport()函数和glOrtho()函数的理解:http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html

(9)void glutInitDisplayMode(unsigned int mode):设置初始显示模式,可以使用 | 运算符组合不同的标志

mode 的取值:

(10)glutDisplayFunc(display):glutDisplayFunc函数用于注册一个绘图函数, 这样操作系统在必要时刻会对窗体进行重新绘制操作

           display()函数是自定义的绘图函数

glutDisplayFunc(display)在程序运行时是自动调用的,即程序会自动调用display函数重绘窗口

调用的时机有:

1.  窗口内容绘制

2.   窗口大小改变

3.   窗口重绘

参考文章:https://www.baidu.com/link?url=3Ces8ZgSJ42FIZD_SGV4njIoRWp0Su56lEHjPUPlJpR2dHT7lc6RvS9pOer-H6Me4MODjJMQu-Op2KsG9kU4UEFUiT5jjwj2UwJh0Hp10EG&wd=&eqid=b8bb5fc500008c06000000055c9895e5

(11)glutMainLoop():进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环

自我感觉很像Qt里面的exec()函数,让事件进入死循环,这样不会一操作完毕程序就结束,程序会等待下一个动作,直到关闭程序为止。


实验一2.0:MFC(vs2013)+openGL

参考:实验指导书+OpenGL+MFC编程入门(VS2013)https://blog.csdn.net/wyg1997/article/details/78346158

1、创建MFC项目OpenGLPlat

在写这些项目的时候,选择用类视图会比较方便,而且清楚明了。

2、导入OpenGL头文件以及相关配置(同实验1.0)

3、在OpenGLPlatView.h下添加相关变量和头文件

4、添加消息WM_CREATE

5、添加消息WM_DESTROY

6、添加消息WM_SIZE

7、在OnDraw函数中增加代码

8、运行

出错及解决方法:

因为实验指导书中的版本是vs2008比我的旧,但是我照着内容敲了,实际上有些地方vs2013作了优化,导致我第一次运行的时候出现debug

 

在CSDN查了一下原因,都说是create函数有些问题,然后我就想到是不是因为我之前删掉了新建项目时候原有的一些代码,导致了出错,于是我在create函数中把这些代码加回去了,最后运行成功了。

猜你喜欢

转载自blog.csdn.net/qq_42417182/article/details/88795238