Android(安卓)OpenGL学习笔记(二)--三角形的绘制.
16lz
2022-01-12
前面讲了一些Android OpenGl 的概念问题,这一节讲给大家讲一下如何画一个三角现出来.
一、新建一个Android工程命名为:OpenGL_Lesson2.
二、修改OpenGL_Lesson2.java代码如下:
view plain copy to clipboard print ?- package com.android.tutor;
- import android.app.Activity;
- import android.os.Bundle;
- public class OpenGL_Lesson2 extends Activity{
- private OpenGlViewmOpenGlView;
- public void onCreate(BundlesavedInstanceState){
- super .onCreate(savedInstanceState);
- mOpenGlView= new OpenGlView( this );
- setContentView(mOpenGlView);
- }
- }
- package com.android.tutor;
- import android.app.Activity;
- import android.os.Bundle;
- public class OpenGL_Lesson2 extends Activity{
- private OpenGlViewmOpenGlView;
- public void onCreate(BundlesavedInstanceState){
- super .onCreate(savedInstanceState);
- mOpenGlView=new OpenGlView( this );
- setContentView(mOpenGlView);
- }
- }
三、新建一个类OpenGlView.java继承与GLSurfaceView,代码如下:
view plain copy to clipboard print ?- package com.android.tutor;
- import android.content.Context;
- import android.opengl.GLSurfaceView;
- public class OpenGlView extends GLSurfaceView{
- private OpenGlRendermOpenGlRender;
- public OpenGlView(Contextcontext){
- super (context);
- mOpenGlRender= new OpenGlRender();
- setRenderer(mOpenGlRender);
- }
- }
- package com.android.tutor;
- import android.content.Context;
- import android.opengl.GLSurfaceView;
- public class OpenGlView extends GLSurfaceView{
- private OpenGlRendermOpenGlRender;
- public OpenGlView(Contextcontext){
- super (context);
- mOpenGlRender=new OpenGlRender();
- setRenderer(mOpenGlRender);
- }
- }
四、新建一个OpenGlRender.java类继承与Renderer,代码如下:
view plain copy to clipboard print ?- package com.android.tutor;
- import java.nio.ByteBuffer;
- import java.nio.ByteOrder;
- import java.nio.FloatBuffer;
- import java.nio.ShortBuffer;
- import javax.microedition.khronos.egl.EGLConfig;
- import javax.microedition.khronos.opengles.GL10;
- import android.opengl.GLSurfaceView.Renderer;
- public class OpenGlRender implements Renderer{
- private float _red=0f;
- private float _green=25f;
- private float _blue=200f;
- private ShortBuffer_indexBuffer;
- private FloatBuffer_vertexBuffer;
- private short []_indicesArray={ 0 , 1 , 2 };
- private int _nrOfVertices= 3 ;
- @Override
- public void onSurfaceCreated(GL10gl,EGLConfigconfig){
- gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
- initTriangle();
- }
- @Override
- public void onSurfaceChanged(GL10gl, int width, int height){
- gl.glViewport( 0 , 0 ,width,height);
- }
- @Override
- public void onDrawFrame(GL10gl){
- gl.glClearColor(_red,_green,_blue, 1 .0f);
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
- gl.glColor4f( 0 .5f,0f,0f, 0 .5f);
- gl.glVertexPointer(_nrOfVertices,GL10.GL_FLOAT, 0 ,_vertexBuffer);
- gl.glDrawElements(GL10.GL_TRIANGLES,_nrOfVertices,GL10.GL_UNSIGNED_SHORT,_indexBuffer);
- }
- private void initTriangle(){
- //floathas4bytes
- ByteBuffervbb=ByteBuffer.allocateDirect(_nrOfVertices* 3 * 4 );
- vbb.order(ByteOrder.nativeOrder());
- _vertexBuffer=vbb.asFloatBuffer();
- //shorthas4bytes
- ByteBufferibb=ByteBuffer.allocateDirect(_nrOfVertices* 2 );
- ibb.order(ByteOrder.nativeOrder());
- _indexBuffer=ibb.asShortBuffer();
- float []coords={
- - 0 .5f,- 0 .5f,0f, //(x1,y1,z1)
- 0 .5f,- 0 .5f,0f, //(x2,y2,z2)
- 0f, 0 .5f,0f //(x3,y3,z3)
- };
- _vertexBuffer.put(coords);
- _indexBuffer.put(_indicesArray);
- _vertexBuffer.position( 0 );
- _indexBuffer.position( 0 );
- }
- }
- package com.android.tutor;
- import java.nio.ByteBuffer;
- import java.nio.ByteOrder;
- import java.nio.FloatBuffer;
- import java.nio.ShortBuffer;
- import javax.microedition.khronos.egl.EGLConfig;
- import javax.microedition.khronos.opengles.GL10;
- import android.opengl.GLSurfaceView.Renderer;
- public class OpenGlRender implements Renderer{
- private float _red=0f;
- private float _green=25f;
- private float _blue=200f;
- private ShortBuffer_indexBuffer;
- private FloatBuffer_vertexBuffer;
- private short []_indicesArray={ 0 , 1 , 2 };
- private int _nrOfVertices= 3 ;
- @Override
- public void onSurfaceCreated(GL10gl,EGLConfigconfig){
- gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
- initTriangle();
- }
- @Override
- public void onSurfaceChanged(GL10gl, int width, int height){
- gl.glViewport(0 , 0 ,width,height);
- }
- @Override
- public void onDrawFrame(GL10gl){
- gl.glClearColor(_red,_green,_blue,1 .0f);
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
- gl.glColor4f(0 .5f,0f,0f, 0 .5f);
- gl.glVertexPointer(_nrOfVertices,GL10.GL_FLOAT,0 ,_vertexBuffer);
- gl.glDrawElements(GL10.GL_TRIANGLES,_nrOfVertices,GL10.GL_UNSIGNED_SHORT,_indexBuffer);
- }
- private void initTriangle(){
- //floathas4bytes
- ByteBuffervbb=ByteBuffer.allocateDirect(_nrOfVertices*3 * 4 );
- vbb.order(ByteOrder.nativeOrder());
- _vertexBuffer=vbb.asFloatBuffer();
- //shorthas4bytes
- ByteBufferibb=ByteBuffer.allocateDirect(_nrOfVertices*2 );
- ibb.order(ByteOrder.nativeOrder());
- _indexBuffer=ibb.asShortBuffer();
- float []coords={
- -0 .5f,- 0 .5f,0f, //(x1,y1,z1)
- 0 .5f,- 0 .5f,0f, //(x2,y2,z2)
- 0f,0 .5f,0f //(x3,y3,z3)
- };
- _vertexBuffer.put(coords);
- _indexBuffer.put(_indicesArray);
- _vertexBuffer.position(0 );
- _indexBuffer.position(0 );
- }
- }
五、运行之,效果如下:
今天晚上就先不做详细解释了!改日在加上!谢谢~
更多相关文章
- 如何动态的设置Relative Layout中按钮的layout_align_parent_rig
- adb命令执行java代码
- Android图片堆叠效果实现
- Android(安卓)WebView加载HTML表单并通过javascript提交
- android上传图片到服务器,求服务器那边和android的Activity的完整
- 自定义Android菜单背景
- Android设备的识别
- Maven + Eclipse + Android(安卓)环境搭建
- android studio的Gradle各种配置汇总