android opengl es 蒙版效果

Android图形处理:Xfermode与PorterDuff混合模式详解 图像混合是计算机图形学中的基础概念,通过算法将源图像与目标图像按特定规则合成。Porter-Duff算法作为经典实现,定义了12种基础混合操作,在Android中扩展为16种模式通过PorterDuffXfermode提供。这种技术核心价值在于实现高效像素级合成,无需预处理即可创建圆形头像、动态蒙版等高级UI效果。在移动开发领域,合理运用Xfermode能显著提升图形处理效率,典型应用场景包括:社交应用的头像处理、电商商品的特殊展示效果、游戏UI的透明混合等。通过离屏缓冲技术和正确的绘制顺序管理,开发者可以 阅读详情

呃,其实都是纹理的基本使用方法。只是多了下面这两行代码

gl.glBlendFunc(GL10.GL_DST_COLOR, GL10.GL_ZERO);

gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE);

不多说了,看代码。


(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.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;
import android.view.WindowManager;

public class Mask extends Activity {
    private MyRenderer myRenderer = new MyRenderer();
    private GLSurfaceView glSurfaceView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置无标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // 设置全屏显示
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        LoadImage.load(getResources());
        glSurfaceView = new GLSurfaceView(this);
        glSurfaceView.setRenderer(myRenderer);
        setContentView(glSurfaceView);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return myRenderer.onKeyDown(keyCode, event);
    }

}

// 载入图片
class LoadImage {
    public static Bitmap image1;
    public static Bitmap image2;
    public static Bitmap logo;
    public static Bitmap mask1;
    public static Bitmap mask2;

    public static void load(Resources res) {
        image1 = BitmapFactory.decodeResource(res, R.drawable.image1);
        image2 = BitmapFactory.decodeResource(res, R.drawable.image2);
        logo = BitmapFactory.decodeResource(res, R.drawable.logo);
        mask1 = BitmapFactory.decodeResource(res, R.drawable.mask1);
        mask2 = BitmapFactory.decodeResource(res, R.drawable.mask2);
    }
}


(2)Renderer类

 

package sim.feel;

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

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

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

public class MyRenderer implements Renderer {
    // 是否使用“掩码”
    private boolean masking = true;
    // 绘制一个场景
    private boolean scene;
    // 保存5个纹理标志
    private int texture[] = new int[5];
    // 滚动纹理
    private float roll;

    // vertex
    private float[] vertex = new float[12];
    // vertexBuffer
    private FloatBuffer vertexBuffer;
    // texCoord
    private float texCoord[] = new float[8];
    // texCoordBuffer
    private FloatBuffer texCoordBuffer;

    // LoadBuffer
    public void loadBuffer() {
        ByteBuffer vertexByteBuffer = ByteBuffer
                .allocateDirect(vertex.length * 4);
        vertexByteBuffer.order(ByteOrder.nativeOrder());
        vertexBuffer = vertexByteBuffer.asFloatBuffer();
        vertexBuffer.put(vertex);
        vertexBuffer.position(0);

        ByteBuffer texCoordByteBuffer = ByteBuffer
                .allocateDirect(texCoord.length * 4);
        texCoordByteBuffer.order(ByteOrder.nativeOrder());
        texCoordBuffer = texCoordByteBuffer.asFloatBuffer();
        texCoordBuffer.put(texCoord);
        texCoordBuffer.position(0);
    }

