解析顶点着色器和片元着色器

2023-11-14

管线

也称渲染管线,因为 OpenGL ES在渲染处理过程中会顺序执行一系列操作,这一系列相关的处理阶段就被称为OpenGL ES 渲染管线。OpenGL ES 渲染过程就如流水线作业一样,这样的实现极大地提高了渲染的效率。如图就是 OpenGL ES 的管线图,学习OpenGL ES 就是学习这张图中的每一个部分。

 

图中阴影部分的 Vertex Shader(顶点着色器)Fragment Shader(片元着色器)可编程管线 。可编程管线就是说这个操作可以动态编程而不必写死在代码中。可动态编程实现这一功能一般都是脚本提供的,在OpenGL ES 中也一样,编写这样脚本的能力是由着色语言GLSL提供的。那可编程管线有什么好处呢?方便我们动态修改渲染过程,而无需重写编译代码,当然也和很多脚本语言一样,调试起来不太方便。

Vertex Shader(顶点着色器)

 

顶点着色器

  • 如图,顶点着色器分为输入和输出两部分,负责的功能是把输入的数据进行矩阵变换位置,计算光照公式生成逐顶点颜⾊,⽣成/变换纹理坐标.并且把位置和纹理坐标这样的参数发送到片段着色器.

  • 输入参数介绍:
    1.着色器程序(Shader Program,图中没有画出):由 main 申明的一段程序源码或可执行文件,描述在顶点上执行的操作:如坐标变换、计算光照公式产生每个顶点颜色、计算纹理坐标。

    2.属性(Attribute):由 vertext array 提供的顶点数据,如空间位置,法向量,纹理坐标以及顶点颜色,属性可以理解为针对每一个顶点的输入数据。属性只在顶点着色器中才有,片元着色器中没有属性。

    3.统一值(Uniforms): Uniforms保存由应用程序传递给着色器的只读常量数据。在顶点着色器中,这些数据通常是变换矩阵,光照参数,颜色等。由 uniform 修饰符修饰的变量属于全局变量,该全局性对顶点着色器与片元着色器均可见,也就是说,这两个着色器如果被连接到同一个应用程序中,它们共享同一份 uniform 全局变量集。因此如果在这两个着色器中都声明了同名的 uniform 变量,要保证这对同名变量完全相同:同名+同类型,因为它们实际是同一个变量。

    4.采样器(Samplers): 一种特殊的 uniform,用于呈现纹理。sampler 可用于顶点着色器和片元着色器。

  • 输出参数介绍:
    1.可变变量(Varying):varying 变量用于存储顶点着色器的输出数据,也存储片元着色器的输入数据。varying 变量会在光栅化处理阶段被线性插值。顶点着色器如果声明了 varying 变量,它必须被传递到片元着色器中才能进一步传递到下一阶段,因此顶点着色器中声明的 varying 变量都应在片元着色器中重新声明为同名同类型的 varying 变量。

    1. gl_Position:在顶点着色器阶段至少应输出位置信息-即内建变量

    2. gl_FrontFacing:为back-face culling stage阶段生成的变量,无论精选是否被禁用,该变量都会生成。

    3. gl_PointSize:点大小。

  • 示例代码

  • // 位置属性
    attribute vec4 position;
    // 坐标属性
    attribute vec2 textCoordinate; 
    // 旋转角度
    uniform mat4 rotateMatrix; 
    // 输出变量
    varying lowp vec2 varyTextCoord; 
    
    // 着色器程序(Shader Program)
    void main()
    {
      // 赋值坐标属性到输出变量
      varyTextCoord = textCoordinate;
      // 位置乘以旋转矩阵
      vec4 vPos = position;
      vPos = vPos * rotateMatrix; 
      // 赋值位置到内建变量gl_Position上,作为输出信息(必须)
      gl_Position = vPos;
    }

    Fragment Shader(片元着色器)

 

片元着色器

 

片元着色器的作用是处理由光栅化阶段生成的每个片元,最终计算出每个像素的最终颜色。归根结底,实际上就是数据的集合。这个数据集合包含每一个像素的各个颜色分量和像素透明度的值。

  • 输入参数介绍:
    1.着色器程序(Shader program): 由 main 申明的一段程序源码,描述在片元上执行的操作。

    2.可变变量(Varyings): 顶点着色器阶段输出的 varying 变量在光栅化阶段被线性插值计算之后输出到片元着色器中作为它的输入,即上图中的 gl_FragCoord,gl_FrontFacing 和 gl_PointCoord。

    3.统一值(Uniforms): 用于片元着色器的常量,如雾化参数,纹理参数等。

    4.采样器(Samples): 一种特殊的 uniform,用于呈现纹理。

  • 输出参数介绍:
    1.gl_FragColor: 在顶点着色器阶段只有唯一的 varying 输出变量-即内建变量gl_FragColor。

  • 示例代码

  • // 纹理坐标
    varying lowp vec2 varyTextCoord;
    // 采样器
    uniform sampler2D colorMp;
    
    // 着色器程序(Shader program)
    void main()
    {
      // 读取纹素(纹理的颜色)放到输出变量gl_FragColor上
      gl_FragColor = texture2D(colorMap,varyTextCoord);
    }

     



 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析顶点着色器和片元着色器 的相关文章

  • 如何从横滚、俯仰和偏航获取相机向上矢量?

    我需要从滚动角 俯仰角和偏航角 以度为单位 获取相机的向上矢量 以获得正确的外观 我已经尝试了几个小时不同的事情 但没有运气 这里的任何帮助将不胜感激 横滚 俯仰和偏航定义 3 轴旋转 从这些角度 您可以构建一个 3x3 变换矩阵来表达该旋
  • 在 Ubuntu 中与未编译的着色器链接

    我需要加载 glsl 来绘制一些东西 我的环境是Ubuntu 13 04 因此它不存在GLuint InitShader GLuint GLuint 这是我的对象创建 预链接步骤和链接的配置 不幸的是 它仍然出现错误 该错误与未编译的着色器
  • OpenGL:顶点越多,性能越慢

    我正在开发一个程序的一部分 其中给定 xyz 坐标集合 制作 3D 模型 我已经完成了这张图片所需的所有功能 即平移 旋转 缩放 但是给出的 xyz 坐标越多 程序运行速度就越慢 我的程序在处理 29 000 个坐标时运行得非常流畅 但当我
  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • GLSL 中统一浮点行为和常量浮点行为的不同

    我正在尝试在 GLSL 中实现模拟双精度 并且观察到一种奇怪的行为差异 导致 GLSL 中出现细微的浮点错误 考虑以下片段着色器 写入 4 浮点纹理以打印输出 layout location 0 out vec4 Output unifor
  • OpenGL中背景对象绘制在前景对象前面?

    为了测试目的 我们假设我画了 2 个茶壶glutSolidTeapot 像这样 glColor3f 1 0f 0 0f 0 0f Red teapot glutWireTeapot 1 0f glColor3f 0 0f 1 0f 0 0f
  • 如何计算正切和副法线?

    谈谈OpenGL着色语言 GLSL 中的凹凸贴图 镜面高光之类的东西 I have 顶点数组 例如 0 2 0 5 0 1 0 2 0 4 0 5 法线数组 例如 0 0 0 0 1 0 0 0 1 0 0 0 世界空间中点光源的位置 例如
  • GL_COLOR_ATTACHMENT 有什么作用?

    我现在正在学习帧缓冲区 但我只是不明白颜色附件的作用 我了解帧缓冲区 第二个参数的意义是什么 glFramebufferTexture2D GL FRAMEBUFFER GL COLOR ATTACHMENT0 GL TEXTURE 2D
  • OpenGL:始终相同的颜色

    我正在 Windows 上编写一个程序 使用c opengl 2 1 and SDL我在顶点颜色方面遇到了一些问题 我在用着glColor3f设置每个顶点集的颜色 但它似乎不起作用 无论我选择什么颜色 我都会将每个顶点绘制为红色 我检查了传
  • 延迟阴影映射 GLSL

    我目前正在实施延迟渲染管道 但我仍坚持使用阴影贴图 我已经成功地将其实施到前向管道中 我所做的步骤是 获取灯光视图中的位置 转换为光视图剪辑空间 使用 0 5 0 5 获取阴影纹理坐标 检查深度 编辑 使用新结果图像更新代码 float c
  • GLSL聚光投影体积

    在我的开源项目中 我使用 Qt3D 设置了延迟渲染管道 到目前为止一切顺利 但现在我想通过添加聚光灯投影量来继续前进 例如场景中好像有烟雾 像这样 我正在使用的片段着色器位于问题的末尾 我读过 对于每个片段 我应该从光位置进行光线行进并找到
  • 渲染到一个颜色通道而不影响其他通道

    使用 OpenGL 任何版本 如何通过一次仅影响一个颜色通道来渲染到帧缓冲区对象 例如 我的帧缓冲区对象具有 GL BGRA 布局 现在我想执行一些渲染命令 这些命令应该只改变红色通道 因此 如果片段用颜色 204 0 0 0 渲染并且像素
  • OpenGL纹理渲染与原始不匹配

    我正在尝试使用 OpenGL 渲染纹理 我用作测试的纹理是白色背景上的一堆黑色矩形 如下所示 然而 在渲染时 纹理似乎被复制并叠加在其自身之上多次 我使用以下方法设置场景 std string vertexSource ShaderLoad
  • OpenGL 缓冲区、glFlush 和 glutSwapBuffers()

    使用之间有什么区别吗 glutInitDisplayMode GLUT SINGLE GLUT RGB with glFlush and glutInitDisplayMode GLUT DOUBLE GLUT RGB with glutS
  • 如何创建自己的 openGL 上下文并将其绑定到 GLCanvas?

    所以当我开始掌握java时 paint Graphics g 我继续创建自己的渲染方法 但我必须了解缓冲区策略以及如何 获取 图形 所以现在我在学习openGL 我必须掌握方法 Override public void display GL
  • SDL 程序中颜色关闭

    我目前正在开发一个非常简单的游戏 使用纯 C 方法和 SDL 及其官方额外库 如 SDL image 和 OpenGL 现在 虽然我遇到了一些障碍 但我不知道为什么要这样做 绘制时颜色全部关闭 我目前在 Mac 上运行该程序 但如果我没记错
  • 如何使用OpenGL数组纹理?

    我正在尝试在OpenGL中使用精灵表 通过数组纹理实现它这就是我加载纹理的方式 QImage image image load C QtProjects project images spritesheet png png const un
  • GLSL memoryBarrierShared() 有用吗?

    我想知道 memoryBarrierShared 的用处 事实上 当我查找屏障功能的文档时 我读到 对于计算着色器中任何给定的静态屏障实例 单个工作组内的所有调用都必须进入该实例 然后才能允许任何调用继续超出该实例 这确保了在给定的屏障静态
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u

