11. GLSL(OpenGL Shader Language)常用知识点汇总
1. 说明:
在使用OPenGL进行三维模型渲染时,需要使用到两个着色器对模型进行位置设置和颜色设置,分别为顶点着色器和片段着色器,这两个着色器是使用 GLSL 语法进行编写的。这篇文章总结了一些GLSL中的一些基本语法知识。
2. 基本知识点:
2.1 主函数:
在每一个 shader 文件中,必须有一个main函数,也是入口函数,类似于C语言。
void main() //也可写成 void main(void)
{...
}
2.2 基本类型:
void,bool,int,float,
bvec2,bvec3,bvec4,// bvec(n)包含n个布尔成分的向量
ivec2,ivec3,ivec4,// ivec(n)包含n个整型成分的向量
mat2(mat2x2),mat3(mat3x3),
mat4x4,mat2x3,mat2x4,mat3x2,
mat3x4,mat4x2,mat4x3, // mat(axb)a行b列的浮点矩阵
sampler1D,sampler2D,sampler3D, // n维纹理采样器
samplerCube //cube map纹理句柄
sampler1DShadow //一维深度纹理句柄
sampler2DShadow // 二维深度纹理句柄
2.3 修饰符:
in //用在函数的参数中,表示这个参数是输入的
out //用在函数参数中,表示这个参数是输出的
uniform //一致变量,在编译时期由着色器在外部初始化,在顶点和片段着色器之间是共享的(一般我们使用uniform变量来放置外部程序传递来的环境数据(如点光源位置,模型的变换矩阵等等))const //常量值必须在声明时初始化
attribute //只读的顶点数据,用于顶点着色器中(一般attribute变量用来放置程序传递来的模型顶点,法线,颜色,纹理等数据)
varying //顶点着色器的输出类型,也是片段着色器的输入数据(主要负责在vertex 和 fragment 之间传递变量)
inout //用在函数参数中,表示这个参数既是输入又是输出
2.4 内置变量:
内置变量是不需要提前声明的,可以在函数内部直接使用,是GLSL内部规定好的变量
2.4.1 顶点着色器内置变量
gl_Position vec4 //输出属性-顶点坐标,所有的顶点着色器都要写这个值
gl_TexCoord[] vec4 //纹理坐标的数组varying输出gl_Color vec4 //输入属性--顶点的主颜色
gl_SecondaryColor vec4 //输入属性--顶点的辅助颜色
gl_Normal vec3 //输入属性--顶点的法线值
gl_Vertex vec4 //输入属性--物体空间的顶点位置
gl_MultiTexCoordn vec4 //输入属性--顶点的第n个纹理坐标
gl_FogCoord float //输入属性--顶点的雾坐标
gl_ClipVertex vec4 //输出坐标,用于用户裁剪平面的裁剪
gl_PointSize float //点的大小
gl_FrontColor vec4 //正面的主颜色的varying输出
gl_BackColor vec4 //背面主颜色的varying输出
gl_FrontSecondaryColor vec4 //正面的辅助颜色的varying输出
gl_BackSecondaryColor vec4 //背面的辅助颜色的varying输出
gl_FogFragCoord float //雾坐标的varying输出
2.4.2 片段着色器内置变量
gl_FragColor vec4 //输出的颜色用于随后的像素操作
gl_TexCoord[] vec4 //包含纹理坐标数组的插值--只读输入gl_Color vec4 //包含主颜色的插值--只读输入
gl_SecondaryColor vec4 //包含辅助颜色的插值--只读输入
gl_FogFragCoord float //包含雾坐标的插值--只读输入
gl_FragCoord vec4 //只读输入--窗口的x,y,z和1/w
gl_FrontFacing bool //只读输入--如果是窗口正面图元的一部分,则这个值为true
gl_PointCoord vec2 //点精灵的二维空间坐标范围在(0.0, 0.0)到(1.0, 1.0)之间,仅用于点图元和点精灵开启的情况下。
gl_FragData[] vec4 //使用glDrawBuffers输出的数据数组。不能与gl_FragColor结合使用。
gl_FragDepth float //输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替
2.5 语句控制:
循环控制语句包含:for循环,while循环,do/while循环,continue / break。
条件控制:if / else 结构
discard 语句:
片段着色器中有一种特殊的控制流成为discard。使用discard会退出片段着色器,不执行后面的片段着色操作。片段也不会写入帧缓冲区。
if (color.a < 0.9)
discard; //后面的代码不会再执行
2.6 函数解释:
2.6.1 纹理查询函数:
纹理查询的最终目的是从sampler中提取指定坐标的颜色信息
//以下函数只在vertex shader中可用:
vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);
vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);
vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);
vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);
//以下函数只在fragment shader中可用:
vec4 texture2D(sampler2D sampler, vec2 coord, float bias);
vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);
vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);
vec4 textureCube(samplerCube sampler, vec3 coord, float bias);
//在 vertex shader 与 fragment shader 中都可用:
vec4 texture2D(sampler2D sampler, vec2 coord);
vec4 texture2DProj(sampler2D sampler, vec3 coord);
vec4 texture2DProj(sampler2D sampler, vec4 coord);
vec4 textureCube(samplerCube sampler, vec3 coord);// 解释:texture2D(sampler2D sampler,vec2 coord)使用纹理坐标coord在当前绑定到采样器sampler的2D纹理中进行纹理查找
2.7 数据精度:
在变量前面加上 highp mediump lowp 即可完成对该变量的精度声明
lowp float color;
varying mediump vec2 Coord;
lowp ivec2 foo(lowp mat3);
highp mat4 m;
参考:GLSL中文手册
参考:GLSL语法基础
持续更新中,请大家多多关注…
相关文章:
11. GLSL(OpenGL Shader Language)常用知识点汇总
1. 说明: 在使用OPenGL进行三维模型渲染时,需要使用到两个着色器对模型进行位置设置和颜色设置,分别为顶点着色器和片段着色器,这两个着色器是使用 GLSL 语法进行编写的。这篇文章总结了一些GLSL中的一些基本语法知识。 2. 基本…...

