OpenGL ES详解——多个纹理实现混叠显示

目录

一、获取图片纹理数据

二、着色器编写

1. 顶点着色器

2. 片元着色器

三、绑定和绘制纹理

1. 绑定纹理

2. 绘制纹理

四、源码下载


一、获取图片纹理数据

获取图片纹理数据代码如下:

//获取图片1纹理数据
mTextureId = loadTexture(mContext, R.mipmap.scenery)
//获取图片2纹理数据
mTextureMeiNvId = loadTexture(mContext, R.mipmap.meinv)

fun loadTexture(context: Context, resourceId: Int): Int {
    var bitmap = generateBitmap(context, resourceId)
    if (bitmap == null) {
        Log.d(TAG, "resourceId could not be decoded.")
        return 0
    }
    return getImgTexture(bitmap)
}

fun getImgTexture(bitmap: Bitmap): Int {
    val textureObjectIds = IntArray(1)
    glGenTextures(1, textureObjectIds, 0)
    if (textureObjectIds[0] == 0) {
        glDeleteTextures(1, textureObjectIds, 0)
        return 0
    }
    glBindTexture(GL_TEXTURE_2D, textureObjectIds[0])
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    texImage2D(GL_TEXTURE_2D, 0, bitmap, 0)
    glGenerateMipmap(GL_TEXTURE_2D)
    bitmap.recycle()
    glBindTexture(GL_TEXTURE_2D, 0)
    return textureObjectIds[0]
}

二、着色器编写

1. 顶点着色器

代码如下:

attribute vec4 a_Position; // 顶点坐标
attribute vec2 a_TextureCoordinates;  //纹理坐标
varying vec2 aCoord;

void main(){
    gl_Position = a_Position;
    aCoord = a_TextureCoordinates;
}

2. 片元着色器

代码如下:

precision mediump float;// 数据精度

varying vec2 aCoord;
uniform sampler2D  u_TextureUnit;
uniform sampler2D  u_TextureUnit1;

void main(){
     gl_FragColor = mix(texture2D(u_TextureUnit, aCoord), texture2D(u_TextureUnit1, aCoord), 0.5);
}

三、绑定和绘制纹理

1. 绑定纹理

     GLES20.glActiveTexture(GL_TEXTURE0)
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureId)
        mTextureShaderProgram!!.setUniforms(
            mTextureShaderProgram!!.getTextureUniformLocation(),
            0
        )
        GLES20.glActiveTexture(GL_TEXTURE1)
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureMeiNvId)
        mTextureShaderProgram!!.setUniforms(
            mTextureShaderProgram!!.getTextureUniform1Location(),
            1
        )

2. 绘制纹理

        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 6)

图一:

图二:

叠加后的效果图如下:

四、源码下载

Android OpenGL ES多个纹理实现混叠显示项目源码

下载地址:

https://download.csdn.net/download/github_27263697/90115686

推荐文章

https://juejin.cn/post/7155040552353234951

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

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

相关文章

C#,在 C# 语言中将 LaTeX 转换为 PNG 或 JPG 图像

在 C 语言中将 LaTeX 转换为 PNG 或 JPG 图像# 12月 28, 2021 2 分钟 法尔汉拉扎 在 C 语言中将 TeX 转换为 PNG JPG 图像# TeX 格式用于处理技术和科学文件。它通常用于交流或发布此类文档。在某些情况下,您可能需要将 TeX 文件渲染为 PNG 或 JPG 等图像…

顺序表(数据结构初阶)

文章目录 顺序表一:线性表1.1概念: 二:顺序表2.1概念与结构:2.2分类:2.2.1静态顺序表2.2.2动态顺序表 2.3动态顺序表的实现声明(初始化)检查空间容量尾插头插尾删头删查找指定位置之前插入数据指…

活动报名:Voice Agent 开发者分享会丨RTE Meetup

引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面,一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期!12 月 15 日(周日)上午&…

STM32 CubeMx HAL库 独立看门狗IWDG配置使用

看门狗这里我就不多介绍了,能搜到这篇文章说明你了解 总之就是一个单片机重启程序,设定好超时时间,在超时时间内没有喂狗,单片机就会复位 主要应用在单片机异常重启方面,比如程序跑飞(注意程序跑飞时你就…

pdb调试器详解

文章目录 1. 启动 pdb 调试器1.1 在代码中插入断点1.2 使用命令行直接调试脚本 2. 常用调试命令2.1 基本命令2.2 高级命令2.3 断点操作 3. 调试过程示例4. 调试技巧4.1 条件断点4.2 自动启用调试4.2.1 运行程序时指定 -m pdb4.2.2在代码中启用 pdb.post_mortem4.2.3 使用 sys.e…

(转,自阅,侵删)【LaTeX学习笔记】一文入门LaTeX(超详细)

【LaTeX学习笔记】一文入门LaTeX(超详细)-阿里云开发者社区LaTeX中主要分为导言区和正文区导言区通常用于定义文档的格式、语言等(全局设置)。常用的LaTex命令主要有\documentclass,\usepackage等。下面分别对几个常用…

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …

MFC学习笔记专栏开篇语

MFC,是一个英文简写,全称为 Microsoft Foundation Class Library,中文翻译为微软基础类库。它是微软开发的一套C类库,是面向对象的函数库。 微软开发它,是为了给程序员提供方便,减少程序员的工作量。如果没…

GPTcelltype——scRNA-seq注释

#安装包 install.packages("openai") remotes::install_github("Winnie09/GPTCelltype") #填写API Sys.setenv(OPENAI_API_KEY your_openai_API_key) #加载包 #Load packages library(GPTCelltype) library(openai) #准备文件 #Assume you have already r…

WebRTC服务质量(03)- RTCP协议

一、前言: RTCP(RTP Control Protocol)是一种控制协议,与RTP(Real-time Transport Protocol)一起用于实时通信中的控制和反馈。RTCP负责监控和调节实时媒体流。通过不断交换RTCP信息,WebRTC应用…

用户认证系统登录界面

下面是使用HTML和JavaScript实现的一个中文版登录界面&#xff0c;包含登录、注册和修改密码功能。注册成功后会显示提示信息&#xff0c;在登录成功后进入一个大大的欢迎页面。 1.代码展示 <!DOCTYPE html> <html lang"zh-CN"> <head><meta …

uniapp中vuex(全局共享)的应用

一、Vuex概述 1.1 官方解释 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 它采用集中式存储管理 应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化 - Vuex 也集成到 Vue 的官方调试工具 devtools extension&#xff0c;提供了诸…

不能通过 ip 直接访问 共享盘 解决方法

from base_config.config import OpenSMB, SMB import os, time, calendar, requests, decimal, platform, fs.smbfsinfo_dict SMB.EPDI_dict info_dict[host] (FS03,10.6.12.182) info_dict[direct_tcp] True# smb OpenSMB(info_dict)print(ok)# 根据 ip 查询电脑名 impor…

JavaEE初阶——多线程(线程安全-锁)

复习上节内容&#xff08;部分-掌握程度不够的&#xff09; 加锁&#xff0c;解决线程安全问题。 synchronized关键字&#xff0c;对锁对象进行加锁。 锁对象&#xff0c;可以是随便一个Object对象&#xff08;或者其子类的对象&#xff09;&#xff0c;需要关注的是&#xff…

day2 数据结构 结构体的应用

思维导图 小练习&#xff1a; 定义一个数组&#xff0c;用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息&#xff0c;删除后调用显示学…

五、网络层:控制平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

目录 一、导论 二、路由选择算法 2.1 路由&#xff08;route&#xff09;的概念 2.2 网络的图抽象 2.2.1 边和路由的代价 2.2.2 最优化原则 2.3 路由的原则 2.4 路由选择算法的分类 2.5 link state 算法 2.5.1 LS路由工作过程 2.5.2 链路状态路由选择&#xff08;lin…

内网是如何访问到互联网(H3C源NAT)

H3C设备NAPT配置 直接打开29篇的拓扑&#xff0c;之前都配置好了 「模拟器、工具合集」复制整段内容 链接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil 现在是出口路由器可以直接访问61.128.1.1&#xff0c;下面的终端访问不了&#xff0c;需要做NAPT源…

生产者-消费者模型

目录 生产者-消费者模型介绍 生产者-消费者模型优点 生产者-消费者之间的关系 基于阻塞队列实现生产者-消费者模型 基于环形队列实现生产者-消费者模型 生产者-消费者模型介绍 ● 计算机中的生产者和消费者本质都是线程/进程 ● 生产者和消费者不直接通讯&#xff0c;而是…

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器&#xff08; IIS &#xff09; 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器&#xff08; Docker 部署使用&#xff09; …

Linux系统中进程的概念 -- 冯诺依曼体系结构,操作系统,进程概念,查看进程,进程状态,僵尸进程,孤儿进程,进程优先级,进程切换,进程调度

目录 1. 冯诺依曼体系结构 2. 操作系统(Operator System) 2.1 操作系统的概念 2.2 设计操作系统(OS)的目的 2.3 系统调用和库函数概念 3. 进程 3.1 进程的基本概念与基本操作 3.1.1 进程的基本概念 3.1.2 PCB -- 描述进程 3.1.3 task_ struct 3.1.4 查看进程 3.1.5…