随机推荐

  • C#多语言切换

    第一步建立工程 第二步 拖拽控件 第三步选择窗体 第四步修改窗体localizable 属性为 true 如下图 第五步 修改language 属性 如下图 第六步 修改各个控件的字符名称 会出现下面的资源文件 注意之前是没有资源文件的 第
  • input输入框在苹果手机上边框有阴影

    问题描述 h5移动端页面 input输入框在苹果手机上显示有兼容性问题 边框上方出现阴影 通过统一设置border 也不能消除 如下图所示 解决方案 添加如下样式即可解决 input outline none webkit appearan
  • 计算机网络之(7):TCP流量控制、拥塞控制 + 网络层

    文章目录 TCP 流量控制 Go back N Selective Repeat Go back N v s Selective Repeat 流量控制中的问题 方法 1 接收方主动 方法2 发送方主动 TCP 拥塞控制 拥塞控制和流量控制
  • 《Android网络请求篇》MyHttpUtils一个非常好用的异步网络请求框架

    Android网络请求篇 MyHttpUtils一个非常好用的异步网络请求框架 最新版介绍看这里 gt 这是一个使用策略模式和构建模式设计的网络请求框架 去看看吧 倾力之作 android轻量级网络请求框架MyHttputils2 1 6
  • 编程三角形面积公式_【面积系列专题】三角形面积公式之水平宽铅垂高

    点击上方蓝字关注我们 面积系列专题 三角形面积公式之水平宽铅垂高 TSQ中学数学微信 TSQmaths 一 本文说明 三角形的面积公式计算较多 而在平面直角坐标系中的三边都不与坐标轴平行的三角形面积一般会采用割补形来求解 但有时采用水平宽铅
  • MATLAB泰勒展开

    MATLAB函数 taylor 题目 对y exp x 进行4阶泰勒展开 并验证 函数调用格式 taylor fcn x x0 Order 6 对函数fcn在点x0处 进行6阶泰勒展开 MATLAB代码 clc clear all clos
  • 三菱plc指令详细解析

    一 顺控指令 1 触点指令 00 LD 逻辑操作开始 01 LDI 逻辑非操作开始 02 AND 逻辑乘 03 ANI 逻辑乘非 04 OR 逻辑加 05 ORI 逻辑加非 2 连接指令 06 ANB AND逻辑块与 07 ORB OR逻辑
  • 一张图正则表达式

    一张图正则表达式
  • VW ware安装Ubuntu虚拟机及环境配置

    实验前准备 VMware 官网下载 Ubuntu XXX iso 文件过大阿里云镜像下载 熟悉那种Linux内核就下载那种 这个不会影响集群的搭建 https pan baidu com s 1tFvCA4PmNC2tZN7Yp2BkZQ
  • vue组件销毁重置详解

    v if方式 key方式 destroy v if方式
  • 在Windows下使用MingGW[GCC+OpenMP]和CodeBlocks开发多核应用基本环境配置

    转自 http blog csdn net danny xcz article details 3332251 从06年开始 多核开发已经越来越多的成为所有应用设计必须考虑的问题 我使用MingGW CodeBlocks来测试OpenMP多
  • 浪涌保护电路设计

    浪涌保护电路设计 一 什么是浪涌 二 浪涌的产生 2 1浪涌的产生 2 2浪涌的传输介质 2 3IEC定义的浪涌标准 三 浪涌保护电路 一 什么是浪涌 浪涌是一种瞬变干扰 在某种特定条件下由电网造成的瞬间电压超出额定电压的范围 通常这个瞬变
  • Docker(三) 创建Docker镜像

    一 在Docker中拉取最基本的Ubuntu系统镜像 搜索Ubuntu镜像 Explore Docker s Container Image Repository Docker Hub 下载镜像 docker pull ubuntu 22
  • PS解决“无法使用快速选择,因为没有足够内存(RAM)”

    PS解决 无法使用快速选择 因为没有足够内存 RAM win R打开命令行 在输入框输入 regedit 点击确定 找到目录HKEY CURRENT USER Software Adobe Photoshop 点击对应版本Photoshop
  • 万维网服务器协议提供web,万维网的HTTP和FTP协议.doc

    万维网的HTTP和FTP协议 doc 万维网的HTTP和FTP协议 摘 要 20世纪40年代以来 人们就梦想能拥有一个世界性的信息库 在这个信息库中 信息不仅能被全球的人们存取 而且能轻松地链接到其他地方的信息 使用户可以方便快捷地获得重要
  • PyQt5 自动计算阵列矩阵

    说实话 其实我当时听懂了 真正写代码的时候越写越懵逼 所以还是记录下来吧 另外有兴趣了解的同学还是看老师的视频解说比较好 想学PyQT的同学强烈建议看这个老师的视频 由浅入深 从PyQT最基本的开始教学 非常棒 bilibili https
  • 第五章:平衡二叉树

    系列文章目录 文章目录 系列文章目录 前言 1 平衡二叉树的介绍 1 1 AVL树的概念 1 2 AVL树的性质 2 平衡二叉树的插入 2 1 平衡二叉树的插入步骤 2 2 平衡二叉树的旋转 2 2 1 左单旋 2 2 2 右单旋 2 2
  • /etc/vsftpd.conf详解

    匿名权限控制 anonymous enable YES 是否启用匿名用户no anon password YES 匿名用户login时不询问口令下面这四个主要语句控制这文件和文件夹的上传 下载 创建 删除和重命名 anon upload e
  • 4399笔试题

    1 冒泡排序的时间复杂度 2 有无序数字5000个 用什么算法能快速的找出最大的前50个数字 3 比如有10个台阶 一直青蛙一次只能跳一个或者二个台阶 问青蛙从第一个台阶开始跳最多有几种跳法 4 从区间 2 2 中随意取出二个实数 它们的和
  • 解析顶点着色器和片元着色器

    管线 也称渲染管线 因为 OpenGL ES在渲染处理过程中会顺序执行一系列操作 这一系列相关的处理阶段就被称为OpenGL ES 渲染管线 OpenGL ES 渲染过程就如流水线作业一样 这样的实现极大地提高了渲染的效率 如图就是 Ope