【问题标题】:Android gl no current contextAndroid gl没有当前上下文
【发布时间】:2016-07-06 13:05:40
【问题描述】:

我正在尝试使用官方 NDK 加载一些着色器并使用 android GLSurfaceView 和 C++ 渲染一个 hello world 三角形。但是我收到错误“在没有当前上下文的情况下调用 OpenGL ES API”。这是我的简单单文件java(注意这是整个项目中唯一的java代码)侧上下文创建代码来自google's tutorial:

class GLESRenderer implements GLSurfaceView.Renderer
{
    static {
        System.loadLibrary("native_code");
    }
    private native void ntInit();
    private native void ntRender();
    private native void ntUpdateScreen(int width, int height);

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        ntInit(); // LOAD SHADERS AND VBO DATA!!!!
    }

    public void onDrawFrame(GL10 unused) {
        ntRender(); // DRAW USING SHADERS AND VBO DATA!!!!
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        ntUpdateScreen(width, height); // UPDATE SCREEN!!!
    }
}

class GLES_SurfaceView extends GLSurfaceView {

    private final GLESRenderer mRenderer;

    public GLES_SurfaceView(Context context){
        super(context);
        setEGLContextClientVersion(2);
        mRenderer = new GLESRenderer();
        setRenderer(mRenderer);
    }
}

public class Main extends Activity {

    private GLSurfaceView mGLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mGLView = new GLES_SurfaceView(this);

        if(Build.VERSION.SDK_INT < 16) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        } else {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

            ActionBar bar = getActionBar();
            if(bar != null)
                bar.hide();
        }
        setContentView(mGLView);
    }
}

许多其他堆栈溢出问题(没有一个使用 NDK,所以它们可能是不同的问题)表明这是一个线程问题,但是这段代码清楚地从 GLSurfaceView.Renderer 调用了本机函数,所以我很确定这不是线程问题。

此外,多个教程使用相同的方法使用 opengl 和 NDK 进行渲染。例如:Intel's tutorial、learnopengles's tutorial。

因此我认为我的上下文创建有问题

【问题讨论】:

  • 如果您要对我的帖子投反对票,您为什么不留下一些反馈,告诉我如何改进我的问题?我已经尽我所能清楚地彻底研究了这个话题。不要做一个混蛋。
  • 您确认错误来自您的代码吗?我认为这些错误消息有时会出现在日志中,与您拨打的电话没有任何联系,而且可能是无害的。为了缩小问题范围,我将清除颜色设置为黑色以外的颜色,并在 Java 代码中调用 glClear()。这将确认上下文创建工作。
  • @RetoKoradi 是的,我在项目的 ndk 端使用不同的 glClearColors 运行了 glClear,它运行完美!所以也许你是对的,这只是一个无用的错误,我的问题出在其他地方。谢谢你的提示,我会调查其他部分。

标签: android c++ opengl-es


【解决方案1】:

忘记回答这个问题了。由于 C++ 的默认构造函数系统,出现此问题。在创建 OpenGL 上下文之前,我正在加载我的“native_code”库。然而,我的本机着色器类具有默认构造函数,这些构造函数使 OpenGL 调用来初始化它们自己。像这样的:

class LightingShader
{
    LightingShader()
    {
        glCreateShader(...) // BAD TO CALL OPENGL HERE WITHOUT CONTEXT CREATED
        ....
    }
};

....
LightingShader light_shader; // <- GLOBAL VARIABLE, DEFAULT CONSTRUCTOR CALLED!!!!

所以基本上当它们的库被加载时,C++ 着色器会自动调用它们的构造函数。这个库是在 OpenGL 初始化之前调用的!我通过删除默认构造函数并改用返回对象的函数来解决此问题:

class LightingShader
{
    LightingShader getLightingShaderInstance()
    {
        glCreateShader(...)
        ....
    }
};

因此,就我而言,这是隐藏在糟糕的面向对象设计中的一个偷偷摸摸的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多