使用Unity build实现iphone MSAA

使用Unity build实现iphone MSAA,iphone,objective-c,opengl-es,unity3d,Iphone,Objective C,Opengl Es,Unity3d,我想在游戏的统一构建中实现MSAA。目前我正在使用我从Unity论坛上获得的代码,它已经编译好了,但我可以清楚地看到它在游戏中没有任何效果。任何帮助都将不胜感激 bool msaaEnabled = false; CGSize globalSize; struct MyEAGLSurface { GLuint format; GLuint depthFormat; GLuint framebuffer; GLuint r

我想在游戏的统一构建中实现MSAA。目前我正在使用我从Unity论坛上获得的代码,它已经编译好了,但我可以清楚地看到它在游戏中没有任何效果。任何帮助都将不胜感激

bool msaaEnabled = false;
CGSize globalSize; 

struct MyEAGLSurface
{
    GLuint      format;
    GLuint      depthFormat;
    GLuint      framebuffer;
    GLuint      renderbuffer;
    GLuint      msaaFrameBuffer;   
    GLuint      msaaRenderBuffer;   
    GLuint      msaaDepthBuffer;   
    GLuint      depthBuffer;
    CGSize      size; 
};

typedef EAGLContext*    MyEAGLContext;

@interface EAGLView : UIView {}
@end

MyEAGLContext           _context;
MyEAGLSurface           _surface;
UIWindow *              _window;
NSTimer*                _timer;
id                      _displayLink;
BOOL                    _accelerometerIsActive = NO;

extern "C" void MSAA_Enabled( bool enabled )
{   
    if( enabled && !msaaEnabled )
    {
        // Create MSAA buffers!
        glGenFramebuffersOES(1, &_surface.msaaFrameBuffer );
        glGenRenderbuffersOES(1, &_surface.msaaRenderBuffer );
        glBindFramebufferOES(GL_FRAMEBUFFER_OES, _surface.msaaFrameBuffer );
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, _surface.msaaRenderBuffer );

        // Samples is the amount of pixels the MSAA buffer uses to make one pixel on the render
        // buffer. Use a small number like 2 for the 3G and below and 4 or more for newer models
        int samples = 4;
        glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, samples, GL_RGB5_A1_OES, globalSize.width, globalSize.height);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, _surface.msaaRenderBuffer);

        // MSAA Depth buffer
        glGenRenderbuffersOES(1, &_surface.msaaDepthBuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, _surface.msaaDepthBuffer);
        glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, samples, _surface.depthFormat, globalSize.width, globalSize.height);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, _surface.msaaDepthBuffer);
    }
    else
    {
    }

    msaaEnabled = enabled;
}

extern "C" void MSAA_BindTarget()
{
    if( _surface.msaaFrameBuffer && msaaEnabled )
    {
        glBindFramebufferOES(GL_FRAMEBUFFER_OES, _surface.msaaFrameBuffer); //Bind MSAA
    }   
} 

bool CreateWindowSurface(EAGLView *view, GLuint format, GLuint depthFormat, bool retained, MyEAGLSurface* surface)
{
    CGSize newSize;
    GLuint oldRenderbuffer;
    GLuint oldFramebuffer;

        CAEAGLLayer* eaglLayer = (CAEAGLLayer*)[view layer];

    surface->format = format;
    surface->depthFormat = depthFormat;

    surface->msaaFrameBuffer = 0;
    surface->msaaRenderBuffer = 0;
    surface->msaaDepthBuffer = 0;
    surface->depthBuffer = 0;
    surface->renderbuffer = 0;
    surface->framebuffer = 0;

    eaglLayer.opaque = YES;
    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];

    newSize = [eaglLayer bounds].size;
    newSize.width = roundf(newSize.width);
    newSize.height = roundf(newSize.height);

    globalSize = newSize;

    glGetIntegerv(GL_RENDERBUFFER_BINDING_OES, (GLint *) &oldRenderbuffer);
    glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, (GLint *) &oldFramebuffer);

    // Create the main frame and render buffers
    glGenFramebuffersOES(1, &surface->framebuffer);
    glGenRenderbuffersOES(1, &surface->renderbuffer);

    // Bind the frame and render buffer
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->framebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->renderbuffer);

    // Set storage for render buffer
    if(![_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer])
    {
        glDeleteRenderbuffersOES(1, &surface->renderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_BINDING_OES, oldRenderbuffer);
        return false;
    }

    // Attach the renderbuffer
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, surface->renderbuffer);

    if (depthFormat)
    {      
        // Regular depth buffer
        glGenRenderbuffersOES(1, &surface->depthBuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->depthBuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, surface->depthFormat, newSize.width, newSize.height);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, surface->depthBuffer);
    }

    surface->size = newSize;
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, oldRenderbuffer);

    CHECK_GL_ERROR();   

    return true; 
}

void DestroySurface(MyEAGLSurface* surface)
{
    EAGLContext *oldContext = [EAGLContext currentContext];

    if (oldContext != _context)
        [EAGLContext setCurrentContext:_context];

    if(surface->msaaDepthBuffer)
    {
        glDeleteRenderbuffersOES(1, &surface->msaaDepthBuffer);
        surface->msaaDepthBuffer = 0;
    }

    if(surface->depthBuffer)
    {
        glDeleteRenderbuffersOES(1, &surface->depthBuffer);
        surface->depthBuffer = 0;
    }

    glDeleteRenderbuffersOES(1, &surface->msaaRenderBuffer);
    surface->msaaRenderBuffer = 0;

    glDeleteFramebuffersOES(1, &surface->msaaFrameBuffer);
    surface->msaaFrameBuffer = 0;

    glDeleteRenderbuffersOES(1, &surface->renderbuffer);
    surface->renderbuffer = 0;

    glDeleteFramebuffersOES(1, &surface->framebuffer);
    surface->framebuffer = 0;

    if (oldContext != _context)
        [EAGLContext setCurrentContext:oldContext];
}

void PresentSurface(MyEAGLSurface& surface)
{
    EAGLContext *oldContext = [EAGLContext currentContext];
    GLuint oldRenderbuffer;

    if (oldContext != _context)
        [EAGLContext setCurrentContext:_context];

    CHECK_GL_ERROR();

    glGetIntegerv(GL_RENDERBUFFER_BINDING_OES, (GLint *) &oldRenderbuffer);

    if( msaaEnabled )
    {
        glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, surface.msaaFrameBuffer);
        glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, surface.framebuffer);

        // Call a resolve to combine buffers
        glResolveMultisampleFramebufferAPPLE();   
    }

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface.renderbuffer);

    if(![_context presentRenderbuffer:GL_RENDERBUFFER_OES])
        EAGL_ERROR("swap renderbuffer");

    if(oldContext != _context)
        [EAGLContext setCurrentContext:oldContext];
}   

void PresentContext_UnityCallback(struct UnityFrameStats const* unityFrameStats)
{   
#if ENABLE_INTERNAL_PROFILER
    _unityFrameStats = *unityFrameStats;

    if (_frameId % BLOCK_ON_GPU_EACH_NTH_FRAME == (BLOCK_ON_GPU_EACH_NTH_FRAME-1))
    {
        Prof_Int64 gpuTime0 = mach_absolute_time();

#if ENABLE_BLOCK_ON_GPU_PROFILER
        UnityFinishRendering();
#endif

        Prof_Int64 gpuTime1 = mach_absolute_time();
        _gpuDelta = gpuTime1 - gpuTime0;
    }
    else
        _gpuDelta = 0;
#endif


#if ENABLE_INTERNAL_PROFILER
    Prof_Int64 swapTime0 = mach_absolute_time();
#endif

    PresentSurface(_surface);

#if ENABLE_INTERNAL_PROFILER
    Prof_Int64 vblankTime = mach_absolute_time();

    if (_lastVBlankTime < 0) _lastVBlankTime = vblankTime;
    _frameDelta = vblankTime - _lastVBlankTime; _lastVBlankTime = vblankTime;

    Prof_Int64 swapTime1 = vblankTime;
    _swapDelta = swapTime1 - swapTime0;
#endif
    }

