OpenGL step by step - tutorial_1 "a hello window"

大三时就打算学习一下opengl,可是。。。可是了。现在opengl编程指南第八版都翻译出来了。现在真的用到了,真的要学一下了。在opengl编程指南第八版中可以看到,现代opengl就是可编程管线的世界了,使用shader是基本的了。在某jk网站看到三集视频,刚刚又发现了这个网站http://ogldev.atspace.co.uk/index.html,发现都是这里的,既然学习下,反正也是要翻译,那就记录下来。

重要的网址发三遍,这个教程系列叫OpenGL step by step,作者OGLdev,原网站:

http://ogldev.atspace.co.uk/index.html 

 http://ogldev.atspace.co.uk/index.html 

 http://ogldev.atspace.co.uk/index.html
OpenGL规范并没有提供用来创建和操作窗口的API。现代的窗口系统能支持OpenGL,是一个子系统提供了OpenGL上下文和窗口系统连接的功能。在X windows system中是GLX,微软的windows是WGL(发音:wiggle),MacOS中是CGL。但是他们有点过时了,我们使用新的,打包了很多细节操作的更高层次的库,“OpenGL uitily library”,我们叫它GLUT。GLUT提供了简化的API来管理窗口、事件、IO及其他服务。此外,GLUT使跨平台更加容易。
(原作者开发平台Linux
    我的是win7 x64,vs2013
    但是windows名义上支持OpenGL,但支持1.0版本,所以在windows上我们还要用到一个扩展glew。有编译完的包和源代码包
    glut我用的是freeglut。这个最新的只有源代码包,下载后自己编译。
    glew和glut(编译后的)文件夹内include和lib放到vs的对应位置,glew的dll放到C:\Windows\System32   ,C:\Windows\SysWOW64  )
创建win32控制台应用程序,空项目

———————————————————————————————————————————————————


#include<freeglut.h>
void RenderSceneCB(){
	glClear(GL_COLOR_BUFFER_BIT);
	glutSwapBuffers();
	//此例中,我们的绘制函数只做一件事:使用我们指定的颜色(你可以改成喜欢的颜色)清除framebuffer。
	//第二行,通知GLUT交换backbuffer(后台)和frontbufeer(当前)的角色。再下一次调用绘制函数时,就会把内容绘制到现在的frontbuffer,把此轮中backbuffer的内容绘制出。(这就是GL_DOUBLE)
}
int main(int argc, char** argv){
	glutInit(&argc,argv); //初始化glut
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);//初始化glut窗口显示模式。GLUT_DOUBLE启用双缓存(当一个buffer在显示当前图像时,在后台的另一个buffer中画下一帧图像)和颜色缓存。我们通常使用这两个参数,但以后还会遇到其他的。
	glutInitWindowSize(1024,768);
	glutInitWindowPosition(100,100);
	glutCreateWindow("a hello window");//这三行字意明显

	glutDisplayFunc(RenderSceneCB);	//RenderSceneCB是自定义函数,用来向屏幕绘制图像
	//因为是在窗口系统,与正在运行的程序的大多数交互行为都是通过事件回掉函数(event callback function )实现
	//Glut负责与底层窗口系统的交互,并为我们提供一些回调选项。这里,我们只用了一个“main”去做所用绘制。
	//这个函数被GLUT内部循环不断调用,以实现连续绘制

	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置窗口会被清除成什么颜色
	//这是我们首次接触OpenGL状态的概念。状态背后的含义是:绘制是如此复杂的任务,以至于不能作为只接受几个参数(合理设计的函数从不会接受很多参数)的函数对待。
	//你需要指定shader,buffer,和多样的flag,他们影响着最后的渲染效果。
	//此外,你可能也经常希望在一些连续的绘制操作中使用保持一串不变的配置属性(例如,如果你从没有禁止过depth test,那么,你也就没有必要每一帧都声明你没有禁止它)。
	//这也是为什么大多数绘制操作的配置是通过在opengl状态机内设置flags和values实现,也是为什么绘制调用它们时只需要‘需要绘制的点数和开始位置的偏移量’这几个参数。
	//调用一个状态切换函数(a state changing function)后,这个特定的配置会保持不变,直到下一次使用不同的值再调用这个状态切换函数。
	//再说回上面这个glClearColor函数,它设置了清除framebuffer(以后再介绍它)时将使用的颜色。这个颜色有四个通道(RGBA),并且被指定为一个[0.0,1.0]之间的规格化值。

	glutMainLoop();	//该函数把一个control传递给GLUT,通知GLUT‘现在开始你的你的内部循环吧’。在该循环中,它监听底层窗口的事件,并使用我们配置的回调函数传递回监听到的事件。
	//在我们的这个例子中,GLUT只调用我们注册的函数作为显示回调(RenderSceneCB)以绘制当前帧。

	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值