使用GlblitFrameBuffer进行多样采样,无法使用OpenGL ES 3.0

Multisampling with glBlitFramebuffer not working opengl es 3.0

本文关键字:OpenGL ES GlblitFrameBuffer 采样 使用      更新时间:2023-10-16

概述:从中,我更改为ES 3.0,在阅读和尝试一天之后,我再次被困在实现抗血液中。我正在在iOS模拟器上进行测试。

问题:我的图纸是可见的,但它们与没有抗逆性的相同。我尝试使用OBJC的[self.glkView setDrawableMultisample:GLKViewDrawableMultisample4X];,差异很明显。这意味着我的多样采样根本不起作用。我缺少什么吗?

使用的资源:我已经阅读了Apple的指南(使用ES3 Update(作为基础指南。Kronos Wiki作为附加指南(它使用glEnable(GL_MULTISAMPLE)在ES3中不存在...我发现类似的是sample coverage,我也尝试过启用它,但仍然没有运气(。

>

代码

/*
setting up shader program code...
*/
// initializing frame buffers
glGenFramebuffers(1, &sampleFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, sampleFramebuffer);
glGenRenderbuffers(1, &sampleColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, sampleColorRenderbuffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, sampleColorRenderbuffer);
glGenRenderbuffers(1, &sampleDepthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, sampleDepthRenderbuffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, sampleDepthRenderbuffer);

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    printf("Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));

// Making Draw FrameBuffer
glGenFramebuffers(1, &resolveFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, resolveFrameBuffer);

glGenRenderbuffers(1, &resolveColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, resolveColorRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, resolveColorRenderbuffer);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    printf("Failed to make complete framebuffer2 object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));

// Cleaning buffer steps
glBindFramebuffer(GL_FRAMEBUFFER, sampleFramebuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

完成此操作后,在我的绘图代码中,完成绘图后,我会这样做:

*use gl program*
*drawarrays*
glBindFramebuffer(GL_READ_FRAMEBUFFER, sampleFramebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFrameBuffer);
glBlitFramebuffer(0, 0, _Width, _Height, 0, 0, _Width, _Height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
checkGLError("glBlitFramebuffer");

我弄清楚了,这是因为我如何测试图纸。我将片段着色器设置为始终给出纯红色(r:1,g:0,b:0,a:1)。我之所以这样做,是因为我的Android项目是由其他人建立的,并且在我拿了副本时还没有完全完成。为了避免工作,我即兴创作并将颜色设置为红色,以便我可以看到在黑色背景上绘制的内容(愚蠢的想法(。

tldr :覆盖片段着色器输出,确保正在完成的任何反式化都被覆盖。将其设置回顶点着色器所提供的内容。