① OpenGL 没有特别的window system interface,但是提供了形如GLUT的,用于callback,来支持一些鼠标、键盘的操作函数。
② 主函数基本代码
<span style="font-size:18px;">int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Simple Demo with Shaders");
glewInit();
init();
//Now, we define callbacks and functions for various tasks.
...</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>glutMainLoop();</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>return 0;
}</span>
函数学习:
void glutInitDisplayMode(unsigned int mode):
1) 设置初始显示模式。
2) 常用Mode:GLUT_RGB、GLUT_SINGLE(指定单缓存窗口)
3) GLUT_SINGLE和GLUT_DOUBLE的区别:
当不需要用户交互时用单缓冲,当需要用户交互或者需要产生流畅动画时用双缓冲。相当于是一个在前台刷着,一个在后台备用。GLUT_SINGLE配合glFlush()使用,GLUT_DOUBLE配合glutSwapBuffers()使用。
glutInitWindowPosition(int x,int y)
x是距离屏幕左边的像素,-1是默认值;y是距离屏幕上边的像素,-1默认。
glutMainLoop()
进入GLUT事件处理循环。在一个GLUT程序中,这个例程被调用一次。一旦被调用,这个程序将永远不会返回。它将调用必要的任何已注册的回调。
③ Viewing in OpenGL
1)两个部分:一个是对于观察object的matrix的操作,一个是对于projection变换的matrix的操作。
2)NEW OpenGL用C++的STL实现矩阵堆栈,开一个stack<mat4> modelview,然后来操作。
3)OpenGL的camara一般是在原点,向着-z方向;Transformations就是把object根据camara来搞来搞去;关于存储,GLM是列优先存储的,因此在初始化Mat4之类的时候,也要按照列优先输入。
4)初始化函数init 的代码:
#include<GL/glut.h>
#include<stdlib.h>
int mouseoldx,mouseoldy;//For mouse motion
GLdouble eyeloc = 2.0;//Where to look from; initially 0 -2, 2
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);//black
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODEVIEW);
glLoadIdentity();
gluLookAt(0,-eyeloc,eyeloc,0,0,0,0,1,1);
//Geometry and shader set up later...
}
函数学习:
glClearColor(int red,int green,int blue,int alpha)
用于清空当前所有颜色,用指定的颜色替代。
glMatrixMode(mode)
mode指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值:GL_MODELVIEW(对模型视景矩阵堆栈)、GL_PROJECTION(对投影矩阵堆栈)、GL_TEXTURE(对纹理矩阵堆栈)。之后一般紧跟着glLoadIdentity()。
glLoadIdentity()
初始化一个单位矩阵,作为后续堆叠的起始矩阵
gluLookAt
定义一个视图矩阵,是对于MODEL而言的,表示这个MODEL需要以怎样的角度呈现出来。并与当前矩阵相乘
http://baike.baidu.com/view/2341537.htm?fr=aladdin
并且OpenGL是会自动normalize的,因此输进去的gluLookAt不要求是normalize的。