在没有GLkit的情况下制作多重采样fbo

时间:2015-12-20 07:42:22

标签: swift opengl opengl-es opengl-es-2.0

所以我试图制作一个跨平台程序,所以我避免使用太多的glkit特定功能。

无论如何,我现在已经将原始形状(点和三角形)绘制成了fbo的纹理。但是我现在需要对屏幕上的内容进行多次采样,使形状的边缘看起来更好。所以我的目标是制作另一个FBO(FBO 2),它可以消除另一个FBO(FBO 1)的纹理,并在屏幕上显示这个美丽的抗锯齿纹理。

不幸的是,我能找到的关于此的任何和所有资源都使用Apple的具体方法。而且我无论如何都无法工作。这是我用来制作和激活帧缓冲区的代码。

import Foundation
import GLKit
import OpenGLES

class RenderTexture2 {
    var framebuffer:GLuint = 0
    var tex:GLuint = 0
    var old_fbo:GLint = 0



    init(widthi: GLsizei, heighti: GLsizei)
    {

    }

    func begin()
    {
        glGetIntegerv(GLenum(GL_FRAMEBUFFER_BINDING), &old_fbo)
        glBindFramebuffer(GLenum(GL_FRAMEBUFFER), framebuffer)
    }

    func checkStatus()
    {
        let status = glCheckFramebufferStatus(GLenum(GL_FRAMEBUFFER))
        if (status != GLenum(GL_FRAMEBUFFER_COMPLETE))
        {
            print("DIDNT GO WELL WITH")
            print(status)
        }
    }

    func end()
    {
        glBindFramebuffer(GLenum(GL_FRAMEBUFFER), GLenum(old_fbo))
    }

    func loadTexture(name: String, type: String) -> GLuint
    {

        var it:GLKTextureInfo = GLKTextureInfo()


        let pic = UIImage(named: name + "." + type)!.CGImage
        let path = NSBundle.mainBundle().pathForResource(name, ofType: type)

        do
        {
            //try it = GLKTextureLoader.textureWithContentsOfFile(NSBundle.mainBundle().pathForResource(name, ofType: type)!, options: nil)
            try it = GLKTextureLoader.textureWithContentsOfFile(path!, options: nil)
        }
        catch
        {
            do
            {
                //print("ERR Loading: " + path!)
                try it = GLKTextureLoader.textureWithCGImage(pic!, options: nil)
            }
            catch
            {
                print("Error loading UIImage: " +  pic.debugDescription)
                it = GLKTextureInfo()

            }

        }

        return it.name

    }

    func load(width: GLsizei, height: GLsizei)
    {
        glBindTexture(GLenum(GL_TEXTURE_2D), 0)


        glGetIntegerv(GLenum(GL_FRAMEBUFFER_BINDING), &old_fbo)

        glGenFramebuffers(1, &framebuffer)
        tex = loadTexture("AF", type: "png")

        glBindFramebuffer(GLenum(GL_FRAMEBUFFER), framebuffer)


        //glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_MIN_FILTER), GL_NEAREST)
        //glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_MAG_FILTER), GL_NEAREST)


        glBindTexture(GLenum(GL_TEXTURE_2D), tex)
        glTexImage2D(GLenum(GL_TEXTURE_2D), 0, GL_RGBA, GLsizei(width), GLsizei(height), 0, GLenum(GL_RGBA), GLenum(GL_UNSIGNED_BYTE), nil)
        glFramebufferTexture2D(GLenum(GL_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT0), GLenum(GL_TEXTURE_2D), tex, 0)

        glClearColor(0, 0.0, 0, 0.0)
        glClear(GLenum(GL_COLOR_BUFFER_BIT))

        let status = glCheckFramebufferStatus(GLenum(GL_FRAMEBUFFER))
        if (status != GLenum(GL_FRAMEBUFFER_COMPLETE))
        {
            print("DIDNT GO WELL WITH", width, " " , height)
            print(status)
        }

        glBindFramebuffer(GLenum(GL_FRAMEBUFFER), GLenum(old_fbo))

    }

}

此代码现在可用作基本剪切和干燥fbo。

我需要做些什么来改变这项工作?也许如果我改变了一些纹理过滤/映射参数?

非常感谢!

0 个答案:

没有答案