    // 加载纹理
    public void loadTexture(GL10 gl) {
        // 启用纹理
        gl.glEnable(GL10.GL_TEXTURE_2D);
        // 创建纹理
        IntBuffer textureBuffer = IntBuffer.allocate(5);
        gl.glGenTextures(5, textureBuffer);
        texture = textureBuffer.array();

        // 绑定纹理
        gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]);
        // 生成纹理
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, LoadImage.image1, 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);

        gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[1]);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, LoadImage.image2, 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);

        gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[2]);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, LoadImage.logo, 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);

        gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[3]);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, LoadImage.mask1, 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);

        gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[4]);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, LoadImage.mask2, 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);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // loadBuffer
        loadBuffer();
        // 清除深度缓存与屏幕
        gl.glClear(GL10.GL_DEPTH_BUFFER_BIT | GL10.GL_COLOR_BUFFER_BIT);

        // 选择Logo纹理
        gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[2]);

        // 开启顶点纹理设置
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        // 给texCoordBuffer与vertexBuffer设置顶点
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texCoordBuffer);
        gl.glLoadIdentity();
        // 向屏幕里移入2个单位
        gl.glTranslatef(0.0f, 0.0f, -2.0f);
        // 呃,还要沿x旋转180度图片才是正的,烦o(-"-)o
        gl.glRotatef(180, 1.0f, 0.0f, 0.0f);

        // 下面代码绘制一个3*3即9个正方形,并为它描上纹理
        // texCoordBuffer put
        texCoordBuffer.clear();
        texCoordBuffer.put(0.0f);
        texCoordBuffer.put(-roll + 0.0f);

        texCoordBuffer.put(3.0f);
        texCoordBuffer.put(-roll + 0.0f);

        texCoordBuffer.put(0.0f);
        texCoordBuffer.put(-roll + 3.0f);

        texCoordBuffer.put(3.0f);
        texCoordBuffer.put(-roll + 3.0f);

        // 我的理解为以-2到-1,-1到0,0到1这些点来组成每个正方体
        // vertexBuffer put
        vertexBuffer.clear();
        vertexBuffer.put(-1.1f);
        vertexBuffer.put(-1.1f);
        vertexBuffer.put(0.0f);

        vertexBuffer.put(1.1f);
        vertexBuffer.put(-1.1f);
        vertexBuffer.put(0.0f);

        vertexBuffer.put(-1.1f);
        vertexBuffer.put(1.1f);
        vertexBuffer.put(0.0f);

        vertexBuffer.put(1.1f);
        vertexBuffer.put(1.1f);
        vertexBuffer.put(0.0f);

        // 正式绘制了
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

        // 启用混合和禁用深度测试
        gl.glEnable(GL10.GL_BLEND);
        gl.glDisable(GL10.GL_DEPTH_TEST);
        // 是否启用"掩码",其实就是由图片组成的一个纹理,这里是texture[4]对应mask2.png
        if (masking) {
            // 使用黑白"掩码"(texture[4])混合屏幕颜色
            gl.glBlendFunc(GL10.GL_DST_COLOR, GL10.GL_ZERO);
        }


        // 绘制那一层为true绘制第二层,否则绘制第一层
        if (scene) {
            // 移入屏幕1个单位
            gl.glTranslatef(0.0f, 0.0f, -1.0f);
            // 沿Z轴旋转
            gl.glRotatef(roll * 360, 0.0f, 0.0f, 0.0f);

            // "掩码是否打开"
            if (masking) {
                // 选择一个"掩码"
                gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[4]);
                texCoordBuffer.clear();
                texCoordBuffer.put(0.0f);
                texCoordBuffer.put(0.0f);

                texCoordBuffer.put(1.0f);
                texCoordBuffer.put(0.0f);

                texCoordBuffer.put(0.0f);
                texCoordBuffer.put(0.1f);

                texCoordBuffer.put(1.0f);
                texCoordBuffer.put(1.0f);

                vertexBuffer.clear();

                vertexBuffer.put(-1.1f);
                vertexBuffer.put(-1.1f);
                vertexBuffer.put(0.0f);

                vertexBuffer.put(1.1f);
                vertexBuffer.put(-1.1f);
                vertexBuffer.put(0.0f);

                vertexBuffer.put(-1.1f);
                vertexBuffer.put(1.1f);
                vertexBuffer.put(0.0f);

                vertexBuffer.put(1.1f);
                vertexBuffer.put(1.1f);
                vertexBuffer.put(0.0f);

                gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
            }
            // 如果没有选择掩码,我们的图像将与屏幕颜色混合
            // 反纹理2复制到屏幕
            gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE);
            // 选择第二个纹理
            gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[1]);

            texCoordBuffer.clear();
            texCoordBuffer.put(0.0f);
            texCoordBuffer.put(0.0f);

            texCoordBuffer.put(1.0f);
            texCoordBuffer.put(0.0f);

            texCoordBuffer.put(0.0f);
            texCoordBuffer.put(0.1f);

            texCoordBuffer.put(1.0f);
            texCoordBuffer.put(1.0f);

            vertexBuffer.clear();

            vertexBuffer.put(-1.1f);
            vertexBuffer.put(-1.1f);
            vertexBuffer.put(0.0f);

            vertexBuffer.put(1.1f);
            vertexBuffer.put(-1.1f);
            vertexBuffer.put(0.0f);

            vertexBuffer.put(-1.1f);
            vertexBuffer.put(1.1f);
            vertexBuffer.put(0.0f);

            vertexBuffer.put(1.1f);
            vertexBuffer.put(1.1f);
            vertexBuffer.put(0.0f);
            // 绘制啦
            gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
        } else {
            if (masking) {
                // 选择一个"掩码"
                gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[3]);
                texCoordBuffer.clear();
                texCoordBuffer.put(roll + 0.0f);
                texCoordBuffer.put(0.0f);

                texCoordBuffer.put(roll + 4.0f);
                texCoordBuffer.put(0.0f);

                texCoordBuffer.put(roll + 0.0f);
                texCoordBuffer.put(4.0f);

                texCoordBuffer.put(roll + 4.0f);
                texCoordBuffer.put(4.0f);

                vertexBuffer.clear();

                vertexBuffer.put(-1.1f);
                vertexBuffer.put(-1.1f);
                vertexBuffer.put(0.0f);

                vertexBuffer.put(1.1f);
                vertexBuffer.put(-1.1f);
                vertexBuffer.put(0.0f);

                vertexBuffer.put(-1.1f);
                vertexBuffer.put(1.1f);
                vertexBuffer.put(0.0f);

                vertexBuffer.put(1.1f);
                vertexBuffer.put(1.1f);
                vertexBuffer.put(0.0f);

                gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
            }
            // 如果没有选择掩码,我们的图像将与屏幕颜色混合
            // 反纹理2复制到屏幕
            gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE);
            // 选择第二个纹理
            gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]);

            texCoordBuffer.clear();
            texCoordBuffer.put(roll + 0.0f);
            texCoordBuffer.put(0.0f);

            texCoordBuffer.put(roll + 4.0f);
            texCoordBuffer.put(0.0f);

            texCoordBuffer.put(roll + 0.0f);
            texCoordBuffer.put(4.0f);

            texCoordBuffer.put(roll + 4.0f);
            texCoordBuffer.put(4.0f);

            vertexBuffer.clear();

            vertexBuffer.put(-1.1f);
            vertexBuffer.put(-1.1f);
            vertexBuffer.put(0.0f);

            vertexBuffer.put(1.1f);
            vertexBuffer.put(-1.1f);
            vertexBuffer.put(0.0f);

            vertexBuffer.put(-1.1f);
            vertexBuffer.put(1.1f);
            vertexBuffer.put(0.0f);

            vertexBuffer.put(1.1f);
            vertexBuffer.put(1.1f);
            vertexBuffer.put(0.0f);
            // 又绘制了,呃。。。。
            gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
        }

        // 启用深度测试
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // 禁用混合
        gl.glDisable(GL10.GL_BLEND);

        // 关闭顶点纹理设置
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        gl.glFinish();

        roll += 0.002f;
        if (roll > 1.0f) {
            roll -= 1.0f;
        }

    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);
        if (height == 0) {
            height = 1;
        }
        float ratio = (float) width / height;
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 100);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
        // 加载纹理
        loadTexture(gl);
        // 黑色背景
        gl.glClearColor(0, 0, 0, 0);
        // 阴影平滑
        gl.glShadeModel(GL10.GL_SMOOTH);
        // 启用深度测试
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // 建立深度缓存
        gl.glClearDepthf(1.0f);
        // 精细修正
        // gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_DPAD_UP:
            masking = true;
            break;
        case KeyEvent.KEYCODE_DPAD_DOWN:
            masking = false;
            break;
        case KeyEvent.KEYCODE_DPAD_RIGHT:
            scene = true;
            break;
        case KeyEvent.KEYCODE_DPAD_LEFT:
            scene = false;
            break;
        }
        return true;
    }

}

 

