着色器GLSL ES语言10分钟了解

这篇具有很好参考价值的文章主要介绍了着色器GLSL ES语言10分钟了解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考资料:threejs中文网

threejs qq交流群:814702116

着色器GLSL ES语言10分钟了解

学习原生WebGL,除了前面说的JavaScript语言之外,你还需要学习一门新的语言就是着色器语言GLSL ES。

平时你接触的JavaScript、C、java等语言是在CPU上执行,对于着色器语言GLSL ES是在显卡GPU上执行。

如何学习

着色器语言GLSL ES语法虽然类似Typescript、C等语言,但是GLSL主要在GPU上执行,有自身的特殊性,只有结合WebGL案例学习GLSL ES语法,才能更好的理解,所以这节课只介绍GLSL ES部分语法。

所以你本节课不用写任何代码,只要跟着视频过一遍即可,后面还会结合WebGL案例具体介绍GLSL ES的语法。

GLSL ES基础数据类型

着色器语言GLSL的基本数据类型和C语言一样具有常见的整型数int、浮点数float和布尔值bool类型数据。

关键字 数据类型
bool 布尔值 布尔变量值为true或false
int 整型数 值为整数,比如0,1,2,3…
float 单精度浮点数 浮点数用小数点表示,比如0.6,3.14,2.8

这三个关键字的用法,下面就会给大家展示怎么用于声明变量。

声明变量

声明变量,并赋值

// 整型变量
int count = 10;
// 浮点数变量
float num = 10.0;
// 声明一个布尔值变量
bool lightBool = true;

通过上面变量声明,你也可以看出,着色器语言声明变量和TypeScript一样需要注明数据类型,但是JavaScript不用注明变量数据类型。

// JavaScript语言声明变量,不用设置数据类型
let count = 10;

先声明变量,后赋值或改变。

float c;
c = 100.0;

改变变量的值

float count = 10.0;
count = 20.0;

注意: 注意变量的数据类型和值要对应

错误赋值方式

float num = 1;

正确赋值方式

float num = 1.0;

变量简单运算

// 32位浮点数相加
float a = 2.0;
float b = 4.0;
float c = a+b;
//整数相加
int a = 2;
int b = 4;
int c = a+b;

两个变量进行运算,需要保持一样数据类型,否则报错。

声明一个常量const

着色器语言和C语言、javascript语言一样可以通过关键字const声明一个常量。

// 着色器语言定义一个整形常量
const int count = 10;
// 定义一个浮点数常量10.0
const float count = 10.0;

着色器语言和其它语言一样,声明一个变量,可以重新赋值,如果通过关键字const声明一个常量,顾名思义是常量,在代码中是不可以更改的。

const int count = 10;
// 错误写法
count= 20;

着色器语言GLSL ES声明函数

函数计算后,如果需要返回的值,通过关键字return返回,不过注意声明函数时候,函数名称前需要声明return返回值的数据类型。

// 两个参数是浮点数,相加后返回值自然也是浮点数
float add(float x,float y){
  return x + y
}

声明一个无返回值函数,函数前面用void关键字即可。

void main(){
  float x = 10.0;
}

if语句

着色器语言GLSL中关于if语句、for语句的使用,和javascript语言、C语言中的if语句、for语句执行逻辑规则基本一致,这里默认你已经有一定的编程基础,也就不做过多讲解,只是简单说明一下。

单独使用if

float x = 10.0
if(x > 100.0){
  x = 100.0;
}

if-else形式

float x = 10.0
if(x > 100.0){
  x = 100.0;
} else {
  x = x + 1.0;
}

if-else if-else if-...else形式

float x = 10.0
if(x<10.0){

}else if (x>=10.0 && x<20.0) {

}else if (x>=20.0 && x<30.0) {

}else {

}

for循环语句

和你平时写JavaScript的for循环语句基本相似,只是注意注明变量i的数据类型即可。

for (int i = 0; i < 20; i++) {
  ...
}

continuebreak关键字

