VS2013下Opengl环境配置

一、下载OpenGL配置文件glut

有5个配置文件:glut.dll、glut.h、glut.lib、glut32.dll、glut32.lib



二、配置文件

1.glut.h:复制到C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\GL目录下,注:没有GL目录,则创建



2.glut.lib和glut32.lib:复制到C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib目录下



3.glut.dll和glut32.dll:复制到C:\Windows\system32文件夹内(32位系统)或‪C:\Windows\SysWOW64(64位系统) 



我的问题出现在配置文件移动这一步。当我将glut32.dll移动到SysWOW64文件夹下时,系统提示我需要获取管理员权限,我点击确定继续,随后系统告知我“拒绝访问”;我在网上找遍了各种方法包括修改管理员读写权限全部都改成“完全控制”以及其它奇技淫巧都,然而这些方法都没有效果,这个过程花费了我4个小时,在最后我还是没有成功的将该文件复制到SysWOW64文件夹下,最后无奈我换了台电脑,最后成功。

三、将lib文件添加到附加依赖项中。


注意glut32.lib与glut.lib的摆放顺序,如果摆放错误,那么生成解决方案的时候IDE会提示“找不到opengl.dll文件",出现这种情况的时候重新调整好摆放顺序然后重启vs2013再次打开项目就行了。

四、Opengl环境测试代码

#include <windows.h>
#include <GL/glut.h>//本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h>,
//但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。
#include <math.h>
#include<time.h>


const GLfloat Pi = 3.1415926536;
const GLfloat R = 0.8f;
const int n = 200;
static GLfloat angle = 2 * Pi;


float Mysecond(struct tm *ptr)
{
	return ((Pi / 2) - (((float)ptr->tm_sec) / 60) * 2 * Pi);
}


float Mymin(struct tm *ptr)
{
	//return (Pi/2)-(((ptr->tm_min+(((float)ptr->tm_sec)/60))/60)*2*Pi);
	return ((Pi / 2) - ((ptr->tm_min + ptr->tm_sec / 60.0) / 60) * 2 * Pi);
};


float Myhour(struct tm *ptr)
{
	if (0<ptr->tm_hour&&ptr->tm_hour<12)
	{
		return ((Pi / 2) - ((float)ptr->tm_hour + ptr->tm_min / 60.0) / 12 * 2 * Pi);
	}
	else{
		return ((Pi / 2) - ((ptr->tm_hour - 12.0 + ptr->tm_min / 60.0) / 12) * 2 * Pi);
	}
};
void myDisplay(void)


{
	//glShadeModel(GL_SMOOTH);
	//获取系统时间
	struct tm *ptr=new tm();
	time_t it;
	it = time(NULL);
	//ptr = localtime(&it);
	localtime_s(ptr, &it);


	glClear(GL_COLOR_BUFFER_BIT);//清除,GL_COLOR_BUFFER_BIT表示清除颜色
	glEnable(GL_POINT_SMOOTH);
	glEnable(GL_LINE_SMOOTH);
	glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // Make round points, not square points
	glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);  // Antialias the lines
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	//钟盘
	glColor3f(0.5, 0.5, 0.5);
	glBegin(GL_POLYGON);
	for (int i = 0; i<n; i++){
		glVertex2f(R*cos(2 * Pi / n*i), R*sin(2 * Pi / n*i));
	}
	glEnd();


	//刻度
	glColor3f(1.0, 1.0, 1.0);
	glPointSize(5.0f);
	glBegin(GL_POINTS);
	for (int j = 0; j<12; j++)
	{
		glVertex2f(0.75*cos(2 * Pi / 12 * j), 0.75*sin(2 * Pi / 12 * j));
	}
	glEnd();


	//时针
	glLineWidth(5.0f);
	glColor3f(0.0, 0.0, 0.0);


	glBegin(GL_LINES);
	glRotatef((angle / 3600.0), 0.0, 0.0, 1.0);
	glVertex2f(0.0, 0.0);
	glVertex2f(cos(Myhour(ptr))*R*0.55, sin(Myhour(ptr))*R*0.55);
	glEnd();


	//分针
	glLineWidth(4.0f);
	glColor3f(0.0, 0.0, 0.0);


	glBegin(GL_LINES);
	glRotatef((angle / 60.0), 0.0, 0.0, 1.0);
	glVertex2f(0.0, 0.0);
	glVertex2f(cos(Mymin(ptr))*R*0.65, sin(Mymin(ptr))*R*0.65);
	glEnd();


	//秒针
	glLineWidth(3.0f);
	glColor3f(0.0, 0.0, 0.0);


	glBegin(GL_LINES);
	glRotatef(angle, 0.0, 0.0, 1.0);
	glVertex2f(0.0, 0.0);
	glVertex2f(cos(Mysecond(ptr))*R*0.85, sin(Mysecond(ptr))*R*0.85);
	glEnd();
	glFlush();//glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。


}


void myIdle(void)
{
	angle -= ((2 * Pi) / 60);
	Sleep(1000);
	if (angle<0.0f){
		angle = 2 * Pi;
	}
	myDisplay();
}


int main(int argc, char *argv[])


{


	glutInit(&argc, argv);//glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。


	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的GLUT_INDEX表示使用索引颜色。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)


	glutInitWindowPosition(300, 100);//设置窗口在屏幕中的位置.


	glutInitWindowSize(400, 400);//设置窗口的大小


	glutCreateWindow("时钟");//根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。


	glutDisplayFunc(&myDisplay);//调用画图函数
	glutIdleFunc(&myIdle);


	glutMainLoop();//进行一个消息循环。这个函数可以显示窗口,并且等待窗口关闭后才会返回


	return 0;

}

生成结果截图:


猜你喜欢

转载自blog.csdn.net/qq_23096723/article/details/80328489