最近在课程上在学习计算机图像,对于突然冒出来的好多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负责把视景体截取的图像按照怎样的高和宽显示到屏幕上
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
//将当前矩阵指定为投影矩阵 glMatrixMode(GL_PROJECTION); //把矩阵设为单位矩阵 glLoadIdentity(); //让中心坐标(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*/);
glEnd();
}
}
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() 设置材质
  1. 示例代码:直线的绘制
#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);
glMatrixMode(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);
glutMainLoop();
return 0;
}

openGL常见函数意义的更多相关文章

  1. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  2. OpenGL: 纹理采样 texture sample

    Sampler (GLSL) Sampler通常是在Fragment shader(片元着色器)内定义的,这是一个uniform类型的变量,即处理不同的片元时这个变量是一致不变的.一个sampler和 ...

  3. 【转】OpenGL超级宝典笔记——纹理映射Mipmap

    原文地址 http://my.oschina.net/sweetdark/blog/177812 , 感谢作者,若非法转载请联系本人. 目录[-] Mipmapping Mipmap过滤 构建Mip层 ...

  4. 1.openGL 初探

    GLEW, GLFW和GLM介绍 现在你有了工程,就让我们开始介绍下工程所用到的开源库和为啥需要这些. The OpenGL Extension Wrangler (GLEW)是用来访问OpenGL ...

  5. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现 什么意思? 拾取 最简单的理解拾取的方式大概是到(http://www.yakergong.net/nehe/course/t ...

  6. OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别

    OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间 ...

  7. OpenGL FAQ

    转自:http://www.cnblogs.com/indif/archive/2011/04/22/2024659.html 1.什么是OpenGL?OpenGL即开放图形库(Open Graphi ...

  8. 一篇说尽Excel常见函数用法

    一篇说尽Excel常见函数用法 Word,PPT,Excel这三个Office软件是职场办公里最常用的三个软件,但是我发现简书上写PPT的教程多,Excel的少,即使有,也是零零散散.因为Excel的 ...

  9. OpenGL管线(用经典管线代说着色器内部)

    图形管线(graphics pipeline)向来以复杂为特点,这归结为图形任务的复杂性和挑战性.OpenGL作为图形硬件标准,是最通用的图形管线版本.本文用自顶向下的思路来简单总结OpenGL图形管 ...

随机推荐

  1. 安装 Angular Material UI

    文档 调色板 安装 ng add @angular/material ? Choose a prebuilt theme name, or "custom" for a custo ...

  2. CURTIS SAVANAH:数字经济=智能基础设施+海量数据+新生业态

    前不久,Datahero Inc公司(公司编号:20141166945)创始人CURTIS SAVANAH在会议上表示,要构建数字经济的愿景,需要智能基础设施.海量数据和全新新生业态. 他在演讲中说到 ...

  3. npm与package.json快速入门

    本文转载自npm与package.json快速入门 导语 npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解了一些,这次结合官方文章总结一下,加深下理解吧! 读完本 ...

  4. Linux之根目录说明

    文件系统 文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构:即在存储设备上组织文件的方法.操作系统中负责管理和存储文件信息的软件 ...

  5. JVisualVM监控JVM-外网服务器

    环境说明: a:阿里云服务器Centos8.2 b:JDK1.8 1:增加JMV运行参数 java -jar 启动时添加一下参数: -Djava.rmi.server.hostname=外网IP地址 ...

  6. GPU 总结

    What features of GPUs allow them to perform computations faster than a typical CPU? GPUs have a mass ...

  7. 后端程序员之路 6、Python fabric

    直接写shell固然也很好,但是用python来写脚本,也是美滋滋.fabric是一个封装部署.多机操作等功能的python库. Welcome to Fabric! - Fabric documen ...

  8. 运营好帮手| 华为DTM助电商类应用实现营销数据快速跟踪

    对于电商来说,销售额就是生命线,业务运营人员需要实时关注订单量,交易额,支付转化率等,并从各种维度对比分析,无论增幅或降幅,都需要马上找到原因,落地运营手段进行干预.快速准确的得到各种营销数据就显得格 ...

  9. 使用CSS计数器美化数字有序列表

    在web设计中,使用一种井井有条的方法来展示数据是十分重要的,这样用户就可以很清晰的理解网站所展示的数据结构和内容,使用有序列表就是实现数据有组织的展示的一种简单方法. 如果你需要更加深入地控制有序列 ...

  10. HDOJ-1024(动态规划+滚动数组)

    Max Sum Plus Plus HDOJ-1024 动态转移方程:dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j]) (0<k<j) ...