3.简单图形

简单图形

目标:熟悉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;
}

最终运行结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值