当前位置:首页 > 生活百科

opengl配置环境(模拟器用opengl还是directx)

栏目:生活百科日期:2025-02-16浏览:0

最近在课程上在学习计算机图像,对于突然冒出来的好多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;}

“opengl配置环境(模拟器用opengl还是directx)” 的相关文章

产品经理数据分析和归纳(5个方面进行数据分析)

用户体验五要素是产品经理的入门必须课之一,这是从思路到具体落地的一种经典的思维框架。实际上这种框架不仅适用于产品设计,在很多地方都可以适用。比如梁宁曾经提到过想...

千兆路由器和百兆区别怎么看(超详解说2者不同处)

我们常说的千兆路由器、百兆路由器,这里的千兆和百兆指的是路由器有线接口的连接速率,千兆即1000Mbps,百兆即100Mbps,因此千兆路由器和百兆路由器就不难...

window端口占用怎么处理(解决window端口被占用的方法)

一、在windows操作系统中,查询端口占用和清除端口占用的程序提升权限后用:netstat-b或用1、查询端口占用的进程ID点击&&#8221;开始&&#82...

公众号如何引流和推广(分享公众号推广技巧)

随着公众号的深入人心,很多企业和个人都纷纷的开通了公众号来推广自己的产品或服务,但同时公众号的推广难度越来越高,积累粉丝就是其中最难一块内容了,那公众号推广的方...

unity官方教程项目在哪里(unity自带官方教程)

Unity3D是一款3D游戏引擎,提供了3D游戏的大部分基础功能实现,比如物理碰撞、3D模型显示、光照等功能。市面上有超过一半以上的游戏,都是利用Unity游戏...

5万左右suv哪款车好,2020最值得入手的三款suv

面对如今汽车越来越普及的情况下,很多年轻人都希望能拥有一辆属于自己的代步车。但是众所周知的,对于刚刚步入社会的年轻人来说,在购车这方面预算还是比较有限的。好比如...

winhex绿色版安装步骤(winhex镜像恢复教程)

我们知道Windows10X是微软全新打造的Windows系统,尽管它已经跳票到了2021年,但关于Win10X的开发工作其实已经大体上完成,微软已经准备好发布...

企业将如何进行品牌定位(效果最好的3种定位法)

一直在说品牌定位,可你们知道定位理论的开创者是谁吗?杰克·特劳特,定位理论的开创者。我们身处互联网信息十大,人们的心智启动了两项功能以此来保护自己。一个是排斥信...

哪里找工作靠谱一点,这五个网站让你少走弯路

对于投简历这件事,你一定听过“海投”这个词~但是,有的小伙伴投了上百份简历,HR的回应寥寥无几……青妹认为,想让自己的简历投递的更加精准,早些得到企业的“翻牌”...

免费文字阅读发声软件(把文字变成声音的方法)

大家在平时的生活中应该都会听到各种语音,吆喝的广告,或者宣传车等等,那么这些语音是怎么来的呢?有一部分当然是付费服务,那么今天就给大家来推荐一款文字转语音的软件...