android opengl es 简单实例

Android OpenGL ES学习笔记之实现OpenGL ES接口 一、GLSurfaceView介绍 在Android平台上实现OpenGL的view很简单,只需要用到GLSurfaceView和GLSurfaceView.Renderer。 GLSurfaceView是用来连接OpenGL ES和android的view结构的.GLSurfaceView位于android.opengl包类,继承自SurfaceView public class GL 阅读详情

      我就是个悲剧的娃,想做个android的3d游戏,所以就把之前没看过的opengl拿过来看,一看不得了,这不,调试一个三角形和正方形就弄了这一晚上,严重影响了本人的睡眠,可能还会老几岁。。。。

      解决了Must use a native order direct Buffer ,及颜色绘不上去 的问题。废话不说了,把今天的实例贴上来,本实例分FirstGL 类与MyRenderer类。

      鉴于我也正忙着学其它的(比如jpct-ae),所以,也只能慢慢的把详细注释加上去,今晚先附上此篇的注释,后续的,我当然也会一点一点加上去的,但时不是那么快:-)

 

 

Activity类:

package sim.feel;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

/**
 * Activity类
 *
 * @author Sim
 *
 */
public class FirstGL extends Activity {
    // GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。
    // 更多GLSurfaceView信息见
    // http://120.132.134.205/cmdn/supesite/?uid-5358-action-viewspace-itemid-6527
    private GLSurfaceView glSurfaceView;

    // 这是渲染器(Render)的公共接口,它的任务就是调用OpenGL的API来作帧的渲染。
    // 更多MyRenderer信息见
    // http://dev.10086.cn/cmdn/supesite/?uid-5358-action-viewspace-itemid-6528
    private MyRenderer renderer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 实例化MyRenderer,GLSurfaceView类
        renderer = new MyRenderer();
        glSurfaceView = new GLSurfaceView(this);
        // 设置渲染器
        glSurfaceView.setRenderer(renderer);
        // 为当前Activity类指定视图
        setContentView(glSurfaceView);
    }
}

 

MyRenderer类:

 

package sim.feel;

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

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

import android.opengl.GLSurfaceView.Renderer;

public class MyRenderer implements Renderer {
    // 关于0x10000注明:Thus 0x10000 means a hexadecimal memory address 10000
    // 就像cai_huan25大哥说的,大家把它理解为google画图单位就ok

    static int one = 0x10000;
    // Int型的缓冲区,下面定义了四个分别是三角形,正方形,三角形颜色,正方形颜色的缓冲区
    private static IntBuffer triangleBuffer;
    private static IntBuffer quaterBuffer;
    private static IntBuffer color1Buffer;
    private static IntBuffer color2Buffer;
    // 三角形顶点,分别对应x,y,z,因此程序为二维,所以z轴上皆为0
    private int[] vertices = new int[] {
            0, one, 0,
            -one, -one, 0,
            one, -one, 0
    };
    //以正方形为例,说明坐标轴:坐标中心位于正方形中心,下面四个顶点分别是右上角,左上角,右下角,左下角
    private int[] quater = new int[] {
            one, one, 0,
            -one, one, 0,
            one, -one, 0,
            -one, -one, 0
    };
    //定义每个顶点的颜色,每个顶点的颜色皆由(r,g,b,a)
    //三角形各顶点颜色(三个顶点)
    private int[] color = new int[] {
            one, 0, 0,one,
            0, one,0, one,
            0,0,one, one
    };
    //正方形各顶点颜色(4个顶点)
    private int[] color2 = new int[] {
            one, 0, 0, 0,
            one, one, 0, 0,
            one,one,one, 0,
            0, one, one, 0
    };

