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

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的公历与农历日期转换及节日查询小程序升级版 调整的功能 上一个小程序只是能计算当年的农历节日的间隔时间,那么这次修改一下,任意年份的农历节日都可以,并且能输出农历节日对应的阳历日期&#xff0…...

c语言中void关键字的含义和用法

在 C 语言中&#xff0c;void 是一个特殊的关键字&#xff0c;主要有以下几个用途&#xff1a; 1. 表示函数没有返回值 当一个函数不需要返回任何值时&#xff0c;可以将其返回类型声明为 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刷机时公对公插头掉了&#xff0c;刷机失败&#xff0c;再次刷机&#xff0c;一直提示无法识别的USB设备&#xff0c;此时LED一直不亮&#xff0c;就像是刷成砖了一样&#xff0c;查了好多文章最后发现正面还有一个地方需要短接。 背面的短接点 【免费】玩客云刷机包s805-…...

影刀进阶指令 | Kimi (对标ChatGPT)

文章目录 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09;一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 确定问题2\. 填写问题并发送3\. 检测答案是否出完 四. 运维 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09; 简单讲讲RPA调用kimi实现…...

前端项目 node_modules依赖报错解决记录

1.首先尝试解决思路 npm报错就切换yarn &#xff0c; yarn报错就先切换npm删除 node_modules 跟 package-lock.json文件重新下载依 2. 报错信息&#xff1a; Module build failed: Error: Missing binding D:\vue-element-admin\node_modules\node-sass\vendor\win32-x64-8…...

数据科学团队管理

定位&#xff1a; 有核心竞争力的工业算法部门与PM、RD等深度合作 业务方向&#xff1a;(不同产品线&#xff09; 工业预测性维护与数据挖掘视觉检测、OCR 工作内容 项目需求与交付内部框架(frameworks \packages)应用demo专利、竞赛、论文 日常管理 项目管理数据管理(原…...

一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类

机器学习实战通常是将理论与实践结合&#xff0c;通过实际的项目或案例&#xff0c;帮助你理解并应用各种机器学习算法。下面是一个简单的机器学习实战例程&#xff0c;使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集&#xff08;Iris Dataset&#xff09;**的…...

攻防世界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延后初始化

目录 实例化网络 小结 到目前为止&#xff0c;我们忽略了建立网络时需要做的以下这些事情&#xff1a; 我们定义了网络架构&#xff0c;但没有指定输入维度。 我们添加层时没有指定前一层的输出维度。 我们在初始化参数时&#xff0c;甚至没有足够的信息来确定模型应该包含…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...