当前位置: 首页 > news >正文

[3]Opengl ES着色器

    术语:
    VertexShader:顶点着色器,用来描述图形图像位置的顶点坐标;
    FragmentShader:片元着色器,用来给顶点指定的区域进行着色;
    Vertex:顶点
    Texture:纹理,给顶点区域进行渲染的材质,比如图像等,其实就是一块内存空间,里面的像素按一定规则排列;

   Opengl ES2.0对渲染管线中的两个阶段增加可编程支持:顶点着色器和片元着色器,分别用于顶点数据和图元着色编程控制,其使用的编程语言叫GLSL,类似C语言,下面对着色器使用的类型、修饰符进行介绍。
   
   1. 数据类型:
   float  bool  int    基本数据类型

   vec2                包含了2个浮点数的向量

   vec3                包含了3个浮点数的向量

   vec4                包含了4个浮点数的向量

   ivec2               包含了2个整数的向量

   ivec3               包含了3个整数的向量

  ivec4               包含了4个整数的向量

  bvec2               包含了2个布尔数的向量

  bvec3               包含了3个布尔数的向量

  bvec4               包含了4个布尔数的向量

  mat2                2*2维矩阵

  mat3                3*3维矩阵

  mat4                4*4维矩阵

  sampler1D           1D纹理采样器

  sampler2D           2D纹理采样器

  sampler3D           3D纹理采样器

  2.着色器修饰符

       属性(Attribute):由 vertext array 提供的顶点数据,如空间位置,法向量,纹理坐标以及顶点颜色,属性可以理解为针对每一个顶点的输入数据。属性只在顶点着色器中才有,片元着色器中没有属性。OpenGL ES 2.0 规定了所有实现应该支持的最大属性个数不能少于 8 个。

       常量(Uniforms): Uniforms保存由应用程序传递给着色器的只读常量数据。在顶点着色器中,这些数据通常是变换矩阵,光照参数,颜色等。由 uniform 修饰符修饰的变量属于全局变量,该全局性对顶点着色器与片元着色器均可见,也就是说,这两个着色器如果被连接到同一个应用程序中,它们共享同一份 uniform 全局变量集。因此如果在这两个着色器中都声明了同名的 uniform 变量,要保证这对同名变量完全相同:同名称+同类型,因为它们实际是同一个变量。此外,uniform 变量存储在常量存储区,因此限制了 uniform 变量的个数,OpenGL ES 2.0 也规定了所有实现应该支持的最大顶点着色器 uniform 变量个数不能少于 128 个,最大的片元着色器 uniform 变量个数不能少于 16 个。
   
      采样器(Samplers): 一种特殊的 uniform,用于呈现纹理。sampler 可用于顶点着色器和片元着色器。
   
      可变变量(Varying):varying 变量用于存储顶点着色器的输出数据,也存储片元着色器的输入数据。varying 变量会在光栅化处理阶段被线性插值。顶点着色器如果声明了 varying 变量,它必须被传递到片元着色器中才能进一步传递到下一阶段,因此顶点着色器中声明的 varying 变量都应在片元着色器中重新声明为同名同类型的 varying 变量。OpenGL ES 2.0 也规定了所有实现应该支持的最大 varying 变量个数不能少于 8 个。
   
    3.着色器坐标系统

      在Opengl ES开发中,我们会碰到如下的坐标系统:

      物体坐标系、视界坐标系、摄像机坐标、规范化坐标、屏幕坐标。

      下面我们简单介绍下这几种坐标系的关系,详细的介绍后续会做介绍,下面我们先来看看在Opengl ES中,一个画面从开始到显示到屏幕上经过的转换。

       

      物体坐标系:此坐标系针对场景中的单个物体而言,就是说场景中每个物体都有自己独立的坐标,其中某个物体做了旋转,并不会影响到其它物体的坐标。

       世界坐标系:世界坐标系是一个比较特殊的坐标系,其一般来说是固定的,用来标定物体和物体之间的相对位置关系(同在世界坐标系之中的物体),形象点说,一个房间相当于一个世界坐标,房间中的桌子、椅子、人各种拥有自己的物体坐标系,但是其在房间中的位置标定物体在房间中和其它物体的相对位置关系。

       摄像机坐标:摄像机坐标是相对于视点来说的,是从摄像机的角度来描述的,比如房间中已经有很多物体,那么我们调整摄像机的位置,所观察到的物体的视角是不一样的,这就是上图说的视变换,这里其实包含两个方面,摄像机调整其观察位置和被观察物体进行变换,两者的结果是等价的,因为最终的结果就是我们从不同角度看到的物体是不一样的。

       规范化坐标系:此坐标系也叫归一化,是Opengl ES的空间计算坐标系,取值范围到-1~1之间。

       屏幕坐标系:此坐标系就是我们显示屏幕的实际坐标系,其通常是左上角为原点,X轴向右,Y轴向下,在归一化坐标下的物体最终都会通过视口变换转为屏幕坐标,然后显示在屏幕上。

      

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【数据库选择】选择合适的数据库(MongoDB、PostgreSQL、Couchbase)以支持复杂 JSON 数据的增删改查
  • spring springboot 日志框架
  • 共享wifi公司哪家正规合法?具体流程全公开!
  • B+树(B+TREE)索引
  • 报表做着太费劲?为你介绍四款好用的免费报表工具
  • 安全热点问题
  • vue/配置axios(前后端数据连通/api接口的调用)
  • Java_Day05学习
  • SpringBoot技术栈的网上超市开发实践
  • SpringBoot 结合 SpringSecurity 对于用户 登陆 和 登出 的设计思考
  • GPIO与MIO控制LED——ZYNQ学习笔记2
  • 计算机视觉方面的一些模块
  • 可靠传输是什么?是基于UDP实现的吗
  • 根据[国家统计局最新行政区规划]数据库代码
  • 【Redis】Redis 缓存设计:抗住百万并发量的最佳实践
  • 《剑指offer》分解让复杂问题更简单
  • canvas 五子棋游戏
  • crontab执行失败的多种原因
  • DataBase in Android
  • eclipse的离线汉化
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Fastjson的基本使用方法大全
  • Javascript弹出层-初探
  • Java教程_软件开发基础
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • zookeeper系列(七)实战分布式命名服务
  • 阿里云Kubernetes容器服务上体验Knative
  • 对超线程几个不同角度的解释
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 普通函数和构造函数的区别
  • 数组大概知多少
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • Java性能优化之JVM GC(垃圾回收机制)
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $.ajax,axios,fetch三种ajax请求的区别
  • (06)金属布线——为半导体注入生命的连接
  • (152)时序收敛--->(02)时序收敛二
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (四)进入MySQL 【事务】
  • (算法)N皇后问题
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)一些感悟
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .net6+aspose.words导出word并转pdf
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net中生成excel后调整宽度
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /etc/fstab 只读无法修改的解决办法
  • @EnableConfigurationProperties注解使用
  • @synthesize和@dynamic分别有什么作用?