着色器语言continuebreak关键字和JavaScript语言习惯也是相似的。

break表示终止for循环执行

for (int i = 0; i < 20; i++) {
  ...
  if(i==15){
    break;//直接终止循环执行,i=16、17等后面的循环不再执行
  }
  ...
}

continue表示直接跳到for循环的下一个循环

for (int i = 0; i < 20; i++) {
  ...
  if(i==15){
    continue;//进行下次循环,执行i=16对应的循环
  }
  ...
}

向量表示颜色

在GLSL ES中,向量可以表示多种数据,也能进行多种数学运算,咱们这里先不讲解那么多,说些简单的。

vec3vec4关键字和intfloat一样也是用来表示数据的类型,vec3表示三维向量、vec4表示四维向量,vec3vec4的每个分量都是浮点数float

// 四维向量有四个分量,可以用来表示颜色的R、G、B、A
vec4 color = vec4(1.0, 0.0, 0.0, 1.0);//红色不透明
关键字 数据类型
vec2 二维向量,具有xy两个分量,分量是浮点数
vec3 三维向量 ,具有xyz三个分量,分量是浮点数
vec4 四维向量 ,具有xyzw四个分量,分量是浮点数
ivec2 二维向量,分量是整型数
ivec3 三维向量 ,分量是整型数
ivec4 四维向量 ,分量是整型数
bvec2 二维向量,分量是布尔值bool
bvec3 三维向量 ,分量是布尔值bool
bvec4 四维向量 ,分量是布尔值bool

向量表示顶点位置坐标

三维向量vec3表示变量pos具有三个分量,可以用来表示顶点的xyz坐标。

vec3 pos = vec3(1.0, 2.0, 3.0);

用四维向量vec4表示齐次坐标,所谓齐次坐标,就是在GLSL ES中表示一个顶点坐标的的时候,增加一个分量,1.0表示。

vec4 pos = vec4(1.0, 2.0, 3.0,1.0);

一个三维向量转化为四维向量

vec3 pos = vec3(1.0, 2.0, 3.0);
vec4 newPos = vec4(pos,1.0);

一个二维向量转化为四维向量

vec2 pos = vec2(1.0, 2.0);
vec4 newPos = vec4(pos, 3.0,1.0);

内置变量

不管是JavaScript语言,还是着色器语言GLSL ES,你想使用一个变量,都需要先声明。

float a = 2.0;
float b = 4.0;
float c = a+b;

所谓内置变量就是着色器语言GLSL ES默认提供的变量,不需要声明,就可以使用。GLSL ES内置变量很多,下面介绍几个下节课会用到的。

  • gl_PointSize:点渲染像素大小,数据类型浮点数float

  • gl_Position:顶点坐标,数据类型四维向量vec4

  • gl_FragColor:像素颜色,数据类型四维向量vec4

// 赋值浮点数
gl_PointSize = 20.0;

vec4前面三个参数表示xyz坐标,第四个参数按照GLSL ES语法习惯需要设置为1.0

// 赋值四维向量,表示xyz坐标是原点
gl_Position = vec4(0.0,0.0,0.0,1.0);

vec4前面三个参数是颜色RGB值,第四个参数是透明度值

// 赋值四维向量,表示红色不透明
gl_FragColor = vec4(1.0,0.0,0.0,1.0);

GLSL ES代码注释

GLSL ES代码注释和JavaScript语言的习惯一样。

  • 单行注释符号//

  • 快级注释符号/* */

GLSL ES语句结尾分号

在JavaScript中,代码语句结尾的分号可以省略,但是 GLSL ES中分号不能省略。

float a = 2.0;//正常

分号省略,会报错文章来源地址https://www.toymoban.com/news/detail-774947.html

float a = 2.0//分号省略,会报错

