[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轴向下,在归一化坐标下的物体最终都会通过视口变换转为屏幕坐标,然后显示在屏幕上。

      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/884295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云 安 全 (Cloud Security)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

解决setMouseTracking(true)后还是无法触发mouseMoveEvent的问题

如图,在给整体界面设置鼠标追踪且给ui界面的子控件也设置了鼠标追踪后,运行后的界面仍然有些地方移动鼠标无法触发 mouseMoveEvent函数,这就令人头痛。。。 我的解决方法是:重载event函数: 完美解决。。。

【线程】线程的同步---生产消费者模型

本文重点:理解条件变量和生产者消费者模型 同步是在保证数据安全的情况下,让我们的线程访问资源具有一定的顺序性 条件变量cond 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了,…

Vue中集中常见的布局方式

布局叠加 完整代码最外层的Container设置为relative&#xff0c;内部的几个box设置为absolute <template><div class"container"><div class"box box1">Box 1</div><div class"box box2">Box 2</div><d…

LeetCode讲解篇之53. 最大子数组和

文章目录 题目描述题解思路题解代码 题目描述 题解思路 该问题我们可以转换为求以i为最后一个元素的0 ~ i范围内的最大子数组和&#xff0c;然后其中的所有的最大子数组和的最大值就是我们要返回的答案 题解代码 func maxSubArray(nums []int) int {ans : nums[0]for i : 1;…

CLIP模型微调简明指南

CLIP 等多模态模型通过将图像等复杂对象与易于理解、生成和解析的文本描述联系起来&#xff0c;开辟了新的 AI 用例。但是&#xff0c;像 CLIP 这样的现成模型可能无法代表特定领域中常见的数据&#xff0c;在这种情况下&#xff0c;可能需要进行微调以使模型适应该领域。 这篇…

8.使用 VSCode 过程中的英语积累 - Help 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

【Java】虚拟机(JVM)内存模型全解析

目录 一、运行时数据区域划分 版本的差异&#xff1a; 二、程序计数器 程序计数器主要作用 三、Java虚拟机 1. 虚拟机运行原理 2. 活动栈被弹出的方式 3. 虚拟机栈可能产生的错误 4. 虚拟机栈的大小 四、本地方法栈 五、堆 1. 堆区的组成&#xff1a;新生代老生代 …

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-22

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-22 引言: 全球最热销的国产游戏-《黑神话: 悟空》不仅给世界各地玩家们带来愉悦&#xff0c;而且对计算机人工智能研究也带来新的思考。在本期的论文速读中&#xff0c;我们带来一篇关于视觉语言模型&#xff0…

深度解析与解决方案:U盘有盘符但无法打开的困境

引言&#xff1a;U盘困境初现 在日常工作与生活中&#xff0c;U盘作为便携式存储设备&#xff0c;扮演着数据传输与备份的重要角色。然而&#xff0c;不少用户会遇到这样一个棘手问题&#xff1a;U盘在插入电脑后能够正常显示盘符&#xff0c;但尝试打开时却遭遇拒绝访问或提示…

运维,36岁,正在经历中年危机,零基础入门到精通,收藏这一篇就够了

我今年36岁&#xff0c;运维经理&#xff0c;985硕士毕业&#xff0c;目前正在经历中年危机&#xff0c;真的很焦虑&#xff0c;对未来充满担忧。不知道这样的日子还会持续多久&#xff0c;突然很想把这些年的经历记录下来&#xff0c;那就从今天开始吧。 先说一下我的中年危机…

华为LTC流程架构分享

文末附LTC流程管理PPT下载链接~ 前面笔者分享了华为LTC流程相关PPT&#xff0c;应读者需求&#xff0c;今天从架构角度进行再次与读者共同学习下LTC流程架构。 华为LTC流程架构是一个全面且集成的业务流程体系&#xff0c;从线索发现开始&#xff0c;直至收回现金&#xff0c…

浅谈Agent智能体

Agent智能体无疑是24年最为火爆的话题之一&#xff0c;那么什么是Agent智能体&#xff1f;有什么作用&#xff1f;为什么需要Agent智能体&#xff1f; 用下边一张图简单说明一下 每日进步一点点

气膜健身馆:提升运动体验与健康的理想选择—轻空间

近年来&#xff0c;气膜健身馆作为一种新兴的运动场所&#xff0c;正逐渐受到越来越多健身爱好者的青睐。这种独特的建筑形式不仅提供了良好的运动环境&#xff0c;更在健康和运动表现上展现出诸多优势。 优越的空气质量 气膜结构的核心技术通过内外气压差形成稳定的气膜&#…

C++ 9.27

作业&#xff1a; 将之前实现的顺序表、栈、队列都更改成模板类 Stack #include <iostream> using namespace std; template <typename T> class Stack { private: T* arr; // 存储栈元素的数组 int top; // 栈顶索引 int capacity; // 栈的…

【高频SQL基础50题】6-10

目录 1.上级经理已离职的公司员工 2.修复表中的名字 3. 寻找用户推荐人 4.产品销售分析 I 5.平均售价 1.上级经理已离职的公司员工 子查询。 先根据薪水大小查询&#xff0c;再根据manager_id查询该员工是否存在&#xff0c;最后做排序。 # Write your MySQL query st…

Proteus-7.8sp2安装

目录 一、D盘新建空文件夹&#xff0c;名为Proteus。 二、安装软件 三、破解 四、汉化 五、卸载软件 一、D盘新建空文件夹&#xff0c;名为Proteus。 二、安装软件 1.双击P7.8sp2.exe 2.next 三、破解 1.双击 Proteus Pro 7.8 SP2破解 1.0.exe 2. 升级 打开软件&#x…

网站建设中,营销型网站与普通网站有什么区别

营销型网站与普通网站在建站目的、交互设计以及结构优化等方面存在区别。以下是具体分析&#xff1a; 建站目的 营销型网站&#xff1a;以销售和转化为主要目标&#xff0c;通过专业的市场分析和策划来吸引潜在客户&#xff0c;并促使其采取购买行动。普通网站&#xff1a;通常…

8610 顺序查找

### 思路 1. **创建顺序表**&#xff1a;从输入中读取元素个数和元素值&#xff0c;构造顺序表。 2. **顺序查找**&#xff1a;在顺序表中依次查找关键字&#xff0c;找到则返回位置&#xff0c;否则返回0。 ### 伪代码 1. **创建顺序表**&#xff1a; - 动态分配存储空间。…

C. Cards Partition 【Codeforces Round 975 (Div. 2)】

C. Cards Partition 思路&#xff1a; 可以O(n)直接判断&#xff0c;牌组从大到小依次遍历即可。 不要用二分答案&#xff0c;因为答案不一定是单调的 代码: #include <bits/stdc.h> #define endl \n #define int long long #define pb push_back #define pii pair<…