int OpenEAGL_UnityCallback(UIWindow** window, int* screenWidth, int* screenHeight)
{
    CGRect rect = [[UIScreen mainScreen] bounds];

    // Create a full-screen window
    _window = [[UIWindow alloc] initWithFrame:rect];
    EAGLView* view = [[EAGLView alloc] initWithFrame:rect];
    [_window addSubview:view];

    //CAEAGLLayer* eaglLayer = (CAEAGLLayer*)[view layer];
    _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

    MSAA_Enabled(true);
    MSAA_BindTarget();

    if (!_context)
        return false;

    if (![EAGLContext setCurrentContext:_context]) {
        _context = 0;
        return false;
    }

    if (!CreateWindowSurface(view, GL_RGB565_OES, GL_DEPTH_COMPONENT16_OES, NO, &_surface)) {
        return false;
    }

    glViewport(0, 0, _surface.size.width, _surface.size.height);
    [_window makeKeyAndVisible];
    [view release];

    *window = _window;
    *screenWidth = _surface.size.width;
    *screenHeight = _surface.size.height;   

    return true;
}
bool msaaEnabled=false;
CGSize全球化;
结构表面
{
胶合格式;
胶合深度格式;
GLuint帧缓冲区;
GLuint renderbuffer;
GLuint-msaaFrameBuffer;
GLuint-msaaRenderBuffer;
GLuint-msaaDepthBuffer;
胶合深度缓冲液;
cg大小;
};
typedef EAGLContext*MyEAGLContext;
@接口EAGLView:UIView{}
@结束
语境(MyEAGLContext)语境;;
Myeagl表面_表面;
UIWindow*\u窗口;
NSTimer*\u定时器;
id\u显示链接;
BOOL\u加速度计激活=否;
外部“C”无效MSAA_已启用(bool已启用)
{   
如果(已启用&!msaaEnabled)
{
//创建MSAA缓冲区!
glGenFramebuffersOES(1,&u surface.msaaFrameBuffer);
glGenRenderbuffersOES(1,&u surface.msaanderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES,_surface.msaaFrameBuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES,_surface.msaaRenderBuffer);
//Samples是MSAA缓冲区用于在渲染上生成一个像素的像素量
//缓冲区。对于3G及以下型号,请使用较小的数字,如2,对于较新型号,请使用4或更多
int样本=4;
GLrenderBufferStorageMultiSamplePle(GL_RENDERBUFFER_OES,样本,GL_RGB5_A1_OES,globalSize.width,globalSize.height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES、GL_COLOR_ATTACHMENT0_OES、GL_RENDERBUFFER_OES、_surface.msaanderBuffer);
//深度缓冲区
glGenRenderbuffersOES(1,&_surface.msaaDepthBuffer);
glbindrenderbuffer(GL_RENDERBUFFER_OES,_surface.msaaDepthBuffer);
glrenderBufferStorageMultiSamplePle(GL_RENDERBUFFER_OES,示例,_surface.depthFormat,globalSize.width,globalSize.height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES,GL_DEPTH_ATTACHMENT_OES,GL_RENDERBUFFER_OES,_surface.msaaDepthBuffer);
}
其他的
{
}
msaaEnabled=已启用;
}
外部“C”无效MSAA_BindTarget()
{
如果(_surface.msaaFrameBuffer&&msaaEnabled)
{
glBindFramebufferOES(GL_FRAMEBUFFER_OES,_surface.msaaFrameBuffer);//绑定MSAA
}   
} 
bool CreateWindowsSurface(EAGLView*视图、GLuint格式、GLuint深度格式、bool保留、MyEAGLSurface*曲面)
{
CGSize;
GLuint oldRenderbuffer;
GLuint-oldFramebuffer;
CaeAglayer*Eaglayer=(CaeAglayer*)[视图层];
表面->格式=格式;
曲面->深度格式=深度格式;
表面->msaaFrameBuffer=0;
表面->msaaRenderBuffer=0;
表面->MSAADEPTHBUFER=0;
表面->深度缓冲区=0;
曲面->渲染缓冲=0;
表面->帧缓冲区=0;
eaglLayer.不透明=是;
EagleLayer.drawableProperties=[NSDictionary Dictionary Dictionary WithObjectsAndKeys:
[NSNumber numberWithBool:FALSE]、KeaglDrawablePropertyRetaineBacking、kEAGLColorFormatRGBA8、kEAGLDrawablePropertyColorFormat、nil];
newSize=[EagleLayer界限].大小;
newSize.width=roundf(newSize.width);
newSize.height=roundf(newSize.height);
globalSize=新闻大小;
GLGetIntegraterv(GL_RENDERBUFFER_BINDING_OES,(GLint*)和oldrendbuffer);
glGetIntegerv(GL\u帧缓冲区\u绑定(GLint*)和oldFramebuffer);
//创建主帧和渲染缓冲区
glGenFramebuffersOES(1,&surface->framebuffer);
glGenRenderbuffersOES(1,&surface->renderbuffer);
//绑定帧和渲染缓冲区
glBindFramebufferOES(GL\u FRAMEBUFFER\u OES,表面->帧缓冲区);
glBindRenderbufferOES(GL_RENDERBUFFER_OES,曲面->RENDERBUFFER);
//设置渲染缓冲区的存储
if(![\u上下文渲染缓冲存储:GL\u渲染缓冲\u OES fromDrawable:EagleLayer])
{
glDeleteRenderbuffersOES(1,&surface->renderbuffer);
GLBinderBufferoes(GL_RENDERBUFFER_BINDING_OES,oldRenderbuffer);
返回false;
}
//附加渲染缓冲区
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES,GL_COLOR_ATTACHMENT0_OES,GL_RENDERBUFFER_OES,surface->RENDERBUFFER);
if(深度格式)
{      
//规则深度缓冲器
glGenRenderbuffersOES(1,&surface->depthBuffer);
glBindRenderbufferOES(GLU RENDERBUFFEROES,表面->深度缓冲区);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES,surface->depthFormat,newSize.width,newSize.height);
glFramebufferRenderbufferOES(GL_帧缓冲区、GL_深度、附件、GL_渲染缓冲区、曲面->深度缓冲区);
}
表面->大小=新闻大小;
glBindRenderbufferOES(GL_RENDERBUFFER_OES,oldRenderbuffer);
检查_GL_ERROR();
返回true;
}
空洞破坏表面(表面*表面)
{
EagleContext*oldContext=[EagleContext currentContext];
如果(旧上下文!=\u上下文)
[EAGLContext setCurrentContext:_context];
如果(表面->MSAADEPTHBUFER)
{
glDeleteRenderbuffersOES(1,&surface->msaaDepthBuffer);
表面->MSAADEPTHBUFER=0;
}
if(表面->深度缓冲区)
{
glDeleteRenderbuffersOES(1,&surface->depthBuffer);
表面->深度缓冲区=0;
}
glDeleteRenderbuffersOES(1,&surface->msaaRenderBuffer);
表面->msaaRenderBuffer=0;
glDeleteFramebuffersOES(1,&surface->msaaFrameBuffer);
表面->msaaFrameBuffer=0;
glDeleteRenderbuffersOES(1,&surface->renderbuffer);
曲面->渲染缓冲=0;
glDeleteFramebuffersOES(1,&surface->framebuffer);
表面->帧缓冲区=0;
如果(旧上下文!=\u上下文)
[EagleContext setCurrentContext:oldContext];
}
void PresentSurface(表面和表面)
{
EagleContext*oldContext=[EagleContext currentContext];
GLuint oldRenderbuffer;
if(oldCon)