【发布时间】:2016-11-16 14:43:45
【问题描述】:
我想用 mipmapping 渲染一个 IOSurface 纹理。
我正在从IOSurface 生成OpenGL 纹理,如下所示:
let error = CGLTexImageIOSurface2D(context.cglContextObj!,
GLenum(GL_TEXTURE_RECTANGLE_ARB),GLenum(GL_RGBA), GLsizei(width), GLsizei(height),
GLenum(GL_BGRA), GLenum(GL_UNSIGNED_INT_8_8_8_8_REV), surface!, 0)
并使用简单的片段着色器进行渲染:
#version 120
uniform sampler2DRect texture;
varying vec2 texCoord;
uniform vec2 size;
void main(){
vec4 tex = texture2DRect(texture, texCoord*size);
gl_FragColor = tex;
}
这很好用。但不幸的是,纹理没有经过 mipmap 处理,并且在以较小尺寸查看时非常粗糙/像素化。经过进一步研究,似乎IOSurface 支持的纹理不仅限于GL_TEXTURE_RECTANGLE_ARB 目标,它们也不支持 mipmapping。
好的。所以我最好的选择似乎是:
- 将
GL_TEXTURE_RECTANGLE_ARB纹理复制到GL_TEXTURE_2D纹理 - 为这个新纹理生成 mipmaps
请注意,我是在不支持 OpenGL 4.3 的 Mac 上开发的,所以我不能在这里使用方便的glCopyImageSubData。相反,我将我的第 1 步方法基于此答案:How to copy texture1 to texture2 efficiently?
我的完整代码现在如下所示:
if !hasCreatedTexture {
glGenTextures(1, &texture);
glGenTextures(1, &arbTexture);
glGenFramebuffers(1, &fbo)
hasCreatedTexture = true
}
glEnable(GLenum(GL_TEXTURE_RECTANGLE_ARB))
glBindTexture(GLenum(GL_TEXTURE_RECTANGLE_ARB), arbTexture)
let error = CGLTexImageIOSurface2D(context.cglContextObj!, GLenum(GL_TEXTURE_RECTANGLE_ARB), GLenum(GL_RGBA), GLsizei(width), GLsizei(height), GLenum(GL_BGRA), GLenum(GL_UNSIGNED_INT_8_8_8_8_REV), surface!, 0)
glBindFramebuffer(GLenum(GL_FRAMEBUFFER), fbo);
glFramebufferTexture2D(GLenum(GL_READ_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT0),
GLenum(GL_TEXTURE_RECTANGLE_ARB), arbTexture, 0);
glFramebufferTexture2D(GLenum(GL_DRAW_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT1),
GLenum(GL_TEXTURE_2D), texture, 0);
glDrawBuffer(GLenum(GL_COLOR_ATTACHMENT1));
glBlitFramebuffer(0, 0, GLint(width), GLint(height), 0, 0, GLint(width), GLint(height), GLbitfield(GL_COLOR_BUFFER_BIT), GLenum(GL_NEAREST));
glBindTexture(GLenum(GL_TEXTURE_2D), texture)
我更改了我的着色器以支持GL_TEXTURE_2D:
#version 120
uniform sampler2D texture;
varying vec2 texCoord;
void main(){
vec4 tex = texture2D(texture, texCoord);
gl_FragColor = tex;
}
这就是我卡住的地方。图像全黑,我不知道为什么它不起作用。
我尝试像这样查看像素数据:
var pixelData = UnsafeMutablePointer<GLubyte>(allocatingCapacity: Int(width * height * 4))
glGetTexImage(GLenum(GL_TEXTURE_2D), 0, GLenum(GL_BGRA),
GLenum(GL_UNSIGNED_INT_8_8_8_8_REV), pixelData)
print(NSData(bytes: pixelData, length: 50000).description)
而且都是零。我的方法是否有问题,或者该问题可能与处理 IOSurface 支持的纹理特别相关?
【问题讨论】:
标签: macos opengl textures scenekit iosurface