OpenGL学习笔记--绘制图元
图元
图元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学习笔记--绘制图元相关推荐
- OpenGL学习笔记(一)绘制点线面及多面体
OpenGL学习笔记(一)绘制点线面及多面体 绘制点线面 #include <iostream> #include <GL/GLUT.h> #define PI 3.14159 ...
- OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...
- OpenGL学习笔记(一):环境搭建、三维空间坐标系理解以及OpenGL的基本使用
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7866 ...
- 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】
✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...
- 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】
✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...
- OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7919 ...
- OpenGL学习笔记:矩阵变换
文章目录 缩放 glm矩阵表示 glm缩放矩阵实现 位移 齐次坐标 glm位移矩阵实现 旋转 沿x轴旋转 沿y轴旋转 沿z轴旋转 沿任意轴旋转 glm旋转矩阵实现 矩阵的组合 glm矩阵组合使用 接上 ...
- OPENGL学习笔记之八
OPENGL学习笔记之八 2017/11/15 阅读材料来自learnopengl.com以及learnopengl-cn.github.io 我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将 ...
- 【OpenGL学习笔记】地月系
OpenGL学习笔记2-地月系 文章目录 OpenGL学习笔记2-地月系 前言 运行结果 纹理图片 一.TexturePool 1.**TexturePool.h** 2.**TexturePool. ...
最新文章
- [译]JavaScript中,{}+{}等于多少?
- python综合程序设计-Python程序设计实验五:综合运用三种基本结构进行程序设计...
- HBase与时空索引技术
- JavaScript实现degreeToRadian度到弧度算法(附完整源码)
- JavaScript语法(二)
- 重构真的能提高代码质量吗?
- 为什么使用%lf读取double型的值,而用%f进行显示?
- 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception
- 苹果手机传照片到电脑_如何将苹果手机的照片和视频导到电脑上?小白看过来哦...
- 编码格式与Datatable数据
- anaconda下载太慢怎么办_Windows10下anaconda成功运行Cython
- 21、2010年中兴面试题
- UCDOS和鲍岳桥and 我和我的嵌入式GUI(DOS,Linux,uC/OS-II等)
- excel与access结合运用_如何在EXCEL与ACCESS之间建立关联
- linux 系统的磁盘 mbr 转gpt方法
- 京东自动评价助手/京东评价
- 金蝶旗舰版当期新增固定资产,当期就计提折旧
- 假设检验,p-value,glm
- N! hdu 1042
- springboot实现邮箱接收验证码