shader三种变量类型(uniform,attribute和varying)
学习目标:
uniform变量在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用。(相当于一个被vertex和fragment shader共享的全局变量)
uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息。
以下是例子:
uniform mat4 viewProjMatrix; //投影+视图矩阵
uniform mat4 viewMatrix; //视图矩阵
uniform vec3 lightPosition; //光源位置
2.attribute变量
attribute变量是只能在vertex shader中使用的变量。(它不能在fragment shader中声明attribute变量,也不能被fragment shader中使用)
一般用attribute变量来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等。
在application中,一般用函数glBindAttribLocation()来绑定每个attribute变量的位置,然后用函数glVertexAttribPointer()为每个attribute变量赋值。
以下是例子:
uniform mat4 u_matViewProjection;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
varying vec2 v_texCoord;
void main(void)
{gl_Position = u_matViewProjection * a_position;
v_texCoord = a_texCoord0;
}
3.varying变量
varying变量是vertex和fragment shader之间做数据传递用的。一般vertex shader修改varying变量的值,然后fragment shader使用该varying变量的值。因此varying变量在vertex和fragment shader二者之间的声明必须是一致的。application不能使用此变量。
以下是例子:
// Vertex shader
uniform mat4 u_matViewProjection;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
varying vec2 v_texCoord; // Varying in vertex shader
void main(void)
{gl_Position = u_matViewProjection * a_position;
v_texCoord = a_texCoord0;
}
// Fragment shader
precision mediump float;
varying vec2 v_texCoord; // Varying in fragment shader
uniform sampler2D s_baseMap;
uniform sampler2D s_lightMap;
void main()
{vec4 baseColor;
vec4 lightColor;
baseColor = texture2D(s_baseMap, v_texCoord);
lightColor = texture2D(s_lightMap, v_texCoord);
gl_FragColor = baseColor * (lightColor + 0.25);
}
multilight.vs
#version 430 corelayout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexNormal;out vec3 Color;struct LightInfo {vec4 Position; // Light position in eye coords.vec3 Intensity; // Light intesity (amb., diff., and spec.)
};uniform LightInfo lights[5];// Material parameters
uniform vec3 Kd; // Diffuse reflectivity
uniform vec3 Ka; // Ambient reflectivity
uniform vec3 Ks; // Specular reflectivity
uniform float Shininess; // Specular shininess factoruniform mat4 ModelViewMatrix;
uniform mat3 NormalMatrix;
uniform mat4 ProjectionMatrix;
uniform mat4 MVP;vec3 ads(int lightIndex, vec4 position, vec3 normal)
{vec3 s = normalize(vec3(lights[lightIndex].Position - position));vec3 v = normalize(vec3(-position));vec3 r = reflect(-s, normal);vec3 I = lights[lightIndex].Intensity;return I * (Ka + Kd * max(dot(s, normal), 0.0f) + Ks * pow(max(dot(r, v), 0.0f), Shininess));
}void main()
{vec3 eyeNorm = normalize(NormalMatrix * VertexNormal);vec4 eyePosition = ModelViewMatrix * vec4(VertexPosition, 1.0f);// Evaluate the lighting equation, for each lightColor = vec3(0.0f);for(int i=0; i<5; i++) {Color += ads(i, eyePosition, eyeNorm);}gl_Position = MVP * vec4(VertexPosition, 1.0f);}
multilight.fs
#version 430 corein vec3 Color;layout (location = 0) out vec4 FragColor;void main()
{FragColor = vec4(Color, 1.0f);
}
参考
softimagewht
shader三种变量类型(uniform,attribute和varying)相关推荐
- GLSL —— 三种变量类型(uniform,attribute和varying)
文章目录 1.uniform变量 2.attribute变量 3.varying变量 1.uniform变量 uniform变量是外部程序传递给(vertex和fragment)shader的变量.因 ...
- OpenGL ES 三种变量类型(uniform,attribute和varying)
https://blog.csdn.net/jackers679/article/details/6848085 https://zhuanlan.zhihu.com/p/103687720 1.un ...
- PL/SQL三种集合类型的比较
PL/SQL三种集合类型的比较<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...
- JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
JavaScript:学习笔记(7)--VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...
- SEO三种职位类型:编辑型SEO、技术型SEO、营销型SEO详解
SEO三种职位类型:编辑型SEO.技术型SEO.营销型SEO详解 网站SEO优化作为营销端的服务之一,这些年也呈现出日新月异的格局.一改过去游兵散将式的小作坊生产模式,不断有力量强大的公司团体加入到这 ...
- Typescript常见三种函数类型
Typescript有常见三种函数类型: 分别是普通的函数: 有可选参数的函数: 有剩余参数的函数: 普通函数 function findMan(age:number):string{return ' ...
- Project中三种任务类型解释
概述 Project--文件---选项---日程里,有"默认任务类型"设置 三种任务类型,与资源结合起来后,就需要根据实际情况选择了. 固定单位 这是Project默认的任务类型. ...
- python语言的三种数字类型_Python语言中的类型之数字类型--Python(10)
数据从不一样的角度能够用不一样的含义去解释它,如: 10,011,101 对上面这个数据,咱们有以下多种含义去解释它: 1)它是1个二进制数字,或者是1个十进制数字: 2)一段文本: 3)用 , 号分 ...
- 交换机以太网端口三种链路类型
以太网端口的三种链路类型:Access.Hybrid和Trunk Access类型的端口只能属于1个VLAN,一般用于连接计算机的端口: Trunk类型的端口可以允许多个VLAN通过,可以接收和发送多 ...
- 19.React Native动画Animated效果三种动画类型二;
目录 1.介绍 2.Animated.decay() 2.1方法 2.1.1value参数值 2.1.2config参数有以下这些属性: 2.2示例-执行缩放 2.2.1初始化缩放值 2.2.2绑定缩 ...
最新文章
- layui表单mysql_layui表单验证支持select下拉框的一种方法
- linux 邮件发送时间,Linux-No.04 Linux 设置定时任务发送邮件功能
- emacs扩展功能_3个用于组织的Emacs扩展
- 学习《机器学习100天》第27天 什么是神经网络? | 深度学习,第1章
- 电阻触摸屏原理及电容触摸屏原理(附上原图)以及各自优缺点
- linux拔掉网线ip仍然在,openwrt 实现网线的拔插能够释放IP和重新分配IP地址
- 固定效应模型VS随机效应模型
- 使用Git提交代码时出现Author identity unknow
- 【iOS】遍历相册照片
- tensorflow 学习笔记使用CNN做英文文本分类任务
- logo计算机编程简单指令,pc logo 基本绘图命令
- Django中视图和URL中的常用方法
- 铜护套氧化镁矿物质绝缘电缆
- AndroidShortcuts
- php毕业设计美食菜谱网站
- pandas如何合并列表_Pandas数据合并与拼接的5种方法
- 机器学习-白板推导系列笔记(二十八)-BM
- 图书分类查询 Demo
- 经纬恒润测试开发面经
- 西部一流,连年扩招,这样的川大计算机你心动了吗?
热门文章
- simditor 图片上传成功后修改图片地址
- CF1528B Kavi on Pairing Duty(dp)
- 学习costmap代价地图
- TensorRT——安装报错解决:sudo pip3 install tensorrt-8.4.0.6-cp38-none-linux_x86_64.whl
- 安装AAE v11.x Control Room简易教程
- JavaSE方法(构造方法)与方法重载基础练习题
- InfluxDB使用HTTP的API编写数据
- 《星际争霸》战术总结==神族对战基本发展流程
- [生存志] 第134节 兵锋十万踏匈奴
- 提问的智慧 | 推荐好文