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

LearnOpenGL --- 你好三角形

你好,三角形的课后练习题


文章目录

  • 你好,三角形的课后练习题
  • 一、创建相同的两个三角形,但对它们的数据使用不同的VAO和VBO


一、创建相同的两个三角形,但对它们的数据使用不同的VAO和VBO

#include <glad/glad.h>
#include <GLFW/glfw3.h>#include <iostream>void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;const char* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos; \n"
"void main()\n"
"{\n"
"	gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\n";const char* fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
"	FragColor = vec4(1.0, 0.5f, 0.2f, 1.0f);\n"
"}\n";int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "创建窗口失败" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "GLAD初始化失败" << std::endl;return -1;}int success;char infoLog[512];unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);std::cout << infoLog << std::endl;}unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);std::cout << infoLog << std::endl;}unsigned int shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);glGetShaderiv(shaderProgram, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(shaderProgram, 512, NULL, infoLog);std::cout << infoLog << std::endl;}glDeleteShader(vertexShader);glDeleteShader(fragmentShader);float vertices0[] = {-0.9f, -0.5f, 0.0f,  // left -0.0f, -0.5f, 0.0f,  // right-0.45f, 0.5f, 0.0f,  // top };float vertices1[] = {0.9f, 0.5f, 0.0f,  // left 0.0f, 0.5f, 0.0f,  // right0.45f, -0.5f, 0.0f,  // top };unsigned int VBOs[2], VAOs[2];glGenBuffers(2, VBOs);glGenVertexArrays(2, VAOs);glBindVertexArray(VAOs[0]);//复制顶点数组到缓冲中供OpenGL使用glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices0), vertices0, GL_STATIC_DRAW);//如何解析顶点数据glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindVertexArray(VAOs[1]);glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices1), vertices1, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);glEnableVertexAttribArray(0);//不知道这两段代码的作用glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);while (!glfwWindowShouldClose(window)){processInput(window);glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgram);glBindVertexArray(VAOs[0]);glDrawArrays(GL_TRIANGLES, 0, 3);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glBindVertexArray(VAOs[1]);glDrawArrays(GL_TRIANGLES, 0, 3);glfwSwapBuffers(window);glfwPollEvents();}glDeleteVertexArrays(2, VAOs);glDeleteBuffers(2, VBOs);glDeleteProgram(shaderProgram);glfwTerminate();return 0;
}void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}void processInput(GLFWwindow* window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}

二、创建两个着色器程序,第二个程序使用一个不同的片段着色器,输出黄色;再次绘制这两个三角形,让其中一个输出为黄色

#include <glad/glad.h>
#include <GLFW/glfw3.h>#include <iostream>void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;const char* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos; \n"
"void main()\n"
"{\n"
"	gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\n";const char* fragmentShader1Source = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
"	FragColor = vec4(1.0, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";const char* fragmentShader2Source = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
"	FragColor = vec4(1.0, 1.0f, 1.0f, 1.0f);\n"
"}\n\0";int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "创建窗口失败" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "GLAD初始化失败" << std::endl;return -1;}unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);unsigned int fragmentShaderOrange = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShaderOrange, 1, &fragmentShader1Source, NULL);glCompileShader(fragmentShaderOrange);unsigned int shaderProgramOrange = glCreateProgram();glAttachShader(shaderProgramOrange, vertexShader);glAttachShader(shaderProgramOrange, fragmentShaderOrange);glLinkProgram(shaderProgramOrange);unsigned int fragmentShaderYellow = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShaderYellow, 1, &fragmentShader2Source, NULL);glCompileShader(fragmentShaderYellow);unsigned int shaderProgramYellow = glCreateProgram();glAttachShader(shaderProgramYellow, vertexShader);glAttachShader(shaderProgramYellow, fragmentShaderYellow);glLinkProgram(shaderProgramYellow);float firstTriangle[] = {-0.9f, -0.5f, 0.0f,  // left -0.0f, -0.5f, 0.0f,  // right-0.45f, 0.5f, 0.0f,  // top };float secondTriangle[] = {0.0f, -0.5f, 0.0f,  // left0.9f, -0.5f, 0.0f,  // right0.45f, 0.5f, 0.0f   // top };unsigned int VBOs[2], VAOs[2];glGenVertexArrays(2, VAOs);glGenBuffers(2, VBOs);glBindVertexArray(VAOs[0]);//复制顶点数组到缓冲中供OpenGL使用glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);glBufferData(GL_ARRAY_BUFFER, sizeof(firstTriangle), firstTriangle, GL_STATIC_DRAW);//如何解析顶点数据glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindVertexArray(VAOs[1]);glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);glBufferData(GL_ARRAY_BUFFER, sizeof(secondTriangle), secondTriangle, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);glEnableVertexAttribArray(0);//不知道这两段代码的作用glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);while (!glfwWindowShouldClose(window)){processInput(window);glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgramOrange);glBindVertexArray(VAOs[0]);glDrawArrays(GL_TRIANGLES, 0, 3);glUseProgram(shaderProgramYellow);glBindVertexArray(VAOs[1]);glDrawArrays(GL_TRIANGLES, 0, 3);glfwSwapBuffers(window);glfwPollEvents();}glDeleteVertexArrays(2, VAOs);glDeleteBuffers(2, VBOs);glDeleteProgram(shaderProgramOrange);glDeleteProgram(shaderProgramYellow);glfwTerminate();return 0;
}void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}void processInput(GLFWwindow* window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}

