我有一个显示OpenGL 3D模型的EAGLView和一个显示图像的UIImageView。
我想要的是在透明背景的UIImageView上方显示EAGLView。
有没有办法在UIImageView上显示带透明背景的3D模型。
任何解决方案都将受到赞赏。
答案 0 :(得分:11)
作为参考,大多数接受的答案是不必要的。唯一的关键部分是这个(在UIViewController中 - 无需编辑或子类EAGLView / GLKView):
self.view.opaque = NO; // NB: Apple DELETES THIS VALUE FROM NIB
self.view.backgroundColor = [UIColor clearColor]; // Optional: you can do this in NIB instead
您可以在NIB中设置背景颜色 - 但是您无法设置不透明度(Apple似乎在initWithCoder上覆盖GL视图的此var :()
另外,当然,在您的OpenGL代码中,您需要清除alpha = 0.0。因此,无论您的glClear / glClearColor调用已经在哪里,请将clearColor替换为:
glClearColor( 0, 0, 0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
答案 1 :(得分:8)
以下是我找到的解决方案:
在EAGLView.m初始化中
self.opaque = NO;
self.backgroundColor = [UIColor clearColor];
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = NO;
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
const CGFloat myColor[] = {0.0, 0.0, 0.0, 0.0};
eaglLayer.backgroundColor = CGColorCreate(rgb, myColor);
CGColorSpaceRelease(rgb);
答案 2 :(得分:1)
UIView是EAGLView和UIImageView派生的基类。当您使用EAGLView和UIImageView时,您正在使用UIView。
UIViews有子视图。可能你会有一个UIView,UIImageView和EAGLView都是子视图。通常的规则是子视图按列出的顺序绘制。因此,如果你的UIImageView是在你的EAGLView之上绘制的,那么它就在后面的列表中。
如果您正在创建它们并以编程方式将其添加为子视图,则可以按其他顺序添加,或者从使用addSubview:切换到例如insertSubview:belowSubview:用于UIImageView。
如果您在Interface Builder中进行布局,那么只需确保在UIImageView之后列出EAGLView。
答案 3 :(得分:1)
如果你使用GLKView所有需要做的就是
view.opaque = NO;
view.layer.opaque = NO;
glClearColor(0.f,0.f,0.f,0.f);
还准备显示透明纹理
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
如果需要
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
答案 4 :(得分:0)
上述答案都没有对我有用,我对CCDirector.m使用了这个代码修改,它运行正常:
-(void) setGLDefaultValues
{
// This method SHOULD be called only after openGLView_ was initialized
NSAssert( openGLView_, @"openGLView_ must be initialized");
[self setAlphaBlending: YES];
[self setDepthTest: YES];
[self setProjection: projection_];
// ***** NEW CODE: make open gl view transparent
openGLView_.opaque = NO;
glClearColor(0.0, 0.0, 0.0, 0.0);
// ***** NEW CODE end
// set other opengl default values
//glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
#if CC_DIRECTOR_FAST_FPS
if (!FPSLabel_) {
CCTexture2DPixelFormat currentFormat = [CCTexture2D defaultAlphaPixelFormat];
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA4444];
FPSLabel_ = [[CCLabelAtlas labelWithString:@"00.0" charMapFile:@"fps_images.png" itemWidth:16 itemHeight:24 startCharMap:'.'] retain];
[CCTexture2D setDefaultAlphaPixelFormat:currentFormat];
}
#endif // CC_DIRECTOR_FAST_FPS
}