簡體   English   中英

無法使OpenGL ES在Android上以2D繪制任何內容

[英]Unable to get opengl ES to draw anything in 2D on Android

這是我為了使2D繪圖起作用而編寫的代碼。 活動,視圖和渲染器設置正確。 我得到一個全黑的屏幕,但上面沒有多邊形。 什么也沒畫。 這將使我發瘋...

public class OpenGLActivity extends Activity {

    private GLSurfaceView surfaceView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                WindowManager.LayoutParams.FLAG_FULLSCREEN
                );

        this.surfaceView = new OpenGLSurfaceView(this);
        setContentView(this.surfaceView);
    }

    @Override
    protected void onPause() {
        super.onPause();
        surfaceView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        surfaceView.onResume();
    }
}

public class OpenGLSurfaceView extends GLSurfaceView {

    private OpenGLSurfaceRenderer renderer;

    public OpenGLSurfaceView(Context context) {
        super(context);
        this.renderer = new OpenGLSurfaceRenderer();
        setRenderer(renderer);
    }

}

public class OpenGLSurfaceRenderer implements Renderer {

    private FloatBuffer vertexBuffer;
    private float[] vertices = {
            0.0f, 1.0f, 0.0f,
            0.0f, 0.0f, 0.0f,
            1.0f, 1.0f, 0.0f,
            1.0f, 0.0f, 0.0f,
            0.0f, 10.0f, 0.0f,
            0.0f, 0.0f, 0.0f,
            10.0f, 10.0f, 0.0f,
            10.0f, 0.0f, 0.0f
    };

    public OpenGLSurfaceRenderer() {
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * (Float.SIZE >> 3));
        vertexBuffer = byteBuffer.asFloatBuffer();
        vertexBuffer.put(vertices);
        vertexBuffer.position(0);
    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

        gl.glClearColor(0.0f, 0.0f, 0.0f, 1);
        gl.glShadeModel(GL10.GL_FLAT);
        gl.glDisable(GL10.GL_DEPTH_TEST);
        gl.glEnable(GL10.GL_TEXTURE_2D);

        gl.glDisable(GL10.GL_DITHER);
        gl.glDisable(GL10.GL_LIGHTING);

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    }

    public void onDrawFrame(GL10 gl) {

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

        gl.glTranslatef(0.0f, 0.0f, 0.5f);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    }

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

        gl.glViewport(0, 0, width, height);

        // Clear the projection matrix
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();

        // Set up orthographic projection mode (2D drawing)
        gl.glOrthof(0, width, height, 0, 0, 1);

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

}

我看到四個問題:

  1. glDrawArrays()的最后一個參數應該是8,而不是4。這是您提供的頂點數,而不是三角形帶中的三角形數。

  2. 正射投影使您的世界單位等於像素。 您的前4個頂點描述的是1像素寬的三角形。 也許屏幕的左下角有一個白色像素?

  3. 您每幀都沿Z軸推進模型投影。 2幀后,它將顯示在視錐范圍之外。

  4. 最重要的是,您沒有在ByteBuffer上設置正確的順序。 將此行插入您的OpenGlRenderer()構造函數中:

    公共OpenGLSurfaceRenderer(){ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * 4); byteBuffer.order(ByteOrder.nativeOrder()); <------ vertexBuffer = byteBuffer.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM