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

简单着色器编写(中下)

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

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 是一个用于确保程序对象正确性的步骤,可以在链接和使用程序之前进行调用。

 

相关文章:

简单着色器编写(中下)

这篇我们来介绍另一部分函数。 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 f…...

matlab使用教程(24)—常微分方程(ODE)求解器

1.常微分方程 常微分方程 (ODE) 包含与一个自变量 t(通常称为时间)相关的因变量 y 的一个或多个导数。此处用于表示 y 关于 t 的导数的表示法对于一阶导数为 y ′ ,对于二阶导数为 y ′′,依此类推。ODE 的阶数等于 y 在方程中…...

企业级数据共享规模化模式

数据共享正在成为企业数据战略的重要元素。对于公司而言,Amazon Data Exchange 这样的亚马逊云科技服务提供了与其他公司共享增值数据或从这些数据获利的途径。一些企业希望有一个数据共享平台,他们可以在该平台上建立协作和战略方法,在封闭、…...

Web服务器-Tomcat详细原理与实现

Tomcat 安装与使用 :MAC 安装配置使用Tomcat - 掘金 安装后本计算机就相当于一台服务器了!!! 方式一:使用本地安装的Tomcat 1、将项目文件移动到Tomcat的webapps目录下。 2、启动Tomcat 3、在浏览器输入想要加载的…...

ARM处理器核心概述

一、基于ARM处理器的嵌入式系统 ARM核深度嵌入SOC中,通过JTAG口进行外部调试。计通常既有外部内存又有内部内存,从而支持不通的内存宽度、速度和大小。一般会包含一个中断控制器。可能包含一些Primece外设,需要从ARM公司取得授权。总线使用A…...

万户协同办公平台 ezoffice存在未授权访问漏洞 附POC

文章目录 万户协同办公平台 ezoffice存在未授权访问漏洞 附POC1. 万户协同办公平台 ezoffice简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 万户协同办公平台 ezoffice存在未授权访问漏洞 附POC 免责声明:请勿利用文章内的相…...

使用ctcloss训练矩阵生成目标字符串

首先我们需要明确 c t c l o s s ctcloss ctcloss是用来做什么的。比如说要生成的目标字符串长度为 l l l,而这个字符串包含 s s s个字符,字符串允许的最大长度为 L L L,这里认为一个位置是一个时间步,就是一拍,记为 T…...

驱动 - 20230829

练习 基于platform实现 在根节点下&#xff0c;增加设备树 myplatform {compatible"hqyj,myplatform";interrupts-extended<&gpiof 9 0>, <&gpiof 7 0>, <&gpiof 8 0>;led1-gpio<&gpioe 10 0>;reg<0x12345678 59>;}…...

数组(个人学习笔记黑马学习)

一维数组 1、定义方式 #include <iostream> using namespace std;int main() {//三种定义方式//1.int arr[5];arr[0] 10;arr[1] 20;arr[2] 30;arr[3] 40;arr[4] 50;//访问数据元素/*cout << arr[0] << endl;cout << arr[1] << endl;cout &l…...

layui表格事件分析实例

在 layui 的表格组件中&#xff0c;区分表头事件和行内事件是通过事件类型&#xff08;toolbar 和 tool&#xff09;以及 lay-filter 值来实现的。 我们有一个表格&#xff0c;其中有一个工具栏按钮和操作按钮。我们将使用 layui 的 table 组件来处理这些事件。 HTML 结构&…...

Android NDK JNI与Java的相互调用

一、Jni调用Java代码 jni可以调用java中的方法和java中的成员变量,因此JNIEnv定义了一系列的方法来帮助我们调用java的方法和成员变量。 以上就是jni调用java类的大部分方法,如果是静态的成员变量和静态方法,可以使用***GetStaticMethodID、CallStaticObjectMethod等***。就…...

装备制造企业如何执行精益管理?

导 读 ( 文/ 2358 ) 精益管理是一种以提高效率、降低成本和优化流程为目标的管理方法。装备制造行业具备人工参与度高&#xff0c;产成品价值高&#xff0c;质量要求高的特点。 在装备制造企业中实施精益管理可以帮助企业提高竞争力、提升生产效率并提供高质量的产品。本文将…...

PHP8中自定义函数-PHP8知识详解

1、什么是函数&#xff1f; 函数&#xff0c;在英文中的单词是function&#xff0c;这个词语有功能的意思&#xff0c;也就是说&#xff0c;使用函数就是在编程的过程中&#xff0c;实现一定的功能。即函数就是实现一定功能的一段特定代码。 在前面的教学中&#xff0c;我们已…...

虚拟化技术:云计算发展的核心驱动力

文章目录 虚拟化技术的概念和作用虚拟化技术的优势虚拟化技术对未来发展的影响结论 &#x1f389;欢迎来到AIGC人工智能专栏~虚拟化技术&#xff1a;云计算发展的核心驱动力 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系…...

光伏+旅游景区

传统化石燃料可开发量逐渐减少&#xff0c;并且对环境造成的危害日益突出。全世界都把目光投向了可再生能源&#xff0c;希望可再生能源能够改变人类的能源结构。丰富的太阳能取之不尽、用之不竭&#xff0c;同时对环境没有影响&#xff0c;光伏发电是近些年来发展最快&#xf…...

手搓文本向量数据库(自然语言搜索生成模型)

import paddle import jieba import pandas as pd import numpy as np import os from glob import glob from multiprocessing import Process, Manager, freeze_supportfrom tqdm import tqdm# 首先 确定的是输出的时候一定要使用pd.to_pickle() pd.read_pickle() # 计算的时…...

EVO大赛是什么

价格是你所付出的东西&#xff0c;而价值是你得到的东西 EVO大赛是什么&#xff1f; “EVO”大赛全称“Evolution Championship Series”&#xff0c;是北美最高规格格斗游戏比赛&#xff0c;大赛正式更名后已经连续举办12年&#xff0c;是全世界最大规模的格斗游戏赛事。常见…...

linux中使用clash代理

本机环境&#xff1a;ubuntu16 安装代理工具&#xff08;这里使用clash&#xff09; 可以手动下载解压&#xff0c;下载地址&#xff1a;https://github.com/Dreamacro/clash 也可以直接使用命令行&#xff0c;演示如下&#xff1a; userlocalhost:~$ curl https://glados.r…...

Kafka3.0.0版本——Follower故障处理细节原理

目录 一、服务器信息二、服务器基本信息及相关概念2.1、服务器基本信息2.2、LEO的概念2.3、HW的概念 三、Follower故障处理细节 一、服务器信息 三台服务器 原始服务器名称原始服务器ip节点centos7虚拟机1192.168.136.27broker0centos7虚拟机2192.168.136.28broker1centos7虚拟…...

13.redis集群、主从复制、哨兵

1.redis主从复制 主从复制是指将一台redis服务器&#xff08;主节点-master&#xff09;的数据复制到其他的redis服务器&#xff08;从节点-slave&#xff09;&#xff0c;默认每台redis服务器都是主节点&#xff0c;每个主节点可以有多个或没有从节点&#xff0c;但一个从节点…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...