目录

1、Z-缓冲

2、GLM库函数

3、PVM矩阵

4、PVM矩阵的使用

5、工程文件结构


1、Z-缓冲

//开启深度测试
glEnable(GL_DEPTH_TEST);

2、GLM库函数

3、PVM矩阵

4、PVM矩阵的使用

我们需要引入GLM函数库的头文件:

#include<glm/glm.hpp>
#include<glm/gtc/matrix_transform.hpp>
#include<glm/gtc/type_ptr.hpp>

设置vew矩阵的相关参数:

//相机参数
glm::vec3 camera_position = glm::vec3(0.0f, 0.0f, 3.0f);     //摄像机位置
glm::vec3 camera_front = glm::vec3(0.0f, 0.0f, -1.0f);       //摄像机方向
glm::vec3 camera_up = glm::vec3(0.0f, 1.0f, 0.0f);           //摄像机上向量

设置project矩阵视野fov:

float fov = 45.0f;

// Transform坐标变换矩阵glm::mat4 model(1);//model矩阵,局部坐标变换至世界坐标model = glm::translate(model, glm::vec3(0.0,0.0,0.0));model = glm::rotate(model, (float)glfwGetTime(), glm::vec3(0.5f, 1.0f, 0.0f));model = glm::scale(model, glm::vec3(1.0f,1.0f,1.0f));

glm::mat4 view(1);//view矩阵,世界坐标变换至观察坐标系view = glm::lookAt(camera_position, camera_position + camera_front, camera_up);

glm::mat4 projection(1);//projection矩阵,投影矩阵projection = glm::perspective(glm::radians(fov), (float)screen_width / screen_height, 0.1f, 100.0f);

int model_location = glGetUniformLocation(shader.ID, "model"); //获取着色器内某个参数的位置

glUniformMatrix4fv(model_location, 1, GL_FALSE, glm::value_ptr(model));//写入参数值

gl_Position=projection*view*model*vec4(aPos,1.0);

5、工程文件结构

shader.h

#ifndef __SHADER_H__
#define __SHADER_H__#include <glad/glad.h>
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "string"class Shader
{
public:unsigned int ID;Shader(const GLchar* vertex_shader_path, const GLchar* fragment_shader_path);~Shader();void Use();void SetBool(const std::string &name, bool value) const;void SetInt(const std::string &name, int value) const;void SetFloat(const std::string &name, float value) const;void SetVec2(const std::string &name, const glm::vec2 &value) const;void SetVec2(const std::string &name, float x, float y) const;void SetVec3(const std::string &name, const glm::vec3 &value) const;void SetVec3(const std::string &name, float x, float y, float z) const;void SetVec4(const std::string &name, const glm::vec4 &value) const;void SetVec4(const std::string &name, float x, float y, float z, float w) const;void SetMat2(const std::string &name, const glm::mat2 &value) const;void SetMat3(const std::string &name, const glm::mat3 &value) const;void SetMat4(const std::string &name, const glm::mat4 &value) const;private:int GetShaderFromFile(const GLchar* vertex_shader_path, const GLchar* fragment_shader_path,std::string *vertex_shader_code, std::string *fragment_shader_code);int LinkShader(const char* vertex_shader_code, const char* fragment_shader_code);int GetUniform(const std::string &name) const;void CheckCompileErrors(GLuint shader, std::string type);
};#endif // !__SHADER_H__
#ifndef __SHADER_H__
#define __SHADER_H__#include <glad/glad.h>
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "string"class Shader
{
public:unsigned int ID;Shader(const GLchar* vertex_shader_path, const GLchar* fragment_shader_path);~Shader();void Use();void SetBool(const std::string &name, bool value) const;void SetInt(const std::string &name, int value) const;void SetFloat(const std::string &name, float value) const;void SetVec2(const std::string &name, const glm::vec2 &value) const;void SetVec2(const std::string &name, float x, float y) const;void SetVec3(const std::string &name, const glm::vec3 &value) const;void SetVec3(const std::string &name, float x, float y, float z) const;void SetVec4(const std::string &name, const glm::vec4 &value) const;void SetVec4(const std::string &name, float x, float y, float z, float w) const;void SetMat2(const std::string &name, const glm::mat2 &value) const;void SetMat3(const std::string &name, const glm::mat3 &value) const;void SetMat4(const std::string &name, const glm::mat4 &value) const;private:int GetShaderFromFile(const GLchar* vertex_shader_path, const GLchar* fragment_shader_path,std::string *vertex_shader_code, std::string *fragment_shader_code);int LinkShader(const char* vertex_shader_code, const char* fragment_shader_code);int GetUniform(const std::string &name) const;void CheckCompileErrors(GLuint shader, std::string type);
};#endif // !__SHADER_H__
#ifndef __SHADER_H__
#define __SHADER_H__#include <glad/glad.h>
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "string"class Shader
{
public:unsigned int ID;Shader(const GLchar* vertex_shader_path, const GLchar* fragment_shader_path);~Shader();void Use();void SetBool(const std::string &name, bool value) const;void SetInt(const std::string &name, int value) const;void SetFloat(const std::string &name, float value) const;void SetVec2(const std::string &name, const glm::vec2 &value) const;void SetVec2(const std::string &name, float x, float y) const;void SetVec3(const std::string &name, const glm::vec3 &value) const;void SetVec3(const std::string &name, float x, float y, float z) const;void SetVec4(const std::string &name, const glm::vec4 &value) const;void SetVec4(const std::string &name, float x, float y, float z, float w) const;void SetMat2(const std::string &name, const glm::mat2 &value) const;void SetMat3(const std::string &name, const glm::mat3 &value) const;void SetMat4(const std::string &name, const glm::mat4 &value) const;private:int GetShaderFromFile(const GLchar* vertex_shader_path, const GLchar* fragment_shader_path,std::string *vertex_shader_code, std::string *fragment_shader_code);int LinkShader(const char* vertex_shader_code, const char* fragment_shader_code);int GetUniform(const std::string &name) const;void CheckCompileErrors(GLuint shader, std::string type);
};#endif // !__SHADER_H__

