基于OPENGL-实现三角形绘制并移动

这是我们OPengl的第一个程序,我们先暂时不理解其中的原理,试着写一个简单的三角形移动的代码。

在这个代码执行后,我们会看到一个左右移动的三角形。

OpenGL程序示例 

这是一个使用C++和OpenGL编写的简单程序,用于在窗口中绘制一个动态变化的三角形。

#include <glad/glad.h> // 包含GLAD库,用于加载OpenGL函数指针
#include <GLFW/glfw3.h> // 包含GLFW库,用于创建窗口和处理输入
#include <iostream>
#include <string>
#include <glm/glm.hpp>
#include <fstream>
using namespace std; // 使用标准命名空间
const int numVao = 1; // 定义顶点数组对象的数量为1
GLuint renderingProgram; // 声明渲染程序的ID
GLuint vao[numVao]; // 声明一个顶点数组对象数组
using namespace std; // 再次使用标准命名空间(冗余)

const int numVAOs = 1; // 定义顶点数组对象的数量为1(冗余)
float inc = 0.1;
float x = 0;

string readFile(const char* filePath) {
    string content;
    ifstream fileStream(filePath, ios::in);
    string line = "";
    while (!fileStream.eof()) {
        getline(fileStream, line);
        content.append(line + "\n");
    }
    fileStream.close();
    return content;
}

// 创建着色器程序的函数
GLuint createShaderProgram() {
    GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);
    GLuint vfprogram = glCreateProgram();

    string vertShaderStr = readFile("vertShader.glsl");
    string fragShaderStr = readFile("fragShader.glsl");

    const char* vertShaderSrc = vertShaderStr.c_str();
    const char* fragShaderSrc = fragShaderStr.c_str();
    //绑定顶点着色器和片段着色器
    glShaderSource(vShader, 1, &vertShaderSrc, NULL);
    glShaderSource(fShader, 1, &fragShaderSrc, NULL);

    // 编译顶点着色器和片段着色器
    glCompileShader(vShader);
    glCompileShader(fShader);

    // 将着色器附加到着色器程序并链接
    glAttachShader(vfprogram, vShader);
    glAttachShader(vfprogram, fShader);

    glLinkProgram(vfprogram);
    //绑定(glShaderSource)->编译(glCompileShader)->附加到着色器,片段着色器(glAttachShader)->链接到ID
    return vfprogram; // 返回着色器程序的ID
}

// 初始化函数
void init(GLFWwindow* window) {
    renderingProgram = createShaderProgram(); // 创建并获取着色器程序的ID
    glGenVertexArrays(numVAOs, vao); // 生成顶点数组对象
    glBindVertexArray(vao[0]); // 绑定顶点数组对象
}

// 显示函数
void display(GLFWwindow* window, double currentTime) {
    // 清除颜色缓冲区和深度缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // 使用着色器程序
    glUseProgram(renderingProgram);

    // 设置像素点的大小
    glPointSize(30.0f);

    // 设置多边形模式为线框模式
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

    // 更新 x 的值
    x += inc;
    if (x > 1.0f) {
        inc = -0.01f;
    }
    if (x < -1.0f) {
        inc = +0.01f;
    }
    // 获取 uniform 变量的位置并设置其值
    GLuint offsetLoc = glGetUniformLocation(renderingProgram, "offset");
    glUniform1f(offsetLoc, x);
    // 绘制三角形
    glDrawArrays(GL_TRIANGLES, 0, 3);
    // 交换前后缓冲区
    glClear(GL_DEPTH_BUFFER_BIT);
}

int main(void) {
    if (!glfwInit()) { exit(EXIT_FAILURE); } // 初始化GLFW库,如果失败则退出程序
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // 设置OpenGL主版本号为4
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 设置OpenGL次版本号为3
    // 创建一个600x600的窗口,标题为“Wasyu的Program”
    GLFWwindow* window = glfwCreateWindow(600, 600, "Wasyu s Program", NULL, NULL);
    glfwMakeContextCurrent(window); // 将窗口的上下文设置为当前线程的主上下文
    // 加载GLAD库,如果失败则退出程序
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { exit(EXIT_FAILURE); }
    glfwSwapInterval(1); // 设置交换间隔为1,启用垂直同步

    init(window); // 调用初始化函数

    // 主循环,直到窗口关闭
    while (!glfwWindowShouldClose(window)) {
        display(window, glfwGetTime()); // 调用显示函数
        glfwSwapBuffers(window); // 交换前后缓冲区
        glfwPollEvents(); // 处理所有待处理的事件
    }
                                                 
    glfwDestroyWindow(window); // 销毁窗口
    glfwTerminate(); // 终止GLFW库
    exit(EXIT_SUCCESS); // 正常退出程序
}
    

fragShader文件:

这是一个使用GLSL编写的简单着色器示例,用于设置输出颜色为紫色。

#version 430
out vec4 color;
void main(void)
{
    color = vec4(1.0, 0.0, 1.0, 1.0);
}
    

vertShader文件:

这是一个使用GLSL编写的简单着色器示例,用于根据顶点ID设置不同的顶点位置。

//注意 其中uniform float offset 就是主函数中绑定进来的ID

#version 430
uniform float offset;
void main(void)
{
    vec4 vec[3];
    vec[0] = vec4(0.25, 0.0, 0.0, 1.0);
    vec[1] = vec4(0.0, 0.25, 0.0, 1.0);
    vec[2] = vec4(-0.25, 0.0, 0.0, 1.0);
    for(int i=0; i<3; i++) {
        if(gl_VertexID == i) {
            gl_Position = vec[i] + vec4(offset, 0.0, 0.0, 0.0);
        }
    }
}
    
posted @   安娜アンナ  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示