    //实现Renderer接口的方法onDrawFrame
    @Override
    public void onDrawFrame(GL10 gl) {
        //因为在glVertexPointer或者是glColorPointer方法中要求传入一个直接的Buffer,
        //所以下面的vbb1,vbb2,colorvbb1,colorvbb2皆为创建一个直接的Buffer
        //以第一个为例说明,首先用ByteBuffer的allocateDirect方法来分配新的直接字节缓冲区。
        //因1个Int有4个byte,所以将vertices的长度乘以4
        // order(ByteOrder.nativeOrder)方法以本机字节顺序来修改此缓冲区的字节顺序
        //然后用asIntBuffer方法创建此字节缓冲区的视图,作为 int 缓冲区。
        //put方法将给定 int 写入此缓冲区的当前位置,然后该位置递增。
        //position方法设置此缓冲区的位置。如果标记已定义并且大于新的位置,则要丢弃该标记。
       

        // triangle的ByteBuffer
        ByteBuffer vbb1 = ByteBuffer.allocateDirect(vertices.length * 4);
        vbb1.order(ByteOrder.nativeOrder());
        triangleBuffer = vbb1.asIntBuffer();
        triangleBuffer.put(vertices);
        triangleBuffer.position(0);

        // quater的ByteBuffer
        ByteBuffer vbb2 = ByteBuffer.allocateDirect(quater.length * 4);
        vbb2.order(ByteOrder.nativeOrder());
        quaterBuffer = vbb2.asIntBuffer();
        quaterBuffer.put(quater);
        quaterBuffer.position(0);

        // color的ByteBuffer
        ByteBuffer colorvbb1 = ByteBuffer.allocateDirect(color.length * 4);
        colorvbb1.order(ByteOrder.nativeOrder());
        color1Buffer = colorvbb1.asIntBuffer();
        color1Buffer.put(color);
        color1Buffer.position(0);

        // color2的ByteBuffer
        ByteBuffer colorvbb2 = ByteBuffer.allocateDirect(color2.length * 4);
        colorvbb2.order(ByteOrder.nativeOrder());
        color2Buffer = colorvbb2.asIntBuffer();
        color2Buffer.put(color2);
        color2Buffer.position(0);

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

        //以下两步为绘制颜色与顶点前必做操作
        //(颜色可采用另一种简单方式,说见http://blog.youkuaiyun.com/Simdanfeg/archive/2011/03/17/6255932.aspx)
        // 允许设置顶点
        //GL10.GL_VERTEX_ARRAY顶点数组
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        // 允许设置颜色
        //GL10.GL_COLOR_ARRAY颜色数组
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

        // 左移1.5单位,并移入屏幕6.0
        gl.glTranslatef(-1.5f, 0.0f, -6.0f);

        //GL_FIXED,GL_FLOAT,GL_UNSIGNED_BYTE
        //更多信息见  http://www.devx.com/wireless/Article/32879/1954
        //参数中的GL_FIXED表示我们之前定义的one为单位长度

        // 设置三角形
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, triangleBuffer);
        // 设置三角形颜色
        gl.glColorPointer(4, GL10.GL_FIXED, 0, color1Buffer);
        // 绘制三角形
        //GL10.GL_TRIANGLES:把每三个顶点作为一个独立的三角形。顶点3n-2,3n-1和3n定义了第n个三角形,总共绘制N/3个三角形。
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

        // 重置当前模型的观察矩阵
        gl.glLoadIdentity();

        // 左移1.5单位,并移入屏幕6.0
        gl.glTranslatef(1.5f, 0.0f, -6.0f);
        // 设置正方形
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);
        // 设置正方形颜色
        gl.glColorPointer(4, GL10.GL_FIXED, 0, color2Buffer);
        //GL_TRIANGLE_STRIP:绘制一组相连的三角形。对于奇数点n,顶点n,n+1和n+2定义了第n个三角形;
        //对于偶数n,顶点n+1,n和n+2定义了第n个三角形,总共绘制N-2个三角形。

        // 绘制正方形
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

        // 取消颜色设置
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        // 取消顶点设置
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

    }

    //实现Renderer接口的方法onSurfaceChanged
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        float ratio = (float) width / height;
        // 设置OpenGL场景的大小,(0,0)表示窗口内部视口的左下角,(w,h)指定了视口的大小
        gl.glViewport(0, 0, width, height);
        // 设置投影矩阵
        gl.glMatrixMode(GL10.GL_PROJECTION);
        // 重置投影矩阵
        gl.glLoadIdentity();
        // 设置视口的大小
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
        //以下两句告诉opengl es,以后所有的变换都将影响这个模型(即我们绘制的图形)
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    //实现Renderer接口的方法onSurfaceCreated
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

       
        // 告诉系统对透视进行修正(选择效率优先还是速度优先,这里我们选择速度优先)
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        // 用黑色来清除屏幕颜色
        gl.glClearColor(0, 0, 0, 0);
        // 启用阴影平滑
        gl.glShadeModel(GL10.GL_SMOOTH);

        // 设置深度缓存
        gl.glClearDepthf(1.0f);
        // 启用深度测试
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // 所做深度测试的类型
        gl.glDepthFunc(GL10.GL_LEQUAL);

    }
}

 