相关文章:

LearnOpenGL --- 你好三角形

你好&#xff0c;三角形的课后练习题 文章目录 你好&#xff0c;三角形的课后练习题一、创建相同的两个三角形&#xff0c;但对它们的数据使用不同的VAO和VBO 一、创建相同的两个三角形&#xff0c;但对它们的数据使用不同的VAO和VBO #include <glad/glad.h> #include &…...

从硬件角度理解“Linux下一切皆文件“,详解用户级缓冲区

目录 前言 一、从硬件角度理解"Linux下一切皆文件" 从理解硬件是种“文件”到其他系统资源的抽象 二、缓冲区 1.缓冲区介绍 2.缓冲区的刷新策略 3.用户级缓冲区 这个用户级缓冲区在哪呢&#xff1f; 解释关于fork再加重定向“>”后数据会打印两份的原因 4.内核缓冲…...

【第76例】IPD流程实战:华为业务流程架构BPA进化的4个阶段

目录 简介 第一个阶段,业务流程架构BPA1.0 第二个阶段,业务流程架构BPA2.0 BPA3.0、4.0 作者简介 简介 不管业务是复杂还是简单,企业内外的所有事情、所有业务都最终会归于流程。 甚至是大家经常说的所谓的各种方法论,具体的落脚点还是在流程上。 比如把大象放进冰…...

游戏站的几种形式

游戏站点的主要形式&#xff1a;单品游戏站、游戏盒子站与单类型游戏盒子站 随着互联网的普及和游戏产业的快速发展&#xff0c;游戏站点作为玩家获取游戏资源和信息的重要平台&#xff0c;呈现出多种形式。本文将分析三种常见的游戏站点形式&#xff1a;单品游戏站、游戏盒子站…...

OpenCV 图像透视变换详解

在计算机视觉领域&#xff0c;图像的视角问题常常会影响后续的分析与处理。例如&#xff0c;从倾斜角度拍摄的文档、带有畸变的场景图像等&#xff0c;都需要通过特定的方法进行矫正。OpenCV 作为计算机视觉领域的重要库&#xff0c;提供了强大的图像透视变换功能&#xff0c;能…...

AI日报 - 2024年5月16日

&#x1f31f; 今日概览 (60秒速览) ▎&#x1f916; 大模型前沿 | OpenAI推出GPT-4.1及mini版&#xff0c;专为编码优化&#xff1b;Google DeepMind发布AlphaEvolve&#xff0c;Gemini驱动算法发现。 GPT-4.1提升编码效率与指令遵循&#xff0c;AlphaEvolve在矩阵乘法、数学问…...

Ubuntu 更改 Nginx 版本

将 1.25 降为 1.18 先卸载干净 # 1. 完全卸载当前Nginx sudo apt purge nginx nginx-common nginx-core# 2. 清理残留配置 sudo apt autoremove sudo rm -rf /etc/apt/sources.list.d/nginx*.list修改仓库地址 # 添加仓库&#xff08;通用稳定版仓库&#xff09; codename$(…...

Python requests GET 报错:ChunkedEncodingError

问题 在实际项目中遇到的这样一个问题&#xff1a;通过Python GET从服务器请求url列表&#xff0c;因为是公司内部数据&#xff0c;知道大概多少条数据&#xff0c;所以直接一次请求500条。平稳运行了一段时间之后&#xff0c;突然某天这个GET请求报错了… response request…...

RabbitMQ是什么?应用场景有哪些?

