【发布时间】:2023-04-01 07:30:01
【问题描述】:
这个问题我有一段时间了,我找不到解决办法。
这里我初始化了Framebuffer:
//Initialize buffers
glGenBuffers(1, &primaryBuffer);
glBindBuffer(GL_FRAMEBUFFER, primaryBuffer);
glGenRenderbuffers(1, &depthBuffer);
glBindBuffer(GL_RENDERBUFFER, depthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, Statics::ScreenWidth, Statics::ScreenHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
glGenTextures(1, &colorTexture);
glBindTexture(GL_TEXTURE_2D, colorTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, Statics::ScreenWidth, Statics::ScreenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glGenTextures(1, &depthTexture);
glBindTexture(GL_TEXTURE_2D, depthTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, Statics::ScreenWidth, Statics::ScreenHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
int res = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (res == GL_FRAMEBUFFER_COMPLETE)
{
printf("GOOD!\n");
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
我是这样在渲染函数中使用它的:
glBindFramebuffer(GL_FRAMEBUFFER, primaryBuffer);
glViewport(0, 0, Statics::ScreenWidth, Statics::ScreenHeight);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
SetCamera();
DrawScene1();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, Statics::ScreenWidth, Statics::ScreenHeight);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SetCamera();
DrawScene2();
这里应该发生的是“scene1”在附加的帧缓冲区纹理中呈现。并且“scene2”应该出现在屏幕上。 “scene2”确实出现在屏幕上,但是当我使用渲染的帧缓冲区纹理时,会出现以下内容:
谁能告诉我怎么了?
【问题讨论】:
-
如果您使用渲染缓冲区而不是纹理作为深度缓冲区,
depthTexture的意义何在? -
你没有说到底是什么问题。结果应该是什么样子?问题是纹理中的正方形吗?哦,不要将
GL_GENERATE_MIPMAP与 FBO 一起使用; FBO 扩展引入glGenerateMipmaps函数是有原因的。 -
输出应该是门内的门。
-
还是不行。它再次显示这个垃圾纹理。
-
如果没有完全访问源代码和数据的权限,这是一个无法回答的调试问题。我唯一能建议的是减少一切的复杂性(画更简单的东西等),直到你把它归结为基础:画一些东西到纹理,用那个纹理渲染其他东西。然后,当它起作用时,开始逐步添加碎片。
标签: c++ xcode macos opengl fbo