效果图:

 

Android OpenGL ES滤镜开发之美颜效果 前言 其实之前我就是已经把美颜效果啥的都做完了,但是就一直懒得记录,今天来记录一下,之前记录的就是大眼睛还有贴纸的效果。以前的时候不爱写博客,总觉得很麻烦,现在发现写博客是用来总结复习很好的一个途径,很多时候写效果或者做些什么,就基本就是做完就完事儿了,也不去总结一下或者拿来复习一下,所以有的时候自己写过的东西,自己就不记得了。 写这个美颜效果,也参考了很多的资料,在文章的最后会把参考的文献列出来... 阅读详情

相关推荐

Android OpenGL es 纹理坐标设定与贴图规则

当opengl对一个四方形进行贴图时,会定义纹理贴图坐标,一串数组,相信初学openggl es者看到后会很头疼,不知道写得是什么东西。现在就将我的研究成果与大家分享下!当纹理映射启动后绘图时,你必须为OpenGL ES提供其他数据,即顶点数组中各顶点的纹理坐标。纹理坐标定义了图像的哪一部分将被映射到多边形。它的工作方式有点奇怪。相信初学者看到后会很头疼,不知道写得是什么东西。现在就将我的研究成果与大家分享下!下面看下在android平台下Opengl纹理系统坐标,左下角为原点。我们现在讨论怎样使用这些纹理

