在刚刚学习了现代OpenGL后,想做一些好玩的东西。这是第一个,想做两个三角形,然后这两个三角形的颜色会一直变化,就能达到闪烁的效果。

  1. 绘制两个不同颜色的三角形的话,首先应该将顶点的索引分成两个ibo对象,然后通过两个vao对象来进行绑定,而顶点数据vbo对象可以共用两个,只不过需要在两个vao对象上分别绑定一次;
  2. 不同颜色的三角形,则需要两个不同的片段着色器(疑问:能否只用同一个片段着色器达到两种不同的颜色?),然后分别在不同的FragmentShader中设置不同的颜色,然后在窗口循环中进行渲染时,分别对两个vao进行渲染前使用不同的ShaderProgram以及绑定两个vao对象即可;
  3. 如果想让三角形的颜色变化起来,也就是在每次循环渲染时改变着色器的颜色设置。可以通过uniform来获得两个片段着色器中的颜色变量,然后在着色器程序外部对片段着色器中的颜色变量进行赋值,从而达到每次渲染时颜色变化的效果。

代码如下:(这些代码看起来有点乱,没有抽象化,不符合面向对象编程的风格,但是对于整个OpenGL的渲染管线的理解来说比抽象出来更加容易理解)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <vector>int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);GLFWwindow* window = glfwCreateWindow(640, 480, "Rectangle", nullptr, nullptr);glfwMakeContextCurrent(window);std::cout << glGetString(GL_VERSION) << std::endl;glewInit();unsigned int vao1;glGenVertexArrays(1, &vao1);glBindVertexArray(vao1);std::vector<float> vertices = {-0.5f, -0.5f, // 00.5f, -0.5f, // 10.5f,  0.5f, // 2-0.5f,  0.5f // 3};unsigned int vbo;glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(float), &vertices[0], GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);std::vector<int> indices1 = {0, 1, 2};unsigned int ibo1;glGenBuffers(1, &ibo1);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo1);glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * sizeof(unsigned int), &indices1[0], GL_STATIC_DRAW);unsigned int vao2;glGenVertexArrays(1, &vao2);glBindVertexArray(vao2);glBindBuffer(GL_ARRAY_BUFFER, vbo);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);std::vector<int> indices2 = {2, 3, 0};unsigned int ibo2;glGenBuffers(1, &ibo2);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo2);glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * sizeof(unsigned int), &indices2[0], GL_STATIC_DRAW);const char* vertexShaderSource = "#version 330 core\n""layout(location = 0) in vec4 pos;\n""void main()\n""{\n""  gl_Position = pos;\n""}\0";unsigned int vs = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vs, 1, &vertexShaderSource, nullptr);glCompileShader(vs);int success;glGetShaderiv(vs, GL_COMPILE_STATUS, &success);if (!success){char message[512];glGetShaderInfoLog(vs, 512, nullptr, message);std::cout << message << std::endl;}const char* fragmentShaderSource = "#version 330 core\n""out vec4 color;\n""uniform vec4 u_Color;\n""void main()\n""{\n""    color = u_Color;\n""}\0";unsigned int fs = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fs, 1, &fragmentShaderSource, nullptr);glCompileShader(fs);const char* fragmentShaderSource1 = "#version 330 core\n""out vec4 color;\n""uniform vec4 u_Color;\n""void main()\n""{\n"" color = u_Color;\n""}\0";unsigned int fs1 = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fs1, 1, &fragmentShaderSource1, nullptr);glCompileShader(fs1);unsigned int program = glCreateProgram();glAttachShader(program, vs);glAttachShader(program, fs);glLinkProgram(program);int result;glGetProgramiv(program, GL_LINK_STATUS, &result);if (!result){char info[512];glGetProgramInfoLog(program, 512, nullptr, info);std::cout << info << std::endl;}unsigned int program1 = glCreateProgram();glAttachShader(program1, vs);glAttachShader(program1, fs1);glLinkProgram(program1);glUseProgram(program1);glDeleteShader(vs);glDeleteShader(fs);glDeleteShader(fs1);glBindVertexArray(0);//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);int location1 = glGetUniformLocation(program, "u_Color");ASSERT(location1 != -1);int location2 = glGetUniformLocation(program1, "u_Color");ASSERT(location2 != -1);float r1 = 0.0f, r2 = 1.0f;float increment1 = 0.05f, increment2 = 0.05f;while (!glfwWindowShouldClose(window)){glClear(GL_COLOR_BUFFER_BIT);glBindVertexArray(vao1);glUseProgram(program);glUniform4f(location1, r1, 0.2f, 0.8f, 1.0f);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr);glBindVertexArray(vao2);glUseProgram(program1);glUniform4f(location2, 0.4f, r2, 0.2f, 1.0f);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr);glfwSwapBuffers(window);glfwPollEvents();if (r1 > 1)increment1 = -0.05f;else if (r1 < 0)increment1 = 0.05f;r1 += increment1;if (r2 > 1)increment2 = -0.05f;else if (r2 < 0)increment2 = 0.05f;r2 += increment2;}glDeleteProgram(program);glfwTerminate();return 0;
}

