Iphone ios中的多采样纹理渲染

Iphone ios中的多采样纹理渲染,iphone,c++,ios,graphics,opengl-es,Iphone,C++,Ios,Graphics,Opengl Es,我正在尝试在ios中渲染启用多重采样的纹理,然后在最终输出中使用该纹理。这可能吗 到目前为止,我只得到了黑色纹理或锯齿图像。我使用的代码是: glGenTextures(1,&texture); glBindTexture(GL_TEXTURE_2D,纹理); GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA4,宽度,高度,0,GL_RGBA,GL_无符号_字节,NULL); GLGEN帧缓冲区(1和帧缓冲区); glBindFramebuffer(GL_FRAMEBUFFER,FRA

我正在尝试在ios中渲染启用多重采样的纹理,然后在最终输出中使用该纹理。这可能吗

到目前为止,我只得到了黑色纹理或锯齿图像。我使用的代码是:

glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,纹理);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA4,宽度,高度,0,GL_RGBA,GL_无符号_字节,NULL);
GLGEN帧缓冲区(1和帧缓冲区);
glBindFramebuffer(GL_FRAMEBUFFER,FRAMEBUFFER);
glGenRenderbuffers(1,&彩色renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER,colorRenderbuffer);
//GLrenderBuffer存储(GL_RENDERBUFFER,GL_RGBA8_OES,宽度,高度);
GLRenderBufferStorageMultiSamplePle(GL_RENDERBUFFER,4,GL_RGBA4,宽度,高度);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_RENDERBUFFER,colorRenderbuffer);
glFramebufferTexture2D(GL_帧缓冲区,GL_颜色,GL_附件0,GL_纹理,GL_2D,纹理,0);
glGenRenderbuffers(1和深度RenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER,depthRenderbuffer);
//glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT16,width,self.view.bounds.size.height);
GLrenderBufferStorageMultiSamplePle(GL_RENDERBUFFER,4,GL_DEPTH_组件16,宽度,高度);
glFramebufferRenderbuffer(GL_帧缓冲区、GL_深度附件、GL_渲染缓冲区、深度渲染缓冲区);
GLenum状态=glCheckFramebufferStatus(GLU帧缓冲区);
如果(状态!=GL\U帧缓冲区\U完成){
NSLog(@“无法生成完整的帧缓冲区对象%x”,状态);
}
//渲染我的场景
glBindFramebuffer(GL_FRAMEBUFFER,FRAMEBUFFER);
glViewport(0,0,宽度,高度);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//画场景
//然后绑定默认帧缓冲区
glBindFramebuffer(GL_FRAMEBUFFER,1);
//画其他东西
//现在解析多重采样和绘制纹理
glResolveMultisampleFramebufferAPPLE();
glUseTexture(GL_纹理_2D,纹理);
//用纹理画图
此代码不起作用。如果对深度渲染缓冲区进行多采样,则会失败。如果我只是使用一个正常的fbo的深度,然后它的作品,但产生一个锯齿图像

有人知道我哪里出错了吗


谢谢

我想你是从样本开始工作的吧

删除glFramebufferTexture2D调用,因为这可能会导致多采样渲染缓冲区分离,因此您有一个多采样后缓冲区和一个采样渲染缓冲区。此外,创建单个采样深度缓冲区将解决您的问题,因为它不会与单个采样渲染缓冲区配对

编辑:您何时收到错误?在创建渲染缓冲区的一个上?如果是这样的话,你最好完全按照我发布的链接(我想你是为这个链接工作的)


对!!我发现我做错了什么。我错误地认为我可以做到以下几点:

帧缓冲区

  • 附加到纹理的多采样颜色渲染缓冲区

  • 多采样深度缓冲器

但你不能这样做。D:你必须具备以下条件:

多采样帧缓冲区:

  • 多采样颜色渲染缓冲区(未附加到纹理)

  • 多采样深度渲染缓冲区

普通帧缓冲区:

  • 附加到纹理的颜色渲染缓冲区。这就是glResolveMultisampleFramebufferAPPLE()将要写入的内容,以及我们将用于呈现结果的内容

  • 没有深度缓冲区

即,您必须将多采样渲染的结果复制到一个全新的帧缓冲区

一些代码:

glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,纹理);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA4,宽度,高度,0,GL_RGBA,GL_无符号_字节,NULL);
glGenFramebuffers(1,&已解析的\u帧缓冲区);
glBindFramebuffer(GL\u FRAMEBUFFER,resolved\u FRAMEBUFFER);
glGenRenderbuffers(1,&resolvedColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER,resolvedColorRenderbuffer);
glFramebufferTexture2D(GL_帧缓冲区,GL_颜色,GL_附件0,GL_纹理,GL_2D,纹理,0);
GLGEN帧缓冲区(1和帧缓冲区);
glBindFramebuffer(GL_FRAMEBUFFER,FRAMEBUFFER);
glGenRenderbuffers(1,&彩色renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER,colorRenderbuffer);
GLrenderBufferStorageMultiSamplePle(GL_RENDERBUFFER,4,GL_RGBA8_OES,宽度,高度);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_RENDERBUFFER,colorRenderbuffer);
glGenRenderbuffers(1和深度RenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER,depthRenderbuffer);
GLrenderBufferStorageMultiSamplePle(GL_RENDERBUFFER,4,GL_DEPTH_组件16,宽度,高度);
glFramebufferRenderbuffer(GL_帧缓冲区、GL_深度附件、GL_渲染缓冲区、深度渲染缓冲区);
GLenum状态=glCheckFramebufferStatus(GLU帧缓冲区);
如果(状态!=GL\U帧缓冲区\U完成){
NSLog(@“无法生成完整的帧缓冲区对象%x”,状态);
}
//渲染我的场景
glBindFramebuffer(GL_FRAMEBUFFER,FRAMEBUFFER);
glViewport(0,0,宽度,高度);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//画场景
//然后绑定默认帧缓冲区
glBindFramebuffer(GL_FRAMEBUFFER,1);
//画其他东西
//现在将多重采样分解到另一个fbo中
glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE,FRAMEBUFFER);
glBindFramebuffer(GL\u DRAW\u FRAMEBUFFER\u APPLE,已解析的\u FRAMEBUFFER);
glResolveMultisampleFramebufferAPPLE();
glBindTexture(GL_TEXTURE_2D,纹理);
//用纹理画图

谢谢Goz,你让我走对了方向

深度缓冲区创建本身是否失败?ie是否是glRenderbufferStorageMultisampleAPPLE调用失败?该调用不会给出glGetError(),但glCheckFramebufferStatus()返回GL\u FRAMEBUFFER\u Complete\u MULTISAMPLE感谢~我可以获得一个采样深度和多采样设置来处理这些更改,但仍然可以获得一个
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height);