cjkwin的专栏 3万+

OpenGL学习二十八:蒙版

(本节对应分析NEHE教程第20课)   有时我们希望上层的图片的某些区域能投出下层的某些区域。当然我们可以通过关 键色进行处理,但是蒙版技术一样可以达到这样的效果,通过以下图片达到蒙版的效果   本节包含2个技术点 1.如何让纹理移动,放大(不是图像位置移动,是纹理移动)(前面以及介绍过了) 2.蒙版的设计 蒙版设计简单的说是通过控制Alpha来让白色的部分透,黑色的部分

StarFlex 1713

【Opengl Android】在安卓上渲染一个obj模型

工具:eclipse 一、获得一个obj文件并分析内容3D溜溜网 点击打开链接 可以下载到很多模型文件 用3dmax打开 导出外部格式文件obj  即可得到一个obj模型将格式改为txt  即可看到里面的数据内容有些模型文件还会带有mlt文件数据详解请转——https://www.douban.com/note/142379570/二、获得obj文件中的数据一是自己分析里面的数据 请转 https...

发光的猴子 7620

Android OpenGL ES 3.0 粒子特效

定义粒子,通常一个粒子有一个生命值,生命值结束该粒子消失,还有描述粒子在(x, y, z)三个方向的位置(偏移)和运动速度,以及粒子的颜色等属性。// 粒子速度//r,g,b,a //粒子颜色// 粒子的位置//粒子出现的时长dx = 0.0f;dy = 0.0f;dz = 0.0f;//粒子的生命值}/*操作符重载 < */}};

风的轨迹 1608

利用EGL在android上使用C/C++写OpenGL ES程序

使用Native代码GLSurfaceView 在Java层使用EGL 在native层使用EGL 很多教程都是在C/C++写的OpenGL的代码,其中有很多优秀的框架,除了前面提过的Assimp库外,还有很强大的库glm,从另外一个角度来看,在学习EGL的时候,很多的资料都是C语言的代码,我在android上写OpenGL ES的代码似乎从来没见过那些代码,不使用一下总觉得缺少点什么。事实上,An

weiersyuan的专栏 1万+

OpenGLES demo - 16. 蒙板 Stencil