运行效果如下:

 

代码中的设置颜色和设置三角形、正方形的位置不要改动哈,不然出来的效果很奇怪。睡觉觉了

Android OpenGL ES(一)开发入门 早就听过大名鼎鼎的 OpenGL,却迟迟没有实践学习,有些惭愧。今天开始通过实践+博文方式学习掌握 OpenGL。此文对于 OpenGL 的学习分为以下部分: OpenGL 基础概念 OpenGL 坐标系理解 OpenGL 渲染管线 OpenGL 着色语言 OpenGL 基础概念 OpenGL OpenGL 即 Open Graphics Library,是一个功能强大、调用方便的底层图形库... 阅读详情

相关推荐

Android Studio + OpenGL ES 学习记录

Android Studio + OpenGL ES 学习记录 OpenGL是一种应用程序编程接口,它是一种可以对图形硬件设备特性进行访问的软件库,而OpenGL ES是OpenGL的子集,针对手机、PDA和游戏主机嵌入式设备而设计。OpenGL ES 是从 OpenGL 裁剪定制而来的,去除了 glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性,剩下最核心有用的部分。 简介 OpenGL是用于渲染2D、3D矢量图形的跨语言、跨平台的应用

huhfairy的博客 3015

Android OpenGL基础(二、坐标系统)

