GLSL基础

OpenGLES(四)glsl语法 GLSL是OpenGL着色器语言(OpenGL Shading Language) 阅读详情

OpenGL Shading Language GLSL作为一种着色语言是纯粹的和GPU打交道的计算机语言。因为GPU是多线程并行处理器,所以GLSL直接面向SIMD模型的多线程计算。GLSL编写的着色器函数是对每个数据同时执行的。每个顶点都会由顶点着色器中的算法处理,每个像素也都会由片段着色器中的算法处理。因此,初学者在编写自己的着色器时,需要考虑到SIMD的并发特定,并用并行计算的思路来思考问题

最常见的用法是在顶点着色器生成所需要的值,然后传递给片段着色器使用。

GLSL能做什么?

  • 日益逼真的材质 – 金属、岩石、木头、油漆等。
  • 日益逼真的光照效果 – 区域光和软阴影。
  • 非现实材质 – 美术效果、钢笔画、水墨画和对插画技术的模拟。
  • 针对纹理内存的新用途。
  • 更少的纹理访问。
  • 图形处理 – 选择、边缘钝化遮蔽和复杂混合。
  • 动画效果 – 关键帧插值、粒子系统。
  • 用户可编程的反走样方法。

GLSL注意

  • GLSL支持函数重载
  • GLSL不存在数据类型的自动提升,类型必须严格保持一致。
  • GLSL不支持指针、字符串、字符,它基本上是一种处理数字数据的语言。
  • GLSL不支持联合、枚举类型、结构体位字段及按位运算符。

数据类型


GLSL有三种基本数据类型:float,int和bool,以及这些数据类型组成的数组和结构体。
需要注意的是:GLSL并不支持指针。与C/C++不同的是,GLSL将向量和矩阵作为基本数据类型。
注意:GLSL不存在数据类型的自动提升,类型必须严格保持一致。

标量

  • float
  • int
  • bool
42    // 十进制
042   // 八进制
0x2A  // 十六进制

GLSL不存在数据类型的自动转换,必须严格保持一致

矢量

矢量可以和标量甚至矩阵做加减乘除(必须符合规则)

 vec2,  vec3,  vec4 // 包含2/3/4个浮点数的矢量
ivec2, ivec3, ivec4 // 包含2/3/4个整数的矢量
bvec2, bvec3, bvec4 // 包含2/3/4个布尔值的矢量

声明:

vec3 v;             //声明三维浮点型向量v  
v[1]=3.0;           //给向量v的第二个元素赋值  

// 下面两种等价
vec3 v = vec3(0.6);
vec3 v = vec3(0.6, 0.6, 0.6);

注意:除了用索引的方式外,还可以用选择运算符的方式来使用向量。选择运算符是对于向量的各个元素(最多为4个)约定俗称的名称,用一个小写拉丁字母来表示。根据向量表示对象的意义不同,可以使用以下选择运算符:

  • 表示顶点可以用(x、y、z、w)。
  • 表示颜色可以用(r、g、b、a)。
  • 表示纹理坐标用(s、t、r、q)。
    用户可以选择其中任意一种选择运算符,它们的作用是等效的。
    也即是说,如果v是一个向量,那么v[0]、v.r、v.x和v.s都是指向量v的第一个元素。例如:
vec4 v1=vec4(1.0, 2.0, 3.0, 4.0);   //用构造函数的方式声明并初始化四维浮点型
vec4 v2;  
v2.xy=v1.yz;                    //将v1的第二个和第三个元素复制到v2的第一个和第二个元素 
v2.z=2.0;                       //给v2的第三个元素赋值  
v2.xy=v1.yx;                    //将v1的头两个元素互换,再复制到v2的头两个元素中

矩阵

mat2,mat3,mat4 – 2x2/3x3/4x4 的矩阵
矩阵式按列顺序组织的,先列后行。
例如:

mat4 m;             //声明四维浮点型方阵m  
m[2][3]=2.0;        //给方阵的第三列、第四行元素赋值 

// 下面两种等价,初始化矩阵对角
mat2 m = mat2(1.0)
mat2 m = mat2(1.0, 0.0, 0.0, 1.0);

取样器(Sampler)

纹理查找需要指定哪个纹理或者纹理单元将指定查找。

sampler1D           // 访问一个一维纹理
sampler2D           // 访问一个二维纹理           
sampler3D           // 访问一个三维纹理
samplerCube         // 访问一个立方贴图纹理
sampler1DShadow     // 访问一个带对比的一维深度纹理
sampler2DShadow     // 访问一个带对比的二维深度纹理
uniform sampler2D grass;

vcc2 coord = vec2(100, 100);
vec4 color = texture2D(grass, coord);

如果一个着色器要在程序里结合多个纹理,可以使用取样器数组

const int tex_nums = 4;
uniform sampler2D textures[tex_nums];

for(int i = 0; i < tex_nums; ++i) {
    sampler2D tex = textures[i];
    // todo ...
}

结构体

这是唯一的用户定义类型

struct light  
{  
    vec3 position;  
    vec3 color;  
};  

light ceiling_light;

数组

数组索引是从0开始的,而没有指针概念

// 创建一个10个元素的数组  
vec4 points[10];  

// 创建一个不指定大小的数组
vec4 points[]; 
points[2] = vec4(1.0);  // points现在大小为3
points[7] = vec4(2.0);  // points现在大小为8

void

只能用于声明函数返回值

类型转换

必须明确地进行类型转换,不会自动转换提升。

float f = 2.3; 
bool b = bool(f); // b is true

限定符


GLSL中有4个限定符(varable qualifiers)可供使用,它们限定了被标记的变量不能被更改的“范围”。

  • const
  • attribute
  • uniform
  • varying

const

const和C++里差不多,定义不可变常量,表示限定的变量在编译时不可被修改。

attribute

attribute是应用程序传给顶点着色器用的。不允许生命时初始化,attribute限定符标记的是一种全局变量,该变量在顶点着色器中是只读(read-only)的,该变量被用作从OpenGL应用程序向顶点着色器中传递参数,因此该限定符仅能用于顶点着色器。

uniform

uniform一般是应用程序用于设定顶点着色器和片段着色器相关初始化值。不允许声明时初始化,uniform限定符标记的是一种全局变量,该变量对于一个图元(primitivie)来说是不可更改的,它可以从OpengGL应用程序中接受传递来的参数。

varying

varying用于传递顶点着色器的值给片段着色器。不允许声明时初始化,它提供了从顶点着色器向片段着色器传递数据的方法,varying限定符可以再顶点着色器中定义变量,然后再传递给光栅化器,光栅化器对数据插值后,再将每个片段的的值交给片段着色器。

限制


  • 不能再if-else中生命变量
  • 用于判断的条件必须是bool类型(if,while,for…)
  • (?:)操作符后两个参数必须类型相同
  • 不支持switch语句
vec4 toonify(in float intensify) 
{
    vec4 color;
    color = vec4(0.8,0.8,0.8,0.8)
    return color;
}

discard


discard关键字可以避免片段更新帧缓冲区,当流控制遇到这个关键字时,正在处理的片段就会被标记位丢

函数


  • 函数名可以通过参数类型重载,但是和返回类型值无关
  • 所有参数必须完全匹配,参数不会自动
  • 函数不能被递归调用
  • 函数返回值不能是数组

hanshu参数标示符

in:进复制到函数中,但不返回的参数(默认)
out:不将参数复制到函数中,单返回参数
inout:复制到函数中并返回

混合操作


通过选择器(.)后列出各分量名,就可以选择这些分量

vec4 v4;
v4.rgba;    // 得到vec4
v4.rgb;     // 得到vec3
v4.b;       // 得到float
v4.xy;      // 得到vec2
v4.xgba;    // 错误!分量名不是同一类

