图元

图元primitive,即图形元素,是可以编辑的最小图形单位。图元是图形软件用于操作和组织画面的最基本的素材。一幅画面由图元组成,图元是一组最简单的、最通用的几何图形或字符。

在OpenGL中最基本的三种图元类型:点Point、线Line、三角形Triangle。多边形Polygon可以看成是三角形带GL_TRIANGLE_TRIPE组成

顶点数组

glVertexAttribPointer可以用来装载一个顶点数组
glEnableVertexAttribArray启用顶点数组

缓存buffer

glGenBuffers分配bufID
glBindBuffer绑定当前操作buf
glBufferData往当前绑定buf拷贝数据

绘制

glDrawArrays绘制启用的顶点数组

代码示例

#include <gl/glew.h>)
#include <gl/freeglut.h>#ifdef WIN32
#pragma comment(lib, "glew32.lib")
#pragma comment(lib, "freeglut.lib")
#endif#include <math.h>
const GLfloat Pi = 3.1415926536f;int glut_loop_continue = 1;
enum EVA{EVA_triangle, EVA_Num};
GLuint  aVAs[EVA_Num];
enum EB{EB_triangle, EB_NUM};
GLuint  aBufs[EB_NUM];void reshape(int w, int h){glViewport(0, 0, w, h);
}void display(){glClearColor(0.0, 0.0, 0.0, 1.0);glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f, 1.0f, 0.0f);// 画顶点数组//glDrawArrays(GL_TRIANGLES, 0, 6);// 画矩形//glRectf(-0.5f, -0.5f, 0.5f, 0.5f);// 画圆(多边形趋近)glBegin(GL_LINE_LOOP);float r = 0.5f;int n = 360;for(int i=0; i < n; ++i)glVertex2f(r *cos(2*Pi/n*i), r*sin(2*Pi/n*i));glEnd(); 画五角星 按照A->C->E->B->D->A的顺序,可以一笔将五角星画出GLfloat a = 1 / (2-2*cos(72*Pi/180));GLfloat bx = a * cos(18 * Pi/180);GLfloat by = a * sin(18 * Pi/180);GLfloat cy = -a * cos(18 * Pi/180);GLfloatPointA[2] = { 0, a },PointB[2] = { bx, by },PointC[2] = { 0.5, cy },PointD[2] = { -0.5, cy },PointE[2] = { -bx, by };glBegin(GL_LINE_LOOP);glVertex2fv(PointA);glVertex2fv(PointC);glVertex2fv(PointE);glVertex2fv(PointB);glVertex2fv(PointD);glEnd();// 画坐标系//glColor3f(0.0f, 1.0f, 1.0f);//glBegin(GL_LINES);//glVertex2f(-1.0f, 0.0f);//glVertex2f(1.0f, 0.0f);        // 以上两个点可以画x轴//glVertex2f(0.0f, -1.0f);//glVertex2f(0.0f, 1.0f);        // 以上两个点可以画y轴//glEnd(); 画正弦函数//glColor3f(1.0f, 1.0f, 0.0f);//glBegin(GL_LINE_STRIP);//float factor = 0.1f;//for(float x=-1.0f/factor; x<1.0f/factor; x+=0.01f)//{//  glVertex2f(x*factor, sin(x)*factor);//}//glEnd();glutSwapBuffers();
}void key(unsigned char key, int x, int y){switch(key){case 27: // Esc//glutLeaveMainLoop();glut_loop_continue = 0;break;}
}void idle(){// 添加你自己的判断条件,比如从缓存中获取到新的图像数据引起窗口重绘if (1){glutPostRedisplay();}
}void initRC(){glFrontFace(GL_CCW);glCullFace(GL_BACK);glEnable(GL_CULL_FACE);glPointSize(2.0f);glLineWidth(5.0f);glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glGenVertexArrays(EVA_Num, aVAs);glBindVertexArray(aVAs[EVA_triangle]);GLfloat triangles[][2] = {{ -0.90,    -0.90 },{  0.85,    -0.90 },{ -0.90,     0.85 },{  0.90,    -0.85 },{  0.90,     0.90 },{ -0.85,     0.90 },};glGenBuffers(EB_NUM, aBufs);glBindBuffer(GL_ARRAY_BUFFER, aBufs[EB_triangle]);glBufferData(GL_ARRAY_BUFFER, sizeof(triangles), triangles, GL_STATIC_DRAW);glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);
}void releaseRC(){glDeleteVertexArrays(EVA_Num, aVAs);glDeleteBuffers(EB_NUM, aBufs);
}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);glutInitWindowPosition(0, 0);glutInitWindowSize(600, 600);int mainwnd = glutCreateWindow("glut window");glutReshapeFunc(reshape);glutDisplayFunc(display);glutKeyboardFunc(key);if (glewInit() != GLEW_OK){return -1;}initRC();// 设置窗口关闭后继续执行程序,而不是exit直接退出了程序//glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);while (glut_loop_continue){if (glutGetWindow() == 0)break; // 窗口关闭时退出事件循环glutMainLoopEvent();idle();Sleep(1); // 循环休眠,防止占用CPU过高}releaseRC();    return 0;
}

