IOSurface
ミップマッピングでテクスチャをレンダリングしたい。
私は次のようなものOpenGL
からテクスチャを生成しています:IOSurface
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;
}
これはうまくいきます。しかし残念なことに、テクスチャはミップマップされておらず、小さいサイズで表示すると非常に粗く/ピクセル化されています。さらに調査すると、IOSurface
バッキングされたテクスチャはGL_TEXTURE_RECTANGLE_ARB
ターゲットに限定されているだけでなく、ミップマッピングもサポートしていないようです。
わかった。したがって、ここでの私の最良の代替手段は次のようです。
GL_TEXTURE_RECTANGLE_ARB
テクスチャをテクスチャにGL_TEXTURE_2D
コピーする- この新しいテクスチャのミップマップを生成します
OpenGL 4.3 をサポートしていない Mac で開発しているため、glCopyImageSubData
ここでは便利な機能を使用できないことに注意してください。代わりに、この回答に基づいてステップ 1 のアプローチを作成しています: How to copy texture1 to texture2 effective?
私の完全なコードは次のようになります。
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
たテクスチャの処理に関連している可能性がありますか?