v4.wxyz;    // 打乱原有分量顺序
v4.xxyy;    // 重复分量
GLSL(OpenGL 着色器语言)基础语法 ✅GLSL语法类似 语言,但更适合GPU并行计算。✅顶点着色器主要进行坐标变换。✅片元着色器主要计算像素颜色。✅变量修饰符 in、out、uniform 控制数据流。✅向量、矩阵 计算是GLSL 的核心,优化GPU性能。 阅读详情

相关推荐

GLSL实现Glow效果

 Glow即辉光效果现在已成为3D图形中一个引人注目的特效.本文主要介绍如何使用GLSL实现一个典型的GLow效果. 实现步骤:1.渲染整个场景到一个祯缓冲区中    2.将场景中需要进行GLow处理的物体绘制第二个FBO纹理A中    3.在FBO纹理A和B之间进行横和纵"高斯"过滤    4.将进行过GLow处理后的FBO纹理A与祯缓冲区中的场景图像以glBlendFu

red woft的专栏 1万+

GLSL基础概念(绝对看得懂)

GLSL(OpenGL Shading Language)是一种用于描述顶点和片元着色器的语言。它是一种 C 语言的变体,专门为 OpenGL 和其他着色器渲染系统而设计。在渲染图形时,主程序会将顶点数据发送到 GPU,然后 GPU 会使用图形着色器来计算每个像素的最终颜色。图形着色器的输入是顶点数据,输出是像素颜色。着色器代码和主程序之间的关系就在于着色器代码是在GPU上执行的,主程序是在CPU上执行的。主程序会把数据传给着色器,例如顶点数据,着色器代码就能够处理这些数据,并将结果返回给主程序。

m0_57236802的博客 8736

GLSL 变量

GLSL变量认识 (1) 基本数据类型 Android上OpenGL ES2.0中基本数据类型: 浮点型(float)、布尔型(bool)、整型(int)、矩阵型(matrix)以及向量型(vec2、vec3等)等。 总体来说,这些数据类型可以分为标量、向量、矩阵、采样器以及数组等几类。 类型描述 floatIEEE 32位浮点值 int有符号二进制补码的32位整数 uint无符号的32位整数 b...

gk11010的博客 976

GLSL ES 语言 | 数组

数组GLSL ES 只支持一维数组,且没有 pop()、push() 等操作,声名数组只需要在变量后加上中括号"[ ]" 和数组长度,如下://声明含有4个数浮点数的数组...

奎特尔星球 3102

深入理解 GLSL:从基础到精通

GLSL 是一种类似于 C 语言的编程语言,它在 OpenGL 图形渲染管线中负责处理顶点和片段的着色操作。顶点着色器主要负责处理顶点的位置、颜色、纹理坐标等属性,而片段着色器则负责确定每个像素的颜色。通过编写 GLSL 代码,开发者可以实现各种复杂的图形效果,如光照、阴影、纹理映射、反射等。

candy的博客 1826

车载与安防项目实战:如何用RK3588搭配NVP6158C实现4路AHD摄像头BT1120接入与同步预览

本文详细解析了基于RK3588处理器与NVP6158C解码芯片实现4路AHD摄像头BT1120接入与同步预览的技术方案。针对车载环视和安防监控场景,重点探讨了硬件架构设计、BT1120接口配置、多路同步机制及Android HAL适配等核心问题,提供了从底层驱动到上层应用的完整实现路径,为相关领域的工程实践提供可靠参考。

weixin_30571465的博客 482

GLSL教程 第2章:GLSL基础

在本章中,我们将深入探讨GLSL(OpenGL Shading Language)的基础知识。这些基础知识包括GLSL程序的基本结构、变量声明和数据类型、向量和矩阵操作以及控制流语句。掌握这些基础概念对于编写有效的GLSL着色器至关重要。

qq_54098120的博客 1945

基于多物理参数数据融合和先进人工智能算法的锂电池热失控监测传感器

