首页 > 其他分享 >OpenGL之绘制矩形使用索引和glUniform4f

OpenGL之绘制矩形使用索引和glUniform4f

时间:2023-08-05 11:22:12浏览次数:37  
标签:矩形 VAO OpenGL 0.5 uniform include Program GL glUniform4f

glUniform更改一个uniform变量或数组的值。要更改的uniform变量的位置由location指定,location的值应该由glGetUniformLocation函数返回。通过调用glUseProgram,glUniform操作的程序对象将成为当前状态的一部分。

glUniform{1|2|3|4}{f|i}使用传进来的实参,修改通过location指定的uniform变量。

所有在程序对象中定义的活动uniform变量,在程序对象链接成功后都会被初始化为0.直到下一次程序对象链接成功再一次被初始化为0前,它们将保留通过调用glUniform赋给它们的值。

glUniform{1|2|3|4}{f|i}v可以用来更改单个uniform变量的值,或者一个uniform变量数组。

glUniformMatrix{2|3|4}fv用来更改一个矩阵或一个矩阵数组。

1.Shader.h

  1 #pragma once    
  2 
  3 #include<string>
  4 #include<fstream>
  5 #include<sstream>
  6 #include<iostream>
  7 using namespace std;
  8 
  9 // 我们自己的着色器
 10 class Shader
 11 {
 12 private:
 13     GLuint vertex, fragment;    // 顶点着色器 和 片元着色器 
 14 public:
 15     GLuint Program;                // 着色器程序的ID
 16 
 17     // Constructor(着色器构造函数)
 18     Shader(const GLchar* vertexPath, const GLchar* fragmentPath)
 19     {
 20         // 文件读取系列的变量定义
 21         string vertexCode;
 22         string fragmentCode;
 23         ifstream vShaderFile;
 24         ifstream fShaderFile;
 25 
 26         // 异常机制处理:保证ifstream对象可以抛出异常:
 27         vShaderFile.exceptions(ifstream::badbit);
 28         fShaderFile.exceptions(ifstream::badbit);
 29 
 30         try
 31         {
 32             // 打开文件
 33             vShaderFile.open(vertexPath);
 34             fShaderFile.open(fragmentPath);
 35             stringstream vShaderStream, fShaderStream;
 36 
 37             // 读取文件的缓冲内容到数据流中
 38             vShaderStream << vShaderFile.rdbuf();
 39             fShaderStream << fShaderFile.rdbuf();
 40 
 41             // 关闭文件处理器
 42             vShaderFile.close();
 43             fShaderFile.close();
 44 
 45             // 转换数据流到string
 46             vertexCode = vShaderStream.str();
 47             fragmentCode = fShaderStream.str();
 48 
 49         }
 50         catch (ifstream::failure e) {    // 发生异常时输出
 51             cout << "ERROR::SHADER::FILE_NOT_SUCCESSFULLY_READ" << endl;
 52         }
 53 
 54         /* 将 string 类型的字符串转化为 char数组 类型 */
 55         const GLchar* vShaderCode = vertexCode.c_str();
 56         const GLchar* fShaderCode = fragmentCode.c_str();
 57 
 58         /* 顶点着色器 */
 59         vertex = glCreateShader(GL_VERTEX_SHADER);                // 创建顶点着色器对象
 60         glShaderSource(vertex, 1, &vShaderCode, NULL);            // 将顶点着色器的内容传进来
 61         glCompileShader(vertex);                                // 编译顶点着色器
 62         GLint flag;                                                // 用于判断编译是否成功
 63         GLchar infoLog[512];
 64         glGetShaderiv(vertex, GL_COMPILE_STATUS, &flag); // 获取编译状态
 65         if (!flag)
 66         {
 67             glGetShaderInfoLog(vertex, 512, NULL, infoLog);
 68             cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << endl;
 69         }
 70 
 71         /* 片元着色器 */
 72         fragment = glCreateShader(GL_FRAGMENT_SHADER);            // 创建片元着色器对象
 73         glShaderSource(fragment, 1, &fShaderCode, NULL);        // 将片元着色器的内容传进来
 74         glCompileShader(fragment);                                // 编译顶点着色器
 75         glGetShaderiv(fragment, GL_COMPILE_STATUS, &flag);        // 获取编译状态
 76         if (!flag)
 77         {
 78             glGetShaderInfoLog(fragment, 512, NULL, infoLog);
 79             cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << endl;
 80         }
 81 
 82         /* 着色器程序 */
 83         this->Program = glCreateProgram();
 84         glAttachShader(this->Program, vertex);
 85         glAttachShader(this->Program, fragment);
 86         glLinkProgram(this->Program);
 87         if (!flag)
 88         {
 89             glGetProgramInfoLog(this->Program, 512, NULL, infoLog);
 90             cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << endl;
 91         }
 92         // 删除着色器,它们已经链接到我们的程序中了,已经不再需要了
 93         glDeleteShader(vertex);
 94         glDeleteShader(fragment);
 95     }
 96 
 97     // Deconstructor(析构函数)
 98     ~Shader()
 99     {
100         glDetachShader(this->Program, vertex);
101         glDetachShader(this->Program, fragment);
102         glDeleteShader(vertex);
103         glDeleteShader(fragment);
104         glDeleteProgram(this->Program);
105     }
106 
107     void Use()
108     {
109         glUseProgram(this->Program);
110     }
111 };
View Code

