【发布时间】:2015-08-26 09:48:27
【问题描述】:
我正在尝试延迟着色,但在尝试对多重渲染目标进行多重采样时遇到了麻烦。好像我只复制一个抗锯齿纹理而不是 3 个(漫反射、位置、法线)。只复制漫反射。
这是为我的 Geometry Pass 创建的 Anti Alias FBO:
IntBuffer drawBuffs = BufferUtils.createIntBuffer(3);
private void CreateFBOAntiAlias() {
AntiAliasFrameBuffer = glGenFramebuffers();
GL30.glBindFramebuffer(GL_FRAMEBUFFER, AntiAliasFrameBuffer);
textureColorMultiSampled = generateMultiSampleTexture(4);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL32.GL_TEXTURE_2D_MULTISAMPLE, textureColorMultiSampled,
0);
texturePositionMultiSampled = generateMultiSampleTexture(4);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1,
GL32.GL_TEXTURE_2D_MULTISAMPLE, texturePositionMultiSampled ,
0);
textureNormalMultiSampled = generateMultiSampleTexture(4);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2,
GL32.GL_TEXTURE_2D_MULTISAMPLE, textureNormalMultiSampled ,
0);
drawBuffs.put(0, GL30.GL_COLOR_ATTACHMENT0);
drawBuffs.put(1, GL30.GL_COLOR_ATTACHMENT1);
drawBuffs.put(2, GL30.GL_COLOR_ATTACHMENT2);
GL20.glDrawBuffers(drawBuffs);
AntiAliasRenderBufferObject = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, AntiAliasRenderBufferObject);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4,
GL_DEPTH24_STENCIL8, width, height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, AntiAliasRenderBufferObject);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
System.err
.println("ERROR::FRAMEBUFFER:: Framebuffer is not complete!");
} else {
System.err.println("FrameBuffer AntiAliasFBO success");
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
private int generateMultiSampleTexture(int samples) {
int texture;
texture = GL11.glGenTextures();
GL11.glBindTexture(GL32.GL_TEXTURE_2D_MULTISAMPLE, texture);
GL32.glTexImage2DMultisample(GL32.GL_TEXTURE_2D_MULTISAMPLE, samples,
GL11.GL_RGBA8, width, height, true);
GL11.glBindTexture(GL32.GL_TEXTURE_2D_MULTISAMPLE, 0);
return texture;
}
这是我的目标 FBO 的创作:
public void CreateFBO() {
fbo_handle = glGenFramebuffers();
diffuse_handle = GL11.glGenTextures();
position_handle = GL11.glGenTextures();
normal_handle = GL11.glGenTextures();
glBindFramebuffer(GL_FRAMEBUFFER, fbo_handle);
//////////////////DIFFUSE////////////////////////////////////
GL11.glBindTexture(GL11.GL_TEXTURE_2D, diffuse_handle);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height,0,
GL11.GL_RGBA, GL11.GL_INT, (ByteBuffer) null);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL11.GL_TEXTURE_2D, diffuse_handle, 0);
/////////////////POSITION////////////////////////////////////
GL11.glBindTexture(GL11.GL_TEXTURE_2D, position_handle);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0,
GL11.GL_RGBA, GL11.GL_INT, (ByteBuffer) null);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1,
GL11.GL_TEXTURE_2D, position_handle, 0);
///////////////NORMALS/////////////////////////////////////////
GL11.glBindTexture(GL11.GL_TEXTURE_2D, normal_handle);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0,
GL11.GL_RGBA, GL11.GL_INT, (ByteBuffer) null);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2,
GL11.GL_TEXTURE_2D, normal_handle, 0);
//////////////////////////////////////////////////////////////////
drawBuffs.put(0, GL30.GL_COLOR_ATTACHMENT0);
drawBuffs.put(1, GL30.GL_COLOR_ATTACHMENT1);
drawBuffs.put(2, GL30.GL_COLOR_ATTACHMENT2);
GL20.glDrawBuffers(drawBuffs);
rbo_depth_buffer_handle = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, rbo_depth_buffer_handle);
glRenderbufferStorage(GL_RENDERBUFFER, GL14.GL_DEPTH_COMPONENT32,
width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER, rbo_depth_buffer_handle);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
System.err.println("Framebuffer configuration error");
} else {
System.err.println("Deferred configuration Success");
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
我在几何传递期间绑定了我的 AA FBO,取消绑定并执行从 AA FBO 到我的目标 FBO 的 Blit,并以不希望的结果渲染全屏四边形。
public void blit() {
GL11.glEnable(GL13.GL_MULTISAMPLE);
glBindFramebuffer(GL_READ_FRAMEBUFFER, AntiAliasFrameBuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_handle);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height,
GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
编辑:我已经尝试在没有多重采样调用的情况下从一个普通的 MRT fbo 到另一个普通的 MRT FBO 并且似乎我只是在复制一个纹理。我的问题的根源是错误地将 MRT 传送到另一个 MRT。
【问题讨论】:
-
我在 drawbuffs 调用之前尝试过,并给了我一个异常:/ java.nio.Buffer.checkIndex(Buffer.java:532) at java.nio.DirectIntBufferU.put 的 java.lang.IndexOutOfBoundsException (DirectIntBufferU.java:300)
-
糟糕,抱歉。我没有注意到您已经提前分配了
drawBuffs的大小。我以为你每次都打电话给put来增加大小。 -
看起来像是一个错字:您正在附加
textureColorMultiSampled3 次。 -
啊,我修正了那个错字并更新了我的问题。它似乎仍然只复制一个纹理。我知道我的 blitting 出了点问题,我只是不知道为什么。
标签: opengl multisampling