基于多物理参数数据融合和先进人工智能算法的锂电池热失控监测传感器是多种方案中的优选项!是一种快速、准确、可靠、应用广泛的传感方案!可有效监测锂离子电池热失控风险,保障化学能储能电站安全!

chicheng_danxin的博客 2410

GLSL 在OpenGL中使用GLSL

设置GLSL 这一节讲述在OpenGL中配置GLSL,假设你已经写好了顶点shader和像素shader。如果你还没有准备好,可以从如下网址获得相关内容: http://www.3dshaders.com/home/ http://www.opengl.org/sdk/tools/ShaderDesigner/ http://developer.amd.com/archiv

hgl868的专栏 1万+

Unsloth Desktop 本地大模型微调量化实战指南

大语言模型的本地化定制正在成为开发者与内容创作者的重要需求,而微调与量化则是其中最关键的两项技术。LoRA 与 QLoRA 通过仅训练少量低秩矩阵,大幅降低显存占用和训练成本,让消费级 GPU 也能完成模型适配;GGUF 格式则打通了训练与推理的边界,使微调后的模型可直接接入 Ollama、llama.cpp 等主流推理引擎。本文以 Unsloth Desktop 为切入对象,从其底层加速原理出发,梳理了环境准备、模型加载、对话测试、量化导出、微调验证及 API 批量调用的完整链路,并针对显存优化、端口冲突

weixin_29055137的博客 397

STM32H750实战:如何用CubeMX配置NAND Flash时序(附常见问题排查)

本文详细解析了STM32H750通过CubeMX配置NAND Flash时序的实战技巧,包括硬件连接、时序参数计算与优化策略,以及常见问题如RGB屏幕干扰、多片选冲突的解决方案。特别针对NAND Flash的时序配置和抗干扰设计提供了实用代码示例和优化建议,帮助开发者提升系统稳定性和性能。

weixin_29176179的博客 363

GLSL. 语法基础

GLSL. 语法基础

jacke121的专栏 4080

VMware Workstation Pro 16 安装 Ubuntu 20.04

VMware Workstation Pro 16 安装 ubuntu 20.04目录环境VMware Workstation下载Ubuntu 20.04下载安装过程 目录 环境 Windows 10 Workstation 16 Pro for Windows Ubuntu 20.04 LTS 64位 desktop版本 VMware Workstation下载 链接: https://www.vmware.com/products/workstation-pro/workstation-pro-eval

qq_45642410的博客 1万+

GLSL Versions

GLSL Versions mattdesl edited this pageon 13 Sep 2013·15 revisions Intro You can use the#versioncommand as the first line of your shader to specify GLSL version: #version 120 void main() { ...

fatcat123的博客 380

企业财务共享服务中心业务蓝图规划方案【附全文阅读】

《企业财务共享服务中心业务蓝图规划方案》为集团企业提供财务共享中心建设全流程指导,涵盖战略定位、组织架构、业务流程、信息系统、运营管理和变革实施六大维度。方案明确共享中心"交易处理+战略支撑"双重职能,设计专业分组架构,筛选标准化高、价值明确的流程(如核算、资金结算等)纳入共享范围,构建业财一体化平台,并配套绩效与风险管控体系。结合项目型企业管理特点,分阶段推进实施,助力企业实现财务集中化与标准化转型。

cdfunlove的博客 994

道威棱镜的设计参考

道威棱镜的设计参考

weixin_72050316的博客 379

VSCode进行GLSL的调试

偶然看见,VSCode可以进行GLSL的调试。迅速查了些资料,着手尝试。也遇到了一些问题,写下来备查。 1、GLSL语法支持 2、GLSL显示支持 3、GLSL语法检查 这个比较复杂,不是直接安装插件就能用。 3.1代码补全的文件配置 https://github.com/KhronosGroup/glslang/releases 这里下载、解压后,填写文件(glslangValidator.exe的路径全名)路径到下图位置 3.2 setting.json配置 ".

qq_41116743的博客 5359

