如何绘制五角星见: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程序绘制多个图形:绘制五星红旗相关推荐

  1. opengl 安装_一步步学OpenGL(34) -《GLFX,一个OpenGL效果库》

    教程 34 GLFX,一个OpenGL效果库 原文: http://ogldev.atspace.co.uk/www/tutorial34/tutorial34.html CSDN完整版专栏: htt ...

  2. 编写一个python程序、输出如下图形效果_Tkinter模块编写Python图形界面代码实例...

    本篇文章小编给大家分享一下Tkinter模块编写Python图形界面代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 一.为何使用Tkinter ...

  3. python请输出如下图形的程序_编写一个python程序,输出如下图形效果。

    [简答题]2.变量与常量作业-.docx [简答题]8.类和对象作业-.docx [计算题]计算 [计算题]求极限 [简答题]使用FileReader对象把Java源文件显示在控制台窗口 [单选题]设 ...

  4. java 图形绘制_Java Graphics 图形绘制

    Graphics类提供基本绘图方法,Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形.画字符串等. 画线段 drawLine pub ...

  5. 使用matlab的mesh函数绘制3维图形绘制

    我们在分析空间的时候,经常会遇到3D绘图的需求,在matlab中有可以直接调用的函数可以直接使用.下面的代码就展示了一个简单的示例. 我们看到,代码先使用meshgrid函数生成了网格数组[mu,nu ...

  6. python画棒棒糖程序_Python使用turtle库绘制小猪佩奇(实例代码)

    turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制.turtle图形绘制的概念诞生于1969年,成功应用于LOGO编程语言. turtle库绘制图形有一个基本框架:一个小海龟 ...

  7. Qt中的基础图形绘制

    文章目录 1 Qt中的基础图形绘制 2 Qt基础图形绘制中的视口和窗口 3 综合实例开发:简易绘图程序 3.1 需求分析 3.2 设计分析 1 Qt中的基础图形绘制 Qt图形系统中的关键角色: QPa ...

  8. 【CV 向】OpenCV 图形绘制指南

    文章目录 引言 1. 创建画布 2. 绘制线段 3. 绘制矩形 4. 绘制圆 5. 绘制椭圆 6. 绘制多边形 7. 绘制字体 结论 引言 Python OpenCV 是一个功能强大的计算机视觉库,除 ...

  9. 神经网络基础知识、常用激活函数及其Python图形绘制

    在人工智能与机器学习研究与应用领域,神经网络占有重要地位.神经网络(Neural Networks, NNs),又称人工神经网络(Artificial Neural Networks, ANNs),是 ...

最新文章

  1. 基于视觉模型强化学习的通用机器人
  2. 虚拟机开启以后电脑非常卡_专主开VT电脑版手机安卓模拟器开启VT 模拟器开启VT 虚拟机打开VT...
  3. HDU-2159 FATE 二维背包
  4. Spring Boot中@ConfigurationProperties与@PropertySource的基本使用(读取指定的properties文件)
  5. vue中的watch监听
  6. metacube 链接 mysql_2019 年 5月 随笔档案 - rgqancy - 博客园
  7. python2.7.11 for iOS 苹果上的python27环境
  8. 两台电脑如何实现共享文件
  9. SONATYPE NEXUS搭建MAVEN私服
  10. 小型迷宫实现---迷宫算法(递归回溯法)
  11. 解密加油优惠打折券的制作过程
  12. Mybatis 注解@select,@detele,@update,@insert的简单应用
  13. 如何在Word中画横线?
  14. 面对妖艳的配置文件,python小技巧来帮你!
  15. Laravel数据库 Eloquent 操作返回值
  16. mysql主键可以重复吗_mysql 处理主键重复
  17. ssm整合说明与模板-Spring Spring MVC Mybatis整合开发
  18. 最新版谷歌浏览器每次都要允许flash解决方法
  19. 电脑蓝屏黑屏无法开机.BIOS更新.进不去系统只能重装?驱动人生解决方案
  20. mysql字符集mysqldump_Mysqldump 字符集问题

热门文章

  1. ip地址解析成国家、城市、iso code或者按语言获取城市名
  2. 通过百度地图把经纬度转化成城市名
  3. 谈下微软企业生产力大学的Sharepoint Service 2010 的3天培训
  4. 西安城的智慧,西安人的欢歌
  5. ESP32任务看门狗实践
  6. 养QQ宠物不花Q币?完全可以!(转)
  7. shell 脚本处理多行文本的记录 -- awk
  8. C语言求ex的近似值
  9. Powerful***功能强大的文本编辑器***PilotEdit Lite
  10. 给后辈的一点建议,含泪整理面经