OpenGL笔记(三) GLSL语法与内建函数
GLSL,OpenGL Shading Language,GLSL中没有指针,并且没有任何类型的字符串或字符。
(1)GLSL的修饰符与基本数据类型
const:用于声明非可写的编译时常量变量;
attribute:用于经常更改的信息,只能在顶点着色器中使用;
uniform:用于外部程序传递给shader的变量,shader只能用,不能改;
varying:用于从顶点着色器向片元着色器传递数据的变量。
然后是基本数据类型,int、float、bool。注意float可以指定精度:
highp:32bit,一般用于顶点坐标(vertex coordinate);
medium:16bit,一般用于纹理坐标(texture coordinate);
lowp:8bit,一般用于颜色表示。
接下来是向量类型。
vec4:4分量浮点向量;
ivec4:4分量整数向量;
uvec4:4分量无符号整数向量;
bvec4:4分量布尔向量;
四维向量:
attribute vec4 position;
矩阵类型,所有的矩阵类型都只支持浮点数,不支持整数或者布尔矩阵:
uniform lowp mat4 colorMatrix;
纹理类型,一般仅在Fragment Shader中使用这个类型,二维纹理的声明方式如下:
uniform sampler2D texSampler;
最后是varing,用于在Vertex Shader和Fragment Shader中传递参数。首先在VS中声明这个类型的变量代表纹理的坐标点,并且对这个变量进行赋值,代码如下:
attribute vec2 texcoord;
varying vec2 v_texcoord;
void main(void)
{
v_texcoord = texcoord;
}
紧接着在FS中也声明同名的变量,然后使用texture2D方法取出二维纹理中该纹理坐标点上的像素值,代码如下:
varying vec2 v_texcoord;
vec4 texel = texture2D(texSampler, v_texcoord);
取出了该坐标点上的像素值之后,就可以进行像素变化操作了,比如说提高对比度,最终将改变的像素值赋给gl_FragColor。
(2)GLSL的内置函数与内置变量
最常见的内置变量是两个Shader的输出变量,首先是VS的:
vec4 gl_position;
上述代码用来设置顶点转换到屏幕坐标的位置,VS一定要去更新这个数值。
float gl_pointSize;
在粒子效果的场景下,需要为粒子设置大小,改变该内置变量的值就是为了设置每一个粒子矩形的大小。
其次是FS的内置变量:
vec4 gl_FragColor;
上述代码用于指定当前纹理坐标所代表的像素点的最终颜色值。
(3)其他
sampler2D类型,其实就是纹理数据。另外还有一个方法texture2D,第一个参数是纹理数据,第二个参数是纹理坐标,这个方法就是在纹理数据中取出当前片段对应在纹理数据中位置上的数据颜色。
OpenGL笔记(三) GLSL语法与内建函数的更多相关文章
- Webpack4 学习笔记三 ES6+语法降级为ES5
前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 Webpack 将es6.es7语法降级为es5 需要通过 babel JavaScript编译器. 安装: npm i babel ...
- VUE 学习笔记 三 模板语法
1.插值 a.文本 数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值 <span>Message: {{ msg }}</span> v-once ...
- Java笔记(三)……基础语法
关键字 标识符 在程序中自定义的一些名称 由26个英文字母大小写,数字:0-9,符号:_ $组成 定义合法标识符规则: 数字不可以开头. 不可以使用关键字. Java中严格区分大小写. 注意:在起名字 ...
- 学习笔记:GLSL Core Tutorial – Pipeline (OpenGL 3.2 – OpenGL 4.2)
GLSL Core Tutorial – Pipeline (OpenGL 3.2 – OpenGL 4.2) GLSL 是一种管道,一种图形化的流水线 1.GLSL 的具体工作流程: 简化流程如下: ...
- OpenGL 笔记 <2> Compiling and Linking a shader program
Preface 这一节所有的主要内容都在一个OpenGL库文件中<LoadShaders.h> ,只需要用LoadShader()函数进行加载即可.但是由于老是出错,所以自己实现了一下,也 ...
- OpenGL笔记(五) 着色器渲染(以Android为例)
一.Android平台上下文环境的创建及初始化 1. 首先实例化Android上下文环境,即EGL的初始化. bool EGLCore::init(EGLContext sharedContext) ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
随机推荐
- 【 js 基础 】【 源码学习 】backbone 源码阅读(三)
最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-stud ...
- jQuery的$.getScript方法去加载javaScript文档解析
1.两个文件的代码如下: <script> function Ajax(){ //将9-4.html中的Ajax()函数进行修改 $.getScript('9-8.js',function ...
- 【代码笔记】iOS-Label随字自动变大
一,效果图. 二,工程图. 三, 代码. RootViewController.h #import <UIKit/UIKit.h> //添加HPGrowingTextView头文件 #im ...
- jQuery中.bind() .live() .delegate() .on()区别
$(selector).bind(event,data,function) $(selector).live(event,data,function)//jquery1.9版本以下支持,jquery1 ...
- 学习MVC之租房网站(十二)-缓存和静态页面
在上一篇<学习MVC之租房网站(十一)-定时任务和云存储>学习了Quartz的使用.发邮件,并将通过UEditor上传的图片保存到云存储.在项目的最后,再学习优化网站性能的一些技术:缓存和 ...
- Why do collection classes appear
package com.itheima_01; import java.util.ArrayList; /* * 为什么会出现集合类: * 我们学习的是面向对象编程语言,而面向对象编程语言对事物的描述 ...
- AWS CSAA -- 04 AWS Object Storage and CDN - S3 Glacier and CloudFront(三)
021 Storage Gateway 022 Snowball 023 Snowball - Lab 024 S3 Transfer Acceleration
- SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间
SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间 这里只讨论字符串类型,int.datetime.text这些数据类型就不讨论了,因为是否节省空间是根据数据类型来定的 在写这篇文 ...
- EntityFramework 贪婪加载与延迟加载以及资源回收
EntityFramework的资源回收 1) Using 内包含Entity的上下文关系,对俩表做Add操作,最好可以直接写一个 entity.SaveChanges(); 完成两张表的同时add操 ...
- Remove Rar Password OnLine
How to Remove Rar passwords without any software : One of the most frustrating thing in our digital ...