shader.cpp

#include "Shader.h"
#include "fstream"
#include "sstream"
#include "iostream"Shader::Shader(const GLchar* vertex_shader_path, const GLchar* fragment_shader_path)
{std::string vertex_shader_code;std::string fragment_shader_code;if (GetShaderFromFile(vertex_shader_path, fragment_shader_path, &vertex_shader_code, &fragment_shader_code)){return;}if (LinkShader(vertex_shader_code.c_str(), fragment_shader_code.c_str())){return;}
}Shader::~Shader()
{}void Shader::Use()
{glUseProgram(ID);
}void Shader::SetBool(const std::string &name, bool value) const
{SetInt(name, (int)value);
}void Shader::SetInt(const std::string &name, int value) const
{glUniform1i(GetUniform(name), value);
}void Shader::SetFloat(const std::string &name, float value) const
{glUniform1f(GetUniform(name), value);
}void Shader::SetVec2(const std::string &name, float x, float y) const
{glUniform2f(GetUniform(name), x, y);
}void Shader::SetVec2(const std::string &name, const glm::vec2 &value) const
{SetVec2(name, value.x, value.y);
}void Shader::SetVec3(const std::string &name, float x, float y, float z) const
{glUniform3f(GetUniform(name), x, y, z);
}void Shader::SetVec3(const std::string &name, const glm::vec3 &value) const
{SetVec3(name, value.x, value.y, value.z);
}void Shader::SetVec4(const std::string &name, float x, float y, float z, float w) const
{glUniform4f(GetUniform(name), x, y, z, w);
}void Shader::SetVec4(const std::string &name, const glm::vec4 &value) const
{SetVec4(name, value.x, value.y, value.z, value.w);
}void Shader::SetMat2(const std::string &name, const glm::mat2 &value) const
{glUniformMatrix2fv(GetUniform(name), 1, GL_FALSE, &value[0][0]);
}void Shader::SetMat3(const std::string &name, const glm::mat3 &value) const
{glUniformMatrix3fv(GetUniform(name), 1, GL_FALSE, &value[0][0]);
}void Shader::SetMat4(const std::string &name, const glm::mat4 &value) const
{glUniformMatrix4fv(GetUniform(name), 1, GL_FALSE, &value[0][0]);
}int Shader::GetShaderFromFile(const GLchar* vertex_shader_path, const GLchar* fragment_shader_path, std::string *vertex_shader_code, std::string *fragment_shader_code)
{std::ifstream vertex_shader_file;std::ifstream fragment_shader_file;vertex_shader_file.exceptions(std::ifstream::badbit | std::ifstream::failbit);fragment_shader_file.exceptions(std::ifstream::badbit | std::ifstream::failbit);try{vertex_shader_file.open(vertex_shader_path);fragment_shader_file.open(fragment_shader_path);std::stringstream vertex_shader_stream, fragment_shader_stream;vertex_shader_stream << vertex_shader_file.rdbuf();fragment_shader_stream << fragment_shader_file.rdbuf();vertex_shader_file.close();fragment_shader_file.close();*vertex_shader_code = vertex_shader_stream.str();*fragment_shader_code = fragment_shader_stream.str();}catch (std::ifstream::failure e){std::cout << "Load Shader File Error!" << std::endl;return -1;}return 0;
}int Shader::LinkShader(const char* vertex_shader_code, const char* fragment_shader_code)
{int vertex_shader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertex_shader, 1, &vertex_shader_code, NULL);glCompileShader(vertex_shader);CheckCompileErrors(vertex_shader, "VERTEX");int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragment_shader, 1, &fragment_shader_code, NULL);glCompileShader(fragment_shader);CheckCompileErrors(fragment_shader, "FRAGMENT");this->ID = glCreateProgram();glAttachShader(ID, vertex_shader);glAttachShader(ID, fragment_shader);glLinkProgram(ID);CheckCompileErrors(ID, "PROGRAM");glDeleteShader(vertex_shader);glDeleteShader(fragment_shader);return 0;
}int Shader::GetUniform(const std::string &name) const
{int position = glGetUniformLocation(ID, name.c_str());if (position == -1){std::cout << "uniform " << name << " set failed!" << std::endl;}return position;
}void Shader::CheckCompileErrors(GLuint shader, std::string type)
{GLint success;GLchar infoLog[512];if (type == "PROGRAM"){glGetProgramiv(shader, GL_LINK_STATUS, &success);if (!success){glGetProgramInfoLog(shader, 512, NULL, infoLog);std::cout << "ERROR::PROGRAM_LINKING_ERROR!\n" << infoLog << std::endl;}}else{glGetShaderiv(shader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(shader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::" << type << "::COMPILATION_FAILED\n" << infoLog << std::endl;}}
}

main.cpp

//总体流程
//1. 初始化并创建窗口
//2. 加载立方体顶点VAOVBO以及着色器并开启深度测试
//3. 进入主循环清除缓冲
//4. 使用立方体着色器,构造并传入pvm矩阵,绘制
//5. 循环结束,释放VAOVBO#include <iostream>
#include "glad/glad.h"
#include "GLFW/glfw3.h"
#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"
#include "glm/gtc/type_ptr.hpp"#include "shader.h"const float vertices[] = {                  //立方体数组-0.5f, -0.5f, -0.5f, 1.0f,0.0f,0.0f,0.5f, -0.5f, -0.5f,  1.0f,0.0f,0.0f,0.5f,  0.5f, -0.5f,  1.0f,0.0f,0.0f,0.5f,  0.5f, -0.5f,  1.0f,0.0f,0.0f,-0.5f,  0.5f, -0.5f,  1.0f,0.0f,0.0f,-0.5f, -0.5f, -0.5f,  1.0f,0.0f,0.0f,-0.5f, -0.5f,  0.5f,  0.0f,1.0f,0.0f,0.5f, -0.5f,  0.5f,  0.0f,1.0f,0.0f,0.5f,  0.5f,  0.5f,  0.0f,1.0f,0.0f,0.5f,  0.5f,  0.5f,  0.0f,1.0f,0.0f,-0.5f,  0.5f,  0.5f,  0.0f,1.0f,0.0f,-0.5f, -0.5f,  0.5f,  0.0f,1.0f,0.0f,-0.5f,  0.5f,  0.5f,  0.0f,0.0f,1.0f,-0.5f,  0.5f, -0.5f,  0.0f,0.0f,1.0f,-0.5f, -0.5f, -0.5f,  0.0f,0.0f,1.0f,-0.5f, -0.5f, -0.5f,  0.0f,0.0f,1.0f,-0.5f, -0.5f,  0.5f,  0.0f,0.0f,1.0f,-0.5f,  0.5f,  0.5f,  0.0f,0.0f,1.0f,0.5f,  0.5f,  0.5f,  0.5f,0.0f,0.0f,0.5f,  0.5f, -0.5f,  0.5f,0.0f,0.0f,0.5f, -0.5f, -0.5f,  0.5f,0.0f,0.0f,0.5f, -0.5f, -0.5f,  0.5f,0.0f,0.0f,0.5f, -0.5f,  0.5f,  0.5f,0.0f,0.0f,0.5f,  0.5f,  0.5f,  0.5f,0.0f,0.0f,-0.5f, -0.5f, -0.5f,  0.0f,0.5f,0.0f,0.5f, -0.5f, -0.5f,  0.0f,0.5f,0.0f,0.5f, -0.5f,  0.5f,  0.0f,0.5f,0.0f,0.5f, -0.5f,  0.5f,  0.0f,0.5f,0.0f,-0.5f, -0.5f,  0.5f,  0.0f,0.5f,0.0f,-0.5f, -0.5f, -0.5f,  0.0f,0.5f,0.0f,-0.5f,  0.5f, -0.5f,  0.0f,0.0f,0.5f,0.5f,  0.5f, -0.5f,  0.0f,0.0f,0.5f,0.5f,  0.5f,  0.5f,  0.0f,0.0f,0.5f,0.5f,  0.5f,  0.5f,  0.0f,0.0f,0.5f,-0.5f,  0.5f,  0.5f,  0.0f,0.0f,0.5f,-0.5f,  0.5f, -0.5f,  0.0f,0.0f,0.5f
};float screen_width = 1280.0f;          //窗口宽度
float screen_height = 720.0f;          //窗口高度
//相机参数
glm::vec3 camera_position = glm::vec3(0.0f, 0.0f, 3.0f);     //摄像机位置
glm::vec3 camera_front = glm::vec3(0.0f, 0.0f, -1.0f);       //摄像机方向
glm::vec3 camera_up = glm::vec3(0.0f, 1.0f, 0.0f);           //摄像机上向量
//视野
float fov = 45.0f;int main() {// 初始化GLFWglfwInit();                                                     // 初始化GLFWglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);                  // OpenGL版本为3.3,主次版本号均设为3glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 使用核心模式(无需向后兼容性)glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // 如果使用的是Mac OS X系统,需加上这行glfwWindowHint(GLFW_RESIZABLE, FALSE);                           // 不可改变窗口大小// 创建窗口(宽、高、窗口名称)auto window = glfwCreateWindow(screen_width, screen_height, "Cube", nullptr, nullptr);if (window == nullptr) {                                        // 如果窗口创建失败,输出Failed to Create OpenGL Contextstd::cout << "Failed to Create OpenGL Context" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);                                 // 将窗口的上下文设置为当前线程的主上下文// 初始化GLAD,加载OpenGL函数指针地址的函数if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// 指定当前视口尺寸(前两个参数为左下角位置,后两个参数是渲染窗口宽、高)glViewport(0, 0, screen_width, screen_height);Shader shader("res/shader/task-cube.vs", "res/shader/task-cube.fs");//加载着色器// 生成并绑定VAO和VBOGLuint vertex_array_object; // == VAOglGenVertexArrays(1, &vertex_array_object);glBindVertexArray(vertex_array_object);GLuint vertex_buffer_object; // == VBOglGenBuffers(1, &vertex_buffer_object);glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object);// 将顶点数据绑定至当前默认的缓冲中glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 设置顶点属性指针glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);glEnable(GL_DEPTH_TEST);// Render loop主循环while (!glfwWindowShouldClose(window)) {//进入主循环,清理颜色缓冲深度缓冲glClearColor(0.0f, 0.34f, 0.57f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清理颜色缓冲和深度缓冲shader.Use();// Transform坐标变换矩阵glm::mat4 model(1);//model矩阵,局部坐标变换至世界坐标model = glm::translate(model, glm::vec3(0.0,0.0,0.0));model = glm::rotate(model, (float)glfwGetTime(), glm::vec3(0.5f, 1.0f, 0.0f));model = glm::scale(model, glm::vec3(1.0f,1.0f,1.0f));glm::mat4 view(1);//view矩阵,世界坐标变换至观察坐标系view = glm::lookAt(camera_position, camera_position + camera_front, camera_up);glm::mat4 projection(1);//projection矩阵,投影矩阵projection = glm::perspective(glm::radians(fov), (float)screen_width / screen_height, 0.1f, 100.0f);// 向着色器中传入参数int model_location = glGetUniformLocation(shader.ID, "model"); //获取着色器内某个参数的位置glUniformMatrix4fv(model_location, 1, GL_FALSE, glm::value_ptr(model));//写入参数值int view_location = glGetUniformLocation(shader.ID, "view");glUniformMatrix4fv(view_location, 1, GL_FALSE, glm::value_ptr(view));int projection_location = glGetUniformLocation(shader.ID, "projection");glUniformMatrix4fv(projection_location, 1, GL_FALSE, glm::value_ptr(projection));//绘制glBindVertexArray(vertex_array_object);glDrawArrays(GL_TRIANGLES, 0, 36);glBindVertexArray(0);glfwSwapBuffers(window);glfwPollEvents();}//释放VAOVBOglDeleteVertexArrays(1, &vertex_array_object);glDeleteBuffers(1, &vertex_buffer_object);// 清理所有的资源并正确退出程序glfwTerminate();return 0;
}

输出结果:

【OpenGL 学习笔记】第 7 篇:绘制旋转立方体相关推荐

  1. OpenGL学习笔记(一)绘制点线面及多面体

    OpenGL学习笔记(一)绘制点线面及多面体 绘制点线面 #include <iostream> #include <GL/GLUT.h> #define PI 3.14159 ...

  2. 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】

    ✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...

  3. android opengl旋转,Android openGl学习笔记二,gl的旋转、位移、放大缩小

    这章文章是对上一篇的进一步学习,最终以达到类似动画效果的目的. 不管什么时候参考资料放在第一位:学习参考资料 这个是本人经过层层筛选后感觉比较全且比较易懂的文章了,学习记录将按照此链接的博客逐步深入学 ...

  4. openGL学习笔记三十七:绘制简单地图

      地形本质上由一个个顶点(x,y,z)组成多个三角面连接而成. 地形有两种来源:   1.美术使用3dmax.maya.bleader工具,画点.线.面,导出三维模型,然后在游戏中加载进来,进行绘制 ...

  5. 安卓学习笔记38:利用OpenGL ES绘制旋转立方体

    文章目录 零.学习目标 一.绘制图形基本步骤 二.绘制旋转立方体 (一)运行效果 (二)实现步骤 1.创建安卓应用[DrawRotatingCube] 2.建模:立方体类 - Cube 3.渲染:立方 ...

  6. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  7. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  8. OpenGL学习笔记(一):环境搭建、三维空间坐标系理解以及OpenGL的基本使用

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7866 ...

  9. OpenGL学习笔记:矩阵变换

    文章目录 缩放 glm矩阵表示 glm缩放矩阵实现 位移 齐次坐标 glm位移矩阵实现 旋转 沿x轴旋转 沿y轴旋转 沿z轴旋转 沿任意轴旋转 glm旋转矩阵实现 矩阵的组合 glm矩阵组合使用 接上 ...

  10. OPENGL学习笔记之八

    OPENGL学习笔记之八 2017/11/15 阅读材料来自learnopengl.com以及learnopengl-cn.github.io 我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将 ...

最新文章

  1. 如何用 Slack 和 Kubernetes 构建一个聊天机器人?| 附代码
  2. 一个预告|恭喜斯科特·阿伦森获得2021年ACM计算奖
  3. 第一阶段SCRUM冲刺 03
  4. mybatis中mapper接口的参数设置几种方法
  5. QSettings allKeys读取为空分析
  6. 版本控制工具 svn 一
  7. java 1.8 vm_HotSpot虚拟机在java 1.8中的新实现
  8. ffmpeg在windows下的编译
  9. adminer.php下载,Adminer.php
  10. windows下consul安装启动
  11. hdu 4311 Meeting point-1 递推 多校联合赛(二) 第二题
  12. 阿里云服务器:配置 Docker 的 镜像加速器
  13. 网络与信息安全方向顶刊顶会
  14. open-能连接,但无法访问内网的问题
  15. 《一封神气的情书》李敖
  16. 哈罗单车确认完成新一轮几十亿融资 春华资本与蚂蚁金服领投
  17. 剖析公司技术栈,看看是否对大家适用!
  18. 基于AI的恶意样本分析(2)
  19. Unity 游戏的String interning优化
  20. c++实现“反应时间”测试

热门文章

  1. 弘辽科技:新手前期如何开网店?
  2. Snipaste 截图贴图
  3. java基础编程题及答案,三面蚂蚁金服(交叉面)定级阿里P6
  4. JS实现飞行的小鸟游戏-简易版
  5. DM数据守护读写分离集群
  6. imperva agent 的重新注册
  7. html中对复选框验证,验证HTML中的复选框
  8. 雅佳5000音色中英文对照表 AKAI EWI5000
  9. ASP页面模板对象[彭国辉]
  10. 促销 java 满 赠_促销活动除了打折、返现、满赠,还有什么方式?