从 SM30 到 Fiori:在 SAP BTP ABAP Environment 里创建 Business Configuration 配置维护对象的完整路径

摘要 在SAP BTP的ABAP环境中,传统SAP GUI和SM30配置方式被Business Configuration (BC)替代。BC通过Fiori应用维护配置,支持传输和权限控制。配置表需满足可维护性条件,如允许数据维护、包含技术字段等。通过ADT生成Maintenance Object和Transport Object,实现配置发布与治理。权限管理需创建IAM App和Business Catalog,确保配置可维护。BC在云端延续了可控、可追溯、可发布的治理原则。 (字数:150)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 237

GLSL的简介(上)

最近开始研究NPR(非真实性)渲染,感觉还是用GLSL自己写着色器比较靠谱。于是找了NEHE的一篇对GLSL的简介翻译一下,当做入门。 什么是GLSL? GLSL(GLslang)是官方的opengl着色语言的简称(OpenGL Shading Language)。GLSL是类似于C/C++的高级语言,适用于一部分显卡。使用GLSL,你能够编写一些短小的程序,称为着色器(shader),这些着

Quixote实验室 4275

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

GLSL教程 第12章:现代GLSL特性

本章探讨了现代GLSL的特性,包括Tessellation Shader、Compute Shader和多重渲染目标等。这些特性为图形开发带来了更多的灵活性和功能,可以帮助开发者实现更加复杂和高效的渲染效果。同时,我们也讨论了GLSL的兼容性和移植性问题,强调了编写跨平台代码的重要性。掌握这些现代GLSL特性和最佳实践,将使我们能够更好地利用GPU的强大能力,推动图形开发技术的进步。

qq_54098120的博客 1360

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[转载] GLSL基础篇

GLSL

青梅煮酒的专栏 3436

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

GLSL基础语法

GLSL(OpenGL着色语言OpenGL Shading Language)语法跟C语言很类似,在可编程管线中我们必须要纯手写顶点和片源着色器,这里就要求必须使用GLSL,自行编译,链接,使用,本片文章介绍了GLSL基础语法。 GLSL中提供了许多内建的函数,来方便我们的使用。可以在官方手册中查找相关的函数http://www.opengl.org/sdk/docs/man/ GLSL指南 ...

小胖七少爷的博客 754

GLSL教程 附录B:GLSL和API集成

在这一附录中,我们将探讨如何将GLSL与OpenGL API进行集成,以及如何在其他图形API中使用GLSL。我们还将讨论跨平台开发中的一些注意事项。通过对这些内容的了解,将能够将GLSL着色器与实际的图形应用程序结合起来,提升开发效率和兼容性。

qq_54098120的博客 1441

GLSL基础转载

变量 GLSL的变量命名方式与C语言类似。变量的名称可以使用字母,数字以及下划线,但变量名不能以数字开头,还有变量名不能以gl_作为前缀,这个是GLSL保留的前缀,用于GLSL的内部变量。当然还有一些GLSL保留的名称是不能够作为变量的名称的。 基本类型 除了布尔型,整型,浮点型基本类型外,GLSL还引入了一些在着色器中经常用到的类型作为基本类型。这些基本类型都可以作为结构体内部的类型。如下...

sinat_41030415的博客 299

OpenGL——GLSL基础篇

基本类型: 类型 说明 int 有符号二进制补码的32位整数 uint 无符号的32位整数 float IEEE 32位浮点值 double IEEE 64位浮点值 void 空类型 bool 布尔类型 true,false GLSL隐式类型转换 所需的类型 可以从这些类型隐式转换 uint int float int、uint double int、uint、float 聚合类型 ...

qq_25065595的博客 2630

【GLSL教程】(二)在OpenGL中使用GLSL

OpenGL中使用GLSL

danshiming的博客 1408
上一篇: Java正则表达式
下一篇: Android OpenGL使用GLSurfaceView预览视频
Bobby_lyc
博客等级 码龄16年 1164粉丝 89原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值