一個簡單的Android OpenES Demo

來源:互聯網
上載者:User

這個例子是根據APIDemo 中的例子更改而來,主要是加入了我對透視投影和座標系的理解。

1. Activity

@Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);</p><p> mGLView = new GLSurfaceView(this);<br /> mGLView.setEGLConfigChooser(false);<br /> mGLView.setRenderer(new StaticTriangleRenderer(this));<br /> setContentView(mGLView);<br /> }

2. RenderView, GLSurface

public class StaticTriangleRenderer extends GLSurfaceView implements GLSurfaceView.Renderer{</p><p> private Context mContext;<br /> private Triangle mTriangle;<br /> private int mTextureID;<br /> private GL11 mGL; </p><p> public StaticTriangleRenderer(Context context) {<br /> super(context);</p><p> mContext = context;<br /> mTriangle = new Triangle();<br />// We want an 8888 pixel format because that's required for<br />// a translucent window.<br />// And we want a depth buffer.<br />setBackgroundDrawable(null);<br />setFocusable(true);<br />setEGLConfigChooser(8, 8, 8, 8, 16, 0);<br />setRenderer(this);<br />setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);<br />// Use a surface format with an Alpha channel:<br />getHolder().setFormat(PixelFormat.TRANSLUCENT);<br /> }</p><p> public void onSurfaceCreated(GL10 gl, EGLConfig config) {<br /> /*<br /> * By default, OpenGL enables features that improve quality<br /> * but reduce performance. One might want to tweak that<br /> * especially on software renderer.<br /> */<br /> //gl.glDisable(gl.GL_DITHER);</p><p> /*<br /> * Some one-time OpenGL initialization can be made here<br /> * probably based on features of this particular context<br /> */<br /> gl.glHint(gl.GL_PERSPECTIVE_CORRECTION_HINT,<br /> gl.GL_FASTEST);</p><p> gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);<br /> gl.glShadeModel(gl.GL_SMOOTH);<br /> gl.glEnable(gl.GL_DEPTH_TEST);<br /> gl.glEnable(GL_TEXTURE_2D);</p><p> /*<br /> * Create our texture. This has to be done each time the<br /> * surface is created.<br /> */</p><p> int[] textures = new int[1];<br /> gl.glGenTextures(1, textures, 0);</p><p> mTextureID = textures[0];<br /> gl.glBindTexture(GL_TEXTURE_2D, mTextureID);</p><p> gl.glTexParameterf(GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER,<br /> gl.GL_NEAREST);<br /> gl.glTexParameterf(GL_TEXTURE_2D,<br /> gl.GL_TEXTURE_MAG_FILTER,<br /> gl.GL_LINEAR);</p><p> gl.glTexParameterf(GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S,<br /> gl.GL_CLAMP_TO_EDGE);<br /> gl.glTexParameterf(GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T,<br /> gl.GL_CLAMP_TO_EDGE);</p><p> gl.glTexEnvx(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE,<br /> GL11.GL_REPLACE); </p><p>Bitmap bmp =<br />BitmapFactory.decodeResource(mContext.getResources(), R.drawable.myvideo);</p><p>int width = bmp.getWidth();<br /> int height = bmp.getHeight();</p><p> Matrix matrix = new Matrix();</p><p> float scaleWidth = ((float) 128) / width;<br /> float scaleHeight = ((float) 128) / height;</p><p> matrix.postScale(scaleWidth, scaleHeight);<br /> Bitmap newbmp = Bitmap.createBitmap(bmp, 0, 0, width, height,<br /> matrix, true);<br /> GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, newbmp, 0);<br /> }</p><p> public void onDrawFrame(GL10 gl) {<br /> /*<br /> * By default, OpenGL enables features that improve quality<br /> * but reduce performance. One might want to tweak that<br /> * especially on software renderer.<br /> */<br /> gl.glDisable(gl.GL_DITHER);</p><p> /*<br /> * Usually, the first thing one might want to do is to clear<br /> * the screen. The most efficient way of doing this is to use<br /> * glClear().<br /> */</p><p> gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT);</p><p> /*<br /> * Now we're ready to draw some 3D objects<br /> */</p><p> gl.glMatrixMode(gl.GL_MODELVIEW);<br /> gl.glLoadIdentity();</p><p> //portalDrawFrame(gl);<br /> GLU.gluLookAt(gl, 0, 0, 4,// The position of the eye<br /> 0f, 0f, 0f,// Eye to see the pointer<br /> 0f, 1.0f, 0.0f);// The direction of the see</p><p> gl.glEnableClientState(gl.GL_VERTEX_ARRAY);<br /> gl.glEnableClientState(gl.GL_TEXTURE_COORD_ARRAY);</p><p> long time = SystemClock.uptimeMillis() % 4000L;<br /> float angle = 0.090f * ((int) time);<br /> gl.glRotatef(angle, 0, 0, 1.0f);</p><p> gl.glEnable(GL_TEXTURE_2D);<br /> gl.glBindTexture(GL11.GL_TEXTURE_2D, mTextureID);</p><p> mTriangle.draw(gl);<br /> }</p><p> public void onSurfaceChanged(GL10 gl, int w, int h) {<br /> gl.glViewport(0, 0, w, h);</p><p> /*<br /> * Set our projection matrix. This doesn't have to be done<br /> * each time we draw, but usually a new projection needs to<br /> * be set when the viewport is resized.<br /> */</p><p> float ratio = (float) w / h;<br /> gl.glMatrixMode(gl.GL_PROJECTION);<br /> gl.glLoadIdentity();<br /> GLU.gluPerspective(gl, 90, ratio, 4, 100);<br /> }</p><p> static class Triangle {<br /> public Triangle() {</p><p> // Buffers to be passed to gl*Pointer() functions<br /> // must be direct, i.e., they must be placed on the<br /> // native heap where the garbage collector cannot<br /> // move them.<br /> //<br /> // Buffers with multi-byte datatypes (e.g., short, int, float)<br /> // must have their byte order set to native order</p><p> ByteBuffer vbb = ByteBuffer.allocateDirect(VERTS * 3 * 4);<br /> vbb.order(ByteOrder.nativeOrder());<br /> mFVertexBuffer = vbb.asFloatBuffer();</p><p> ByteBuffer tbb = ByteBuffer.allocateDirect(VERTS * 2 * 4);<br /> tbb.order(ByteOrder.nativeOrder());<br /> mTexBuffer = tbb.asFloatBuffer();</p><p> ByteBuffer ibb = ByteBuffer.allocateDirect(VERTS * 2);<br /> ibb.order(ByteOrder.nativeOrder());<br /> mIndexBuffer = ibb.asShortBuffer();</p><p> // A unit-sided equilateral triangle centered on the origin.<br /> float[] coords = {<br /> // X, Y, Z<br /> -2.0f, -3.0f, -4.0f,<br /> 2.0f, -3.0f, -4.0f,<br /> 2.0f, 3.0f, -4.0f,<br /> -2.0f, 3.0f, -4.0f};</p><p> float[] texture = {<br /> 0.0f, 0.0f,<br /> 0.0f, 1.0f,<br /> 1.0f, 1.0f,<br /> 1.0f, 0.0f};</p><p> mFVertexBuffer.put(coords);<br /> mTexBuffer.put(texture);</p><p> for(int i = 0; i < VERTS; i++) {<br /> mIndexBuffer.put((short) i);<br /> }</p><p> mFVertexBuffer.position(0);<br /> mTexBuffer.position(0);<br /> mIndexBuffer.position(0);<br /> }</p><p> public void draw(GL10 gl) {<br /> gl.glVertexPointer(3, GL_FLOAT, 0, mFVertexBuffer);<br /> glTexCoordPointer(2, GL_FLOAT, 0, mTexBuffer);<br /> gl.glDrawElements(GL11.GL_TRIANGLE_FAN, VERTS, GL_UNSIGNED_SHORT, mIndexBuffer);<br /> //gl.glDrawArrays(GL11.GL_TRIANGLE_FAN, 0, VERTS);<br /> }</p><p> private final static int VERTS = 4;<br /> private FloatBuffer mFVertexBuffer;<br /> private FloatBuffer mTexBuffer;<br /> private ShortBuffer mIndexBuffer;<br /> }<br />}<br />

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.