学习目标:

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)相关推荐

  1. GLSL —— 三种变量类型(uniform,attribute和varying)

    文章目录 1.uniform变量 2.attribute变量 3.varying变量 1.uniform变量 uniform变量是外部程序传递给(vertex和fragment)shader的变量.因 ...

  2. OpenGL ES 三种变量类型(uniform,attribute和varying)

    https://blog.csdn.net/jackers679/article/details/6848085 https://zhuanlan.zhihu.com/p/103687720 1.un ...

  3. PL/SQL三种集合类型的比较

    PL/SQL三种集合类型的比较<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  4. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

    JavaScript:学习笔记(7)--VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...

  5. SEO三种职位类型:编辑型SEO、技术型SEO、营销型SEO详解

    SEO三种职位类型:编辑型SEO.技术型SEO.营销型SEO详解 网站SEO优化作为营销端的服务之一,这些年也呈现出日新月异的格局.一改过去游兵散将式的小作坊生产模式,不断有力量强大的公司团体加入到这 ...

  6. Typescript常见三种函数类型

    Typescript有常见三种函数类型: 分别是普通的函数: 有可选参数的函数: 有剩余参数的函数: 普通函数 function findMan(age:number):string{return ' ...

  7. Project中三种任务类型解释

    概述 Project--文件---选项---日程里,有"默认任务类型"设置 三种任务类型,与资源结合起来后,就需要根据实际情况选择了. 固定单位 这是Project默认的任务类型. ...

  8. python语言的三种数字类型_Python语言中的类型之数字类型--Python(10)

    数据从不一样的角度能够用不一样的含义去解释它,如: 10,011,101 对上面这个数据,咱们有以下多种含义去解释它: 1)它是1个二进制数字,或者是1个十进制数字: 2)一段文本: 3)用 , 号分 ...

  9. 交换机以太网端口三种链路类型

    以太网端口的三种链路类型:Access.Hybrid和Trunk Access类型的端口只能属于1个VLAN,一般用于连接计算机的端口: Trunk类型的端口可以允许多个VLAN通过,可以接收和发送多 ...

  10. 19.React Native动画Animated效果三种动画类型二;

    目录 1.介绍 2.Animated.decay() 2.1方法 2.1.1value参数值 2.1.2config参数有以下这些属性: 2.2示例-执行缩放 2.2.1初始化缩放值 2.2.2绑定缩 ...

最新文章

  1. layui表单mysql_layui表单验证支持select下拉框的一种方法
  2. linux 邮件发送时间,Linux-No.04 Linux 设置定时任务发送邮件功能
  3. emacs扩展功能_3个用于组织的Emacs扩展
  4. 学习《机器学习100天》第27天 什么是神经网络? | 深度学习,第1章
  5. 电阻触摸屏原理及电容触摸屏原理(附上原图)以及各自优缺点
  6. linux拔掉网线ip仍然在,openwrt 实现网线的拔插能够释放IP和重新分配IP地址
  7. 固定效应模型VS随机效应模型
  8. 使用Git提交代码时出现Author identity unknow
  9. 【iOS】遍历相册照片
  10. tensorflow 学习笔记使用CNN做英文文本分类任务
  11. logo计算机编程简单指令,pc logo 基本绘图命令
  12. Django中视图和URL中的常用方法
  13. 铜护套氧化镁矿物质绝缘电缆
  14. AndroidShortcuts
  15. php毕业设计美食菜谱网站
  16. pandas如何合并列表_Pandas数据合并与拼接的5种方法
  17. 机器学习-白板推导系列笔记(二十八)-BM
  18. 图书分类查询 Demo
  19. 经纬恒润测试开发面经
  20. 西部一流,连年扩招,这样的川大计算机你心动了吗?

热门文章

  1. simditor 图片上传成功后修改图片地址
  2. CF1528B Kavi on Pairing Duty(dp)
  3. 学习costmap代价地图
  4. TensorRT——安装报错解决:sudo pip3 install tensorrt-8.4.0.6-cp38-none-linux_x86_64.whl
  5. 安装AAE v11.x Control Room简易教程
  6. JavaSE方法(构造方法)与方法重载基础练习题
  7. InfluxDB使用HTTP的API编写数据
  8. 《星际争霸》战术总结==神族对战基本发展流程
  9. [生存志] 第134节 兵锋十万踏匈奴
  10. 提问的智慧 | 推荐好文