首页 > 其他分享 >基于OPENGL-实现三角形绘制并移动

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

时间:2024-12-13 20:43:20浏览次数:3  
标签:1.0 OPENGL void window GLuint 三角形 GL 绘制 着色器

这是我们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);
        }
    }
}
    

标签:1.0,OPENGL,void,window,GLuint,三角形,GL,绘制,着色器
From: https://www.cnblogs.com/AnnaStore/p/18605806

相关文章

  • 关于使用OpenGL开启Blend绘制汇报错的一个问题
    源描述:https://blog.csdn.net/Strengthennn/article/details/143742022我这里遇到的一个问题,OpenGL开启Blend后,出现了问题然后对其进行修改。绘制字体所遇到的情况, 代码如下:1glEnable(GL_BLEND);2glEnable(GL......
  • 使用svg画一个三角形
    <svgwidth="100"height="100"><polygonpoints="50,1010,9090,90"style="fill:blue;stroke:black;stroke-width:2"/></svg>ThiscodecreatesanSVGimageofabluetrianglewithablackoutlin......
  • 如何使用SOLIDWORKS绘制圣诞树讲座预约
     最新一期的线上讲座预约开始啦,本期内容将为大家演示使用SOLIDWORKS绘制圣诞树的操作流程,扫描页尾二维码即可预约,免费观看,欢迎参与。讲座方式:视频号直播报名方式:扫描页尾二维码预约讲座时间:12月20日14:00有奖活动圣诞节将至,为此SoldKits推出一期有奖互动小活动,12月13日......
  • 演示:基于WPF开发的仿PPT程序,演示基于DrawingVisual开发的2D图形绘制工具
    一、目的:基于WPF开发的仿PPT程序,演示基于DrawingVisual开发的2D图形绘制工具二、效果图三、环境VS2022,.net7.0,WPF四、功能图形绘制基础绘图矩形多线段多边形点和文本曲线标记箭头导入图片标尺椭圆平滑曲线圆形贝塞尔曲线进攻方向箭头圆弧Visu......
  • uni-app在image上绘制点位并回显
    在Uni-app中绘制多边形可以通过使用CanvasAPI来实现。Uni-app是一个使用Vue.js开发所有前端应用的框架,同时支持编译为H5、小程序等多个平台。由于Canvas是H5和小程序中都支持的API,所以通过Canvas绘制多边形是一个比较通用的方法。1.创建一个新的Uni-app项......
  • pyechart库绘制地图
            绘制哪个省的地图,就将上述代码中,“河北地图”改成“**省地图”,后面的“河北”改成“**”,改成你所要绘制的省份即可,后面的题目,当然也可以替代成你所需要的。        当绘制省份地图时,无论是直接引用表格中的数据还是自定义引进城市名称(上图所示......
  • 使用三角形重心坐标生成任意网格内的一点
    1.重心坐标三角形重心坐标(BarycentricCoordinates)可以通过alpha、beta、gamma三个权重总和为1的插值系数得到三角形内任意一点,可以用此求出某点的重心坐标系数,或是给出系数得到一点:publicclassTest:MonoBehaviour{publicTransformp0;publicTransformp1......
  • 一文掌握 OpenGL 几何着色器的使用
    学习本文需要具备OpenGLES编程基础,如果看起来比较费劲,可以先看入门文章OpenGLES3.0从入门到精通系统性学习教程。什么是几何着色器几何着色器(GeometryShader)OpenGL管线中的可选着色器阶段,位于顶点着色器(VertexShader)和光栅化阶段之间。其核心功能是基于输......
  • Python+OpenCV系列:绘制图形和文字
    绘制图形和文字1.基本绘图函数简介2.绘制示例代码2.1创建一个空白图像2.2绘制基本图形1.绘制直线2.绘制矩形3.绘制圆4.绘制椭圆2.3添加文字3.显示与保存图像4.扩展应用总结在图像处理领域,绘制基本图形和文字是一个常见需求,例如标记对象、绘制边界框或添......
  • 使用lumerical脚本语言创建绘制波导并进行数据分析(纯代码实现)(1)
            使用lumerical脚本语言创建绘制波导、配置二维模式求解器、计算模式轮廓、计算有效折射率(neff)和群折射率(ng)随波长的变化关系、计算有效折射率(neff)随波导宽度的变化关系及针对有效折射率法进行相关数据处理(代码均有注释详解)。一、绘制波导结构1.1代码实现......