2.shader_rect_v.txt

1 #version 330 core                            // 3.30版本
2 layout(location = 0) in vec3 position;        // 位置变量的属性位置值为0
3 void main()
4 {
5     gl_Position = vec4(position, 1.0f);        // 核心函数(位置信息赋值)
6 } 
View Code

3.shader_rect_f.txt

1 #version 330 core         // 3.30版本
2 out vec4 FragColor;     // 输出是四个浮点数构成的一个向量 RGB+aerfa
3 uniform vec4 time;        // 在OpenGL程序代码中设定这个变量(uniform:实时地变量表示)
4 void main()
5 {
6     FragColor = time;    // 颜色随时间变化
7 }
View Code

4.DrawRectUseIndice.cpp

 1 /* 引入相应的库 */
 2 #include <iostream>
 3 using namespace std;
 4 
 5 #define GLEW_STATIC    
 6 #include <GL/glew.h>    
 7 #include <GLFW/glfw3.h> 
 8 
 9 #include"Shader.h"
10 
11 /* 编写各顶点位置 */
12 GLfloat vertices_1[] =
13 {
14     //position                    
15      0.5f,  0.5f, 0.0f,            // top right        0
16      0.5f, -0.5f, 0.0f,            // bottom right        1
17     -0.5f, -0.5f, 0.0f,            // bottom left        2
18     -0.5f,  0.5f, 0.0f,            // top left            3
19 };
20 
21 /* 四个顶点的连接信息给出来 */
22 GLuint indices_1[] =
23 {
24     0, 1, 3,        // 序号为 0、1、3 的顶点组合成一个三角形
25     1, 2, 3            // 序号为 1、2、3 的顶点组合成一个三角形
26 };
27 
28 const GLint WIDTH = 600, HEIGHT = 600;        // 正方形窗口
29 
30 int main()
31 {
32     glfwInit();
33     GLFWwindow* window_1 = glfwCreateWindow(WIDTH, HEIGHT, "Learn OpenGL Triangle test", nullptr, nullptr);
34     int screenWidth_1, screenHeight_1;
35     glfwGetFramebufferSize(window_1, &screenWidth_1, &screenHeight_1);
36     glfwMakeContextCurrent(window_1);
37     glewInit();
38 
39     /* 将我们自己设置的着色器文本传进来 */
40     Shader ourShader = Shader("shader_rect_v.txt", "shader_rect_f.txt");        // 相对路径
41 
42     /* 设置顶点缓冲对象(VBO) + 设置顶点数组对象(VAO)  */
43     GLuint VAO, VBO;
44     glGenVertexArrays(1, &VAO);
45     glGenBuffers(1, &VBO);
46     glBindVertexArray(VAO);
47     glBindBuffer(GL_ARRAY_BUFFER, VBO);
48     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices_1), vertices_1, GL_STATIC_DRAW);
49 
50     /* 设置链接顶点属性 */
51     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
52     glEnableVertexAttribArray(0);    // 通道 0 打开
53 
54     /* 设置索引缓冲对象    */
55     GLuint EBO;
56     glGenBuffers(1, &EBO);
57     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
58     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices_1), indices_1, GL_STATIC_DRAW);
59 
60     // draw loop 画图循环
61     while (!glfwWindowShouldClose(window_1))
62     {
63         // 视口 + 时间 
64         glViewport(0, 0, screenWidth_1, screenHeight_1);
65         glfwPollEvents();
66 
67         // 渲染 + 清除颜色缓冲
68         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
69         glClear(GL_COLOR_BUFFER_BIT);
70 
71         /*  绘制图形 */
72         ourShader.Use();
73         float time = glfwGetTime();                        // 获取时间
74         float redValue = sin(time) / 2.0f + 0.5f;        // 红色数值计算,范围[0,1]
75         float greenValue = 1 - redValue;                // 绿色数值计算,范围[0.1]。且满足 “redValue + greenValue = 1”
76         int vertexColorLocation = glGetUniformLocation(ourShader.Program, "time");
77         glUniform4f(vertexColorLocation, redValue, greenValue, 0.0f, 1.0f);
78 
79         glBindVertexArray(VAO);                                    // 绑定 VAO
80         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);                // 绑定 EBO
81         glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);    // 画两个三角形 从第0个顶点开始 一共画6次
82         glBindVertexArray(0);                                    // 解绑定 VAO
83         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);                // 解绑定 EBO
84 
85         // 交换缓冲
86         glfwSwapBuffers(window_1);
87     }
88 
89     glDeleteVertexArrays(1, &VAO);    // 释放资源
90     glDeleteBuffers(1, &VBO);
91     glDeleteBuffers(1, &EBO);
92     glfwTerminate();                // 结束
93     return 0;
94 }
View Code

 

