Android OpenGl(二) Shader

news2025/1/4 19:20:47

一、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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode】200、岛屿数量

【LeetCode】200、岛屿数量 文章目录 一、并查集1.1 并查集1.2 多语言解法 二、洪水填充 DFS2.1 洪水填充 DFS 一、并查集 1.1 并查集 // go var sets int var father [90000]intfunc numIslands(grid [][]byte) int {n, m : len(grid), len(grid[0])build(grid, n, m)for i …

[最佳方法] 如何将视频从 Android 发送到 iPhone

概括 将大视频从 Android 发送到 iPhone 或将批量视频从 iPhone 传输到 Android 并不是一件容易的事情。也许您已经尝试了很多关于如何将视频从 Android 发送到 iPhone 15/14 的方法,但都没有效果。但现在,通过本文中的这 6 种强大方法,您可…

MetaRename for Mac,适用于 Mac 的文件批量重命名工具

在处理大量文件时,为每个文件手动重命名既耗时又容易出错。对于摄影师、设计师、开发人员等需要频繁处理和整理文件的专业人士来说,找到一款能够简化这一过程的工具是至关重要的。MetaRename for Mac 就是这样一款旨在提高工作效率的应用程序&#xff0c…

QEMU网络配置简介

本文简单介绍下qemu虚拟机网络的几种配置方式。 通过QEMU的支持,常见的可以实现以下4种网络形式: 基于网桥(bridge)的虚拟网络。基于NAT(Network Addresss Translation)的虚拟网络。QEMU内置的用户模式网…

Elasticsearch向量检索需要的数据集以及768维向量生成

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一:使用fromsize实现分页 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang) Elasticsearch检索之三:官方推荐方案search_after…

MySQL:安装配置(完整教程)

这里写目录标题 一、MySQL 简介二、下载 MySQL三、安装 MySQL四、配置环境变量五、配置 MySQL5.1 初始化 MySQL5.2 启动 MySQL 服务 六、修改 MySQL 密码七、卸载 MySQL八、结语 一、MySQL 简介 MySQL 是一款广泛使用的开源关系型数据库管理系统(RDBMS)…

您的公司需要小型语言模型

当专用模型超越通用模型时 “越大越好”——这个原则在人工智能领域根深蒂固。每个月都有更大的模型诞生,参数越来越多。各家公司甚至为此建设价值100亿美元的AI数据中心。但这是唯一的方向吗? 在NeurIPS 2024大会上,OpenAI联合创始人伊利亚…

如何用CSS3创建圆角矩形并居中显示?

在网页设计中,圆角矩形因其美观和现代感而被广泛使用,居中显示元素也是一个常见的需求。今天,我们将学习如何使用CSS3的border-radius属性来创建圆角矩形,并将其居中显示在页面上。 如果你正在学习CSS,那么这个实例将非…

PhPMyadmin-cms漏洞复现

一.通过日志文件拿Shell 打开靶场连接数据库 来到sql中输入 show global variables like %general%; set global general_logon; //⽇志保存状态开启; set global general_log_file D:/phpstudy/phpstudy_pro/WWW/123.php //修改日志保存位置 show global varia…

本地LLM部署--llama.cpp

–图源GitHub项目主页 概述 llama.cpp是以一个开源项目(GitHub主页:llamma.cpp),也是本地化部署LLM模型的方式之一,除了自身能够作为工具直接运行模型文件,也能够被其他软件或框架进行调用进行集成。 其…

基本算法——分类

目录 创建项目 导入依赖 加载数据 特征选择 学习算法 对新数据分类 评估与预测误差度量 混淆矩阵 通过模型的预测结果生成 ROC 曲线数据 选择分类算法 完整代码 结论 创建项目 首先创建spring boot项目,我这里用的JDK8,springboot2.7.6&…

【系统配置】3种方式修改用户登录显示名|统信|麒麟|方德

原文链接:【系统配置】3种方式修改用户登录显示名|统信|麒麟|方德 Hello,大家好啊!今天给大家带来一篇关于 通过修改 /etc/passwd 文件、usermod 命令,以及图形化界面三种方式修改用户登录名 的…

TTL 传输中过期问题定位

问题: 工作环境中有一个acap的环境,ac的wan口ip是192.168.186.195/24,ac上lan上有vlan205,其ip子接口地址192.168.205.1/24,ac采用非nat模式,而是路由模式,在上级路由器上有192.168.205.0/24指向…

Cocos2dx Lua绑定生成中间文件时参数类型与源码类型不匹配

这两天维护的一个项目&#xff0c;使用arm64-v8a指令集编译时遇到了报错&#xff0c;提示类型不匹配&#xff0c;具体报错的代码【脚本根据C源文件生成的中间文件】如下&#xff1a; const google::protobuf::RepeatedField<unsigned long long>& ret cobj->equi…

连接Milvus

连接到Milvus 验证Milvus服务器正在侦听哪个本地端口。将容器名称替换为您自己的名称。 docker port milvus-standalone 19530/tcp docker port milvus-standalone 2379/tcp docker port milvus-standalone 192.168.1.242:9091/api/v1/health 使用浏览器访问连接地址htt…

走方格(蓝桥杯2020年试题H)

【问题描述】在平面上有一些二维点阵。这些点的编号就像二维数组的编号一样&#xff0c;从上到下依次为第1~n行&#xff0c;从左到右依次为第1~m列&#xff0c;每个点可以用行号和列号表示。 现在有个人站在第1行第1列&#xff0c;他要走到第n行第m列&#xff0c;只能向右或者向…

28. 二叉树遍历

题目描述 根据给定的二叉树结构描述字符串&#xff0c;输出该二叉树按照中序遍历结果字符串。中序遍历顺序为:左子树&#xff0c;根结点&#xff0c;右子树。 输入描述 由大小写字母、左右大括号、逗号组成的字符串: 1、字母代表一个节点值&#xff0c;左右括号内包含该节点的子…

Swift White Hawkstrider

Swift White Hawkstrider 迅捷白色陆行鸟 Swift White Hawkstrider - Item - 魔兽世界怀旧服TBC数据库_WOW2.43数据库_70级《燃烧的远征》数据库 Kaelthas Sunstrider (1) <Lord of the Blood Elves> 凯尔萨斯逐日者. 掉落 [80圣骑士][Alonsus-加丁][诺森德冒险补给品…

LeetCode算法题——有序数组的平方

题目描述 给你一个按非递减顺序排序的整数数组nums&#xff0c;返回每个数字的平方组成的新数组&#xff0c;要求也按非递减顺序排序。 题解 解法一&#xff1a;暴力解法 思路&#xff1a; 该题目可通过暴力解法解决&#xff0c;即利用for循环遍历数组&#xff0c;对数组每…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(四)

文章目录 一、管理员角色功能实现1、添加教师功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、教师管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码下…