个人博客中讲opengles2.0入门课程的16课,初级stencil的使用

Android OpenGL ES 简明开发教程二:构造OpenGL ES View

在Andorid平台上构造一个OpenGL View非常简单,主要有两方面的工作: GLSurfaceView Android平台提供的OpenGL ES API主要定义在包android.opengl ,javax.microedition.khronos.egl ,javax.microedition.khronos.opengles ,java.nio 等几个包中,其中类GLSurfac...

编程资料大全 344

Windows系统下复现PointNet++算法

本文详细介绍了如何在Windows系统下复现PointNet++算法,内容包括程序下载、环境配置、数据集准备以及三个主要任务(语义分割、分类、部件分割)的实现步骤和常见报错解决方法。通过遵循本文的指导,用户可以顺利完成PointNet++算法的复现。

LingYi_5的博客 4326

Android OpenGLES2.0(十七)——球形天空盒VR效果实现

在3D游戏中通常都会用到天空盒,在3D引擎中也一般会存在天空盒组件,让开发者可以直接使用。那么天空盒是什么?天空盒又是如何实现的呢?本篇博客主要介绍如何在Android中利用OpenGLES绘制一个天空盒,并实现VR效果。天空盒、天空穹、天空球和VR虽然大多数人知道这些东西是啥,但是我觉得我还是有必要把他们的定义“搬”过来,万一有人不知道呢。 天空盒(Sky Box)是放到场景中的一个立方体,经常是

偶尔记录的一些学习笔记 1万+

揭秘 | 顶刊论文插图中的高级配色方案(附RGB/HEX码解析)

本文揭秘了顶级期刊如《Nature》《Science》插图的高级配色方案,详细解析了RGB/HEX码的应用技巧。从双色配色的黄金组合到复杂数据可视化的多色解决方案,提供了实用的配色法则和跨平台一致性建议,帮助科研人员提升图表专业度和视觉传达效果。

weixin_28523493的博客 985

保姆级教程:用Smaart7和你的USB声卡搞定现场音响系统调试(附频谱与延时测试避坑指南)

本文提供Smaart7与USB声卡协同工作的现场音响系统调试指南,涵盖硬件连接、频谱分析、延时校准等关键步骤。通过详细的操作流程和常见问题解决方案,帮助音响工程师快速掌握专业测量技术,确保演出音质达到最佳状态。

weixin_29290259的博客 422

利用Xfermode 自定义形状View

