着色器语言(GLSL)基础学习三
内置的常量
glsl提供了一些内置的常量,用来说明当前系统的一些特性. 有时我们需要针对这些特性,对shader程序进行优化,让程序兼容度更好.
在 vertex Shader 中:
1.const mediump int gl_MaxVertexAttribs>=8
gl_MaxVertexAttribs 表示在vertex shader(顶点着色器)中可用的最大attributes数.这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个.
2.const mediump int gl_MaxVertexUniformVectors >= 128
gl_MaxVertexUniformVectors 表示在vertex shader(顶点着色器)中可用的最大uniform vectors数. 这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 128 个.
3.const mediump int gl_MaxVaryingVectors >= 8
gl_MaxVaryingVectors 表示在vertex shader(顶点着色器)中可用的最大varying vectors数. 这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个.
4.const mediump int gl_MaxVertexTextureImageUnits >= 0
gl_MaxVaryingVectors 表示在vertex shader(顶点着色器)中可用的最大纹理单元数(贴图). 这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 甚至可以一个都没有(无法获取顶点纹理)
5.const mediump int gl_MaxCombinedTextureImageUnits >= 8
gl_MaxVaryingVectors 表示在 vertex Shader和fragment Shader总共最多支持多少个纹理单元. 这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个.
在 fragment Shader 中:
1.const mediump int gl_MaxTextureImageUnits >= 8
gl_MaxVaryingVectors 表示在 fragment Shader(片元着色器)中能访问的最大纹理单元数,这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个.
2.const mediump int gl_MaxFragmentUniformVectors >= 16
gl_MaxFragmentUniformVectors 表示在 fragment Shader(片元着色器)中可用的最大uniform vectors数,这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 16 个.
3.const mediump int gl_MaxDrawBuffers = 1
gl_MaxDrawBuffers 表示可用的drawBuffers数,在OpenGL ES 2.0中这个值为1, 在将来的版本可能会有所变化.
glsl中还有一种内置的uniform状态变量, gl_DepthRange 它用来表明全局深度范围.
结构如下:
struct gl_DepthRangeParameters {highp float near; // nhighp float far; // fhighp float diff; // f - n};
uniform gl_DepthRangeParameters gl_DepthRange;
除了 gl_DepthRange 外的所有uniform状态常量都已在glsl 1.30 中废弃.
流控制
glsl的流控制和c语言非常相似,这里不必再做过多说明,唯一不同的是片段着色器中有一种特殊的控制流discard. 使用discard会退出片段着色器,不执行后面的片段着色操作。片段也不会写入帧缓冲区。
1.for语句
for (l = 0; l < numLights; l++)
{if (!lightExists[l]);continue;color += light[l];
}
2.while语句
while (i < num)
{sum += color[i];i++;
}
3. do while语句
do{color += light[lightNum];lightNum--;
}while (lightNum > 0)
4.if语句
if (true)discard;//跳出流程
内置函数库
glsl提供了非常丰富的函数库,这些功能都是非常有用的,按功能大致可以分成7类:
1.通用函数:
该类函数的类型 T 可以是 float, vec2, vec3, vec4,且可以逐分量操作
2.角度或三角函数:
该类函数的 类型 T可以是 float, vec2, vec3, vec4,且可以逐分量操作.
3.指数函数:
该类函数的 类型 T可以是 float, vec2, vec3, vec4,且可以逐分量操作.
4.几何函数:
该类函数的 类型 T可以是 float, vec2, vec3, vec4,且可以逐分量操作.
5.矩阵函数
mat可以为任意类型矩阵.
方法 | 说明 |
---|---|
mat matrixCompMult(mat x, mat y) | 将矩阵 x 和 y的元素逐分量相乘 |
6.向量函数
该类函数的 类型 T可以是 vec2, vec3, vec4, 且可以逐分量操作.
bvec指的是由bool类型组成的一个向量,如:
vec3 v3= vec3(0.,0.,0.);
vec3 v3_1= vec3(1.,1.,1.);
bvec3 aa= lessThan(v3,v3_1);//bvec3(true,true,true)
7.纹理查询函数:
图像纹理有两种 一种是平面2d纹理,另一种是盒纹理,针对不同的纹理类型有不同访问方法.
纹理查询的最终目的是从sampler中提取指定坐标的颜色信息. 函数中带有Cube字样的是指 需要传入盒状纹理. 带有Proj字样的是指带投影的版本.
以下函数只在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);
官方的shader范例:
Vertex Shader:
uniform mat4 mvp_matrix; //透视矩阵 * 视图矩阵 * 模型变换矩阵
uniform mat3 normal_matrix; //法线变换矩阵(用于物体变换后法线跟着变换)
uniform vec3 ec_light_dir; //光照方向
attribute vec4 a_vertex; // 顶点坐标
attribute vec3 a_normal; //顶点法线
attribute vec2 a_texcoord; //纹理坐标
varying float v_diffuse; //法线与入射光的夹角
varying vec2 v_texcoord; //2d纹理坐标
void main(void)
{//归一化法线vec3 ec_normal = normalize(normal_matrix * a_normal);//v_diffuse 是法线与光照的夹角.根据向量点乘法则,当两向量长度为1是 乘积即cosθ值v_diffuse = max(dot(ec_light_dir, ec_normal), 0.0);v_texcoord = a_texcoord;gl_Position = mvp_matrix * a_vertex;
}
Fragment Shader:
precision mediump float;
uniform sampler2D t_reflectance;
uniform vec4 i_ambient;
varying float v_diffuse;
varying vec2 v_texcoord;
void main (void)
{vec4 color = texture2D(t_reflectance, v_texcoord);//这里分解开来是 color*vec3(1,1,1)*v_diffuse + color*i_ambient//色*光*夹角cos + 色*环境光gl_FragColor = color*(vec4(v_diffuse) + i_ambient);
}
着色器语言(GLSL)基础学习三相关推荐
- OpenGL ES着色器语言(GLSL ES)规范 ——下篇
文章目录 前言 分支和循环 if.if-else for continue.break.discard 着色器内置变量 函数 函数定义 规范声明 webgl内置函数 存储限定字 const attri ...
- OpenGLES2.0着色器语言glsl
OpenGLES2.0中是强制使用可编程的渲染管线的,使用的是glsl着色器语言,因为着色器语言是使用的GPU,即图形处理单元,而不是CPU,这样可以使CPU从繁重的几何计算和像素的处理中解脱出来了. ...
- OpenGL着色器语言GLSL语法总结
GLSL语法与C语言类似. 1.变量类型 基础类型:bool,int,uint,float,double与C语言的类型类似. 向量类型:vecN,bvecN,ivecN,uvecN,dvecN,N表示 ...
- 图片处理之着色器语言 GLSL (opengl-shader-language) 内建函数
内建函数基本上可以分为一下三类: (1)它们使用一些简便的方式提供必要的硬件功能,如材质贴图.这些函数单独通过着色器是无法模拟出来的. (2)它们展示了一些可以常简单的写入的繁琐操作(clamp, m ...
- GLSL三种基本类型(着色器语言三种变量)
着色器语言和C语言一样,通过一个表示特定数据类型的关键词声明一个变量,比如int num;通过int关键字声明一个整数型变量num,不过着色器语言还提供了三个关键字attribute.uniform和 ...
- 可编程渲染管线与着色器语言
Programming pipeline & shading language 大家好,今天想给大家介绍一下可编程渲染管线和着色器语言的相关基础知识,使想上手SHADER编程的童鞋们可以快速揭 ...
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)...
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- OpenGL ES着色器语言之变量和数据类型
所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符.变量在声明的时候首先要标明类型,后边可以跟多个变量,之间用逗号隔开.很多情 ...
- Godot着色器语言
引言 Godot 使用的了一种非常接近GLSL ES 3.0的着色器语言,并且支持其绝大多数的数据类型和函数,尚未完全支持的部分也会逐渐增加进去. 如果你对GLSL熟悉的话,可以直接阅读 <Go ...
- 第四章:缓冲区、着色器、GLSL
原文链接: http://www.rastertek.com/gl40tut04.html Tutorial 4: Buffers, Shaders, and GLSL 第四章:缓冲区.着色器.GLS ...
最新文章
- Ubuntu(Linux)上安装ROS缓慢,解决方法:添加ros的国内镜像源,以及ROS安装过程使用rosdep update出现错误:‘The read operation timed out‘
- 1.多线程-NSThread
- POJ-1724 深搜剪枝
- Python基础练习题:猜数字小游戏
- if you canget up early
- RequireJS 主要函数
- MIUI 11或随小米MIX4共同发布 登场时间9月至10月间
- 性能测试很难吗?一文带你学会性能测试核心流程和概念
- Customer Group Checkout----------Red2Black_RealTidbits
- springMVC Model ModelMap 和 ModelAndView的区别
- 位运算 取某一位 java_Java 位运算妙用
- vue循环阿里巴巴矢量图标
- MySQL中幻读是如何解决的
- 远方测试软件,远方测试仪操作指导书
- [算法]LeetCode每日一题--9回文数(Java)
- 计算机硬盘为啥要入固定资产,监控存储硬盘入固定资产吗
- Win11怎么添加日语输入法
- 花椒六间房“花房之夜”落幕 全新升级不止心动
- BJTU1931 铁憨憨骑士团的中央空调
- 燕千云知识库,解决你的知识沉淀烦恼
热门文章
- 阿里云产品推荐——边缘节点服务
- python中functools_python模块之functools
- 三元函数的几何图形一般是_如何求三元函数的极值?
- 可逆残差网络:不存储激活的反向传播 Reversible Residual Network: Backpropagation Without Storing Activations
- 2020Android通用流行框架大全,android开发入门基础教程
- 注解方式—解决mybatis实体类属性名和数据库字段名不一致问题
- 什么叫模型,什么叫算法
- wordpress主题基本文件配置
- Java初学01:学习路线
- mysql or不走索引分析