简单图形
目标:熟悉OpenGL常用函数,创建一个简单图形
常用函数:
1.glutInit(&argc, argv) (glutInit函数的作用 )
初始化glutInit函数,如果不调用此函数 会导致编译报错
2.glutInitDisplayMode()
设置图形的显示模式 常用的显示模式如下
/*glutInitDisplayMode
* GLUT_RGB 指定RGB颜色模式的窗口
* GLUT_RGBA 指定RGBA颜色模式的穿工具
* GLUT_INDEX 指定颜色索引模式的窗口
* GLUT_SINGLE 指定单缓存窗口
* GLUT_DOUBLE 指定双缓存窗口
* GLUT_ACCUM 窗口使用累加缓存
* GLUT_ALPHA 窗口的颜色分量包含alpha值
* GLUT_DEPTH 窗口使用模板缓存
* GLUT_MULTISAMPLE 指定支持多样本功能的窗口
* GLUT_STEREO 指定立体窗口
* GLUT_LUMINANCE 窗口使用亮度颜色模式
*/
3.glutInitWindowPosition()
设置初始窗口的位置(窗口左上角相对于桌面坐标的x,y)
4.glutInitWindowSize()
设置初始窗口的大小
5.glutCreateWindow()
产生一个顶层窗口,并命名
6.glutDisplayFunc()
注册当前窗口显示回调
7.glutMainLoop()
当glut程序进入事件循环,一旦调用,到程序结束才返回
8.glClearColor()
设置清除颜色为XXXX(背景颜色)
9.glClear()
用当前缓冲区清楚值来清楚缓冲区 常用的参数:
/*glClear
* GL_COLOR_BUFFER_BIT 当前可写的颜色缓冲
* GL_DEPTH_BUFFER_BIT 深度缓冲
* GL_ACCUM_BUFFER_BIT 累计缓冲
* GL_STENCIL_BUFFER_BIT 模板缓冲
*/
10.glRectf()
用当前的绘图颜色绘制一个填充矩形(未设置为白色 通过glColor3f修改颜色值)
11.glFlush()
将GL命令队列中的命令发送诶显卡 并清空命令队列,发送完立即返回(告诉代码,我搞完了 你可以开始画了)
创建一个简单图形
#define GLUT_DISABLE_ATEXIT_HACK
#include <Windows.h>
#include <gl/glut.h>
void yh()
{
glClearColor(0.4, 0.2, 0.9, 0.0); //设置清除颜色为XXXX(背景颜色)
glClear(GL_COLOR_BUFFER_BIT); //用当前缓冲区清楚值来清楚缓冲区
glRectf(-0.5, -0.5, 0.5, 0.5); //用当前的绘图颜色绘制一个填充矩形(未设置为白色 通过glColor3f修改颜色值)
glFlush(); //将GL命令队列中的命令发送诶显卡 并清空命令队列,发送完立即返回(告诉代码,我搞完了 你可以开始画了)
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv); //初始化glutInit函数
glutInitDisplayMode(GLUT_STENCIL|GLUT_RGB); //设置图形显示模式
glutInitWindowPosition(0, 0); //设置初始窗口的位置(窗口左上角相对于桌面坐标的x,y)
glutInitWindowSize(500, 500); //设置初始窗口的大小
glutCreateWindow("OpenGL窗口"); //产生一个顶层窗口,并命名
glutDisplayFunc(yh); //注册当前窗口显示回调
glutMainLoop(); //当glut程序进入事件循环,一旦调用,到程序结束才返回
return 0;
}
运行结果
添加视口
上述窗口并没有限制范围大小,会导致当拉扯屏幕的时候,中间正方形会根据窗口变化而导致变形,因此使用glutReshapeFunc函数对视口进行限定
最终代码
#define GLUT_DISABLE_ATEXIT_HACK
#include <Windows.h>
#include <gl/glut.h>
void yh()
{
glClearColor(0.4, 0.2, 0.9, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5, -0.5, 0.5, 0.5);
glFlush();
}
//x,y 屏幕的长高
void redraw(int x, int y)
{
//如果X大于Y 则 X = Y 不然 Y = X
int dis = x > y ? y : x;
glViewport(0, 0, dis, dis);//创建一个视口
/*
* x,y表示视口左下角的坐标,width,height表示视口的宽度和高度
* 这里选择大小改变后的窗口较小的边,作为新的视口边长
*/
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_STENCIL|GLUT_RGB);
glutInitWindowPosition(0, 0);
glutInitWindowSize(500, 500);
glutCreateWindow("有视口的窗口");
glutDisplayFunc(yh);
glutReshapeFunc(redraw);
glutMainLoop();
return 0;
}