我是靠谱客的博主 繁荣天空,最近开发中收集的这篇文章主要介绍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负责把视景体截取的图像按照怎样的高和宽显示到屏幕上
      	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 不过渡,颜色有层次

  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()设置材质
  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);
    	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常见函数意义及绘图代码模板的全部内容,希望文章能够帮你解决openGL常见函数意义及绘图代码模板所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部