- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试关注 ThinMatrix's water tutorial 。为此,我需要创建一个 FBO 并将其渲染为纹理。
我正在使用source code provided直接来自教程(从链接复制)。
基本上,我创建了一个 FrameBuffer:
public FrameBufferObject() {//call when loading the game
initialiseReflectionFrameBuffer();
initialiseRefractionFrameBuffer(); //Let's ignore refraction for now, as I only use reflection at the moment.
}
private void initialiseReflectionFrameBuffer() {
reflectionFrameBuffer = createFrameBuffer();
reflectionTexture = createTextureAttachment(REFLECTION_WIDTH,REFLECTION_HEIGHT);
reflectionDepthBuffer = createDepthBufferAttachment(REFLECTION_WIDTH,REFLECTION_HEIGHT);
unbindCurrentFrameBuffer();
}
然后我创建一个纹理附件:
private int createTextureAttachment( int width, int height) {
int texture = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, width, height,
0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0,
texture, 0);
return texture;
}
我还创建了一个深度缓冲区附件:
private int createDepthBufferAttachment(int width, int height) {
int depthBuffer = GL30.glGenRenderbuffers();
GL30.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthBuffer);
GL30.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_DEPTH_COMPONENT, width,
height);
GL30.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT,
GL30.GL_RENDERBUFFER, depthBuffer);
return depthBuffer;
}
然后,我将对象渲染到帧缓冲区对象:
Main.TerrainDemo.shader.start();
fbos.bindReflectionFrameBuffer();
for (Grass g : Main.TerrainDemo.toDraw){
g.render();
}
fbos.unbindCurrentFrameBuffer();
我像这样绑定(bind)帧缓冲区:
private void bindFrameBuffer(int frameBuffer, int width, int height){
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);//To make sure the texture isn't bound
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
GL11.glViewport(0, 0, width, height);
System.out.println("Bound");
if(GL30.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER) == GL30.GL_FRAMEBUFFER_COMPLETE) {
System.out.println("Frame buffer setup is complete: " + GL30.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER));
}
System.out.println("Error: " + GL11.glGetError());
}
当我打印出glGetError()时的“错误”是一个正常的0
。 “帧缓冲区设置”消息确实打印出来。
之后,我希望调用 fbos.getReflectionTexture()
将返回一个纹理 ID...而且确实如此!它成功返回纹理ID 12。但是,当我绑定(bind)它时,纹理是全黑的。
public int getReflectionTexture() {//get the resulting texture
return reflectionTexture; //Remember, this was our original texture attachment.
}
reflectionTexture = createTextureAttachment(REFLECTION_WIDTH,REFLECTION_HEIGHT);
我无法弄清楚出了什么问题,以及为什么纹理没有显示渲染给它的任何内容。
我所知道的事情没有错误:
我确实正确地绘制和纹理化了水本身。我可以使用任何预加载的纹理并对水进行纹理处理:
此外,渲染到 FBO 的对象具有正确的平移、旋转等。如果我不绑定(bind)任何帧缓冲区,则用于 FBO 的树叶会在屏幕上正确绘制(并看到)。
最佳答案
所以我意识到这是一个非常古老的问题,可能没有人再关心了,但我最近在完成相同的教程并遇到类似的问题后发现自己在这里。
在练习了一些 google foo 之后,我意识到我在代码中犯了一个非常基本的错误,这可能是相同的解决方案。
我根本就没有做;
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
在再次填充之前,正在使用帧缓冲区对象:
我只是继续将其放在绑定(bind)帧缓冲区函数的末尾,然后我就成功了!
private void bindFrameBuffer(int frameBuffer, int width, int height){
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);//To make sure the texture isn't bound
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
GL11.glViewport(0, 0, width, height);
System.out.println("Bound");
if(GL30.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER) == GL30.GL_FRAMEBUFFER_COMPLETE) {
System.out.println("Frame buffer setup is complete: " + GL30.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER));
}
System.out.println("Error: " + GL11.glGetError());
}
可能不是同一个问题,因为我的错误特别基本,但值得一试。
有谁知道这个解决方案是否正确,或者它是解决更大问题的创可贴吗?
关于java - FBO 纹理显示全黑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33760638/
我有以下 OpenGL 设置来解决帧缓冲区问题: 我将立方体渲染到帧缓冲区中。 我使用此帧缓冲区中的目标纹理绘制带纹理的四边形,它在我的视口(viewport)中显示立方体。 当流程的两个阶段都在同一
我一直在研究乒乓球着色,并认为在我上一个问题之后我已经破解了它。但是,随着对着色器的进一步了解,看起来虽然我能够在 FBO A 和 FBO B 上运行着色器,但 A 的输出并未用作 B 的源。换句话说
平台是iPhone OpenGL ES 2.0 框架已经创建了一个带有渲染缓冲区的主fbo,因为它是颜色附件。 我有自己的 fbo ,其中 texture2D 作为颜色附件。我想将主 fbo 的内容复
我有一个应用程序需要执行以下操作: 将纹理从磁盘加载到 GL 纹理 在其上运行图像过滤器(通过 FBO 将其渲染到另一个纹理上) 在屏幕上显示生成的纹理 我有那么多工作。 接下来,我希望能够将第 2
我正在尝试创建一个 FBO 来绘制 3D 场景,并创建另一个 FBO 来绘制 HUD。然后,我尝试通过将 3D 场景 block 传输到默认 FBO,然后将 HUD block 传输到默认 FBO,来
除了默认的帧缓冲区之外,在什么情况下我希望在 OpenGL FBO 中添加渲染缓冲区附件而不是纹理附件?因为,纹理附件似乎更加通用。 最佳答案 纹理为您提供更多功能(采样!、格式多样性),因此更有可能
我正在考虑重构我的渲染代码的很大一部分,然后我想到了一个问题:是否可以使用帧缓冲区对象中的多个颜色附件渲染到屏幕和纹理?尽管它有许多有用的应用程序,但我找不到任何信息是否可能。我想将我的纹理作为颜色a
我尝试在 OpenGL 中使用 FBO 的模板缓冲区,但无法正常工作。我将深度和模板目标的 depth24_stencil8 纹理绑定(bind)到 FBO。作为一个简单的测试,我尝试了: /* En
到目前为止,在对自定义 FBO 进行深度测试时,我一直在使用渲染缓冲区。现在我需要用深度纹理替换它们(因为我需要在着色器中读取它)。我正在查看不同的来源,如 here并看到 GL_FLOAT 用作数据
我现在正在尝试实现阴影贴图几天,我想我开始看到手头的真正问题:我有一个附加了深度纹理的 FBO,用于阴影贴图的光 channel ,但是其中没有任何内容被渲染。甚至没有硬编码值。 我已经仔细检查了程序
我正在尝试关注 ThinMatrix's water tutorial 。为此,我需要创建一个 FBO 并将其渲染为纹理。 但是正如您所看到的,水是完全黑色的: 我正在使用source code pr
我正在使用 A FBO 捕捉四边形表面上方的反射。前提是将相机移动到水面下然后渲染场景到fbo,然后恢复到原来的观看位置,像这样: WaterFrameBuffer fbos; Water test(
我有一个按以下方式创建的 FBO: glGenRenderbuffers(1, &m_depthStencilBuffer); glBindRenderbuffer(GL_RENDERBUFFER,
我无法使用 glreadpixels 函数从深度纹理读取正确的深度值。 FBO 状态完成。其他渲染目标在传输到另一个 FBO 后看起来也很好。 代码片段: // Create the FBO
我正在尝试将多采样场景渲染为纹理,这是我正在使用的代码。我得到一个黑屏。我在 init 结束时检查了 fbo 的完整性,他们报告两个 fbo 都是完整的。 void init_rendered_FBO
我读到在分层渲染中,我们创建了一个 2D 纹理数组(GL_TEXTURE_2D_ARRAY): glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTU
我在网上看到了很多示例(for example),它们执行以下操作 创建和绑定(bind) FBO 创建和绑定(bind)缓冲区 (纹理、渲染、深度、模板) 然后,解除绑定(bind)缓冲区 要使用
我想使用片段着色器输出到 FBO,然后将其纹理附件绘制到默认帧缓冲区。最终,我希望能够输出到一个 FBO,然后使用另一个着色器将其传递给另一个 FBO,依此类推。但我认为让它在默认帧缓冲区上工作是一个
在我的渲染器中,我在多重采样的 FBO 上生成抗锯齿场景,该场景被位 block 传输到颜色附件为纹理的 FBO。然后在渲染到帧缓冲区期间读取纹理。 我想更新它,以便获得 Gamma 正确的结果。使用
我想将图像处理 OpenGL 着色器程序的输出保存到图像文件中,并在屏幕上显示结果。我知道如何使用 glReadPixels() 保存窗口帧缓冲区。然而,屏幕的分辨率小于图像的尺寸。 如果我渲染到 F
我是一名优秀的程序员,十分优秀!