简单着色器编写(中下)

这篇我们来介绍另一部分函数。

static unsigned int CreateShader(const std::string& vertexShader, const std::string& fragmentShader)
{unsigned int program = glCreateProgram();unsigned int vs = CompileShader(GL_VERTEX_SHADER,vertexShader);unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);glAttachShader(program, vs);glAttachShader(program, fs);glLinkProgram(program);glValidateProgram(program);glDeleteShader(vs);glDeleteShader(fs);return program;
}

static unsigned int CreateShader(const std::string& vertexShader, const std::string& fragmentShader)

  • static:这个关键字表示函数是静态的,属于类或命名空间,而不是特定的对象实例。它可以通过类名或命名空间名直接调用,而无需创建对象。

  • unsigned int:这是函数的返回类型,表示返回一个无符号整数,即程序对象的标识符。

  • CreateShader:这是函数的名称,表示创建一个OpenGL程序对象。

  • const std::string& vertexShader:这是一个传入的参数,表示顶点着色器的源代码。参数类型是一个常量引用,表示函数不会修改传入的字符串。

  • const std::string& fragmentShader:这是另一个传入的参数,表示片元着色器的源代码。同样,参数类型是一个常量引用。

整个函数的作用是,它会创建一个OpenGL程序对象,并将顶点着色器和片元着色器编译后的标识符附加到该程序对象上,然后返回程序对象的标识符,供后续使用。通过这个函数,你可以方便地创建一个包含多个着色器的程序对象,从而进行渲染操作。

 unsigned int program = glCreateProgram();

  • unsigned int program:这是一个变量声明,表示创建的OpenGL程序对象的标识符将会存储在名为 program 的变量中。变量的类型是无符号整数,因为OpenGL中的对象都用整数标识符来表示。

  • glCreateProgram():这是一个OpenGL函数调用,用于创建一个程序对象,并返回一个表示程序对象的标识符。这个标识符是一个无符号整数,用于在后续的操作中标识和操作这个程序对象。

通过这行代码,创建了一个程序对象并获得了它的标识符,以便在后续的代码中使用这个程序对象进行着色器附加、链接和使用等操作。

 unsigned int vs = CompileShader(GL_VERTEX_SHADER,vertexShader);
unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);

  • unsigned int vs:这是一个变量声明,表示编译顶点着色器后的着色器对象标识符将存储在名为 vs 的变量中。变量的类型是无符号整数,用于标识顶点着色器对象。

  • CompileShader(GL_VERTEX_SHADER, vertexShader):这是一个函数调用,调用了之前定义的 CompileShader 函数,传入顶点着色器的源代码和着色器类型 GL_VERTEX_SHADER。这个函数会编译顶点着色器并返回顶点着色器对象的标识符,这个标识符被赋值给变量 vs

  • unsigned int fs:同理,这是一个变量声明,表示编译片元着色器后的着色器对象标识符将存储在名为 fs 的变量中。

  • CompileShader(GL_FRAGMENT_SHADER, fragmentShader):这个函数调用类似于前面的顶点着色器编译,传入片元着色器的源代码和着色器类型 GL_FRAGMENT_SHADER。这个函数会编译片元着色器并返回片元着色器对象的标识符,这个标识符被赋值给变量 fs

通过这两行代码,编译了顶点着色器和片元着色器,获取了它们的着色器对象标识符,以便后续附加到程序对象中。

 glAttachShader(program, vs);
glAttachShader(program, fs);

  • glAttachShader(program, vs):这行代码调用了OpenGL函数 glAttachShader,将顶点着色器对象(存储在变量 vs 中)附加到程序对象 program 上。这是将多个着色器组合成一个程序的第一步。

  • glAttachShader(program, fs):类似于前一行,这行代码将片元着色器对象(存储在变量 fs 中)附加到同一个程序对象 program 上。

