使用 OpenGL 渲染会旋转 会变色的三角形(LearnOpenGL P3)

编程入门 行业动态 更新时间:2024-10-26 02:27:34

使用 OpenGL 渲染会旋转  会变色的三<a href=https://www.elefans.com/category/jswz/34/1769024.html style=角形(LearnOpenGL P3)"/>

使用 OpenGL 渲染会旋转 会变色的三角形(LearnOpenGL P3)

文章目录

    • 前言
    • 代码

前言

本文参考文献,侵删!LearnOpenGL - 你好,三角形

本文将假设您完成了 OpenGL 的配置,并且使用 VAO、VBO 渲染图形

由于时间问题,代码的详细讲解将在几日内给出~

代码

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>// 窗口大小
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;// 顶点着色器源码
const char* vertexShaderSource = R"(#version 330 corelayout (location = 0) in vec3 aPos;uniform float rotation;mat3 getRotationMatrix(float angle) {float s = sin(angle);float c = cos(angle);return mat3(c, -s, 0.0,s, c, 0.0,0.0, 0.0, 1.0);}void main(){mat3 rotationMatrix = getRotationMatrix(rotation);gl_Position = vec4(rotationMatrix * aPos, 1.0);}
)";// 片段着色器源码
const char* fragmentShaderSource = R"(#version 330 coreout vec4 FragColor;uniform float time; void main(){float red = sin(time);float green = cos(time);float blue = 0.5 + 0.5 * sin(2.0 * time);FragColor = vec4(red, green, blue, 1.0);}
)";int main() {// 初始化GLFWif (!glfwInit()) {std::cout << "GLFW initialization failed" << std::endl;return -1;}// 配置GLFWglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建窗口对象GLFWwindow* window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Triangle", nullptr, nullptr);if (window == nullptr) {std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}// 将窗口的上下文设置为当前线程的主上下文glfwMakeContextCurrent(window);// 初始化GLADif (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// 创建顶点着色器对象unsigned int vertexShader;vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);glCompileShader(vertexShader);// 检查顶点着色器是否编译成功int success;char infoLog[512];glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);std::cout << "Failed to compile vertex shader:\n" << infoLog << std::endl;return -1;}// 创建片段着色器对象unsigned int fragmentShader;fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr);glCompileShader(fragmentShader);// 检查片段着色器是否编译成功glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);std::cout << "Failed to compile fragment shader:\n" << infoLog << std::endl;return -1;}// 创建着色器程序对象unsigned int shaderProgram;shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// 检查着色器程序是否链接成功glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);std::cout << "Failed to link shader program:\n" << infoLog << std::endl;return -1;}// 删除着色器对象glDeleteShader(vertexShader);glDeleteShader(fragmentShader);// 设置顶点数据float vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f, 0.5f, 0.0f,0.0f,  0.0f, 0.0f  // 原点坐标};// 创建顶点缓冲对象(VBO)和顶点数组对象(VAO)unsigned int VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);// 绑定VAO和VBOglBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 设置顶点属性指针glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// 解绑VAO和VBOglBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);// 渲染循环while (!glfwWindowShouldClose(window)) {// 处理输入事件glfwPollEvents();// 清空颜色缓冲glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 使用着色器程序glUseProgram(shaderProgram);// 获取当前时间float time = glfwGetTime();float rotation = time;int rotationLocation = glGetUniformLocation(shaderProgram, "rotation");glUniform1f(rotationLocation, rotation);int timeLoadtion = glGetUniformLocation(shaderProgram, "time");glUniform1f(timeLoadtion, time);// 绑定VAOglBindVertexArray(VAO);glDrawArrays(GL_POINTS, 3, 1);  // 从索引3开始绘制一个点// 绘制三角形glDrawArrays(GL_TRIANGLES, 0, 3);// 解绑VAOglBindVertexArray(0);// 交换缓冲区glfwSwapBuffers(window);}// 删除VAO和VBOglDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);// 终止GLFWglfwTerminate();return 0;
}

更多推荐

使用 OpenGL 渲染会旋转 会变色的三角形(LearnOpenGL P3)

本文发布于:2023-12-05 06:16:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1663349.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:角形   OpenGL   LearnOpenGL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!