效果:

Modern OpenGL---做一些好玩的东西 01(绘制两个同时闪烁的三角形)相关推荐

  1. python能做什么有趣的东西-可以用 Python 做哪些神奇好玩的事情?

    Python作为一种应用极为广泛的语言,几乎在任何领域都能派上用场.想做Web有Flask / Django / Tornado:想做分布式有Celery:想做手机App有 Kivy :想做数据分析有 ...

  2. cv/dl/cl领域的实验室官网/牛人主页/技术论坛/比赛数据库/好玩的东西

    #技术论坛 1/mit的关于关于机器人的技术review https://www.technologyreview.com/c/robotics/ 2/valse视觉与学习青年学者讨论会 http:/ ...

  3. 【Modern OpenGL】第一个三角形

    >说明:跟着learnopengl的内容学习,不是纯翻译,只是自己整理记录.>强烈推荐原文,无论是内容还是排版. [原文链接](http://learnopengl.com/#!Getti ...

  4. DEFCON GROUP 010上竟玩了这些好玩的东西!

    本文讲的是DEFCON GROUP 010上竟玩了这些好玩的东西!, 曾经在我刚入行时,经常听一些前辈讲:作为黑客,如果不能参加DEFCON,那你一定会遗憾终生.那个时候对DEFCON还没有很深入的了 ...

  5. 好玩的东西,测试一下

    好玩的东西,测试一下 看到我的blog左边公告栏下面有一个QQ的图标了吗? 点击它就可以给我的QQ发消息了,不用加我为好友 当然,前提是你机器上的QQ正在运行着 测试一下,我还没用过呢

  6. 【Modern OpenGL】Shader

    Shaders 正如在上一篇教程中提到的,shader是在GPU中运行的小程序.如上一个教程中实现的最简单的vertex shader和fragment shader,一个shader基本上负责图形渲 ...

  7. WinHEC上好玩的东西

    上周四参加WinHEC,讲了一场课之后,去会场转了转,看见了几个好玩的东西.Surface之类咱们就不说了,很酷,不过说多了也就不酷了.这次WinHEC里有几项技术应该是国内的,当时人比较多忘记要资料 ...

  8. 记录一下最近找到的好玩的东西

    记录一下最近找到的好玩的东西 1 自定义各软件启动的快捷方式 点击应用的快捷方式图标,右键,属性--快捷方式---快捷键 2 将应用固定在任务栏上,Windows键加1则打开固定的第一个应用,以此类推 ...

  9. SurfaceView简单理解,Android混淆,Android openGl开发详解简单图形的绘制,

    SurfaceView允许你在非ui线程中去绘制. SurfaceView的帧率可以操作60FPS 在要求实时性比较高的游戏开发中,显然,view的ondraw是满足不了你的,这时候只能是用Surfa ...

最新文章

  1. rpm包安装apache发布多个虚拟主机
  2. 从零开始学习jQuery (九) jQuery工具函数
  3. pandas python groupby_pandas之分组groupby()的使用整理与总结
  4. c++ map 修改value_干货 | 名企高频考点如何使用map统计字符串各个字符出现的次数...
  5. MySQL /“N叉树”的N值在MySQL中是可以被人工调整吗
  6. 函数的作用域在各浏览器的混乱情况
  7. mybatis高级查询,批量新增
  8. python 查询sqlserver 视图_SQL Server 2017 数据库教与学(教学大纲,含Python+SQL Server案例)...
  9. java 二叉树特点_疯狂java笔记之树和二叉树
  10. java enummap_Java EnumMap containsValue()方法与示例
  11. visual studio 2013 触发挂起事件
  12. 排序算法第三篇——归并排序
  13. 移植busybox构建最小根文件系统
  14. vue-cli 没有build如何配置_如何从零开发一个 gradle 插件(一)
  15. 时间数值缺失产生的字符串NaT处理
  16. 测试方法之JUnit单元测试
  17. DSkin的DSkinDataGridView控件滚动条拖动后位置不变
  18. 微信小程序怎样关闭直播插件
  19. 如何在matlab坐标轴上输入希腊字符和开根号符号
  20. Python自动批量删除微博

热门文章

  1. TCP怎么保证数据的可靠性?
  2. 为人民服务!选调生公告:江苏省2023年应届优秀大学毕业生
  3. 我在北京生活的尴尬——读韩寒《马上会跌,跌破一千》有感
  4. lol提示游戏环境异常重启计算机,教你win7系统lol游戏环境异常请重启机器后再试的解决教程...
  5. 雅礼集训 1.2 取石子游戏
  6. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java快递代拿系统jx6gg
  7. python可爱代码_Python里那些可爱的游戏模块们
  8. 如何在Ubuntu 18.04上安装Apache Kafka
  9. 解决电脑在待机唤醒后无法连接网络
  10. java字符串转换bigdecimal_安全字符串到BigDecimal转换