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

从零到一:AVL Cruise与Matlab联合仿真DLL配置的避坑指南

本文详细介绍了AVL Cruise与Matlab联合仿真DLL配置的全流程,包括编译器选择、环境变量设置、DLL编译与模型导出等关键步骤。针对常见问题如版本匹配、路径错误等提供了实用解决方案,帮助工程师高效实现控制策略与整车性能仿真的无缝对接。

weixin_29054399的博客 566

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

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

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

Centos7.6操作系统安装+Bond配置(600GB磁盘版本)

1.安装前准备工作 准备centos7.6操作系统镜像 CentOS-7-x86_64-DVD-1810.iso 服务器安装一般都是在BMC界面操作,所以安装前需要在BMC界面挂载好操作系统镜像 重启服务器后自动进入安装界面。 华为大数据集群安装操作系统配置

小时光 6006

Docker 与容器技术的未来:从 OCI 标准到 eBPF 的演进

OCI 的核心目标是创建一个开放的、厂商中立的容器技术标准。这意味着,只要一个容器镜像符合 OCI 镜像格式规范,它就可以在任何符合 OCI 运行时规范的容器运行时上运行。eBPF 是一种革命性的技术,它允许在 Linux 内核中安全地运行沙盒程序,而无需修改内核源代码或加载内核模块。这些程序可以注册到内核中的各种事件点(如网络包到达、系统调用、函数调用/返回),并在事件发生时执行自定义逻辑。核心思想是:在不将数据复制到用户空间的情况下,程序可以直接在内核中处理数据,极大地提高了效率和性能。

专栏 1381

利用Xfermode 自定义形状View

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

weixin_33804990的博客 103

超详细!新手必看STM32-DMA配置与实验(串口使用DMA发送数据)

DMA就是:直接存储器访问。DMA传输数据从一个地址空间复制到另一个地址空间,提供在外设和存储器或者存储器和存储器之间的高速数据传输。

qq_1033275663的博客 2万+

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

别再为STM32F407的USB高速通信发愁了!手把手教你用USB3320(ULPI接口)搞定硬件设计

本文详细介绍了STM32F407通过USB3320(ULPI接口)实现高速USB通信的硬件设计实战。从USB3320的选型优势到原理图设计避坑,再到PCB布局和固件配置,提供了一套完整的解决方案。特别针对USB PHY芯片的常见问题,如供电处理、信号完整性和初始化代码,给出了专业建议和调试技巧,帮助工程师高效完成高速USB通信设计。

weixin_42527401的博客 385

深入解析:AndroidManifest.xml 与 Qt 6.7.0 的整合

本文探讨了在Qt 6.7.0和CMake构建Android应用时,AndroidManifest.xml未被正确识别的问题。通过分析CMake配置错误、文件路径问题等可能原因,提出了在CMakeLists.txt中明确指定路径、确保目录结构正确等解决方案,并给出了示例项目演示。文章强调正确配置AndroidManifest.xml对获取权限和应用功能的重要性,为Qt开发者提供了实用的调试建议。

2501_90323865的博客 109

安卓OpenGL ES——透视投影

OpenGL ES 透视投影

Zach_z的博客 2289

指纹浏览器指纹工厂(下):基于真实设备数据特征的马尔可夫链生成与校验

本文揭示了静态指纹生成算法在高级风控时序追踪下的致命缺陷,指出违背设备演进马尔可夫性质(如无状态跳跃、因果断裂)是导致指纹存活率骤降的核心原因。通过分析风控系统的时序状态机与多维特征验证机制,提出基于隐马尔可夫模型(HMM)的动态指纹架构:以真实设备的状态转移链为蓝本,构建异步演进的“数字基因熔炉”,通过非均匀时间步长、突发事件响应及微观因果绑定,模拟软硬件独立更新的物理法则。最终实现指纹在时间维度与微观特征上的自洽,规避风控的时序陷阱。

数据知道的博客 415

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

(ICLR 2025)【源码讲解+复现】TIMER-XL: Long-Context Transformers for Unified Time Series Forecasting

本文提出了一种统一的多变量时序预测模型Timer-XL,其核心创新包括:1)采用自回归解码器架构,将多变量时序预测统一为next-token预测问题;2)设计TimeAttention机制,通过相对位置编码和因果掩码捕获时序位置和变量间交互;3)支持长上下文预训练以提升零样本迁移能力。模型架构包含嵌入层、时间感知注意力块和预测头,采用MSE损失进行端到端训练。实验表明该方法在多种时序任务上表现优异,特别是在长跨度预测和少样本场景下。代码实现提供了完整的模型定义、数据加载和训练流程,支持自定义配置参数。

1145

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android OpenGL | ES 实现雾气效果

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

yff1123570554的专栏 1071

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

安卓进阶——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、付费专栏及课程。

余额充值