转发一张网络工程师考试的试卷2021.5.15
网络工程师考试 单选题 (30题,每题1分,共30分) 1. 你在一个网络中实现DHCP服务,配置一些计算机成为DHCP客户端,由于工作需要,一台系统为Windows 10 的客户端要把从DHCP服务器获得的地址释放&a…...

AMD发布23.2.1 新驱动 支持开年新作《魔咒之地》
如果说2023年有什么新作,《魔咒之地(Forspoken)》当属开年大作之一,1月25日才在steam平台发售。虽然开售后的表现似乎不如想象中优秀,加之价格相对昂贵,令不少玩家望而却步,但如果只是想尝鲜&am…...
开放平台如何做接口的签名和加解密?
目录安全性功能介绍实现流程开放平台依赖代码AES加解密工具类PlatformConfigRequestUtilsPlatformServiceCommonCodeZuulFilterHelperServerResponsePlatformContactRsaSignatureRsaUtilsStreamUtil开放平台-解密过滤器开放平台-加密过滤器调用方代码公共代码Get-DemoPost-Demo…...

Mr. Cappuccino的第40杯咖啡——Kubernetes之Pod生命周期
Kubernetes之Pod生命周期Pod生命周期官方文档Pod的状态初始化容器案例钩子函数Exec命令TCPSocketHTTPGet案例容器探测Exec命令TCPSocketHTTPGet探测时间重启策略Pod生命周期官方文档 Pod生命周期官方文档 Pod的状态 pending:挂起,apiserver创建了pod资…...

记一次OOM
1,问题描述: 新上了一版代码之后,上游服务请求我们服务失败,报错:“服务不可用”,发现注册中心上服务掉线,查询日志:发现oom:Java heap space,GC overhead limit exceeded。 容易…...

idea插件生成dao类service类controller类以及mapper.xml
idea插件生成dao类service类controller类以及mapper.xml 安装插件Easycode和MybatisX,不用自己写代码 1.Files——》Settings——》Plugins,分别搜索Easycode和MybatisX,点击下载。 2.新建一个springboot模板,选择的依赖如下 3.…...
DML 数据操作语言
概述 DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。 添加数据(INSERT)修改数据(UPDATE)删除数据(DELETE) 添加数据 1、给指定字段…...