通过这两行代码,将编译后的顶点着色器和片元着色器对象附加到一个程序对象上,为后续的链接和使用做准备。程序对象是OpenGL中的一个重要概念,它代表了一组着色器以及其他OpenGL状态的集合,用于实现图形渲染。

glLinkProgram(program);

  • glLinkProgram(program):这是一个OpenGL函数调用,调用了函数 glLinkProgram,它接受一个程序对象的标识符作为参数,这里是变量 program。这个函数的作用是将程序对象中附加的着色器链接在一起,形成一个可以执行的OpenGL程序。

链接程序的过程会将不同的着色器阶段(如顶点着色器、片元着色器)连接在一起,并生成一个可执行的图形渲染管线。链接程序时还会进行一些错误检查和优化操作,以确保程序能够正确运行。

在这行代码之后,程序对象将具有一个链接好的着色器程序,可以用来进行渲染操作。如果链接成功,程序就可以被使用,否则需要检查错误信息并进行修正。

glValidateProgram(program);

  • glValidateProgram(program):这是一个OpenGL函数调用,调用了函数 glValidateProgram,它接受一个程序对象的标识符作为参数,这里是变量 program。这个函数会验证程序对象,检查它是否已经正确链接,并且是否能在当前OpenGL上下文中运行。

验证程序可以帮助你捕捉一些链接和使用中的错误,比如着色器之间的不一致,着色器中的语法错误等。如果验证失败,你可以通过查询程序对象的信息日志来了解错误的具体原因。

总之,glValidateProgram 是一个用于确保程序对象正确性的步骤,可以在链接和使用程序之前进行调用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/53122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库为什么使用B+树而不是B树做索引

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

34、springboot切换内嵌Web服务器(Tomcat服务器)与 生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS

