当前位置: 首页 > news >正文

创建一个矩形中有两个三角形

#include <glad/glad.h>
#include <GLFW/glfw3.h>#include <iostream>float vertices[] = {// 第一个三角形0.5f,  0.5f, 0.0f,  // 右上0.5f, -0.5f, 0.0f,         // 右下-0.5f, -0.5f, 0.0f,         // 左下-0.5f,  0.5f, 0.0f,    // 左上
};unsigned int indices[] = {0, 1, 3,        // 第一个三角形1, 2, 3         // 第二个三角形
};using namespace std;/*******************************************定义常量************************************************/
//设置窗口的宽和高
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
/*******************************************函数************************************************/
//响应键盘输入事件
//ESC推出窗口
void processInput(GLFWwindow* window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS){glfwSetWindowShouldClose(window, true);}
}//当用户改变窗口的大小的时候,视口也应该被调整。
//对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{//glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)glViewport(0, 0, width, height);
}/*******************************************顶点与片源着色器************************************************///定义顶点着色器的函数字符串
const char* vertexShaderSource = R"( #version 460 corelayout (location = 0) in vec3 aPos;void main(){gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);}
)";
//第一个片段着色器代码
const char* fragmentShaderSource = R"( #version 460 coreout vec4 FragColor;void main(){FragColor = vec4(0.0f, 0.0f, 1.0f, 1.0f);}
)";/*******************************************主函数************************************************/
//主函数
int main()
{//初始化GLFWglfwInit();// 初始化GLFWif (!glfwInit()){std::cerr << "Failed to initialize GLFW" << std::endl;return -1;}//声明版本与核心glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); //主版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); //次版本号glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//创建窗口并设置其大小,名称,与检测是否创建成功GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nullptr, nullptr);if (window == nullptr){cout << "Failed to create GLFW window" << endl;glfwTerminate();return -1;}//创建完毕之后,需要让当前窗口的环境在当前线程上成为当前环境,就是接下来的画图都会画在我们刚刚创建的窗口上glfwMakeContextCurrent(window);//告诉GLFW我们希望每当窗口调整大小的时候调用这个函数glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//glad寻找opengl的函数地址,调用opengl的函数前需要初始化gladif (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}//顶点Shader//创建顶点着色器对象int vertexShader = glCreateShader(GL_VERTEX_SHADER);//着色器源码附加到对象上,然后编译glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);// 检查是否编译成功int success; //int 类型标识是否成功char infoLog[512];//储存错误消息的容器//glGetShaderiv()检查是否编译成功glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success){//glGetShaderInfoLog()获取错误消息,然后打印它。glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}//片源Shader//创建第一个片源着色器对象int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);着色器源码附加到对象上,然后编译glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);// 检查是否编译成功glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);// 检查片段着色器是否编译成功glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(fragmentShader, sizeof(infoLog), nullptr, infoLog);std::cerr << "Fragment shader compilation failed: " << infoLog << std::endl;}//链接Shader,链接顶点与片源//创建第一个链接对象int shaderProgram = glCreateProgram();//着色器附加到了程序上,然后用glLinkProgram链接glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);//检查是否链接出错glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;}//把着色器对象链接到程序对象以后,删除着色器对象,不再需要它们glDeleteShader(vertexShader);glDeleteShader(fragmentShader);//创建 VBO 顶点缓冲对象 VAO顶点数组对象 EBO索引缓冲对象//多个对象unsigned int VBO, VAO, EBO;glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);// 创建顶点缓冲对象(Vertex Buffer Object,VBO)glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glGenBuffers(1, &EBO);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);//复制顶点数据到缓冲内存中glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 赋值顶点索引到缓冲内存中glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//链接顶点属性,设置顶点属性指针glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);//以顶点属性位置值作为参数,启用顶点属性;顶点属性默认是禁用的。glEnableVertexAttribArray(0);/*******************************************渲染循环************************************************///glfwWindowShouldClose()检查窗口是否需要关闭。如果是,游戏循环就结束了,接下来我们将会清理资源,结束程序while (!glfwWindowShouldClose(window)){//响应键盘输入processInput(window);//设置清除颜色glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//清除当前窗口,把颜色设置为清除颜色glClear(GL_COLOR_BUFFER_BIT);//激活链接程序,激活着色器,开始渲染glUseProgram(shaderProgram);//绑定VAOglBindVertexArray(VAO);//绘制四边形glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);//线框绘制glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);//交换颜色缓冲 glfwSwapBuffers(window);//处理事件glfwPollEvents();} 清理资源glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteBuffers(1, &EBO);glDeleteProgram(shaderProgram);//释放前面所申请的资源glfwTerminate();return 0;
}

在这里插入图片描述

http://www.lryc.cn/news/276812.html

相关文章:

  • Open3D 基于kdtree树的邻近点搜索(10)
  • c++实现支持动态扩容的栈(stack)
  • 举例说明计算机视觉(CV)技术的优势和挑战。
  • 如何利用docker来部署war包项目
  • SpringBoot 如何增强PageHelper入参的健壮性
  • 书生·浦语大模型全链路开源体系 学习笔记 第三课
  • CodeGPT,你的智能编码助手—CSDN出品
  • VMware Workstation——修改虚拟机配置和设置网络
  • 计算机毕业设计 基于SpringBoot的项目申报系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • CentOS 7.8 安装 Docker
  • Flask 会员列表展示
  • 光纤知识总结
  • LeetCode简单题记录
  • 【Python学习】Python学习10-列表
  • MySQL四大引擎,数据库管理,数据表管理,数据库账号管理
  • CentOS找回root密码
  • react输入框检索树形(tree)结构
  • 云原生学习系列之基础环境准备(虚拟机搭建)
  • Python入门知识点分享——(十三)内置函数
  • 手拉手springboot3整合mybatis-plus多数据源
  • 【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁
  • 基于JAVA+SpringBoot的咖啡商城
  • [AutoSar]基础部分 RTE 08 runnable mapping
  • 云消息队列 Kafka 版生态谈第一期:无代码转储能力介绍
  • java: 从HBase中读取数据
  • Lumeical Script------Script Prompt 中的两种输出方式
  • 什么是OOM error
  • IO进程线程 day7
  • 扩展学习|数据融合助推商务智能与分析
  • Java项目:112SSM在线电影订票系统