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

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

版权声明:本文图片和内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送联系客服 举报,一经查实,本站将立刻删除,请注明出处:https://www.4kpp.com/8134.html

(0)
漫空客漫空客
上一篇 2023年4月23日
下一篇 2023年4月23日

相关推荐

  • 硬盘分盘教程(新电脑硬盘分区步骤)

    那么首先 我们 去下载一个名字叫 DiskGenius 的一个软件简称 DG分区工具 自行百度下载打开后是这个样子的 好 我们来看看我们的 硬盘在什么位置 对 就是这里 你插上新的…

    2023年4月23日
    1500
  • 神游太虚(神游太虚是什么境界)

    今天小编给各位分享神游太虚(神游太虚是什么境界),如果能碰巧解决你现在面临的问题,别忘了关注小站,我们一起开始吧! 贾宝玉的幻境怎么了?电视上好像没有提到…我想知道是怎…

    投稿 2023年4月23日
    3730
  • jpg是什么意思(单反摄影RAW和JPG格式你选哪个?)

    jpg是什么意思(单反摄影RAW和JPG格式你选哪个?) 很多摄友拍了百思特网多年的照片,还一直使用JPG格式。对于RAW格式知道很少,或许觉得是麻烦,或许是不了解。对新手来说,都…

    2023年4月22日
    2220
  • 电光火石(电光火石什么意思)

    今天跟大家分享一个关于crackle的问题(crackle是什么意思)。以下是这个问题的总结。让我们来看看。 爆裂声:启迪人类文明的火花 爆裂声是一个描述极快运动或变化的词。它来源…

    投稿 2023年4月23日
    980
  • 走月亮是什么意思(走月亮课文)

    今天小编给各位分享走月亮是什么意思(走月亮课文),如果能碰巧解决你现在面临的问题,别忘了关注小站,我们一起开始吧! 在月球上行走这一段的主旨和中心思想 《漫步月球》是吴然的抒情散文…

    投稿 2023年4月23日
    1440
  • 大病救助范围(大病救助范围2019)

    今天给大家分享一个关于大病救助范围的问题(《大病救助范围2019》)。以下是这个问题的总结。让我们来看看。 什么是大病救助? 重疾救助是指* * *或相关机构针对特定重疾人群提供的…

    投稿 2023年4月23日
    1050
  • 爱逛街 淘宝(爱逛街软件)

    刚刚落幕的全民淘宝节,展示了中小微经济的“万千神奇”和电商创业的新动能。 一只猫的生意,带动了宠物汉服、美容、汽车安全带等140多种类目发展;一人食的电饭煲,8大功能满足独居青年自…

    投稿 2023年4月23日
    2420
  • 宠物鸟种类(宠物鸟种类以及图片大全)

    今天给大家分享一个关于宠物鸟种类的问题(宠物鸟种类及完整图片)。以下是这个问题的总结。让我们来看看。 介绍一些适合养宠物的鸟。 鸟类作为珍稀动物,因其独特的外貌和个性而受到人们的喜…

    投稿 2023年4月23日
    1530
  • 赞助费计入什么科目(企业赞助费会计处理)

    【导读】:民办企业顾名思义就是由人民群众建立的企业,除了我们一般的政府单位之外,还有一种性质是民办非单位,它们也可以接受企业的赞助。那么民办非单位收到企业赞助入什么科目呢?想了解与…

    投稿 2023年4月23日
    3040
  • 手机微信密码破解器(ec微信密码破解)

    手机微信密码破解器(ec微信密码破解) 找到别人失踪的电话 它不仅没有归还主人。 相反,通过破解密码, 兑换1100元给微信钱包的失主。 玉山县张村镇妇女 在证人席上 玉山县公安局…

    2023年4月22日
    1090

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注