知识点1:springboot切换内嵌Web服务器(Tomcat服务器) 知识点2:生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS ★ Spring Boot默认的Web服务器(Tomcat) ▲ 基于Servlet的应用(使用Spring MV…

使用VSCode SSH实现公网远程连接本地服务器开发的详细教程

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

把Android手机变成电脑摄像头

一、使用 DroidCam 使用 DroidCam,你可以将手机作为电脑摄像头和麦克风。一则省钱,二则可以在紧急情况下使用,比如要在电脑端参加一个紧急会议,但电脑却没有摄像头和麦克风。 DroidCam 的安卓端分为免费的 DroidCam 版和收费的 …

【每日一题】1267. 统计参与通信的服务器

【每日一题】1267. 统计参与通信的服务器 1267. 统计参与通信的服务器题目描述解题思路 1267. 统计参与通信的服务器 题目描述 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有…

python进行数据分析:数据预处理

六大数据类型 见python基本功 import numpy as np import pandas as pd数据预处理 缺失值处理 float_data pd.Series([1.2, -3.5, np.nan, 0]) float_data0 1.2 1 -3.5 2 NaN 3 0.0 dtype: float64查看缺失值 float_data.isna()0 False 1 …

Kotllin实现ArrayList的基本功能

前言 上次面试时,手写ArrayList竟然翻车,忘了里面的扩容与缩容的条件,再次实现一次,加深印象 源码讲了什么 实现了List列表和RandomAccess随机访问接口List具有增删改查功能,RandomAccess支持下标访问内部是一个扩容…

java使用ExcelExportUtil.exportBigExcel导出大文件(非分页)

网上看到很多使用这个方法处理的时候,大多使用的分页进行查询,但是当遇到特殊的产品需求,比如A类型数据,多条记录就显示多行,B类型的要求存在多条记录时,就进行汇总后只显示一条,这就导致无法使…

Oracle给表空间添加容量

假如给SYSTEM表空间添加 查看文件位置和容量:Select * FROM DBA_DATA_FILES; FILE_NAME就是要修改的文件 查看每一个表空间的容量,单位MB: SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM dba_tablespaces…

大数据扫盲(2): 数据分析BI与ETL的紧密关系——ETL是成功BI的先决条件

着业务的发展每个企业都将产生越来越多的数据,然后这些数据本身并不能直接带来洞察力并产生业务价值。为了释放数据的潜力,数据分析BI(商业智能)成为了现代企业不可或缺的一部分。然而,在数据分析的背后,有…

详解多目标跟踪(MOT)算法中的Kalman滤波

Kalman滤波算法的原理可以参考: 卡尔曼滤波理解 以sort算法为例, 算法中使用到了卡尔曼滤波。 其作用是:通过t-1帧的结果, 通过卡尔曼滤波的predict过程得到目标在t帧的先验估计, 同时在t帧通过检测模型得到检测结果&…

【Linux网络】TCP UDP socket HTTP webSocket之间的区别

目录 一、OSI & TCP/IP模型 二、几者之间的关系 三、HTTP 四、Socket 五、WebSocket 5.1、WebSocket 优点 一、OSI & TCP/IP模型 首先我们要了解OSI七层模型,和预支对应的TCP/IP 四层的模型。 用下面的图可以看出,TCP UDP 工作在传输层&…

前端面试:【新技术与趋势】WebAssembly、Serverless、GraphQL

在不断演进的技术领域中,WebAssembly、Serverless和GraphQL都是备受关注的新技术和趋势。它们改变了软件开发、部署和数据传输的方式,为开发者提供了更多的选择和灵活性。 1. WebAssembly(Wasm): 简介: Web…

Word导出创建Adobe PDF其中emf图片公式马赛克化及文字缺失

软件版本 Word 2021 Visio 2019 Adobe Acrobat Pro 2020 问题描述 公式马赛克化,是指在Word中使用MathType编辑的公式,然后在Visio中使用图片(增强型图元文件)形式得到的粘贴对象,效果如下 文字缺失,是指Word导出→创建Adobe P…

一文学会lua脚本

文章目录 0.前言背景应用 1. 学习大纲1. 学习基本语法:2. 理解函数和模块:3. 深入数据结构:4. 高级特性和技巧:5. 实践项目: 2. Lua脚本2.1 学习基本语法2.2 理解函数和模块2.3 深入数据结构2.4 高级特性和技巧 3. 高级…

Hbase分布式安装

一、环境准备 启动zookeeper 启动hdfs 二、安装 上传安装包 1、解压 tar -zxf hbase-2.2.2-bin.tar.gz -C /opt/installs/2、更名 mv hbase-2.2.2/ hbase3、配置环境变量 [roothadoop11 conf]# vim /etc/profile export HBASE_HOME/opt/installs/hbase export PATH$PATH:$…

如何使用Linux文件系统?

为了让你更好地理解Linux文件系统,我要告诉你一些非常非常重要的知识点,确保你能够顺利地在这个庞大的世界中游走。 首先,你需要了解Linux中的基本概念。这个系统不像你的手机或者电脑,它是一个“文本”驱动的操作系统。这里的所…

Spring Boot中如何编写优雅的单元测试

单元测试是指对软件中的最小可测试单元进行检查和验证。在Java中,单元测试的最小单元是类。通过编写针对类或方法的小段代码,来检验被测代码是否符合预期结果或行为。执行单元测试可以帮助开发者验证代码是否正确实现了功能需求,以及是否能够…

vr内容编辑软件降低了虚拟现实项目开发门槛

VR虚拟场景编辑器是一种专门用于创建、修改和设计虚拟场景的工具。它利用vr虚拟现实技术,让用户可以在三维空间中直接对场景进行操作和编辑。这种编辑器的出现,使得用户可以更加直观、自由地进行场景设计和制作,为诸多领域带来了新的可能性。…

深入解析 Lambda 表达式

系列文章目录 文章目录 系列文章目录前言一、Lambda 表达式的基本概念二、Lambda 表达式的应用1.集合操作2.函数式接口3.线程操作三、Lambda 表达式 vs. 匿名类四、Lambda 表达式的局限性总结前言 Lambda表达式是Java 8引入的一项重要特性,它允许我们以更简洁、更紧凑的方式编…