到了这里,关于着色器GLSL ES语言10分钟了解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity记录一些glsl和hlsl的着色器Shader逆向代码

    以下内容一般基于 GLSL 300 之后 以下某些代码行,是“伪代码“,绝大部分是renderDoc 逆向产生标准代码 本人OpenlGL零基础,也不打算重头学 目录 Clip() 剔除函数 discard; FS最终颜色输出 out 和最终颜色相加方程 从 discard; 命令可得知,一般通过透明度剔除, _26 == color.a _21.w 刚

    2024年02月07日
    浏览(47)
  • Cesium版本升级webgl问题,glsl代码报错,修改办法

      Cesium 从1.102.0  开始,Cesium 默认使用  WebGL2  上下文。一些webgl特效代码在webgl1中支持,但是在版本升级后,运行会报各种glsl代码错误。现在有两种解决方案。详细办法描述如下所示。   地球初始化配置如下: requestWebgl1: true   需要修改的为:  varying   attribute  

    2024年02月06日
    浏览(38)
  • 【Webgl_glsl&Threejs】搬运分享shader_飘落心形

    将shadertory上的代码转成了threejs可以直接用的代码,引入文件的material,并在创建mesh或已有物体上使用material即可,使用时请注意uv对齐。 flowHeart

    2024年04月27日
    浏览(33)
  • 3分钟快速了解es中分片的概念

    在 Elasticsearch 中,分片(shard)是将索引划分为多个较小的部分的过程。分片可以提高搜索性能和容错能力。下面是如何为书籍示例创建一个带有分片和中文分词器的索引。 我们将为 “books” 索引创建 3 个主分片(primary shards)和 1 个副本分片(replica shard)。 创建带有分片

    2024年02月05日
    浏览(38)
  • 三分钟带你了解ES【详解版】

    1 ES是什么 Elasticsearch 是一个分布式的 RESTful 搜索和分析引擎,可用来集中存储您的数据,以便您对形形色色、规模不一的数据进行搜索、索引和分析。 上面是​​官网-API文档​​对的定位描述。ES 是一个分布式的搜索引擎,数据存储形式与我们常用的 MySQL 的存储形式 —

    2024年02月16日
    浏览(40)
  • 3分钟快速了解ES中索引,映射,文档的概念

    在 Elasticsearch 中,索引、映射和文档是数据存储和组织的基本概念。以下是这三个概念的关系和用法: 索引:索引是用于存储和组织具有类似结构的文档集合。在我们的书籍示例中,我们可以创建一个名为 “books” 的索引来存储书籍信息。 映射:映射定义了索引中文档的字

    2024年02月06日
    浏览(64)
  • 3分钟快速了解mysql和es中字段类型相似之处

    Elasticsearch 和 MySQL 的字段类型在很多方面具有相似之处。这些相似之处主要反映在它们表示基本数据类型的能力上。下面是 Elasticsearch 和 MySQL 中一些相似的字段类型: 文本: Elasticsearch: text 和 keyword MySQL: VARCHAR , CHAR , TEXT , TINYTEXT , MEDIUMTEXT , LONGTEXT 在 Elasticsearch 中, text

    2024年02月05日
    浏览(40)
  • 泊松分布的分布函数_10分钟了解泊松分布

    泊松分布的分布函数_10分钟了解泊松分布_weixin_39921131的博客-CSDN博客 gamma分布_轻松理解gamma分布_weixin_39883433的博客-CSDN博客

    2024年02月12日
    浏览(43)
  • kubernetes--技术文档--基本概念--《10分钟快速了解》

    Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。 它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。 Kubernetes 是开源系统,可以自由地部署在企

    2024年02月12日
    浏览(58)
  • 大数据学习之Flink,10分钟带你初步了解Flink

    目录 前摘 一、认识Flink的Logo​编辑 二、了解Flink的起源 三、了解Flink的发展 四、明白Flink的定位 五、Flink主要的应用场景 六、流式数据处理的发展和演变 1. 流处理和批处理 2. 传统事务处理 2.1传统事务处理架构​编辑 3. 有状态的流处理 4. Lambda 架构 5. 新一代流处理器 七、

    2024年02月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包