标签:矩形,VAO,OpenGL,0.5,uniform,include,Program,GL,glUniform4f
From: https://www.cnblogs.com/sansuiwantong/p/17607678.html

相关文章

  • OpenGL之绘制三角形使用顶点颜色
     ●VBO、VAO与EBO之间的联系与区别:⭐️⭐️  ①顶点缓冲对象VBO是在显卡存储空间中开辟出的一块内存缓存区,用于存储顶点的各类属性信息,如顶点坐标、顶点法向量、顶点颜色数据等。在渲染时,可以直接从VBO中取出顶点的各类属性数据,由于VBO在显存而不是在内存中,不需要从CP......
  • 代码随想录算法训练营第四十六天| 84.柱状图中最大的矩形
     84.柱状图中最大的矩形要求:有多个矩形,要求返回可能勾勒出的最大矩形思路:寻找右边第一个小于当前节点的index寻找左边第一个小于当前节点的index 右边:累加的方式,如果当前节点小于,那么判读后放进去左边,放进去了之后,当前节点后一个,就是左边最小的代码:1//要求:和相......
  • uniapp 之h5修改全局滚动条(浏览器下滑有小矩形滚动条)
    在index.html文件里<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,user-scalable=no,initial-......
  • OpenGL之HelloWorld
    1#include<iostream>//C++的标准输入输出头文件2usingnamespacestd;34#defineGLEW_......
  • OpenGL之DrawTriangle
    1/*第一步:引入相应的库*/2#include<iostream>3usingnamespacestd;45#defineGLEW_STATIC6#include<GL/glew.h>7#include<GLFW/glfw3.h>8910/*第二步:编写顶点位置*/11GLfloatvertices_1[]=12{130.0......
  • Linux 下的 OpenGL 之路(九):天空盒、反射和折射
    前言搞定了天空盒,才算是真正完成了场景的搭建,以后再要进行什么样的图形学测试,都可以在这个场景下进行。比如后面的反射、折射就是这样的例子。写完这篇,我决定暂时结束这个系列。主要是因为我太懒了,居然拖拖拉拉拖了两年。其实可以探索的内容还有很多,比如阴影啊、HDR啊、辉光啊、......
  • 代码随想录算法训练营第60天 | ● 84.柱状图中最大的矩形 - 第10章 动态规划part03
     第十章 单调栈part03有了之前单调栈的铺垫,这道题目就不难了。  ●  84.柱状图中最大的矩形   今天是训练营最后一天,恭喜坚持两个月的录友们,接下来可以写一篇自己 代码随想录一刷的总结。好好回顾一下,这两个月自己的博客内容,以及自己的收获。  ......
  • OpenGL入门——浅谈OpenGL
    OpenGL入门了很多次,但是一旦踏出一段时间,就又啥也不懂,从头开始。以前只是需要用的时候草草学一下怎么用,会套用就行,没让自己停下来认真思考消化......短时间看效率高,长时间看效率低,因为每次使用都得重新搜索学习。所以想在再次入门的时候记录点东西,整理一下自己的思绪,以后有时间......
  • 搭建opengl环境
    转载自:https://www.cnblogs.com/ls-33/p/6595818.html 开始学习opengl啦,练习用的编辑器是codeblocks。首先当然是要清楚如何使用codeblocks创建一个opengl项目了。首先必须先引用opengl的库glut,网上百度下载一个完整的glut.下载下来的glut包后解压然后进行以下步骤:将glut......
  • OpenGL在QT中的管理
    一、设计思路1.用例图管理 2.困惑点:(1)在程序编写中,为什么主程序的Shader可以关联到model类中的数据。解决:在加载数据方面,利用VBO、VAO等,已经将数据通过处理推到GPU上。二、代码实现GLHeader.h#pragmaonce#include<QOpenGLShaderProgram>#include......