效果图:

这里是画了个圆和五角星,你可以尝试放开display里面的画顶点数组、画矩形、画圆、画五角星、画坐标系、画正弦函数,看看各种效果。

OpenGL学习笔记--绘制图元相关推荐

  1. OpenGL学习笔记(一)绘制点线面及多面体

    OpenGL学习笔记(一)绘制点线面及多面体 绘制点线面 #include <iostream> #include <GL/GLUT.h> #define PI 3.14159 ...

  2. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  3. OpenGL学习笔记(一):环境搭建、三维空间坐标系理解以及OpenGL的基本使用

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7866 ...

  4. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  5. 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】

    ✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...

  6. OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7919 ...

  7. OpenGL学习笔记:矩阵变换

    文章目录 缩放 glm矩阵表示 glm缩放矩阵实现 位移 齐次坐标 glm位移矩阵实现 旋转 沿x轴旋转 沿y轴旋转 沿z轴旋转 沿任意轴旋转 glm旋转矩阵实现 矩阵的组合 glm矩阵组合使用 接上 ...

  8. OPENGL学习笔记之八

    OPENGL学习笔记之八 2017/11/15 阅读材料来自learnopengl.com以及learnopengl-cn.github.io 我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将 ...

  9. 【OpenGL学习笔记】地月系

    OpenGL学习笔记2-地月系 文章目录 OpenGL学习笔记2-地月系 前言 运行结果 纹理图片 一.TexturePool 1.**TexturePool.h** 2.**TexturePool. ...

最新文章

  1. [译]JavaScript中,{}+{}等于多少?
  2. python综合程序设计-Python程序设计实验五:综合运用三种基本结构进行程序设计...
  3. HBase与时空索引技术
  4. JavaScript实现degreeToRadian度到弧度算法(附完整源码)
  5. JavaScript语法(二)
  6. 重构真的能提高代码质量吗?
  7. 为什么使用%lf读取double型的值,而用%f进行显示?
  8. 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception
  9. 苹果手机传照片到电脑_如何将苹果手机的照片和视频导到电脑上?小白看过来哦...
  10. 编码格式与Datatable数据
  11. anaconda下载太慢怎么办_Windows10下anaconda成功运行Cython
  12. 21、2010年中兴面试题
  13. UCDOS和鲍岳桥and 我和我的嵌入式GUI(DOS,Linux,uC/OS-II等)
  14. excel与access结合运用_如何在EXCEL与ACCESS之间建立关联
  15. linux 系统的磁盘 mbr 转gpt方法
  16. 京东自动评价助手/京东评价
  17. 金蝶旗舰版当期新增固定资产,当期就计提折旧
  18. 假设检验,p-value,glm
  19. N! hdu 1042
  20. springboot实现邮箱接收验证码

热门文章

  1. matlab_R2010b下载及安装文档和备用序列号
  2. 电子笔记本的思考(1)(ver0.2)
  3. 物流车队养内鬼1年半盗1680部iPhone4S
  4. 使用docker安装Prometheus
  5. java jmap 分析_Jmap 分析
  6. 查看自己的mac是macOS x64还是macOS ARM64
  7. 最早的一次hacker经历
  8. 百度搜索词API接口,淘宝搜索词API接口
  9. 因聚而生 为你所能 | 华为伙伴暨开发者大会2022盛大召开
  10. Python 之天天向上的魔力