Android gl без текущего контекста

Я пытаюсь загрузить некоторые шейдеры и отобразить привет мировой треугольник с помощью Android GLSurfaceView и C ++, используя официальный NDK. Однако я получаю ошибку «вызов API OpenGL ES без текущего контекста». Вот мой простой одиночный файл Java (обратите внимание, что это единственный код Java во всем проекте) код создания бокового контекста из учебник Google:

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, а также учебник Learnopengles.

Таким образом, я думаю, что что-то не так в моем создании контекста.

-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(...)
....
}
};

Таким образом, это была скрытая ошибка, скрытая в плохом объектно-ориентированном дизайне с моей стороны.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector