【OpenGL】VAO数组实现一个OpenGL程序绘制多个图形:绘制五星红旗
如何绘制五角星见:http://t.csdn.cn/5rMA1,本文国旗由五个五角星组成
使用OpenGL通过VAO数组、VBO数组和EBO数组绘制五星红旗
#include<iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include<cmath>#define pi 3.14159265const char* fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(255.0f, 222.0f, 0.0f, 1.0f);\n"
"}\n\0";const char* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}void processInput(GLFWwindow* window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}float ang2rad(float ang) {return (ang * pi) / 180;
}float findBiggerRadius(float smallR) {float a, b, c, x1, x2, d;float num1 = sin(ang2rad(36)) / sin(ang2rad(126));a = (1 - (pow(num1, 2)));b = (2 * num1 * smallR * cos(ang2rad(126)));c = -(smallR * smallR);//scanf("%f %f %f",&a,&b,&c);if (a != 0){d = sqrt(b * b - 4 * a * c);x1 = (-b + d) / (2 * a);x2 = (-b - d) / (2 * a);if (x1 < x2)return x2;elsereturn x1;}return -1;
}int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//将主版本号(Major)和次版本号(Minor)都设为3glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//告诉GLFW我们使用的是核心模式(Core-profile)GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))//我们给GLAD传入了用来加载系统相关的OpenGL函数指针地址的函数。GLFW给我们的是glfwGetProcAddress,它根据我们编译的系统定义了正确的函数。{std::cout << "Failed to initialize GLAD" << std::endl;return -1;}glViewport(0, 0, 500, 500);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);unsigned int vertexShader;vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);unsigned int fragmentShader;fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);unsigned int shaderProgram;shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);//glUseProgram(shaderProgram);glDeleteShader(vertexShader);glDeleteShader(fragmentShader);//Vertex1float v_center1x = -0.5f;float v_center1y = 0.5f;float radius_small = 0.1f;float radius_big = findBiggerRadius(radius_small);float v[35];float degree = 54.0f;int i = 0;while (i < 15) {v[i++] = v_center1x + radius_small * cos(ang2rad(degree));v[i++] = v_center1y + radius_small * sin(ang2rad(degree));v[i++] = 1.0f;degree += 72.0f;}degree = 18.0f;while (i < 30) {v[i++] = v_center1x + radius_big * cos(ang2rad(degree));v[i++] = v_center1y + radius_big * sin(ang2rad(degree));v[i++] = 1.0f;degree += 72.0f;}v[i++] = v_center1x;v[i++] = v_center1y;v[i++] = 1.0f;//Vertex2float v1[35];v_center1x = -0.1f;v_center1y = 0.80f;radius_small = 0.05f;radius_big = findBiggerRadius(radius_small);degree = 94.0f;i = 0;while (i < 15) {v1[i++] = v_center1x + radius_small * cos(ang2rad(degree));v1[i++] = v_center1y + radius_small * sin(ang2rad(degree));v1[i++] = 1.0f;degree += 72.0f;}degree = 58.0f;while (i < 30) {v1[i++] = v_center1x + radius_big * cos(ang2rad(degree));v1[i++] = v_center1y + radius_big * sin(ang2rad(degree));v1[i++] = 1.0f;degree += 72.0f;}v1[i++] = v_center1x;v1[i++] = v_center1y;v1[i++] = 1.0f;//Vertex3float v2[35];v_center1x = 0.1f;v_center1y = 0.50f;radius_small = 0.05f;radius_big = findBiggerRadius(radius_small);degree = 74.0f;i = 0;while (i < 15) {v2[i++] = v_center1x + radius_small * cos(ang2rad(degree));v2[i++] = v_center1y + radius_small * sin(ang2rad(degree));v2[i++] = 1.0f;degree += 72.0f;}degree = 38.0f;while (i < 30) {v2[i++] = v_center1x + radius_big * cos(ang2rad(degree));v2[i++] = v_center1y + radius_big * sin(ang2rad(degree));v2[i++] = 1.0f;degree += 72.0f;}v2[i++] = v_center1x;v2[i++] = v_center1y;v2[i++] = 1.0f;//Vertex4float v3[35];v_center1x = 0.05f;v_center1y = 0.15f;radius_small = 0.05f;radius_big = findBiggerRadius(radius_small);degree = 54.0f;i = 0;while (i < 15) {v3[i++] = v_center1x + radius_small * cos(ang2rad(degree));v3[i++] = v_center1y + radius_small * sin(ang2rad(degree));v3[i++] = 1.0f;degree += 72.0f;}degree = 18.0f;while (i < 30) {v3[i++] = v_center1x + radius_big * cos(ang2rad(degree));v3[i++] = v_center1y + radius_big * sin(ang2rad(degree));v3[i++] = 1.0f;degree += 72.0f;}v3[i++] = v_center1x;v3[i++] = v_center1y;v3[i++] = 1.0f;//Vertex5float v4[35];v_center1x = -0.2f;v_center1y = -0.1f;radius_small = 0.05f;radius_big = findBiggerRadius(radius_small);degree = 34.0f;i = 0;while (i < 15) {v4[i++] = v_center1x + radius_small * cos(ang2rad(degree));v4[i++] = v_center1y + radius_small * sin(ang2rad(degree));v4[i++] = 1.0f;degree += 72.0f;}degree = -2.0f;while (i < 30) {v4[i++] = v_center1x + radius_big * cos(ang2rad(degree));v4[i++] = v_center1y + radius_big * sin(ang2rad(degree));v4[i++] = 1.0f;degree += 72.0f;}v4[i++] = v_center1x;v4[i++] = v_center1y;v4[i++] = 1.0f;/*unsigned int indices[] = {// 注意索引从0开始!// 此例的索引(0,1,2,3)就是顶点数组vertices的下标,// 这样可以由下标代表顶点组合成矩形0, 1, 3, // 第一个三角形1, 2, 3 // 第二个三角形};*/unsigned int indices[] = {// 注意索引从0开始! // 此例的索引(0,1,2,3)就是顶点数组vertices的下标,// 这样可以由下标代表顶点组合成矩形0, 6, 10,6, 1, 10,1, 7, 10,2, 7, 10,2, 8, 10,3, 8, 10,3, 9, 10,4, 9, 10,4, 5, 10,0, 5, 10};glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);unsigned int VBO[5], VAO[5], EBO[5];glGenVertexArrays(6, VAO);glGenBuffers(6, VBO);glGenBuffers(6, EBO);//BIND BIGSTARglBindVertexArray(VAO[0]);glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);glBufferData(GL_ARRAY_BUFFER, sizeof(v), v, GL_STATIC_DRAW);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO[0]);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_TRUE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);//BIND SMALLSTAR1glBindVertexArray(VAO[1]);glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);glBufferData(GL_ARRAY_BUFFER, sizeof(v1), v1, GL_STATIC_DRAW);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO[1]);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_TRUE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);//BIND SMALLSTAR2glBindVertexArray(VAO[2]);glBindBuffer(GL_ARRAY_BUFFER, VBO[2]);glBufferData(GL_ARRAY_BUFFER, sizeof(v2), v2, GL_STATIC_DRAW);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO[2]);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_TRUE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);//BIND SMALLSTAR3glBindVertexArray(VAO[3]);glBindBuffer(GL_ARRAY_BUFFER, VBO[3]);glBufferData(GL_ARRAY_BUFFER, sizeof(v3), v3, GL_STATIC_DRAW);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO[3]);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_TRUE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);//BIND SMALLSTAR3glBindVertexArray(VAO[4]);glBindBuffer(GL_ARRAY_BUFFER, VBO[4]);glBufferData(GL_ARRAY_BUFFER, sizeof(v4), v4, GL_STATIC_DRAW);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO[4]);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_TRUE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);while (!glfwWindowShouldClose(window))//我们需要在程序中添加一个while循环,我们可以把它称之为渲染循环(Render Loop),它能在我们让GLFW退出前一直保持运行{// 输入processInput(window);//渲染指令QAQ//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glClearColor(1.0f, 0.0f, 0.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgram);glBindVertexArray(VAO[0]);glDrawElements(GL_TRIANGLES, 30, GL_UNSIGNED_INT, 0);glUseProgram(shaderProgram);glBindVertexArray(VAO[1]);glDrawElements(GL_TRIANGLES, 30, GL_UNSIGNED_INT, 0);glBindVertexArray(VAO[2]);glDrawElements(GL_TRIANGLES, 30, GL_UNSIGNED_INT, 0);glBindVertexArray(VAO[3]);glDrawElements(GL_TRIANGLES, 30, GL_UNSIGNED_INT, 0);glBindVertexArray(VAO[4]);glDrawElements(GL_TRIANGLES, 30, GL_UNSIGNED_INT, 0);//检查并调用事件,交换缓冲glfwSwapBuffers(window);glfwPollEvents();}glfwTerminate();return 0;
}
实现效果
参考1:LearnOpenGL CN:https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/
参考2:沙拉酱609 opengl之如何在一个窗口中绘制多个角色/物体:https://blog.csdn.net/qq_45543503/article/details/120671763
【OpenGL】VAO数组实现一个OpenGL程序绘制多个图形:绘制五星红旗相关推荐
- opengl 安装_一步步学OpenGL(34) -《GLFX,一个OpenGL效果库》
教程 34 GLFX,一个OpenGL效果库 原文: http://ogldev.atspace.co.uk/www/tutorial34/tutorial34.html CSDN完整版专栏: htt ...
- 编写一个python程序、输出如下图形效果_Tkinter模块编写Python图形界面代码实例...
本篇文章小编给大家分享一下Tkinter模块编写Python图形界面代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 一.为何使用Tkinter ...
- python请输出如下图形的程序_编写一个python程序,输出如下图形效果。
[简答题]2.变量与常量作业-.docx [简答题]8.类和对象作业-.docx [计算题]计算 [计算题]求极限 [简答题]使用FileReader对象把Java源文件显示在控制台窗口 [单选题]设 ...
- java 图形绘制_Java Graphics 图形绘制
Graphics类提供基本绘图方法,Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形.画字符串等. 画线段 drawLine pub ...
- 使用matlab的mesh函数绘制3维图形绘制
我们在分析空间的时候,经常会遇到3D绘图的需求,在matlab中有可以直接调用的函数可以直接使用.下面的代码就展示了一个简单的示例. 我们看到,代码先使用meshgrid函数生成了网格数组[mu,nu ...
- python画棒棒糖程序_Python使用turtle库绘制小猪佩奇(实例代码)
turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制.turtle图形绘制的概念诞生于1969年,成功应用于LOGO编程语言. turtle库绘制图形有一个基本框架:一个小海龟 ...
- Qt中的基础图形绘制
文章目录 1 Qt中的基础图形绘制 2 Qt基础图形绘制中的视口和窗口 3 综合实例开发:简易绘图程序 3.1 需求分析 3.2 设计分析 1 Qt中的基础图形绘制 Qt图形系统中的关键角色: QPa ...
- 【CV 向】OpenCV 图形绘制指南
文章目录 引言 1. 创建画布 2. 绘制线段 3. 绘制矩形 4. 绘制圆 5. 绘制椭圆 6. 绘制多边形 7. 绘制字体 结论 引言 Python OpenCV 是一个功能强大的计算机视觉库,除 ...
- 神经网络基础知识、常用激活函数及其Python图形绘制
在人工智能与机器学习研究与应用领域,神经网络占有重要地位.神经网络(Neural Networks, NNs),又称人工神经网络(Artificial Neural Networks, ANNs),是 ...
最新文章
- 基于视觉模型强化学习的通用机器人
- 虚拟机开启以后电脑非常卡_专主开VT电脑版手机安卓模拟器开启VT 模拟器开启VT 虚拟机打开VT...
- HDU-2159 FATE 二维背包
- Spring Boot中@ConfigurationProperties与@PropertySource的基本使用(读取指定的properties文件)
- vue中的watch监听
- metacube 链接 mysql_2019 年 5月 随笔档案 - rgqancy - 博客园
- python2.7.11 for iOS 苹果上的python27环境
- 两台电脑如何实现共享文件
- SONATYPE NEXUS搭建MAVEN私服
- 小型迷宫实现---迷宫算法(递归回溯法)
- 解密加油优惠打折券的制作过程
- Mybatis 注解@select,@detele,@update,@insert的简单应用
- 如何在Word中画横线?
- 面对妖艳的配置文件,python小技巧来帮你!
- Laravel数据库 Eloquent 操作返回值
- mysql主键可以重复吗_mysql 处理主键重复
- ssm整合说明与模板-Spring Spring MVC Mybatis整合开发
- 最新版谷歌浏览器每次都要允许flash解决方法
- 电脑蓝屏黑屏无法开机.BIOS更新.进不去系统只能重装?驱动人生解决方案
- mysql字符集mysqldump_Mysqldump 字符集问题