创建两个着色器程序

ops/2024/9/25 21:24:05/

创建两个着色器程序,第二个程序使用一个不同的片段着色器,输出黄色;再次绘制这两个三角形,让其中一个输出为黄色
在这篇博客中,我们将创建两个着色器程序,其中一个将输出橙色,另一个将输出黄色。然后,我们将绘制两个三角形,分别使用这两个不同的着色器程序。

完整代码
以下是实现代码,包括必要的注释,以帮助你理解每一步。

#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""}\0";
const char* fragmentShader1Source = "#version 330 core\n""out vec4 FragColor;\n""void main()\n""{\n""   FragColor = vec4(1.0f, 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.0f, 1.0f, 0.0f, 1.0f);\n""}\n\0";int main()
{// glfw: 初始化和配置// ------------------------------glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);#ifdef __APPLE__glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif// glfw: 创建窗口// --------------------GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "无法创建 GLFW 窗口" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);// glad: 加载所有的 OpenGL 函数指针// ---------------------------------------if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "无法初始化 GLAD" << std::endl;return -1;}// 构建并编译着色器程序// ------------------------------------unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);unsigned int fragmentShaderOrange = glCreateShader(GL_FRAGMENT_SHADER); // 输出橙色的片段着色器unsigned int fragmentShaderYellow = glCreateShader(GL_FRAGMENT_SHADER); // 输出黄色的片段着色器unsigned int shaderProgramOrange = glCreateProgram();unsigned int shaderProgramYellow = glCreateProgram();// 编译顶点着色器glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);// 编译第一片段着色器glShaderSource(fragmentShaderOrange, 1, &fragmentShader1Source, NULL);glCompileShader(fragmentShaderOrange);// 编译第二片段着色器glShaderSource(fragmentShaderYellow, 1, &fragmentShader2Source, NULL);glCompileShader(fragmentShaderYellow);// 链接第一个程序对象glAttachShader(shaderProgramOrange, vertexShader);glAttachShader(shaderProgramOrange, fragmentShaderOrange);glLinkProgram(shaderProgramOrange);// 链接第二个程序对象glAttachShader(shaderProgramYellow, vertexShader);glAttachShader(shaderProgramYellow, fragmentShaderYellow);glLinkProgram(shaderProgramYellow);// 设置顶点数据和属性// ------------------------------------------------------------------float firstTriangle[] = {-0.9f, -0.5f, 0.0f,  // 左 -0.0f, -0.5f, 0.0f,  // 右-0.45f, 0.5f, 0.0f,  // 顶部 };float secondTriangle[] = {0.0f, -0.5f, 0.0f,  // 左0.9f, -0.5f, 0.0f,  // 右0.45f, 0.5f, 0.0f   // 顶部 };unsigned int VBOs[2], VAOs[2];glGenVertexArrays(2, VAOs); // 生成多个 VAOglGenBuffers(2, VBOs); // 生成多个 VBO// 第一个三角形设置// --------------------glBindVertexArray(VAOs[0]);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);// 渲染循环// -----------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); // 绘制黄色三角形// glfw: 交换缓冲区并获取输入事件// -------------------------------------------------------------------------------glfwSwapBuffers(window);glfwPollEvents();}// 可选:释放所有不再需要的资源// ------------------------------------------------------------------------glDeleteVertexArrays(2, VAOs);glDeleteBuffers(2, VBOs);glDeleteProgram(shaderProgramOrange);glDeleteProgram(shaderProgramYellow);// glfw: 终止,清除之前分配的所有 GLFW 资源// ------------------------------------------------------------------glfwTerminate();return 0;
}// 处理所有输入:查询 GLFW 是否按下/释放了相关键,并作出相应的反应
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow* window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}// 当窗口大小改变(由操作系统或用户改变)时,执行此回调函数
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{// 确保视口与新窗口尺寸匹配glViewport(0, 0, width, height);
}

http://www.ppmy.cn/ops/115955.html

相关文章

MySQL篇(数据库范式)(持续更新迭代)

目录 一、什么是范式 二、三大范式 第一范式&#xff08;1NF&#xff09; 第二范式&#xff08;2NF&#xff09; 第三范式&#xff08;3NF&#xff09; 三、其他大三范式 巴斯-科德范式&#xff08;BCNF&#xff0c;Boyce-Codd Normal Form&#xff09; 第四范式&#x…

Web3技术在元宇宙中的应用:从区块链到智能合约

随着元宇宙的兴起&#xff0c;Web3技术正逐渐成为其基础&#xff0c;推动着数字空间的重塑。元宇宙不仅是一个虚拟世界&#xff0c;它还代表着一个由去中心化技术驱动的新生态系统。在这个系统中&#xff0c;区块链和智能合约发挥着至关重要的作用&#xff0c;为用户提供安全、…

计算机毕业设计之:基于微信小程序的校园流浪猫收养系统(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

【Linux】Linux的基本指令(1)

A clown is always a clown.&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;Linux的背景 •&#x1f330;1.Unix发展的历史 •&#x1f330;2.Linux发展历史 •&#x1f330;3.企业应用现状 •&#x1f330;4.发行版本 &…

正向科技|格雷母线定位系统的设备接线安装示范

格雷母线安装规范又来了&#xff0c;这次是设备接线步骤 格雷母线是格雷母线定位系统的核心部件&#xff0c;沿着移动机车轨道方向上铺设&#xff0c;格雷母线以相互靠近的扁平状电缆与天线箱电磁偶合来进行信号传递&#xff0c;从而检测得到天线箱在格雷母线长度方向上的位置。…

K8s flink-operator 例子

1.参考官网&#xff1a; https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/docs/try-flink-kubernetes-operator/quick-start/ 2.首先环境具备 k8s、helm 我的环境 k8s 1.30 最新版本了 [rootk8s-master ~]# kubectl get no -owide NAME …

天润融通发布微藤智能体平台,中国客户联络正式进入“智能体时代”

9月19日&#xff0c;以“云启智跃&#xff0c;产业蝶变”为主题的2024云栖大会在杭州正式开幕。大会持续三天&#xff0c;聚焦AI时代的技术升级与实践应用&#xff0c;设有三大主论坛、400多个分论坛&#xff0c;并开放4万平方米的智能科技展区&#xff0c;展示全球百余款AI应用…

前端工程记录:Vue2 typescript项目升级Vue3

由于typescript飞速发展&#xff0c;某些vue2项目也在vue3出现之前集成了typescript开发&#xff0c;例如我的个人网站&#xff0c;当时花费了不少时间。而vue3我使用一段时间后&#xff0c;在2022年左右开始投入生产&#xff0c;但是这个个站就没怎么维护了。若是想继续&#…