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