可以理解为按照形状剪切图形。 具体步骤看下面代码中的注释。 Bitmap bitmap; @Override public void draw(Canvas canvas) { //保存还没有绘制之前的图层 int j = canvas.saveLayer(new RectF(0,0,getRight(),getBottom()),n...

weixin_33804990的博客 103

PHP实现SM2算法(附完整源码)

PHP实现SM2算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 4021

android opengl es 雾化效果

<br /> <br />雾效果其实很容易实现,我先总结一下:<br />(1)首先肯定是将背景色设为我们雾的颜色<br />(2)打开雾效果<br />(3)设置雾的背景色<br />(4)设置雾方程式<br />雾方程式有三种表现形式 EXP(最老),EXP2(EXP加强版),LINEAR(雾的最好方程式,当然用这个),如果要用LINEAR这种,则要多雾start,end的设置,表示雾从多远开始,从多远停止 。像LINEAR这种称之为线性雾(不是我发明的,OPENGL超级宝典上这样说,设置稠密度无效)

Simdanfeg的专栏 6685

Open3D DBSCAN聚类

DBSCAN算法做为一种有名的密度聚类算法,它是通过邻域参数(Distance,MinPts)来刻画样本分布的紧密程度。而在真正开始之前,首先要理解下面这几个概念:更为具体的内容也可参考这篇文章点云DBSCAN聚类算法。...

dayuhaitang1的博客 1794

航空电子系统标准全景图:ARP4754A、ARP4761、DO-178C、DO-254 的协同作用

通过 ARP4754A、ARP4761、DO-178C 和 DO-254 的相互配合,确保航空电子系统的安全性和功能性在开发过程中得到充分保障。每一个文件在不同层面发挥作用,共同构成了一个完整的、系统的开发和验证框架,确保航空电子设备达到适航要求。这些标准不仅帮助开发人员有条理地开发复杂的航空系统,还确保所有系统组件(软件和硬件)在整个生命周期内都能满足最严格的安全和可靠性要求。

qq_41854911的博客 1812

安卓OpenGL ES——透视投影

OpenGL ES 透视投影

Zach_z的博客 2289

玩转Docker小游戏项目系列: Docker部署红心纸牌网页小游戏

玩转Docker小游戏项目系列: Docker部署红心纸牌网页小游戏

jks212454的博客 420

android opengl es 七彩星星效果

<br />调试了半天,不知道原来就是那种效果,还是怎么的,反正旋转的时候有那么点别扭。可能是我写的有点问题吧。<br /> <br />Activity类:<br /> <br />package sim.feel;<br /><br /> import android.app.Activity;<br /> import android.content.res.Resources;<br /> import android.graphics.Bitmap;<br /> import androi

Simdanfeg的专栏 6378

S7-200SMART通过表格指令实现模拟量信号滑动平均值滤波的具体方法

S7-200SMART通过表格指令实现模拟量信号滑动平均值滤波的具体方法

Robot_PLC_HMI_Automation 6724

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android opengl es 光照效果

<br />通过模拟器左右上下键旋转3d正正方体,中键为光源开关<br /> <br />Activity类<br /> <br />package sim.feel;<br /><br /> import android.app.Activity;<br /> import android.content.res.Resources;<br /> import android.graphics.Bitmap;<br /> import android.graphics.BitmapFactory;

Simdanfeg的专栏 4674

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android OpenGL | ES 实现雾气效果

在Android上使用OpenGL ES开发时,模仿自然界的各种现象是很常见的,比如光照、雾气、飘动等效果,今天我们就来使用OpenGL ES实现自然界的雾气效果,雾气效果很简单,我们今天就使用系统自带的三种雾气渲染算法来实现不同的效果,当然你可以自己设置雾气的颜色和范围程度等。 本节的代码是基于Android OpenGL | ES给立方体进行纹理映射一文的代码上修改的,我会重点提到雾气渲染...

yff1123570554的专栏 1071

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

安卓进阶——OpenGL ES

本文系统介绍了OpenGL在2D和3D图形开发中的应用。2D部分重点阐述了OpenGL ES在Android平台的高性能优势、核心渲染管线(顶点处理、纹理映射、着色器编程)以及实现流程,包括GLSurfaceView配置和Renderer实现。3D部分深入讲解了坐标系转换、矩阵变换(MVP矩阵)、深度测试、光照模型等关键技术,并提供了3D场景渲染的实现框架。文章不仅覆盖了基础绘制方法,还介绍了纹理滤镜、粒子系统、帧缓冲等进阶技巧,为移动端图形开发提供了全面指导。通过系统学习这些内容,开发者可以实现...

Meteors.的博客 981

android opengl es 变形效果

<br />这个小程序需要的三个txt文本文件在被粘在示例图后面, 此变形效果程序分为以下四个类<br />(1)Morphing 除主功能外在本程序中还有按键处理及返回InputStream<br />(2)MyRenderer 负责绘制<br />(3)OBJECT 三维物体类<br />(4)VERTEX 三维顶点类<br /> <br /><br /><br />从最简单的VERTEX 类开始,可见此类主要映射三维各顶点<br />package sim.feel;<br /> /**<br /

Simdanfeg的专栏 4989

Android 中opengl es灯光效果实例

一、还是要准备一张图片,放在res/drawable中 二、灯光效果代码: /** * 设置灯光 */ //设置环境光 gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_AMBIENT, AmbientBuffer); //设置漫射光 gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_DIFFUSE, dif

楼中望月 3867
上一篇: android opengl es 粒子系统
下一篇: android opengl es 变形效果
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值