RabbitMQ 是一款开源的消息代理中间件,基于 AMQP(高级消息队列协议)实现,用于在分布式系统中进行异步通信和消息传递。它通过将消息的发送者和接收者解耦,提高了系统的可扩展性、可靠性和灵活性。 核心特点 多协议支持:不仅支持 AMQP,还兼容 STOMP、MQTT 等多种消息协议…...

打造智能化军工软件工厂,破解版本管理难题

在数字化浪潮席卷全球的当下&#xff0c;军工行业正经历着前所未有的软件工业化转型。作为这一进程的核心支撑&#xff0c;软件工厂模式正在重塑军工领域的研发体系。然而&#xff0c;传统版本管理方式已难以适应现代军工软件研发的复杂需求&#xff0c;成为制约行业发展的关键…...

SpringbBoot nginx代理获取用户真实IP

为了演示多级代理场景&#xff0c;我们分配了以下服务器资源&#xff1a; 10.1.9.98&#xff1a;充当客户端10.0.3.137&#xff1a;一级代理10.0.4.105&#xff1a;二级代理10.0.4.129&#xff1a;三级代理10.0.4.120&#xff1a;服务器端 各级代理配置 以下是各级代理的基本配…...

allure报告自定义logo和名称

根据pytest框架&#xff0c;做自动化测试的时候&#xff0c;选择的是allure测试报告&#xff0c;这个报告是目前所有报告中功能最强大最好用的测试报告之一 我们在使用这个测试报告的时候&#xff0c;怎么样去把allure的logo和名称替换成自己公司或者自己的logo呢&#xff1f;…...

鸿蒙OSUniApp 实现的地图定位与导航功能#三方框架 #Uniapp

UniApp 实现的地图定位与导航功能 随着移动互联网的发展&#xff0c;地图定位与导航功能已成为众多应用的标配。本文将详细介绍如何在 UniApp 框架下实现地图定位与导航功能&#xff0c;并探讨如何适配鸿蒙系统&#xff0c;助力开发者打造更加流畅的地图体验。 前言 最近在做一…...

【AI论文】对抗性后期训练快速文本到音频生成

摘要&#xff1a;文本到音频系统虽然性能不断提高&#xff0c;但在推理时速度很慢&#xff0c;因此对于许多创意应用来说&#xff0c;它们的延迟是不切实际的。 我们提出了对抗相对对比&#xff08;ARC&#xff09;后训练&#xff0c;这是第一个不基于蒸馏的扩散/流模型的对抗加…...

Android 中 显示 PDF 文件内容(AndroidPdfViewer 库)

PDFView 是一个用于在 Android 应用中显示 PDF 文档的库。它提供了丰富的功能和灵活的配置选项&#xff0c;使得开发者能够轻松地在应用中嵌入 PDF 阅读器。 一、 添加依赖 在模块的 build.gradle 文件中添加以下依赖&#xff1a; // pdfimplementation("com.github.bar…...

Linux 软件包|服务管理

rpm 指令备注rpm -qa查看已安装软件&#xff0c;可以结合grep过滤查找rpm -e firefox卸载firefoxrpm -ivh firefox-115.12.0-1.el7.centos.i686.rpm安装gcc&#xff08;只能离线安装&#xff09; yum 能够从指定的服务器自动下载 RPM 包并且安装 指令备注yum list列出所有可…...

测试工程师如何学会Kubernetes(k8s)容器知识

Kubernetes(K8s)作为云原生时代的关键技术之一&#xff0c;对于运维工程师、开发工程师以及测试工程师来说&#xff0c;都是一门需要掌握的重要技术。作为一名软件测试工程师&#xff0c;学习Kubernetes是一个有助于提升自动化测试、容器化测试以及云原生应用测试能力的重要过程…...

遥感图像露天矿区检测数据集VOC+YOLO格式1542张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1542 标注数量(xml文件个数)&#xff1a;1542 标注数量(txt文件个数)&#xff1a;1542 …...

每日Prompt:迷你 3D 建筑

提示词 3D Q版迷你风格&#xff0c;一个充满奇趣的迷你星巴克咖啡馆&#xff0c;外观就像一个巨大的外带咖啡杯&#xff0c;还有盖子和吸管。建筑共两层&#xff0c;大大的玻璃窗清晰地展示出内部温馨而精致的设计&#xff1a;木质的家具、温暖的灯光以及忙碌的咖啡师们。街道…...

