需要源码请点赞关注收藏后评论区留言私信~~~

一、给三维物体贴图

除了位置坐标、颜色向量和矩阵向量,着色器还支持声明材质坐标和纹理采样器。 其中材质坐标表示物体表面摊平后的二维空间,纹理采样器表示采用第几层的纹理单元。引入纹理指标之后,需要修改顶点着色器的GLSL文件,补充声明纹理坐标的输入参数以及输出参数

接着还要修改片段着色器的GLSL文件,补充声明纹理坐标的输入参数以及纹理采样器的全局变量,并调用texture方法生成片元颜色

然后根据小程序编号在指定的材质坐标上应用纹理,注意末尾调用glGetUniformLocation方法获取采样器的位置序号之后还要调用glUniformli方法传入采样器纹理单元的编号

回到活动页面,在绘制图形之前调用以上的bindImageTexture方法绑定图像纹理

运行测试效果如下

演示视频已上传至个人主页 有需要可自行前往观看

Android魔方贴图旋转动画

代码如下

Java类

package com.example.threed;import androidx.appcompat.app.AppCompatActivity;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLES30;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;import com.example.threed.util.GlUtil;
import com.example.threed.util.EsVertexUtil;import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import java.util.List;import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;public class EsTextureActivity extends AppCompatActivity {private final static String TAG = "EsTextureActivity";private GLSurfaceView glsv_content; // 声明一个图形库表面视图对象private List<FloatBuffer> mVertexList = new ArrayList<>(); // 顶点列表private ByteBuffer mIndicateBuffer; // 示意连线的字节缓存private int mAngle = 60; // 旋转角度private int mProgramId; // 声明glsl小程序的编号private Bitmap mMagicBitmap; // 魔方的位图private float[] mProjectionMatrix = new float[16]; // 投影矩阵private float[] mModelMatrix = new float[16]; // 模型矩阵private float[] mMVPMatrix = new float[16]; // 结果矩阵@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_es_texture);initShapeSpinner(); // 初始化形状下拉框mVertexList = EsVertexUtil.getCubeVertexs(); // // 获得立方体的顶点列表mIndicateBuffer = GlUtil.getByteBuffer(EsVertexUtil.cubeIndicates);glsv_content = findViewById(R.id.glsv_content);// 声明使用OpenGL ES的版本号为3.0。使用ES30方法之前务必指定版本号glsv_content.setEGLContextClientVersion(3);// 给OpenGL的表面视图注册三维图形的渲染器glsv_content.setRenderer(new TextureRenderer());// 设置渲染模式。默认的RENDERMODE_CONTINUOUSLY表示持续刷新,RENDERMODE_WHEN_DIRTY表示只有首次创建和调用requestRender方法时才会刷新glsv_content.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);}// 初始化形状下拉框private void initShapeSpinner() {ArrayAdapter<String> shapeAdapter = new ArrayAdapter<>(this,R.layout.item_select, shapeArray);Spinner sp_shape = findViewById(R.id.sp_shape);sp_shape.setPrompt("请选择三维物体形状");sp_shape.setAdapter(shapeAdapter);sp_shape.setOnItemSelectedListener(new EsTextureActivity.ShapeSelectedListener());sp_shape.setSelection(0);}private String[] shapeArray = { "静止魔方", "旋转魔方" };class ShapeSelectedListener implements AdapterView.OnItemSelectedListener {public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {mMagicBitmap = null;if (arg2 == 1) {glsv_content.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); // 设置渲染模式} else {glsv_content.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); // 设置渲染模式glsv_content.requestRender(); // 主动请求渲染操作}}public void onNothingSelected(AdapterView<?> arg0) {}}public class TextureRenderer implements GLSurfaceView.Renderer {@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {GLES30.glClearColor(1f, 1f, 1f, 1f); //设置背景颜色// 初始化着色器mProgramId = GlUtil.initShaderProgram(EsTextureActivity.this, "texture_vertex.glsl", "texture_fragment.glsl");}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {GLES30.glViewport(0, 0, width, height); // 设置输出屏幕大小float aspectRatio = width>height ? 1.0f*width/height : 1.0f*height/width;Matrix.setIdentityM(mProjectionMatrix, 0); // 初始化投影矩阵// 计算矩阵的正交投影Matrix.orthoM(mProjectionMatrix, 0, -1f, 1f, -aspectRatio, aspectRatio, -1f, 1f);}@Overridepublic void onDrawFrame(GL10 gl) {// 清除屏幕和深度缓存GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT | GLES30.GL_DEPTH_BUFFER_BIT);// 开启深度测试,这样只绘制靠前的表面,不绘制靠后的表面GLES30.glEnable(GLES30.GL_DEPTH_TEST);Matrix.setIdentityM(mModelMatrix, 0); // 初始化模型矩阵Matrix.rotateM(mModelMatrix, 0, mAngle,1f, 1f, 0.5f); // 旋转模型矩阵// 把投影矩阵和模型矩阵相乘,得到最终的变换矩阵Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mModelMatrix, 0);// 获取顶点着色器的unMatrix位置int matrixLoc = GLES30.glGetUniformLocation(mProgramId, "unMatrix");Log.d(TAG, "matrixLoc="+matrixLoc);// 输入变换矩阵信息GLES30.glUniformMatrix4fv(matrixLoc, 1, false, mMVPMatrix, 0);mAngle++;drawMagic(); // 绘制魔方}}// 绘制魔方private void drawMagic() {if (mMagicBitmap == null) {mMagicBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.magic);FloatBuffer textureBuffer = GlUtil.getFloatBuffer(EsVertexUtil.cubeTextCoord);// 绑定魔方的图像纹理int textureId = GlUtil.bindImageTexture(mProgramId, textureBuffer, mMagicBitmap);Log.d(TAG, "textureId="+textureId);}// 获取顶点着色器的vPosition位置int positionLoc = GLES30.glGetAttribLocation(mProgramId, "vPosition");Log.d(TAG, "positionLoc="+positionLoc);GLES30.glEnableVertexAttribArray(positionLoc); // 启用顶点属性数组for (FloatBuffer buffer : mVertexList) {// 指定顶点属性数组的信息GLES30.glVertexAttribPointer(positionLoc, 3, GLES30.GL_FLOAT, false, 0, buffer);// 假设绘制一个立方体,绘制类型为GL_TRIANGLES,那么六个面各由两个三角形组成,// 就得向渲染管线传入36个顶点依次绘制,可实际上一个矩形也只有4个顶点,// 为了优化绘制的效率,减少数据的传递,于是有了glDrawElements绘制方法。GLES30.glDrawElements(GLES30.GL_TRIANGLES, EsVertexUtil.cubeIndicates.length,GLES30.GL_UNSIGNED_BYTE, mIndicateBuffer);}GLES30.glDisableVertexAttribArray(positionLoc); // 禁用顶点属性数组}@Overrideprotected void onPause() {super.onPause();glsv_content.onPause(); // 暂停绘制三维图形mMagicBitmap = null;mAngle = 60;}@Overrideprotected void onResume() {super.onResume();glsv_content.onResume(); // 恢复绘制三维图形}}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="right"android:text="三维物体形状:"android:textColor="@color/black"android:textSize="17sp" /><Spinnerandroid:id="@+id/sp_shape"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:spinnerMode="dialog" /></LinearLayout><!-- 注意这里要使用控件的全路径android.opengl.GLSurfaceView --><android.opengl.GLSurfaceViewandroid:id="@+id/glsv_content"android:layout_width="match_parent"android:layout_height="400dp" /></LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

【Android App】给三维魔方贴图以及旋转动画讲解和实战(附源码和演示视频 超详细必看)相关推荐

  1. 【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)

    需要源码请点赞关注收藏后评论区留言~~~ 一.获取地点信息 至于如何集成腾讯地图和调用腾讯地图接口此处不再赘述,有需要请参见我之前的博客 腾讯地图用来搜索POI地点的工具是TencentSearch, ...

  2. 【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 与传统的影视行业相比,诞生于移动互联网时代的短视频是个全新行业,它制作方便又容易传播,一出现就成为大街小巷的时髦潮流. 各行各业的人们均可通过短视频展 ...

  3. 【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 手机最开始用于通话,后来增加了短信功能,初步满足了人与人之间的沟通需求.然而短信只能发文字,于是出现了能够发图片的彩信,但不管短信还是彩信,资费都太贵 ...

  4. 【Android App】Vulkan实现宇宙中旋转雷达动画效果(附源码和原始视频 超详细必看)

    需要源码请点赞关注收藏后评论区留言私信~~~ 一.Vulkan简介 Vulkan是一个跨平台的图形绘制接口,被称为下一代OpenGL,因为尽管OpenGL提供了丰富的图形API,但他在底层实现的C代码 ...

  5. 【Android App】勾勒出三维立方体和球体以及它们的转动图形讲解及实战(附源码和演示视频 超详细)

    需要源码或运行有问题请点赞关注收藏后评论区留言~~~ 一.轮廓勾勒 勾勒三维物体轮廓线条的步骤如下: (1)调用glEnableClientState方法启用顶点开关 (2)调用glVertexPoi ...

  6. Android App开发实战项目之模仿美图秀秀的抠图工具(附源码和演示视频 简单易懂 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 所谓抠图神器,就是从一副图片中扣出用户想要的某块区域 一.需求描述 美图的修图功能如此强大,离不开专业的图片加工技术,抠图便是其中重要的一项功能.在A ...

  7. 【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)

    需要源码请点赞关注收藏后评论区留言私信~~~ 不管是绘画还是摄影,都是把三维的物体投影到平面上,其实仍旧呈现二维的模拟画面. 随着科技的发展,传统的成像手段越来越凸显出局限性,缘由在于人们需要一种更逼 ...

  8. Android App开发动画特效之实现百叶窗动画和马赛克动画效果实战演示(附源码和演示视频 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.实现百叶窗动画 合理运用图层规则可以实现酷炫的动画效果,比如把图片分割成一条一条,接着每条都逐渐展开,这便产生了百叶窗动画,把图片等分为若干小方格 ...

  9. 【Android App】实战项目之实现你问我答的智能语音机器人(超详细 附源码和演示视频)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.需求描述 想必大家都见过商场里的智能语音机器人,你对它提问时它可以自动回答你的问题,接下来我们也实现这样一个机器人,它依靠语音技术完成问询服务 基 ...

最新文章

  1. OGRE 2.1 Windows 编译
  2. 【PHP源码分析】small内存规格的计算
  3. seaborn使用violinplot函数可视化小提琴图、并在violinplot函数中设置inner参数来添加数据点显示数据的稠密程度
  4. pythontuple数据类型_Python基础教程2d–数据类型-tuple(元组)
  5. hdu 5077 NAND(打表)2014 Asia regional 鞍山站 H题
  6. Android SDK Manager无法下载包的问题
  7. Disjoint Set
  8. leetcode307. Range Sum Query - Mutable
  9. art-template入门(四)之调试
  10. CCIE理论-第九篇-IPV6详细介绍
  11. 什么是页损坏 mysql_MySQL数据库页损坏怎么办,innodb_force_recovery参数帮你解决问题...
  12. .NET Framework版本解析
  13. 4.看板方法---在五个季度内,从最差变为最好
  14. python代码案例详解-Python代码样例列表
  15. UI原型设计软件Axure
  16. java递归走迷宫游戏
  17. nfs挂载文件系统时VFS: Unable to mount root fs on unknown-block的问题解决
  18. 常微分齐次方程的规范化通解
  19. 中英文标点符号切换的组合键_最全的键盘各键及组合键功能说明,建议收藏
  20. 随着窗体大小变化改变控件的大小和字体

热门文章

  1. 科技资讯|Apple Vision Pro新专利,关于相对惯性测量系统的校正
  2. Ubuntu:为 Firefox 浏览器 安装 flash 插件
  3. C 用单向链表建立一张班级成绩单,包括每个学生的学号、姓名、英语、高等数学、普通物理、C语言程序设计4门课程的成绩。实现以下功能,并提供菜单选项:(只实现了部分功能)
  4. java 字符串转utc时间_在Java中将UTC时间转换为本地时区
  5. 下面不属于c语言的数据类型是,下面不属于C++语言的基本数据类型的是()。...
  6. 这7个网站,帮你找到精美高清配图
  7. html+css点亮灯泡
  8. 纤纳光电CEO姚冀众荣获“第十一届中国青年创业奖”
  9. 群晖用VMM虚拟机安装ikuai(爱快)软路由
  10. 【IPv4】十进制点分表示法转换