首页 > 其他分享 >Android OpenGL ES入门

Android OpenGL ES入门

时间:2023-12-05 18:14:12浏览次数:31  
标签:glSurfaceView 渲染 OpenGL GLSurfaceView import Android ES

1.OpenGL 和OpenGL ES

  OpenGL(Open Graphics Library)是一种用于渲染2D和3D图形的跨平台编程接口。OpenGL提供了一套标准的函数和接口,使开发人员能够在各种操作系统上创建高性能的图形应用程序,这些操作系统包括Windows、Linux、macOS和一些嵌入式系统。OpenGL ES(OpenGL for Embedded Systems)是OpenGL的嵌入式系统版本,专门设计用于移动设备、嵌入式系统和其他资源受限的环境。与标准的OpenGL相比,OpenGL ES经过精简和优化,以适应移动设备和嵌入式系统的硬件和性能要求。

  它的应用场景如下:

  1. 游戏开发:移动游戏通常需要高性能的图形渲染,以呈现复杂的场景、光影效果和3D模型。OpenGL ES是移动游戏开发的主要工具之一,许多流行的移动游戏都使用它来实现图形渲染。
  2. 图形用户界面GUI:移动应用程序的用户界面通常包含复杂的图形元素,如按钮、滑块、图标等。OpenGL ES可用于创建流畅、响应迅速的用户界面,同时提供各种视觉效果。
  3. 地图和导航应用:在需要呈现复杂地图、导航路径和地理信息的应用中,OpenGL ES可以用于实现高性能的地图渲染。
  4. 娱乐和多媒体应用:通过OpenGL ES,开发者可以创建高质量的娱乐和多媒体应用,包括图像和视频编辑应用,艺术创作工具等。

2.第一个OpenGL ES应用程序

  这个应用程序的功能非常简单,它要做的是初始化OpenGL并不停地清空屏幕。初始化OpenGL使用的类是GLSurfaceView,它可以处理OpenGL初始化过程中比较基本的操作,如配置显示设备,在后台线程中渲染,渲染是在显示设备中一个称为surface的特定区域完成的。在使用GLSurfaceView的时候,我们要处理好Activity生命周期事件,在Activity暂停的时候要释放资源,在Activity恢复的时候要重新恢复资源。

  完整的代码如下:

package com.example.opengles20

import android.app.ActivityManager
import android.content.Context
import android.opengl.GLSurfaceView
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast

class MainActivity : AppCompatActivity() {
    private lateinit var glSurfaceView: GLSurfaceView
    var rendererSet=false
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        glSurfaceView= GLSurfaceView(this)
     //检查设备是否支持OpenGL ES 2.0 val activityManager=getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager val configurationInfo=activityManager?.deviceConfigurationInfo val support:Boolean= configurationInfo?.reqGlEsVersion!! >= 0x20000 if(support){//配置渲染表面 glSurfaceView.setEGLContextClientVersion(2) glSurfaceView.setRenderer(MyRenderer()) rendererSet=true } else{ Toast.makeText(this,"这台设备不支持OpenGL ES 2.0",Toast.LENGTH_SHORT).show() return } setContentView(glSurfaceView) } override fun onPause() { super.onPause() if(rendererSet){ glSurfaceView.onPause() } } override fun onResume() { super.onResume() if(rendererSet){ glSurfaceView.onResume() } } }
package com.example.opengles20


import android.opengl.GLES20.*
import android.opengl.GLSurfaceView.Renderer
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

class MyRenderer:Renderer {
    override fun onSurfaceCreated(p0: GL10?, p1: EGLConfig?) {
        glClearColor(0.0F,1.0F,0.0F,0.0F)//设置清除所使用的颜色,参数分别代表红绿蓝和透明度
    }