解决 Sarspace 处理陆探一号辐射定标地理编码出现条纹问题:DEM 下载篇

在使用 Sarspace 处理陆探一号辐射定标地理编码时&#xff0c;结果出现条纹现象&#xff0c;经排查确定是 DEM&#xff08;数字高程模型&#xff09;下载存在问题。以下为利用自动下载功能解决该问题的过程。 问题排查 陆探一号数据处理中&#xff0c;条纹现象的出现往往与多种…...

el-breadcrumb 面包屑第一项后面怎么写没有分隔符

<el-breadcrumb separator"/"><el-breadcrumb-item>当前位置&#xff1a;</el-breadcrumb-item><el-breadcrumb-item :to"{ path: / }">首页</el-breadcrumb-item><el-breadcrumb-item><a href"/">活…...

Free2AI解锁教育新可能:LLM+RAG 技术驱动智能学习的关键路径

一、引言​ 在科技飞速发展的当下,人工智能技术正深刻地改变着各个领域,教育领域也不例外。大型语言模型(LLM)和检索增强生成(RAG)技术的兴起,为教育与智能学习带来了前所未有的机遇。LLM 凭借其强大的语言理解和生成能力,能够与用户进行自然流畅的对话,仿佛一位知识…...

MYSQL 高可用

目录 一 什么是MYSQL高可用 1.1 什么是MySQL高可用 1.2方案组成 1.3 优势 2.1 案例环境 二 案例实施 1.安装mysql数据库 &#xff08;1 基础环境 &#xff08;2二进制安装进行bash (3 设置配置文件 MYSQL 的配置文件跟上面编译安装的配置文件类似 &#xff08;4. 配…...

【GaussDB迁移攻略】DRS支持CDC,解决大规模数据迁移挑战

目录 1 背景介绍 2 CDC的实现原理 3 DRS的CDC实现方式 4 DRS的CDC使用介绍 5 总结 1 背景介绍 随着国内各大行业数字化转型的加速&#xff0c;客户的数据同步需求越来越复杂。特别是当需要将一个源数据库的数据同时迁移到不同的目标库场景时&#xff0c;华为云通常会创建…...

HoloTime:从一张图片生成可交互的4D虚拟世界——突破静态生成模型,重构VR/AR内容生产范式

引言:静态生成模型的局限与HoloTime的突破 在空间智能与虚拟内容生成领域,传统生成模型(如扩散模型)面临两大瓶颈: 静态输出:仅能生成固定视角的3D场景或局部物体动画。沉浸感缺失:无法构建用户可“走进去”的动态4D空间(时间+空间)。HoloTime 通过“图像→全景视频→…...

【Python CGI编程】

Python CGI&#xff08;通用网关接口&#xff09;编程是早期Web开发中实现动态网页的技术方案。以下是系统化指南&#xff0c;包含核心概念、实现步骤及安全实践&#xff1a; 一、CGI 基础概念 1. 工作原理 浏览器请求 → Web服务器&#xff08;如Apache&#xff09; → 执行…...

JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换

关键点 JavaScript 可以轻松实现时间格式&#xff08;HH:mm:ss 或 HH:mm&#xff09;与十进制小时&#xff08;如 17.5&#xff09;的相互转换。两个函数分别处理时间字符串到十进制小时&#xff0c;以及十进制小时到时间字符串的转换&#xff0c;支持灵活的输入和输出格式。这…...

【深度学习】#11 优化算法

主要参考学习资料&#xff1a; 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 目录 深度学习中的优化挑战局部极小值鞍点梯度消失 凸性凸集凸函数 梯度下降一维梯度下降学习率局部极小值 多元梯度下降 随机梯度下降随机梯度更新动态学习率…...

《数字藏品APP开发:解锁高效用户身份认证与KYC流程》

开发一款数字藏品APP&#xff0c;要面对诸多复杂且关键的环节&#xff0c;其中&#xff0c;实现高效的用户身份认证与KYC&#xff08;了解你的客户&#xff09;流程&#xff0c;无疑是重中之重。这不仅关乎用户资产安全与平台合规运营&#xff0c;更是构建用户信任、保障平台可…...

ros2中自定义的package查不到?

在ros2中自定义的package功能包&#xff0c;使用命令&#xff1a;ros2 pkg list无法查找到自己的功能包&#xff1f; 首先&#xff0c;利用ros2 pkg create命令创建好功能包之后要利用colcon build命令进行编译&#xff0c;编译成功之后&#xff0c;在当前路径需要运行命令&am…...