模拟器用opengl还是directx(opengl配置环境)
最近在课程上在学习计算机图像,对于突然冒出来的好多glut库里的函数感觉很难招架。把示例代码一行行百度下来,总算是差不多理解了大概的意思,在这里分享一下绘制图像需要的基础的函数。
1. 配置环境
对于openGL的环境配置可以看我之前写的环境配置的文章,点击文章底部左下角“阅读原文”就可以访问原文章。
2. main函数设置
基本设置
在绘制图像前还需要对程序进行初始化
在main函数里需要添加初始化语句
//这个函数用来初始化 GLUT 库
glutInit(&argc, argv);
//设置颜色模式和缓冲区格式
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
颜色模式:
参数有,GLUT_RGBA模式;GLUT_RGB模式 ;GLUT_INDEX模式
缓冲区类型 :GLUT_SINGLE——单缓冲窗口;GLUT_DOUBLE——双缓冲窗口
GLUT_SINGLE 实际上就是将所有的绘图指令在窗口上执行,一般只用于显示单独的一副非动态的图
GLUT_DOUBLE 实际上绘图指令是在一个缓冲区完成,在绘图指令完成之后,再通过交换指令把完成的图形立即显示在屏幕上,一般用于生成动画效果
窗体设置
对绘制的窗体的设置,同样可以写入main函数中
//设置初始窗口的位置
glutInitWindowPosition(100, 100);
//设置初始窗口的大小
glutInitWindowSize(400, 400);
//根据前面设置建立窗口,参数设置为变体
glutCreateWindow("实验");
//颜色函数设置
Init();
//绘图时被调用的函数
glutDisplayFunc(myDisplay);
//改变窗体大小时进行图像重绘
glutReshapeFunc(Reshape);
//进行消息循环,用于显示窗体,窗体关闭后自动退出循环
glutMainLoop();
glutInitWindowPosition(int x, int y)窗口左上角相对于计算机坐标(x,y)
glutDisplayFunc(myDisplay)其中的 myDisplay 参数为自己设置的成像函数
glutReshapeFunc(Reshape)其中的 Reshape 参数为自己设置的重新成像函数
Reshape函数设置
void Reshape(int w, int h) {
//glViewport负责把视景体截取的图像按照怎样的高和宽显示到屏幕上
gViewport(0, 0, (GLsizei)w, (GLsizei)h);
//将当前矩阵指定为投影矩阵
glMatrixMode(GL_PROJECTION);
//把矩阵设为单位矩阵
lLoadIdentity();
//让中心坐标(0,0)变成窗口的左下角
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
颜色函数设置
void Init(){
//设置颜色
glClearColor(0.0, 0.0, 0.0, 0.0);
//颜色过渡形式
glShadeModel(GL_FLAT);
}
glShadeModel 函数用于控制opengl中绘制指定两点间其他点颜色的过渡模式
参数一般为 GL_SMOOTH(默认)自然过渡;GL_FLAT 不过渡,颜色有层次
函数用于控制opengl中绘制指定两点间其他点颜色的过渡模式 参数一般为 GL_SMOOTH(默认)自然过渡 GL_FLAT 不过渡,颜色有层次
3.绘图函数 myDisplay 函数设置
void myDraw(int a, int b) {
/*other code*/
//指定栅格化点的直径
glPointSize(1);
//绘图准备
glBegin(GL_POINTS);
glVertex2i(/*other code*/);
lEnd();
}
}
void myDisplay(void) {
myDraw(a,b)
glFlush();//强制刷新缓冲,保证绘图命令将被执行
}
/* other code */ 为绘图必要的条件设置
glPointSize(1) 表示图像直径为一个像素点,其中的参数可以决定整体图像的粗细程度
glBegin() 是和 glEnd() 结合起来使用
函数原型 void glBegin(GLenum mode)
mode:创建元素的类型,比如:点,线等。可以是以下数值:
函数 | 说明 |
GL_POINTS | 把每个顶点作为一个点进行处理 |
GL_LINES | 把每个顶点作为一个独立的线段 |
GL_LINE_STRIP | 绘制从第一个顶点到最后一个顶点依次相连的一组线段 |
GL_LINE_LOOP | 绘制从第一个顶点到最后一个顶点首尾相连的一组线段 |
GL_TRIANGLES | 把每个顶点作为一个独立的三角形 |
GL_TRIANGLE_STPIP | 绘制一组相连的三角形 |
GL_QUADS | 绘制由四个顶点组成的一组单独的四边形 |
GL_QUAD_STRIP | 绘制一组相连的四边形 |
在 glBegin() 和 glEnd() 之间需要调用函数绘图,glVertex() 设置顶点坐标
glVertex2i 输入整型的点
glVertex2f 输入单精度的点
glVertex2d 输入双精度的点
除此之外还有其他可以在 glBegin() 和 glEnd() 之间调用的函数
函数 | 说明 |
glVertex() | 设置顶点坐标 |
glColor() | 设置当前颜色 |
glIndex() | 设置当前颜色表 |
glNormal() | 设置法向坐标 |
glCoord() | 产生坐标 |
glCallList(),glCallLists() | 执行显示列表 |
glTexCoord() | 设置纹理坐标 |
glEdgeFlag() | 控制边界绘制 |
glMaterial() | 设置材质 |
4.示例代码:直线的绘制
#include <GL/glut.h>
#include <math.h>
void myDraw(int x0, int y0, int x1, int y1) {
int m = 0;
if (abs(x1 - x0) >= abs(y1 - y0))
m = abs(x1 - x0);
else
m = abs(y1 - y0);
float dx = (float)(x1 - x0) / m;
float dy = (float)(y1 - y0) / m;
float x = x0;
float y = y0;
glPointSize(1);
for (int i = 0;i < m;i++) {
glBegin(GL_POINTS);
glVertex2i((int)(x + 0.5), (int)(y + 0.5));
glEnd();
x += dx;
y += dy;
}
}
void myDisplay(void) {
myDraw(0, 0, 200, 300);
glFlush();
}
void Init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void Reshape(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
lMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("实验1 直线绘制");
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
lutMainLoop();
return 0;
}
推荐阅读
-
洗衣机不脱水了是怎么回事(洗衣机不甩干的处理方法)
洗衣机作为大家日常生活必备的家用电器,其利用率频繁,难免会因为机械磨损、缺乏润滑油、机件老化、弹簧疲劳变形等原因,出现各种不正...
-
电子表格零基础自学教程(小白也能学明白)
可能很多人(包括我)觉得Excel不就是做个表吗,没什么好学的。然而很多大型企业在面试的时候还是会问,“会Excel吗?”“会...
-
笔记本电脑报价大全(联想笔记本多少钱)
(注意:建议在旗舰店、官方旗舰店、官网购买) 一、游戏本设计本、办公本推荐如下: 华为品牌:(全球第一大电信设备商) 1...
-
煲机软件哪个好(让耳机有个思想准备)
《无间道》中陈永仁与刘建明有过一句经典对白&mdash;&mdash;“高音甜、中音准、低音沉,总之一个词通透”。这一句话也一...
-
viewsonic平板电脑(viewsonic平板电脑刷机)
ViewSonic是一个视讯品牌,中文名字:优派。 ViewSonic 一、读音:英[vju:][?s?n?k],美[vj...
-
采访麦克风户外哪款好(讯飞智能无线麦克风C1采访神器)
对于视频创作者、直播工作者、远程培训老师、记者等媒体工作者来说,工作过程中,最让人费心的莫过于如何确保收音纯正、字幕快速生成、...
-
电脑硬件配置怎么查(详述两招快速查看电脑配置参数信息)
大家好,今天跟大家分享两个快速查看电脑配置参数信息的办法。 操作步骤如下: 1右击电脑屏幕最下方任务栏左侧的电脑徽标按钮,...
-
数据线没坏但充不上电怎么办(数据线充不上电处理方法)
苹果充电器突然充不上电是比较尴尬的问题,首先看自己的充电器数据线是不是原装,如果非原装在第一次充电时,苹果手机会提示你是否要适...
-
电脑开机出现黑屏如何处理(电脑不能开机黑屏解决方法)
电脑不能开机或者开机以后黑屏怎么解决?这里收集了所有常见的维修方法,看完秒变维修高手,实在是一篇不能错过的电脑维修教程。简单易...
-
手机宝典怎么搞(小米手机性能优化宝典)
别再总是抱怨手机卡顿,系统臃肿,反应慢,现在看完这篇文章,你会发现你并不了解小米手机,当然,文中许多方法并不是仅仅适用于小米手...