【发布时间】:2013-01-30 08:12:14
【问题描述】:
我已经阅读了一些教程并试图围绕 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 中阴影贴图的信息
【问题讨论】:
-
呃,其实我不知道this能不能帮到你……
-
太好了。我还没有找到这个。
-
Google for
man glTexImage2D第一个点击是:opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml 它解释了最后一个参数的用途——图像数据(在你的情况下还有很多)。 (man是 Unix/Linux 手册页命令。) -
好吧,我查看了手册,我只是不明白他们为什么要将最后一个参数指定为
NULL并且不传递任何数据 here。另外,我不知道 android/libgdx 中的等价物是什么? -
啊,看来你是对的。但是,看起来这是一个已知问题并已修复(在 2011 年?):code.google.com/p/libgdx/issues/detail?id=538 作为解决方法,请尝试创建一个用于保存纹理(宽度*高度)的 int 缓冲区。除了浪费空间,应该是无害的吧?
标签: java opengl-es opengl-es-2.0 libgdx shadow-mapping