Android OpenGl(二) Shader
一、Shader
1、什么是Shader,为什么要使用Shder
(1)shader运行在gpu上的小程序
(2)以前使用固定管线,但缺点是灵活度不够,无法满足复杂需求,为了解决固定管线的缺点,出现了可编程管线,可编程管线允许开发者自定义渲染过程,提高了灵活度。
(3)Shader是可编程管线的一部分,用于对各个阶段的自定义,shader可充分利用gpu并行计算能力,提高渲染速度,Shader可通过编程对gpu灵活控制。
2、两种Shader
- Vertex Shader–顶点Shader,用于处理3D几何图形的顶点。
- Fragment Shader–片元Shader,用于处理像素颜色和纹理
3、Shader的输入与输出
- 接收顶点数据,输出构造好的三角形
- 接收片元数据,为每个像素设置不同的颜色
4、最基本的图形–三角形
- 图形学中,三角形是最基本的图形
- 所有复杂图形都是由三角形组成的
- 三角形是由顶点和片元组成的
二、标准坐标系与屏幕坐标系
1、标准设备坐标系
- 屏幕中心是(0,0)
- x,y的范围在[-1,1]之间
- 是shader的输出坐标系

2、屏幕坐标系
- 屏幕左上角是(0,0)
- 屏幕右下角是(width,height)
- 屏幕坐标系的单位是像素
- OpenGL会自动将标准设备坐标转成屏幕坐标系。

3、应用在什么地方?
- 标准设备坐标系是Shader的输出
- 屏幕坐标系用于模型的最终显示
4、标准设备坐标系到屏幕坐标系
- 先将标准坐标系中的顶点+1
- 每个顶点成衣屏幕的宽/高
- 也可以通过一个变换矩阵直接完成两步操作。
三、着色器Shader作用及语法
1、GLSL(Graphics Language Shader Language )基本语法
- 语法类似于C语言
- 支持向量、矩阵等数学运算
"attribute vec4 vPosition;" +"void main() { " +" gl_Position = vPosition;" +"}"
2、数据的传递

(1)一个opengl程序包含了2个shader,一个是vertex shader(用于处理顶点),一个是Fragment shader(用于处理像素)。
(2)可以将opengl shader比喻成一个芯片,每个芯片都有许多引脚,每个引脚都有唯一的id,比如上图引脚id1,引脚1关联是vertex shader 的vPosition,引脚2 关联的是fragment shader的vColor.
(3)当我们将数据传递给引脚1的时候,会自动传递给vPosition,同理fragment shader 会自动传递给vColor。
(4)如何将数据传送给引脚(不同类型数据方法不同):
以vPosition为例:第一步:如图调用opengl提供的api的glGetAttribLocation 来获取到vPosition变量对应的引脚。第二步:拿到引脚ID之后,调用glEnableVertexattribArrray()使得引脚处于开启状态,第三步调用glVertexAttribPointer(ID,…,vertexData),将准备好的vertex data当做输入参数传入api中,最终传给vPosition。这样vertextShader就可以通过vPosition得到数据。
以vColor为例:由于vColor是uniform类型的变量,它只需要2步,首先是glGetUniformLocation来获取引脚位置,第二步通过glUniform4fv()将数据传递给内部vColor。

vertex shader 主要有上图几种变量类型,attribute 类型、uniforms类型、Samplers类型变量(一种uniforms的特殊类型,主要用于纹理绘制),

