基本的OpenGLEs程序问题

时间:2014-05-24 20:07:51

标签: android opengl-es

我正在学习OpenGlEs for android。我正在尝试执行一个非常基本的清除屏幕程序。但是我没有执行。 以下是我的计划。

MainActivity

   package com.learning.opengl;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.pm.ConfigurationInfo;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

    private GLSurfaceView glSurfaceView;
    private boolean rendererSet = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        glSurfaceView = new GLSurfaceView(this);

        final ActivityManager activityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        final boolean supportGlEs2 = configurationInfo.reqGlEsVersion >= 0x2000;

        if(supportGlEs2){
            glSurfaceView.setEGLContextClientVersion(2);
            //glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
            glSurfaceView.setRenderer(new CustomRenderer());
            rendererSet = true;
            Toast.makeText(this,"The Version is :"+(configurationInfo.reqGlEsVersion >= 0x2000),Toast.LENGTH_LONG).show();
        }
         else{
            Toast.makeText(this,"This device does not support OpenGL ES 2.0", Toast.LENGTH_LONG).show();
        }


    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();

        if(rendererSet)
        {
            glSurfaceView.onResume();
        }
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();

        if(rendererSet)
        {
            glSurfaceView.onPause();
        }
    }
}

CustomRenderer

package com.learning.opengl;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;
import static android.opengl.GLES20.glClear;
import static android.opengl.GLES20.glClearColor;
import static android.opengl.GLES20.glViewport;
import android.opengl.GLSurfaceView.Renderer;

public class CustomRenderer  implements Renderer{

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        glClearColor(1.0f, 0.0f, 0.0f, 0.0f);

    }

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

    }   glViewport(0, 0, width, height);

    }

    @Override
    public void onDrawFrame(GL10 gl) {
        glClear(GL_COLOR_BUFFER_BIT);

我在Android清单文件中没有任何权限。当我在真实设备Motox上执行此程序时

我收到了以下错误

05-24 14:49:21.396: E/Adreno-ES20(10379): <gl_external_unsized_fmt_to_sized:2379>: QCOM> format, datatype mismatch
05-24 14:49:21.396: E/Adreno-ES20(10379): <get_texture_formats:3009>: QCOM> Invalid format!
我用Google搜索了一下。但没有运气。

谢谢。

1 个答案:

答案 0 :(得分:0)

我认为您使用来自reqGlEsVersion的{​​{1}}的测试不符合您的意图。它提供了您在清单中请求的版本的值。如果您未在清单中指定ES 2.0,则测试将失败。

如果您打算仅支持ES 2.0,请确保在清单中包含此内容:

ConfigurationInfo

如果您确实打算支持多个OpenGL版本,则需要进行不同的运行时测试。 http://developer.android.com/guide/topics/graphics/opengl.html上的“检查OpenGL ES版本”部分解释了如何执行此操作。总之,您有两种选择:

  • 使用您计划支持的最低版本创建OpenGL上下文,并在创建后查询实际上下文版本。我不相信这会可靠地运行,因为某些设备不支持具有相同上下文的ES 1.0和ES 2.0+。
  • 您尝试使用要使用的最高版本创建上下文,并检查上下文创建失败。