【问题标题】:Android: Different two uses of RendererAndroid:Renderer的不同两种用法
【发布时间】:2012-03-08 12:09:47
【问题描述】:

我使用Renderer的两种方式来绘制三角形。一个是工作,一个是没有。

这是我的两个解决方案。

第一个解决方案:运行时无法工作。我实现了Renderer(您应该看到 :glView.setRenderer 方法。这是我的两种解决方案的基本区别。)

package com.test;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

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;

public class TriangleOpenGLTest extends Activity implements Renderer{

    FloatBuffer vertices;
    ByteBuffer byteBuffer;
    GL10 gl;
    GLSurfaceView glView;


    @Override 
    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);

        byteBuffer = ByteBuffer.allocateDirect(3*2*4);
        byteBuffer.order(ByteOrder.nativeOrder());

        vertices = byteBuffer.asFloatBuffer();
        vertices.put(new float[] { 0.0f, 0.0f, 319.0f, 0.0f, 160.0f, 479.0f});
        vertices.flip();

        glView = new GLSurfaceView(this);
        glView.setRenderer(this);
        setContentView(glView);

    }

    @Override
    public void onResume(){
        super.onResume();
            gl.glViewport(0, 0, glView.getWidth(), glView.getHeight());
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadIdentity();
            gl.glOrthof(0, 320, 0, 480, 1, -1);
            gl.glColor4f(1, 0, 0, 1);
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glVertexPointer( 2, GL10.GL_FLOAT, 0, vertices);
            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);       
    }

            @Override
        public void onDrawFrame(GL10 gl) {
        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {

        }

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        }
}

解决方案 2:我为我的渲染器创建一个新的子类。

package com.test;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

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;

public class TriangleOpenGLTest extends Activity {

    FloatBuffer vertices;
    ByteBuffer byteBuffer;
    GL10 gl;
    GLSurfaceView glView;


    @Override 
    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);

        byteBuffer = ByteBuffer.allocateDirect(3*2*4);
        byteBuffer.order(ByteOrder.nativeOrder());

        vertices = byteBuffer.asFloatBuffer();
        vertices.put(new float[] { 0.0f, 0.0f, 319.0f, 0.0f, 160.0f, 479.0f});
        vertices.flip();

        glView = new GLSurfaceView(this);
        glView.setRenderer(new DrawTriangle());
        setContentView(glView);

    }

    @Override
    public void onResume(){
        super.onResume();
    }

    public class DrawTriangle implements Renderer{

        public DrawTriangle(){

        }
        @Override
        public void onDrawFrame(GL10 gl) {

            gl.glViewport(0, 0, glView.getWidth(), glView.getHeight());
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadIdentity();
            gl.glOrthof(0, 320, 0, 480, 1, -1);
            gl.glColor4f(1, 0, 0, 1);
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glVertexPointer( 2, GL10.GL_FLOAT, 0, vertices);
            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);       

        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // TODO Auto-generated method stub

        }

    }

}

谁能帮我解释一下上述两种解决方案的区别。

谢谢:)

【问题讨论】:

    标签: java android opengl-es renderer implements


    【解决方案1】:

    在第一个解决方案中,您有一个空的 onDrawFrame() 方法。这可能是它不起作用的原因。见GLSurfaceView.Renderer

    【讨论】:

    • 哦。非常感谢。你能为我解释一下,这个例子的 onResume 和 onDrawFrame 有什么区别。因为我认为Android总是会以onDrawFrame的形式运行到onResume。谢谢:)
    • 当 onResume 被触发时,这会告诉 GLSurfaceView 开始一遍又一遍地调用它的 onDrawFrame()。由于您的第一个方法在 onDrawFrame 函数中不执行任何操作,因此不会绘制任何内容。如果将 onResume 函数中的绘图代码放入 onDrawFrame() 中,它应该开始工作。注意 onResume 只被调用一次,至少在一个不同的生命周期事件引发一个循环更改返回到它之前(记录它并查看)。有关 android 生命周期的更多信息,请参阅Activity Life Cycle
    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    相关资源
    最近更新 更多