PySpark实战一之入门
1、PySpark的编程模型 分三个模块: 数据输入:通过SparkContext对象,完成数据输入 数据处理计算:输入数据后得到RDD对象,对RDD对象的成员方法进行迭代计算 数据输出:最后通过RDD对象的成员方法࿰…...

【DockerCE】Docker-CE 23.0.1正式版发布
很意外啊!Docker社区版竟然直接从20.xx.xx版本,升级到23.xx.xx版本了。官网地址(For RHEL/CentOS 7.9):https://download.docker.com/linux/centos/7/x86_64/stable/Packages/23.0.1版本官方安装包如下:# l…...

vscode开发的Vue家用电器维修服务系统nodejs+mysql
主要功能包括管理员:首页、个人中心、用户管理、维修员管理、维修信息管理、维修申请管理、维修处理管理、家电类别管理、配件信息管理、配件领用管理、维修结果管理、家电维修知识管理、公告信息管理、留言板管理,用户:首页、个人中心、维修…...

PyQt5数据库开发1 4.2 配置SQL Server 2008 数据源(ODBC编程)
文章目录 配置SQL Server 2008 数据源(ODBC编程) 1. 了解要配置的数据源服务器名称,以及数据库和对应表 2. 打开控制面板,点击管理工具 3. 双击数据源 4. 选择“用户DSN”选项卡,点击“添加” 5. 选择SQL Serv…...

【JavaEE】多线程代码实例:单例模式与阻塞队列BlockingQueue
目录 单例模式: 什么是单例模式? 单例模式的实现方式: 饿汉模式: 懒汉模式: 基于并发编程对单例模式线程安全问题的讨论: 阻塞队列: 标准库中的阻塞队列: 自实现阻塞…...

算法思想 - 搜索算法
本文主要介绍算法中搜索算法的思想,主要包含BFS,DFS。搜索相关题目深度优先搜索和广度优先搜索广泛运用于树和图中,但是它们的应用远远不止如此。BFS广度优先搜索的搜索过程有点像一层一层地进行遍历,每层遍历都以上一层遍历的结果…...

C#底层库--日期扩展类(上周、本周、明年、前年等)
系列文章 C#底层库–记录日志帮助类 本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709 C#底层库–数据库访问帮助类(MySQL版) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379 …...

如何在 Webpack 中开启图片压缩
工具对比 npmtrends.com/image-minim… 这四个压缩工具,从下载量来看,image-webpack-loader 较多,image-minimizer-webpack-plugin、imagemin-webpack-plugin 次之,imagemin-webpack 已经不再维护,因此不考虑此工具。 …...
Web-Filter
## 今日内容 1. Filter:过滤器 2. Listener:监听器 # Filter:过滤器 1. 概念: * 生活中的过滤器:净水器,空气净化器,土匪、 * web中的过滤器:当访问服务器的资源时…...
测试写文章自动保存
近日恰逢双十一,瞅了瞅自己干瘪的钱包,没忍心入手期待已久的 macPro,只好在虚拟机里玩一下 mac好了,等以后钱包傲气的时候再来个真实的。 安装环境: windows10 VMWare14.2 2018-7-28 小嘚瑟补充:唧唧歪歪大半年,一夜回到解放前,终于剁手整了个真机,可以折腾一下了 ——…...

云平台搭建实例
嗨嗨,每天一更是不是很奈斯?我也觉得,昨天晚上我学校的老师借一天一千的设备,只能用七天,所以我拿出来给你们没有设备和刚用设备的看看吧。操作:首先我们将云平台安装好后,插上网线,…...
【Airplay_BCT】关于Bonjour的概念解答
1.什么是Bonjour? Bonjour,也称为零配置网络,可以自动发现 IP 网络上的计算机、设备和服务。 Bonjour 使用行业标准 IP 协议,允许设备自动发现彼此,无需输入 IP 地址或配置 DNS 服务器。具体来说,Bonjour …...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...