OpenGL ES 2.0 — буфер глубины рендеринга

Я прочитал несколько руководств и попытался понять OpenGL ES 2.0. При попытке создать буфер глубины моя JVM падает. Кстати, я использую фреймворк LibGDX.

  IntBuffer depthBuffer = BufferUtils.newIntBuffer(1);

  // AFAIK this puts 1 texture name into depthBuffer.
  Gdx.gl20.glGenTextures(1, depthBuffer);
  int depthBufferValue = depthBuffer.get();

  // I now bind the texture, so I can use it.
  Gdx.gl20.glBindTexture(GL20.GL_TEXTURE_2D, depthBufferValue);

Я понятия не имею, что делает glTexImage2D, я полагаю, он должен генерировать текстуру глубины.

Следующая строка приводит к сбою JVM

Gdx.gl20.glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, Gdx.graphics.getWidth(),  Gdx.graphics.getHeight(), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,  BufferUtils.newIntBuffer(1));

Следующая строка вызывает NullPointerException

Я не знаю, что мне поставить в качестве glTexImage2D последнего параметра. Я видел примеры для iOS, где они ставят NULL.

Gdx.gl20.glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, null);

Остальная часть кода

  // This code should attach the depth texture into frame buffer
  IntBuffer depthFrameBuffer = BufferUtils.newIntBuffer(1);
  glGenFramebuffers(1, depthFrameBuffer);
  int depthFrameBufferValue = depthBuffer.get();
  glBindFramebuffer(GL_FRAMEBUFFER, depthFrameBufferValue);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthFrameBufferValue, 0);
  // I dont know what should I call next or what type of shader should I use

Пожалуйста, укажите мне правильное направление, или всякий раз, когда я сделал ошибку в своих предположениях.

Учебник был бы лучшим, я не нашел много о картах теней в OpenGL ES 2.0


person jellyfication    schedule 30.01.2013    source источник
comment
Эээ, на самом деле я не знаю, это может вам помочь...   -  person Stefan Hanke    schedule 30.01.2013
comment
Замечательно. Я не нашел этот.   -  person jellyfication    schedule 30.01.2013
comment
Google для man glTexImage2D и первое попадание: opengl.org/sdk/docs /man/xhtml/glTexImage2D.xml объясняет, для чего нужен этот последний параметр — данные изображения (и многие из них в вашем случае). (man — это команда справочных страниц Unix/Linux.)   -  person P.T.    schedule 30.01.2013
comment
Ну, я просмотрел руководство, я просто не понял, почему они хотят указать последний параметр как NULL и не передавать какие-либо данные здесь. Кроме того, я не знаю, что эквивалентно в android/libgdx?   -  person jellyfication    schedule 30.01.2013
comment
Ах, кажется, ты прав. Однако похоже, что это была известная проблема, и она была исправлена ​​(в 2011 году?): code.google.com/p/libgdx/issues/detail?id=538 В качестве обходного пути попробуйте создать буфер int, в котором будет храниться текстура (ширина * высота). Это должно быть безвредно, кроме потраченного впустую пространства?   -  person P.T.    schedule 01.02.2013
comment
Странно, у меня никогда не было этих старых библиотек. Я посмотрел, что опубликовал @StefanHanke, и буду придерживаться этого.   -  person jellyfication    schedule 01.02.2013
comment
@jellyfication: вы пытаетесь использовать FBO. Взгляните на эту страницу. Он не ориентирован на Java, но вы можете легко перевести примеры для Android.   -  person Fabien R    schedule 02.02.2013
comment
Похоже, это было исправлено только частично в libGDX, и был отправлен патч, чтобы исправить это для GLES20 на libGDX: github.com/libgdx/libgdx/pull/228#issuecomment-13062354   -  person P.T.    schedule 05.02.2013


Ответы (1)


В libGDX была ошибка, которая требовала, чтобы параметр текстуры glTexImage2D был ненулевым (подразумевая, что всегда должны быть какие-то локальные данные текстуры для загрузки). Это было исправлено с помощью этого изменения: https://github.com/libgdx/libgdx/pull/228< /а>. Это будет частью выпуска после 0.9.8 (скорее всего, выпуска 0.9.9).

person P.T.    schedule 11.02.2013