您的位置:首页 > 运维架构

OpenGL学习日记1状态管理和绘制几何物体

2016-03-14 16:10 369 查看
清除窗口 Clear the window

目的:绘制新场景时一般需要将背景清除为某一种颜色。

函数:glClearColor(R,G,B,alpha);//设置当前清除颜色

glClear(Buffer Name);//颜色缓冲区:GL_COLOR_BUFFER_BIT; 深度缓冲区:GL_DEPTH_BUFFER_BIT;

累积缓冲区:GL_ACCUM_BUFFER_BIT; 模板缓冲区:GL_STENCIL_BUFFER_BIT。

对每一个想要清除的缓冲区都需要设置相应的清除值,颜色就是glClearColor();深度是glClearDepth();按照此命名方式以此类推。

可以同时清除多个缓冲区,在glClear( )中将Buffer的名字用“|“连接,表示逻辑or。同时清除缓冲区往往会比线性清除缓冲区高效。

例子:同时清除 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

线性清除 glClear(GL_DEPTH_BUFFER_BIT);

glClear(GL_COLOR_BUFFER_BIT);

指定颜色 Specifying a Color

因为OpenGL是状态机,所以每一次绘制一个物体或场景时就需要设置一次需要的颜色。这里只学习简单的设置颜色,不考虑光照条件等。现在只考虑设置当前颜色。

函数:glColor4f(R,G,B,alpha);//函数名的命名很有意思,glColor(表示对颜色的设置)+3|4(表示参数个数,4个参数时多了alpha)+f(表示参数类型是浮点数)

常用的OpenGL颜色值://现在暂时不考虑alpha的值。

黑色0.0 0.0 0.0

红色1.0 0.0 0.0

绿色0.0 1.0 0.0

蓝色0.0 0.0 1.0

黄色1.0 1.0 0.0

青色0.0 1.0 1.0

白色1.0 1.0 1.0

强制完成绘图操作 Forcing Completion of Drawing

目的:强制刷新,保证绘图命令将被执行而不是在缓冲区中等待。

函数:

glFlush(void);//有时图画不出来,用flush强制冲出来。强制以前所发出的OpenGL命令开始执行。

glFinish(void);//强制以前所发出的OpenGL命令完成执行。

坐标系统工具箱

在刚打开窗口、移动和改变窗口大小时,计算机都需要重新绘制一次刚刚绘制的图形,这就需要重新调用一次刚刚绘制这个图形的代码。也就是说应该把重绘场景所需要的所有的代码放到回调函数里。

上面说的过程,GLUT会自动执行,只需在glutReshapeFunc()中注册回调函数。

Reshape回调函数

void reshape(int w, int h) {具体见课本}

上课的时候老师演示程序,在回调函数reshape()那里设置了断点,在一开始绘制图形时,程序运行到这一行时就会停下,在调整窗口大小或者移动窗口时也会在设置的断点处停下。问过师姐之后才回忆起来。好像对这个回调函数理解了。之后应该自己调试一下,设置一下断点,看一下是不是这么一回事。

程序练习1:

// GL_ex1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<glut.h>

void display()//在这里添加断点
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,0.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(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
}

int _tmain(int argc, char** argv)//修改了这里面的参数
{
glutInit(&argc,argv);//这里是什么意思?
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(250,250);
glutInitWindowPosition(100,100);
glutCreateWindow("ex1");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: