android opengl es 飘动的flag

OpenGL中的顶点缓冲区(Vertex Buffer) Vertex buffer即顶点缓冲区。从字面意思来看,这个词就是指储存是顶点数据的缓冲区,本质还是一个缓冲区(buffer),是占一定字节的内存。就像在C++中我们用声明并赋值一个int类型,在内存中开辟4个字节空间来储存数据,这是在CPU上进行的。而Vertex buffer是OpenGL在GPU中开辟空间储存数据。当我们运行程序绘制图形时,显卡会从缓存(buffer)中读取顶点数据,进行绘制。 今天我们来看一下如何用OpenGL来创建顶点缓存区(vertex buffer)。我个人感觉这个过程和编程 阅读详情

越来越感到知识相关性的重要性,光会一点编程,是远远不够的。数学,物理,和计算机是不可分割兄弟。

 

(1)Activity类

 

package sim.feel;

import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;

public class FlagActivity extends Activity {
    /** Called when the activity is first created. */
    GLSurfaceView glSurfaceView;
    Renderer renderer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LoadImage.load(getResources());
        renderer = new MyRenderer();
        glSurfaceView = new GLSurfaceView(this);
        glSurfaceView.setRenderer(renderer);
        setContentView(glSurfaceView);
    }
}

//载入图片
class LoadImage {
    public static Bitmap bitmap;

    public static void load(Resources res) {
        bitmap = BitmapFactory.decodeResource(res, R.drawable.img);
    }
}

 

 

 

 

(2)Renderer类

 

package sim.feel;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLUtils;

public class MyRenderer implements Renderer {
    // Points 网格顶点数组(45,45,3)
    float vertex[][][] = new float[45][45][3];
    // 指定旗形波浪的运动速度
    int wiggle_count = 0;
    // 临时变量
    float hold;
    // x,y,z转角
    float xrot, yrot, zrot;
    // vertex
    private float[] texVertex = new float[12];
    // vetexBuffer
    private FloatBuffer vertexBuffer;
    // coord
    private float[] coord = new float[8];
    // coordBuffer
    private FloatBuffer coordBuffer;
    // textures
    private int[] textures = new int[1];

    // init()
    public void init() {
        ByteBuffer texByteBuffer = ByteBuffer
                .allocateDirect(texVertex.length * 4);
        texByteBuffer.order(ByteOrder.nativeOrder());
        vertexBuffer = texByteBuffer.asFloatBuffer();
        vertexBuffer.put(texVertex);
        vertexBuffer.position(0);

        ByteBuffer coordByteBuffer = ByteBuffer
                .allocateDirect(coord.length * 4);
        coordByteBuffer.order(ByteOrder.nativeOrder());
        coordBuffer = coordByteBuffer.asFloatBuffer();
        coordBuffer.put(coord);
        coordBuffer.position(0);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        init();
        int x, y; // 循环变量
        float _x, _y, _xb, _yb; // 用来将旗形的波浪分割成很小的四边形

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓冲
        gl.glLoadIdentity(); // 重置当前的模型观察矩阵

        gl.glTranslatef(0.0f, 0.0f, -12.0f); // 移入屏幕12个单位

        gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f); // 绕 X 轴旋转
        gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f); // 绕 Y 轴旋转
        gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f); // 绕 Z 轴旋转

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, coordBuffer);

        for (x = 0; x < 44; x++) {
            for (y = 0; y < 44; y++) {
                _x = (float) (x) / 44.0f; // 生成X浮点值
                _y = (float) (y) / 44.0f; // 生成Y浮点值
                _xb = (float) (x + 1) / 44.0f; // X浮点值+0.0227f
                _yb = (float) (y + 1) / 44.0f; // Y浮点值+0.0227f

                coordBuffer.clear();
                // bottom left
                coordBuffer.put(_x);
                coordBuffer.put(_y);
                // bottom right
                coordBuffer.put(_x);
                coordBuffer.put(_yb);
                // top right
                coordBuffer.put(_xb);
                coordBuffer.put(_yb);
                // top left
                coordBuffer.put(_xb);
                coordBuffer.put(_y);

                vertexBuffer.clear();
                // bottom left
                vertexBuffer.put(vertex[x][y][0]);
                vertexBuffer.put(vertex[x][y][1]);
                vertexBuffer.put(vertex[x][y][2]);
                // bottom right
                vertexBuffer.put(vertex[x][y + 1][0]);
                vertexBuffer.put(vertex[x][y + 1][1]);
                vertexBuffer.put(vertex[x][y + 1][2]);
                // top right
                vertexBuffer.put(vertex[x + 1][y + 1][0]);
                vertexBuffer.put(vertex[x + 1][y + 1][1]);
                vertexBuffer.put(vertex[x + 1][y + 1][2]);
                // top left
                vertexBuffer.put(vertex[x + 1][y][0]);
                vertexBuffer.put(vertex[x + 1][y][1]);
                vertexBuffer.put(vertex[x + 1][y][2]);

                gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);
            }
        }

        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

        if (wiggle_count == 2) { // 用来降低波浪速度(每隔2帧一次)
            for (int j = 0; j < 45; j++) {
                hold = vertex[0][j][2]; // 存储当前左侧波浪值
                for (int i = 0; i < 44; i++) {
                    // 当前波浪值等于其右侧的波浪值
                    vertex[i][j][2] = vertex[i + 1][j][2];
                }
                vertex[44][j][2] = hold;
            }
            wiggle_count=0;
        }

        wiggle_count++;
        xrot += 0.3f; // X 轴旋转
        yrot += 0.2f; // Y 轴旋转
        zrot += 0.4f; // Z 轴旋转
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        float ratio = (float) width / (float) height;
        // 设置OpenGL场景的大小
        gl.glViewport(0, 0, width, height);
        // 设置投影矩阵
        gl.glMatrixMode(GL10.GL_PROJECTION);
        // 重置投影矩阵
        gl.glLoadIdentity();
        // 设置视口的大小
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 15);
        // 选择模型观察矩阵
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        // 重置模型观察矩阵
        gl.glLoadIdentity();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // 黑色背景
        gl.glClearColor(0, 0, 0, 0);
        // 启用阴影平滑
        gl.glShadeModel(GL10.GL_SMOOTH);
        // 启用深度测试
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // 启用纹理映射
        gl.glClearDepthf(1.0f);
        // 深度测试的类型
        gl.glDepthFunc(GL10.GL_LEQUAL);
        // 精细的透视修正
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
        // 允许2D贴图,纹理
        gl.glEnable(GL10.GL_TEXTURE_2D);

        gl.glEnable(GL10.GL_LEQUAL);

        // 创建纹理
        gl.glGenTextures(1, textures, 0);
        // 设置要使用的纹理
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

        // 生成纹理
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, LoadImage.bitmap, 0);
        // 线形滤波
        gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
                GL10.GL_LINEAR);
        gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
                GL10.GL_LINEAR);


        //NEW
        // 沿X平面循环
        for (int x = 0; x < 45; x++) {
            // 沿Y平面循环
            for (int y = 0; y < 45; y++) {
                // 向表面添加波浪效果
                // -4.5f~4.5f
                vertex[x][y][0] = ((float) x / 5.0f) - 4.5f;
                vertex[x][y][1] = (((float) y / 5.0f) - 4.5f);
                // 0-2*pai
                vertex[x][y][2] = (float) (Math
                        .sin(((((float) x / 5.0f) * 40.0f) / 360.0f) * 3.141592654 * 2.0f));
            }
        }

    }
}

 

效果如下:

MIUI 6的毛玻璃效果的技术实现(实时模糊) 说说MIUI 6的毛玻璃效果的技术实现。 很久以前我们的文件夹打开和最近任务等几个地方就使用了毛玻璃效果,在技术上讲就是背景模糊。应该是比iOS 7的使用要早很多。不过那时候我们使用的是先对背景截图,再将其模糊处理,然后作为app的背景图,所以是一张静止的图片,当背景内容发生变化时模糊的图片并不会随之变化,因此比较生硬。而iOS 7的背景模糊则是实时的,当背景变化的时候,模糊内容 阅读详情

相关推荐

android项目下对图片高斯模糊毛玻璃自定义view

android项目下对图片高斯模糊毛玻璃,自定义view,模糊程度可控制,高斯模糊毛玻璃,自定义view,模糊程度可控制

OpenGL ES (12): 答疑解惑 -- GLES20的绘图相关方法解释

1.介绍 之前的文章中已经写到在Render中的onDrawFrame()调用了 mTriangle.draw(),进行了三角形的绘制。 我们这里是要分析draw()里面的东西 关于GLES20的绘图方法,解释参数。   2.先看之前代码中的内容具体是怎样 public Triangle() { ByteBuffer bb = ByteBuffer.allocateDi...

八步赶蝉 3492

Android实现图片的高斯模糊效果

Android使用RenderScript实现图片的高斯模糊效果。通过在网上资料查找,有以下4种方法可以实现: - RenderScript - Java算法 - NDK算法 - openGL 最终考虑,使用RenderScript 应该是最适合的。

Android OpenGLES视频模糊,毛玻璃效果

最近帮朋友做了个给视频加模糊的功能,毛玻璃效果,思路很简单,首先要先知道哪些参数能修改模糊度,我在动态调节模糊里说了sigma,blurRadius和图片尺寸都会影响模糊效果,在画面清晰时sigma对模糊的效果影响特别小,而blurRadius必须很大的时候才能达到效果,可是blurRadius太大会照成视频卡顿,所以最简单的方法是先降低画面尺寸,在设置blurRadius和sigma。 思路有了,接下来是原理,缩小画面尺寸,先想到的应该是改变视频的长宽,但我们不能去改原文件的长宽,所以只能对解码出来的视

红色与青色 3030

Android利用RenderScript实现毛玻璃模糊效果示例

毛玻璃效果(亦称磨砂效果),近两年在移动端的UI设计上越来越流行,下面这篇文章主要介绍了Android利用RenderScript实现毛玻璃模糊效果的相关资料,文中给出了详细的示例代码,需要的朋友可以参考学习,下面来一起看看吧。

使用python读取卫星测高数据并做相应的处理

5.在python处理结果如下,最大的优点就是比matlab快30-40倍。4.进行粗差的如NaN值,还有进行3倍方差进行对粗差处理。1.首先遍历卫星数据的文件,挨个读取每个数据。有问题,请各位读者及时告知,一起完善内容。3.进行下一步,筛选在研究区域的数据。4.进行按天求平均和按月求平均。2.读取数据主体代码。

爱下去更难! 1133

Android中毛玻璃效果的两种实现Android12及以前版本

方法1 先将图片缩小,然后放大图片,再设置为控件背景以达到更模糊的效果,同时也提升模糊算法的处理效率。对比下来同样的模糊半径 ,方法1 的模糊效果更好,且方法1 的模糊半径可以设置范围更大。2.使用Android自带类RenderScript 实现。Android中毛玻璃效果主要有两种实现方式。3.FastBlurUtil.java 类。1.使用JAVA算法FastBlur实现。2.BitmapUtil.java 类。方法2 模糊半径只能设置1-25。1.activity中调用。

kk3087961的博客 3290

MIMIC数据库基本信息分析

一、MIMIC数据库中26张表介绍 数据库中一共有26张表,记录患者入院的各种信息,每张表的介绍如下所示。 表格名 信息 admission 患者基本信息,比如性别、种族、语言、宗教、婚姻、入院和出院时间、死亡时间等 callout 提供病人准备从ICU转出或者已经从ICU转出时相关信息 caregivers 记录医护人员信息(ID、类型、附加...

m0_37520426的博客 1万+

Android OpenGL ES 高斯模糊与毛玻璃效果

一、均值模糊 所谓模糊,就是让图像看不清,那么让图片看不清有哪些方法呢 缩小图片 缩小图片比较好理解,当我们将原本1080*960的图片,按照比例缩小为540*480,即缩小为原来的二分之一,但显示的时候,我们还是让他以1080*960大小显示,此时图片看起来就比原来的模糊 像素取周边像素的平均值 当某张人像的图片非常看不清楚时,我们可能会说,这张照片的人眼睛鼻子糊成一块都看不清了,其实也就是像素与像素之间变得平滑,而不是高清图的那种轮廓分明 下面,我们正在在做图片模糊处...

翻肚鱼儿的博客 2281

Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法

AX200 iwlwifi-cc-46.3cfab8da.0.tgz 无法下载网页出问题使用 其他方法来进行但是前提还是有网络。

chen20170325的博客 1039

期权定价模型系列[11]三叉树期权定价[trinomial model ]

三叉树期权定价方法简介

xiaowu1997的博客 1847

Android毛玻璃(磨砂)效果(静态&动态背景图模糊 收集)

果然前人栽树,后人乘凉.google搜索”Android实现动态高斯模糊效果”发现2016年转载的博客居多(或者试试英文搜索,可能时间会提前很多.),看来2016年想实现这种效果的产品多; 2014年是图片高斯模糊2015年有性能对比2016年火的就是动态高斯模糊了,不知道对于性能的影响有多大,消耗内存占用资源得有个数据show一下,当然在比较性能之前,应该先实现效果.待都尝试运行过后再弄数据.一A

TTKatrina的博客 1万+

YOLOv11改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用

本文记录的是利用优化的目标检测方法研究。深度可分离卷积可以减少FLOPs,但会导致更高的内存访问,引起延迟并减慢整体计算。部分卷积利用逐点卷积处理通道冗余,减少模型计算量和内存访问量。Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks的实现代码如下: 四、创新模块 4.1 改进点⭐ 模块改进方法: 1️⃣ 加入。添加后如下:2️⃣:加入基于的。利用改进模块,减少通道冗余。改进代码如下:首先添加如下代码让加入,并重命名为 再添加如

Limiiiing的博客 3873

Android进阶之路 - 毛玻璃遮罩层

目录 前期提要 使用方式 完整代码 前期提要 更具体的详情请查看文末的借鉴文章之处 > <~ 模糊方案 1.Java实现,一般都是采用Stack模糊算法 2.RenderScript实现 3.Native实现 4.OpenCV或者OpenGL实现,由于其复杂度,本文暂不讨论该方案 BlurLayout自定义属性 注:只用到了blurkit:blk_fps属性,其他属性一用就...

Android、前端、小程序、后端 1万+

为Ollama本地大模型添加持久化记忆层:openclaw-ollama-memory项目详解

在构建基于大型语言模型(LLM)的对话应用时,上下文管理是核心技术挑战之一。其原理在于模型本身不具备跨会话的持久化记忆能力,每次请求都是独立的。这导致在多轮对话中,模型无法有效利用历史信息,用户体验割裂。从技术价值看,独立的记忆层通过解耦推理与存储,能突破模型固定上下文窗口的限制,实现更智能、连贯的交互。其核心应用场景包括聊天机器人、智能助手及需要长期记忆的复杂代理。本文聚焦的 openclaw-ollama-memory 项目,正是为 Ollama 生态提供的记忆层解决方案,它通过向量检索和智能摘要等机制

weixin_42521558的博客 312

《备考系统架构设计师》 - 专栏介绍和目录

本专栏包括所有历年真题及详解、章节知识核心总结、精选高分论文、补充知识、专题总结等。欢迎订阅专栏。

数据知道的博客 4万+

OpenGL学习三十九:飘动的旗帜

(此节内容对应NEHE教程第11课)   目前为止我们做的例子都是平面的,这个例子是带有波动效果的, 2维图形包括X,Y两个坐标系。因此看到的是平面的。 3维图形由X,Y,Z三个坐标系构成,当Z坐标不为0时,可以产生3维的效果。一个图片或图形由许多个3维图形构成是,并且Z是变化的 就会产生波动的效果 for(int x=0; x<45; x++) { // 沿Y平面循环 f

StarFlex 4293

uniapp [安卓苹果App端] - 实现集成微信一键登录及授权获取用户信息全流程源码,uniApp唤起微信客户端app实现微信授权头像昵称手机号(提供移动应用/开放平台/资质认证/签名/权限申请

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,微信一键登录,uniapp项目App端实现微信登录,Uniapp实现微信授权登录,调起微信客户端授权用户信息,uniappapp端微信一键登录打开手机微信app,app端如何唤起用户本机微信应用并授权登陆,如何申请微信一键登录,uniapp实现APP微信登录流程,打开本地微信软件,接入微信登录,UniApp实现微信登录教程,获取头像昵称手机号用户数据,超详细实现微信登录功能,唤起没反应,授权失败,获取

🏆 前端领域优质创作者 1万+

OpenGL -- 飘动的旗帜 (java)

<br />原创内容,转载请注明EOE论坛。       声明:因为本人的学习都是居于杨丰盛老师的《Android应用开发揭秘》一书,因此,本内容教程代码和大部分的内容都来自公布在网络上的杨老师的代码。C/C++部分可以看NeHe的OpenGL教程:http://yarin.blog.51cto.com/1130898/380974<br /> <br /> 效果图片<br /> <br />1 . 局部顶点:我们将这张图片由X、Y轴平均分割成44份,也就是有45个分割点,这些构成小方格的点就是局部顶点了。

GEOLO的专栏 4093

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 开源 高斯模糊_推荐一个强大的毛玻璃特效开源库

本文作者:大逗大人作者博客:https://juejin.im/user/56a4ee7b2e958a0059676953毛玻璃效果实际上是对原图片的严重劣化,突出朦胧感,一般都是通过图片的缩放+模糊算法来实现,从性能角度考虑,模糊半径不能大于25,所以要更高的模糊效果则需要进行缩放。具体实现方案有以下几种:Java实现,一般都是采用Stack模糊算法RenderScript实现Native实现O...

weixin_35711852的博客 1193

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android opengl模糊,android 实时渲染模糊

转载知乎朱才MIUI 6已经实现了实时模糊,我来说说其技术实现吧。很久以前我们的文件夹打开和最近任务等几个地方就使用了毛玻璃效果,在技术上讲就是背景模糊。应该是比iOS 7的使用要早很多。不过那时候我们使用的是先对背景截图,再将其模糊处理,然后作为app的背景图,所以是一张静止的图片,当背景内容发生变化时模糊的图片并不会随之变化,因此比较生硬。而iOS 7的背景模糊则是实时的,当背景变化的时候,模...

weixin_39669163的博客 567

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android 实现磨砂效果_Android 5.0 下毛玻璃(磨砂)效果如何实现?

刚刚做技术调研,可以给一些优缺点的对比.目前主流实现毛玻璃效果(高斯模糊)分大致三种方法:一 利用RenderScript接口利用现有Android结构,通过RenderScript调用底层接口实现高斯模糊计算.// Remix Blurprivate void blur(Bitmap bkg, View view) {…RenderScript rs = RenderScript.create(...

weixin_32529407的博客 1035

Android高斯模糊技术,实现毛玻璃效果

内容精炼,易读易懂,十分钟实现高斯模糊效果。

郭霖 4111

Android 毛玻璃效果的实现

Android 毛玻璃效果,主要找到了3中实现方案, 1、如果系统的api在16以上,可以使用系统提供的方法直接处理图片 if (VERSION.SDK_INT &gt; 16) {             Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);                         final R...

fanleiym的专栏 2192
上一篇: android opengl es 3d世界
下一篇: android opengl es 显示列表
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值