    override fun onSurfaceChanged(p0: GL10?, width: Int, height: Int) {
        glViewport(0,0,width,height)
     //是一个用于设置视口的函数,视口定义了在屏幕上渲染图形的区域。这个函数通常用于在渲染过程中指定绘图区域的大小和位置
     //前两个参数x,y表示视口左下角在屏幕的位置
} override fun onDrawFrame(p0: GL10?) { glClear(GL_COLOR_BUFFER_BIT)//清除帧缓冲区内容,和glClearColor一起使用 } }

  Renderer是一个接口,代表渲染器,图像的绘制就是由它控制的,它里面有三个方法需要实现:

  1. onSurfaceCreated:当surface被创建的时候,GLSurfaceView会调用这个方法,这发生在应用程序第一次运行的时候,并且当设备被唤醒或者用户从其他Activity返回的时候也可能被调用,也就是说该方法可能被多次调用
  2. onsurfaceChanged:每次surface尺寸发生变化的时候,这个方法会被GLSurfaceView调用,横竖屏切换的时候尺寸会发生变化
  3. onDrawFrame:当绘制一帧时,这个方法会被GLSurfaceView调用,在这个方法中,我们一定要绘制一些东西,因为这个方法返回时,渲染缓冲区会被交换并显示在屏幕上,如果什么都没有画,会看到糟糕的闪烁效果

标签:glSurfaceView,渲染,OpenGL,GLSurfaceView,import,Android,ES
From: https://www.cnblogs.com/luqman/p/gl.html

相关文章

  • Salesforce认证考试,这5招让你轻松过关!
    认证是很多求职者获得第一份Salesforce工作的敲门砖。认证不仅是个人能力的体现,而且在学习备考的过程中,可以更系统地梳理知识,了解最新的产品和功能,对Salesforce有更全面和深入的认识。大多数Salesforce从业者都至少持有一项认证,并且自由侠部落之前发布的薪酬调查报告显示,认证会......
  • Salesforce LWC学习(四十六) 自定义Datatable实现cell onclick功能
    本篇参考:https://developer.salesforce.com/docs/component-library/bundle/lightning-datatable背景:我们有时会有这种类似的需求,显示Account列表,Account列除了需要显示Account信息,还需要显示其他的内容,比如当前Account有多少Opportunity,有多少Contact数量。点击数量信息,可以显示......
  • pytest框架学习-fixture
    一、fixture是什么被@pytest.fixture()装饰器装饰的函数就是一个fixture,fixture可以灵活的为不同范围的测试用例提供前置和后置操作,以及向测试用例传递测试数据。 二、fixture定义@pytest.fixture(scope=“function”,params=None,autouse=False,ids=None,name=None)参数说明......
  • android之使用可编辑和不可编辑的提示/文本编辑文本之Android
    请您参考如下方法: 整个东西不是编辑文本,而是布局。您可以按如下方式实现该效果。 Java<LinearLayoutandroid:id="@+id/container"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizo......
  • 随机森林的nodesize值
    首先,什么是nodesize值,以及它的含义和作用。nodesize值是指定每个叶子节点最少包含的样本数量的整数值,它是随机森林算法的一个重要的参数,它影响了随机森林的复杂度和泛化能力。nodesize值的含义和作用是控制决策树的生长和剪枝,以及随机森林的随机性和准确性。当nodesize值较小......
  • SAP、ERP、SRM、CRM、WMS、TMS、MES、APS、PLM、OA、HR系统都是些什么?
     一、基础定义简称中文名简述核心模块示例系统英文全称SAP先进的企业资源计划ERP软件适用于中大型企业,供应链管理方面,SAP系统可以实现全过程跟踪,对供应商进行评价和管理,以及与第三方物流公司进行对接等功能。采购、库存(MM)、销售(SD)、生产制造业务(PP)、财务......
  • Cookies和Session
    Cookies和Session都是为了解决HTTP协议无状态性而引入的技术,它们用于在多个请求之间保持用户状态。Cookies存储在客户端;Session存储在服务器端;两者怎么联系使得http保持了用户状态呢?其实服务器首先创建session,生成sessionID,并通过cookie返回给了浏览器,这样浏览器就获得了sessi......
  • ADO.Net DataAccess 常用方法ExecuteNonQuery ExecuteReader ExecuteDataSet
    1///<summary>2///Standardinterfacefordataaccessusingstoredprocedures3///</summary>4publicinterfaceIDataAccess5{6stringConnectionString{get;set;}7SqlConnectionCreateConnecti......
  • Scope api1 not found in store. IdentityServer4.Validation.TokenRequestValidator:
    看明白了这个报错,说是scopeapi在授权服务器没有定义,但是一直不知道哪出错,我寻思也定义了这个资源来着但其实并没有,说的是scope不是说的resource,所以需要再定义一个Scope  ......
  • Educational Codeforces Round 159 总结
    最失败的一集。C开题顺序搞错,不小心先开了C,以为是A。还好C不难。题意大概是在给定的数组最后添一个数(所有数两两不同),再自定义一个数\(k\),数组中每个数可以加上若干个\(k\),最后使得所有数字相等。要求加\(k\)的次数最少。如果不加最后一个数,那么显然把所有的数加到与最大......