3、如何创建、编译和使用Shader程序
/*** 创建shader,加载shader程序*/private fun loadShader(type: Int, shaderCode: String): Int {val shader = GLES20.glCreateShader(type)GLES20.glShaderSource(shader, shaderCode)GLES20.glCompileShader(shader)return shader}private fun linkProgram(vertexShader: Int, fragmentShader: Int) {// 创建空的opengl es 程序program = GLES20.glCreateProgram()program?.let {// 将顶点着色器加入程序GLES20.glAttachShader(it, vertexShader)// 将片元着色器加入程序GLES20.glAttachShader(it, fragmentShader)// 链接到着色器程序GLES20.glLinkProgram(it)// 将程序加入到opengl30环境中GLES20.glUseProgram(it)val info = GLES20.glGetProgramInfoLog(it)// 打印链接程序日志Log.e("wdf", "info==" + info)}}
使用
// 创建定点着色程序val vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode)// 创建片元着色程序val fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode)linkProgram(vertexShader, fragmentShader)
相关文章:
Android OpenGl(二) Shader
一、Shader 1、什么是Shader,为什么要使用Shder (1)shader运行在gpu上的小程序 (2)以前使用固定管线,但缺点是灵活度不够,无法满足复杂需求,为了解决固定管线的缺点,出…...
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1) 架构 架构图 本设计方案的目标是在一台阿里云ECS服务器上搭建一个轻量级的Kubernetes服务k3s节点,并基于Argo搭建一套完整的DevOps CI/CD服务平台,包括Argo CD…...
【已解决】“Content-Security-Policy”头缺失
1、作用 简称CSP,意为内容安全策略,通过设置约束指定可信的内容来源,降低异源文件攻击,例如:js/css/image等 2、相关设置值 指令名 demo 说明 default-src self cdn.example.com 默认策略,可以应用于js文件/图片…...
win系统B站播放8k视频启用HEVC编码
下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads,根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent 在youtube中会导致视频无法播放,我选择直接屏蔽了 B站设置...
快速理解24种设计模式
简单工厂模式 建立产品接口类,规定好要实现方法。 建立工厂类,根据传入的参数,实例化所需的类,实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例,并提供一个访问他它的全局…...
为什么深度学习和神经网络要使用 GPU?
为什么深度学习和神经网络要使用 GPU? 本篇文章的目标是帮助初学者了解 CUDA 是什么,以及它如何与 PyTorch 配合使用,更重要的是,我们为何在神经网络编程中使用 GPU。 图形处理单元 (GPU) 要了解 CUDA,我们需要对图…...
Yocto 项目中的交叉编译:原理与实例
Yocto 项目是一个强大的工具集,它专注于为嵌入式系统生成定制的 Linux 发行版。交叉编译在 Yocto 项目中扮演着核心角色,它使得开发者能够在功能强大的宿主机上构建适用于资源受限目标设备的软件系统。这篇文章将从运行原理、实际案例和工具链组成等角度…...
Python入门:7.Pythond的内置容器
引言 Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器&…...
sqlserver镜像设置
本案例是双机热备,只设置主体服务器(主)和镜像服务器(从),不设置见证服务器 设置镜像前先检查是否启用了 主从服务器数据库的 TCP/IP协议 和 RemoteDAC (1)打开SQL Server配置管理器…...
Pandas04
Pandas01 Pandas02 Pandas03 文章目录 内容回顾1 数据的合并和变形1.1 df.append (了解)1.2 pd.concat1.3 merge 连接 类似于SQL的join1.4 join (了解) 2 变形2.1 转置2.2 透视表 3 MatPlotLib数据可视化3.1 MatPlotLib API 套路 &为什么要可视化3.2 单变量可视化3.3 双变量…...
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序(升级版)
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序升级版 调整的功能 上一个小程序只是能计算当年的农历节日的间隔时间,那么这次修改一下,任意年份的农历节日都可以,并且能输出农历节日对应的阳历日期࿰…...
c语言中void关键字的含义和用法
在 C 语言中,void 是一个特殊的关键字,主要有以下几个用途: 1. 表示函数没有返回值 当一个函数不需要返回任何值时,可以将其返回类型声明为 void。 #include <stdio.h>void printMessage() {printf("Hello, World!\…...
安卓音频之dumpsys audio
目录 概述 详述 dumpsys audio 1、音频服务生命周期的事件日志 2、音频焦点事件日志 3、音频流音量信息 4、音量组和设备的相关信息 5、铃声模式 6、音频路由 7、其他状态信息 8、播放活动监控信息 9、录音活动记录 10、AudioDeviceBroker 的记录 11、音效&#…...
玩客云v1.0 刷机时无法识别USB
v1.0刷机时公对公插头掉了,刷机失败,再次刷机,一直提示无法识别的USB设备,此时LED一直不亮,就像是刷成砖了一样,查了好多文章最后发现正面还有一个地方需要短接。 背面的短接点 【免费】玩客云刷机包s805-…...
影刀进阶指令 | Kimi (对标ChatGPT)
文章目录 影刀进阶指令 | Kimi (对标ChatGPT)一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 确定问题2\. 填写问题并发送3\. 检测答案是否出完 四. 运维 影刀进阶指令 | Kimi (对标ChatGPT) 简单讲讲RPA调用kimi实现…...
前端项目 node_modules依赖报错解决记录
1.首先尝试解决思路 npm报错就切换yarn , yarn报错就先切换npm删除 node_modules 跟 package-lock.json文件重新下载依 2. 报错信息: Module build failed: Error: Missing binding D:\vue-element-admin\node_modules\node-sass\vendor\win32-x64-8…...
数据科学团队管理
定位: 有核心竞争力的工业算法部门与PM、RD等深度合作 业务方向:(不同产品线) 工业预测性维护与数据挖掘视觉检测、OCR 工作内容 项目需求与交付内部框架(frameworks \packages)应用demo专利、竞赛、论文 日常管理 项目管理数据管理(原…...
一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类
机器学习实战通常是将理论与实践结合,通过实际的项目或案例,帮助你理解并应用各种机器学习算法。下面是一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的…...
攻防世界web第二题unseping
这是题目 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("ping"))) {cal…...
动手学深度学习-深度学习计算-3延后初始化
目录 实例化网络 小结 到目前为止,我们忽略了建立网络时需要做的以下这些事情: 我们定义了网络架构,但没有指定输入维度。 我们添加层时没有指定前一层的输出维度。 我们在初始化参数时,甚至没有足够的信息来确定模型应该包含…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
