`
gjhappyyy
  • 浏览: 260604 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

OpenGL ES之Must use a native order direct Buffer解决方案

 
阅读更多

今天做了一个OpenGL ES的小例子,中间遇到一些小插曲,创建三角形顶点缓存的时候使用下面的方式。

private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{
		0,one,0,
		-one,-one,0,
		one,-one,0,
	});

测试环境分别是2.3.1及3.0均报 java.lang.IllegalArgumentException: Must use a native order direct Buffer异常。最后发现不能通过这种方式创建顶点缓存数组。下面是正确的代码,大家可以参考一下噢。

 

import java.nio.Buffer;
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.app.Activity;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;
import android.util.Log;

public class OpenGLActivityDemo1 extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Renderer render = new GLRender();
        GLSurfaceView glView = new GLSurfaceView(this);
        glView.setRenderer(render);
        setContentView(glView);
    }
}
class GLRender implements Renderer{

	private String TAG = "GLRender";
	float roateTri;//用于三角形的角度
	float roateQuad;//用于四边形的角度
	int one = 0x10000;
	/*//三角形三个顶点
	private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{
		0,one,0,
		-one,-one,0,
		one,-one,0,
	});
	//四边形四个顶点
	private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{
			-one,one,0,
			one,one,0,
			one,-one,0,
			-one,-one,0,
	});*/
	int [] colorArray = {
			one,0,0,one,
			0,one,0,one,
			0,0,one,one,
	};
	int [] triggerArray ={
			0,one,0,
			-one,-one,0,
			one,-one,0};
	int []  quaterArray = {
			one,one,0,
			-one,one,0,
			one,-one,0,
			-one,-one,0
	};
	
	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		// TODO Auto-generated method stub
		Log.i(TAG, "onSurfaceCreated");
		//告诉系统对透视进行修正,会使透视图看起来好看点
		gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
		//黑色背景
		gl.glClearColor(0, 0, 0, 0);//红,绿,蓝,apaha
		//启动阴影平滑 
		gl.glShadeModel(GL10.GL_SMOOTH);
		
		//设置深度缓存
		gl.glClearDepthf(1.0f);
		//启用深度测试
		gl.glEnable(GL10.GL_DEPTH_TEST);
		//所做深度测试的类型
		gl.glDepthFunc(GL10.GL_LEQUAL);
	}

	@Override
	public void onSurfaceChanged(GL10 gl, int width, int height) {
		// TODO Auto-generated method stub
		Log.i(TAG, "onSurfaceChanged width:"+width+" height:"+height);//1920 944
		
		float radio = (float)width/height;
		
		//设置OpenGL场景的大小
		gl.glViewport(0, 0, width, height);
		//设置投影矩阵,投影矩阵负责为场景增加透视
		gl.glMatrixMode(GL10.GL_PROJECTION);
		//重置投影矩阵
		gl.glLoadIdentity();
		//设置视口的大小 前四个参数去顶窗口的大小,分别是左,右,下,上,后两个参数分别是在场景中所能绘制深度的起点和终点
		gl.glFrustumf(-radio, radio, -1, 1, 1, 10);
		//指明任何新的变换即那个会影响 模型观察矩阵
		gl.glMatrixMode(GL10.GL_MODELVIEW);
		gl.glLoadIdentity();
		
	}

	@Override
	public void onDrawFrame(GL10 gl) {
		// TODO Auto-generated method stub
		
		Log.i("GLRender", "onDrawFrame");
		
		roateTri +=0.5f;
		roateQuad-=0.5f;
		
		//清除屏幕和深度缓存
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
		// 重置当前的模型观察矩阵
		gl.glLoadIdentity();
		//移动当前中心点,左移1.5单位,并移入屏幕6.0,y不变
		//注意:屏幕内移动的单位数必须小于前面我们通过
		//glFrustumf方法所设置的最远距离,否则显示不出来。
		//腰围OpenGL设置一个顶点数组,故需要告诉OpenGL要设置
		//顶点这个功能。
		//开启顶点设置功能
		gl.glTranslatef(-1.5f, 0.0f, -6.0f);
		
		//设置某无题沿着指定的轴旋转
		//参数1:旋转的角度
		//后三个参数共通决定旋转的方向
		//注意:要在画图前,使用旋转
		gl.glRotatef(roateTri, 0.0f, -1.0f, 0.0f);
		
		//开启颜色渲染功能
		gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
		//设置颜色,平滑着色
		gl.glColorPointer(4, GL10.GL_FIXED, 0, bufferUtil(colorArray));
		
		//允许设置顶点
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		//设置三角形
		//参数1:描述顶点的尺寸,本例中使用X,Y,Z坐标系,所以是3
		//参数2:描述顶点的类型,本例中数据是固定的,所以使用了GL_FIXED表示固定顶点
		//参数3:描述步长
		//参数4:顶点缓存,即我们创建的顶点数组
		gl.glVertexPointer(3, GL10.GL_FIXED, 0, bufferUtil(triggerArray));
		//绘制三角形
		//参数1:绘制模式,GL_TRIANGLES:表示绘制三角形
		//参数2:开始位置
		//参数3:要绘制的顶点计数
		gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
		
		//重置当前的模型观察矩阵
		gl.glLoadIdentity();
		
		
		//关闭颜色渲染
		gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
		
		//左移1.5单位,并移入屏幕6.0
		gl.glTranslatef(1.5f, 0.0f, -6.0f);
		
		gl.glRotatef(roateQuad, 1.0f, 0.0f, 0.0f);
		
		//开启颜色渲染功能
		gl.glEnableClientState(GL10.GL_COLOR_BUFFER_BIT);
		//设置颜色,单调着色 (r,g,b,a)
		gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);
		
		//设置和绘制正方形
		gl.glVertexPointer(3, GL10.GL_FIXED, 0, bufferUtil(quaterArray));
		gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
		
		//关闭颜色渲染
		gl.glDisableClientState(GL10.GL_COLOR_BUFFER_BIT);
		//取消顶点设置
		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
		
	}
	/*
	 * OpenGL 是一个非常底层的画图接口,它所使用的缓冲区存储结构是和我们的 java 程序中不相同的。
	 * Java 是大端字节序(BigEdian),而 OpenGL 所需要的数据是小端字节序(LittleEdian)。
	 * 所以,我们在将 Java 的缓冲区转化为 OpenGL 可用的缓冲区时需要作一些工作。建立buff的方法如下
	 * */
	public Buffer bufferUtil(int []arr){
		 IntBuffer mBuffer ;
		 
		 //先初始化buffer,数组的长度*4,因为一个int占4个字节
		ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);
		//数组排列用nativeOrder
	     qbb.order(ByteOrder.nativeOrder());
	    
	     mBuffer = qbb.asIntBuffer();
	     mBuffer.put(arr);
	     mBuffer.position(0);
	     
	     return mBuffer;
	}
	
}

 

 

运行效果是画了一个三角形和长方形,并设置了填充颜色,及旋转效果。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Android Native层使用opengl es渲染yuv420

    Android Native层使用opengl es渲染yuv420,通过egl绑定android的surface,直接在native层进行渲染 具体使用见http://blog.csdn.net/lidec/article/details/73732369#comments

    OpenGL ES 2 for Android A Quick-Start Guide

    《OpenGL ES 2 for Android: A Quick-Start Guide》是一本专为Android开发者设计的实用指南,旨在帮助读者快速掌握OpenGL ES 2的核心概念和技术,并应用于Android应用开发中。本书通过丰富的示例代码和清晰易懂的...

    OPENGL ES 3.0编程指南

    它通常与OpenGL ES不直接交互,但在构建例如3D地理信息系统或可视化应用时,可能会利用Elasticsearch来检索和组织数据,然后通过OpenGL ES进行呈现。 总的来说,OpenGL ES 3.0编程指南涵盖了移动和嵌入式设备图形...

    基于gbm_drm平台的opengles开发示例

    本示例基于GBM (Graphics Buffer Manager) 和DRM (Direct Rendering Manager) 平台,利用EGL (Embedded GL) 进行初始化和上下文管理,为在没有X Server的环境中实现OpenGL ES编程提供了一种方法。 首先,我们来深入...

    OpenGL ES 3.0 Programming Guide, 2nd Edition

    OpenGL® ES™ is the industry’s leading software interface and graphics library for rendering sophisticated 3D graphics on handheld and embedded devices. The newest version, OpenGL ES 3.0, makes it ...

    opengl配置解决方案

    OpenGL 配置解决方案 OpenGL 是一个跨平台的图形编程接口,允许开发人员创建交互式三维图形应用程序。下面是关于 OpenGL 配置解决方案的一些知识点: 一、OpenGL 坐标系 在 OpenGL 中,默认坐标系与 Windows 中...

    OPENGL ES 3.0编程指南.pdf

    OpenGL ES 3.0编程指南是面向初学者的优秀教程,旨在帮助读者深入理解并掌握OpenGL ES 3.0这一移动设备和嵌入式系统上的图形处理标准。OpenGL ES(Embedded Systems)是OpenGL的轻量级版本,专为资源有限但需要高...

    OpenGL与OpenGLES在开发过程中的异同.pdf

    ### OpenGL与OpenGLES在开发过程中的异同 #### 一、引言 OpenGL与OpenGLES都是由Khronos Group维护的跨平台图形应用程序接口(API)。它们为开发人员提供了绘制高质量2D和3D图形的能力。OpenGL主要用于桌面操作系统...

    Unity3D调用Native OpenGL渲染方式

    Unity3D是一款强大的跨平台游戏开发引擎,广泛应用于2D和3D游戏、虚拟现实(VR)和增强现实(AR)应用的制作。...这对于那些需要定制图形解决方案或者需要充分利用硬件性能的应用来说,是一种非常有价值的实践方式。

    OpenGL ES 3.0.2 spec

    ### OpenGL ES 3.0.2 规范详解 #### 一、概述 OpenGL ES (Open Graphics Library for Embedded Systems) 是一种专为嵌入式设备设计的图形渲染库,广泛应用于移动设备、游戏主机和其他资源受限的系统。OpenGL ES ...

    Qt+openglEs2加载3D模型,平移、旋转、拾取模型

    Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt...

    opengl es 1.0 specification

    OpenGL® ES is a royalty-free, cross-platform API for full-function 2D and 3D graphics on embedded systems - including consoles, phones, appliances and vehicles. It consists of well-defined subsets of...

    OpenGL ES编程指南

    OpenGL ES编程指南是一本针对移动设备和嵌入式系统的图形编程权威书籍,主要聚焦于OpenGL ES 2.0版本。OpenGL ES(Embedded Systems)是OpenGL的轻量级版本,专为资源有限但需要高质量3D图形处理能力的平台设计,如...

    OpenGL ES 2 for Android A Quick

    ### OpenGL ES 2.0 for Android 快速入门指南 #### 一、引言 《OpenGL ES 2.0 for Android》是一本针对Android平台上OpenGL ES 2.0技术的全面指南,它不仅包含了深入的技术讲解,还有丰富的实战案例。本书由Kevin ...

    opengles画中画功能

    OpenGL ES(OpenGL for Embedded Systems)是OpenGL的一个精简版本,专为嵌入式设备,特别是移动设备如智能手机和平板电脑设计,用于处理2D和3D图形。在Android系统中,OpenGL ES是主要的图形库,它允许开发者创建...

    OpenglES3.0完整环境.rar

    在本压缩包“OpenglES3.0完整环境.rar”中,你将找到搭建OpenGL ES 3.0开发环境所需的所有资源,包括仿真模拟器、示例代码和CMake构建工具。 首先,让我们详细了解一下OpenGL ES 3.0的新特性: 1. **增强的顶点...

    Mali OpenGL ES SDK for Linux on ARM v2.0.0

    7. **移植性支持**:针对不同版本的OpenGL ES提供兼容性解决方案,确保代码能在不同设备上运行。 Mali OpenGL ES SDK v2.0.0的发布,带来了以下主要改进: 1. **性能提升**:优化了图形处理流程,减少了延迟,提高...

    OpenGL ES 2.0规范(中文版)——本人自己翻译总结的

    - **帧缓存的区别**:OpenGLES命令对window-system-provided framebuffers的影响最终由分配帧缓存资源的窗口系统控制。窗口系统决定了OpenGL ES在任何特定上下文中的行为。 #### 六、OpenGL ES 2.0与OpenGL 2.0的...

    OpenGLES demo - 10. DrawElements, Vertex Buffer和Index Buffer

    在OpenGLES编程中,`drawElements`、`Vertex Buffer`和`Index Buffer`是三个非常重要的概念,它们是高效渲染3D图形的关键技术。在这个OpenGLES入门课程的第10章中,我们将深入探讨这三个主题,了解它们的工作原理...

    opengles之点精灵介绍

    OpenGL ES(Open Graphics Library for Embedded Systems)是OpenGL的嵌入式版本,主要为移动设备如智能手机、平板电脑等提供3D图形渲染能力。在OpenGL ES中,“点精灵”(Point Sprites)是一种特殊的渲染技术,它...

Global site tag (gtag.js) - Google Analytics