一、引言   在Android OpenGL基础(一、绘制三角形四边形)中,我们简单实现了绘制三角形的功能。大家可能会发现,我们声明的是一个标准设备坐标系下的等边三角形: class Triangle { // 三角形三个点的坐标值 private var triangleCoords = floatArrayOf( 0.0f, 0.5f, 0.0f, // top -0.5f, -0.5f, 0.0f, // bottom left

BC工坊 3876

OPENGL es版本和OGL 及android关系

OpenGL ES 1.0 and 1.1 - This API specification is supported by Android 1.0 and higher. OpenGL ES 2.0 - This API specification is supported by Android 2.2 (API level 8) and higher. OpenGL ES 3.0 - Th

自由理想的足迹 5254

OpenGL精简案例一

**//缓冲区 private final FloatBuffer vertexData;//上下文 private Context context;//float buffer大小 private static final int BYTES_PER_FLOAT = 4;//程序 private int program;//颜色着色器引用 private int aColorLocation;

Android小码家 540

Android studio中使用opengl es绘图

首先是使用android studio生成空白的模板文件,包含一个MainActivity文件, 在onCreate方法中参照如下注释进行修改 package com.example.wang.androiddemo; import android.opengl.GLSurfaceView; import android.support.v7.app.AppCompatActivity; i

wangrl的博客 2467

HCIP-Cloud Service DevOps Engineer V2.0 华为认证云服务 DevOps高级工程师 章节测试题+结课测试题(模拟考试题)汇总

本文为HCIP-Cloud Service DevOps Engineer V2.0 华为认证云服务DevOps高级工程师 在线课程中所有章节测试以及结课测试(HCIP-Cloud Service DevOps Engineer模拟考试)习题和答案

gaogao0305的博客 2266

Android 平台 OpenGL 环境搭建的两种方法及示例

static float triangleCoords[] = { // 按逆时针方向顺序// 设置颜色// 初始化顶点字节缓冲区// (每个浮点数占用4个字节)均同上。

说码解字 2722

告别误唤醒!S32K3xx低功耗设计避坑指南:Fast Standby模式与WISR寄存器操作详解

本文深入解析了NXP S32K3xx系列MCU在低功耗设计中常见的误唤醒问题,并提供了基于Fast Standby模式的解决方案。文章重点剖析了DCMRWF5寄存器的配置方法、WISR/WISR_64唤醒中断状态寄存器的标志位处理策略,以及如何利用32KB Standby SRAM保存唤醒状态,从而帮助开发者构建稳定可靠的汽车电子低功耗系统。

weixin_29163857的博客 362

Android核心开发之——OpenGL

OpenGL是一个跨平台的图形编程接口,用于实现2D和3D图形的渲染和处理。它提供了一系列函数和状态机来操作图形硬件,使开发者能够创建各种复杂的图形效果和交互式应用程序。OpenGL仅仅提供了底层的图形操作接口,开发者需要具备一定的图形学知识和编程技巧,才能充分利用OpenGL的功能。《Android核心技术手册》

鸿蒙的技术博客 1076

AntV G6边动画实战:手把手教你实现数据流向箭头与虚线流动效果

本文详细解析了如何使用AntV G6实现数据流向箭头与虚线流动效果,通过自定义边动画提升数据可视化的动态表现力。从基础环境搭建到核心概念讲解,再到虚线流动动画和箭头路径动画的具体实现与参数调控,帮助开发者掌握G6边动画的高级技巧,适用于网络流量监控、数据传递等场景。

weixin_28487433的博客 265

【OpenVINO】OpenVINO C# API 常用 API 详解与演示

在本文中我们基于模型推理流程,演示了OpenVINO C# API使用方法,并和OpenVINO C++API进行了对比,展示了OpenVINO C# API与C++API在使用的区别,这也对使用过C++ API的开发者十分友好,上手会十分容易。在本文中我们只展示了基础的模型推理流程代码,也对各个API进行了测试,针对其他比较高级的API方法,我们后续会继续进行测试其他API方法,向各位开发者展示其用法。

grape_yan的博客 1539

Android OpenGL入门示例:绘制三角形和正方形 (附完整源码)

Android上对OpenGl的支持是无缝的,所以才有众多3D效果如此逼真的游戏,在Camera的一些流程中也有用到GLSurfaceView的情况。本文记录OpenGL在Android上的入门级示例,绘制一个三角形和正方形。尽管功能简单,可以我捣腾了好几个晚上,大量网上文章上的代码都有点问题,不是绘制不出来就是挂了。第一个文件:MainActivity.javapackage com.examp

yanzi1225627的专栏 1万+

SMMU软件指南SMMU编程之流表(Stream Table)

SMMU使用一组内存中的数据结构来定位翻译数据,详见“转换过程概述”(Translation process overview)。SMMU_(*_)STRTAB_BASE 存储初始结构(流表,Stream Table)的基地址。流表项(Stream Table Entry, STE)包含二级(Stage 2)转换表的基址指针,同时也定位一级(Stage 1)配置结构,这些配置结构包含转换表的基址指针。 传入事务的 StreamID,由 SEC_SID 进行限定,决定了用于查找的流表,并定位相应的STE。

AI-安全-功耗 1189

android opengl es bitmap,【翻译】安卓 opengl ES教程之六——纹理

在上一篇教程中,我们主要讨论了网格,以及如何在网格中添加颜色。实际上向网格添加颜色的更普遍的做法是使用纹理。向网格添加纹理是与添加颜色有些不同的,接下来,我将展示这些操作,并解释一些基本知识。载入Bitmap第一步,载入用于生成纹理的Bitmap。你可以通过下载,生成或者从resources中加载一张图片。我这里是用的最简单的方式——从resources中直接加载一张图片。Bitmapbitma...

weixin_39742392的博客 621

第一节:初识n8n与下一代工作流自动化

本章介绍了n8n的Fair-code理念与节点式架构,对比了其与Zapier/Make的核心差异,并引导读者在n8n Cloud上完成首次界面导览,建立了工作流自动化的宏观认知。

easeyoo的专栏 105

【Claude Code 源码解析教程】总体大纲

本教程旨在深入解析 Anthropic Claude Code 项目的源码架构和实现细节。Claude Code 是一个基于 TypeScript + Bun 构建的 AI 编程助手 CLI 工具,代号 "Tengu",具有复杂的多模块架构和丰富的功能特性。本教程基于Claude Code 的源码分析来生成,将帮助您全面掌握 Claude Code 的源码架构和实现细节,为开发类似 AI 编程助手工具奠定坚实基础。

rengang66的博客 386

安卓进阶——OpenGL ES

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

Meteors.的博客 981

电机瞬态分析基础(2):理想电机的基本假设和正方向规定

电机瞬态分析基础之理想电机假设条件和正方向规定

weixin_45670943的博客 1145

安卓OpenGL ES——透视投影

OpenGL ES 透视投影

Zach_z的博客 2289

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android opengl版本,Android OpenGL ES(一)开发入门

早就听过大名鼎鼎的 OpenGL,却迟迟没有实践学习,有些惭愧。今天开始通过实践+博文方式学习掌握 OpenGL。此文对于 OpenGL 的学习分为以下部分:OpenGL 基础概念OpenGL 坐标系理解OpenGL 渲染管线OpenGL 着色语言OpenGL 基础概念OpenGLOpenGL 即 Open Graphics Library,是一个功能强大、调用方便的底层图形库,它定义了跨编程语言...

weixin_36479263的博客 3860

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

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

Android NDK opengl ES

<br />Android NDK opengl ES<br />Android 2010-05-24 08:49:25 阅读272 评论0  字号:大中小 订阅作者: 刘鹏日期: 2010-02-08本文详细介绍了如何利用 Anroid NDK 开发 native OpenGL ES程序。NDK 简介<br />Android SDK 提供了一套 OpenGL ES 接口,该接口是基于 Java 的,速度非常慢,往往很难满足需要。<br />NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动

kevin373的专栏 1489

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 特效相机实现,安卓特效相机(三) OpenGL ES 特效渲染

系列文章:特效的实现原理接下来这篇文章我们讲下特效的具体实现原理。由于预览画面的渲染是将Surface传给CameraDevice由它去绘制的,而且我没有找到什么可以接管或者添加渲染效果的接口,所以并不能直接去处理摄像头的画面。于是这里我们只能用一种游戏中常用的手段去处理,这种手段的名字叫做RTT(render to texture),中文名叫做渲染到纹理。玩法是先将我们想要处理的画面,不直接绘制...

weixin_35182280的博客 958

android view 初始化,【翻译】安卓opengl ES教程之一——初始化view

我将会写一个系列的关于安卓opengl ES的教程。对于不同的设备,opengl的原理是相通的,所以你能够很容易的移植到其他平台。我不可能记清我具体从哪里获取的这些详细信息,所以有时候我可能不能给出足够正确的引用文献。如果你认为我引用了你的文章却没有加入到引用文献中,你可以给我发邮件通知我更正。在这个样例代码中,为每个章节,我有两个不同的链接,一个是链接到安卓官方开发文档,另一个是opengl E...

weixin_34079307的博客 465

Android和OpenGL es讲解

Android和OpenGL es讲解 文章目录Android和OpenGL es讲解前言 前言 为了学习AndroidGUI之Surfaceflinger做铺垫,由于GUI贯通了GUI系列的很多知识,由于GUI系统是基于OpenGL/EGL实现的,所以为了做到事半功倍,进而先学习它。 ...

Super627890115的博客 1022

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

http://www.guidebee.info/wordpress/archives/1508 在Andorid平台上构造一个OpenGL View非常简单,主要有两方面的工作: GLSurfaceView Android平台提供的OpenGL ES API主要定义在包android.opengl ,javax.microedition.khronos.egl ,javax.micr...

u010029439的博客 146
上一篇: 初探Symbian
下一篇: android opengl es 三角形、正方形自动旋转
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值