【发布时间】:2011-03-12 16:10:47
【问题描述】:
我有一个显示 OpenGL 3D 模型的 EAGLView 和一个显示图像的 UIImageView。
我想要的是在具有透明背景的 UIImageView 上方显示 EAGLView。
有没有办法在 UIImageView 上显示这个具有透明背景的 3D 模型。
任何解决方案将不胜感激。
【问题讨论】:
标签: iphone objective-c opengl-es 3d
我有一个显示 OpenGL 3D 模型的 EAGLView 和一个显示图像的 UIImageView。
我想要的是在具有透明背景的 UIImageView 上方显示 EAGLView。
有没有办法在 UIImageView 上显示这个具有透明背景的 3D 模型。
任何解决方案将不胜感激。
【问题讨论】:
标签: iphone objective-c opengl-es 3d
作为参考,大多数接受的答案都是不必要的。唯一的关键部分是这个(在 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);
【讨论】:
这是我找到的解决方案:
在 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);
【讨论】:
UIView 是 EAGLView 和 UIImageView 派生的基类。当您使用 EAGLView 和 UIImageView 时,您正在使用 UIView。
UIViews 有子视图。可能你会有一个 UIView,它的 UIImageView 和 EAGLView 都是子视图。通常的规则是子视图按照它们列出的顺序绘制。因此,如果您的 UIImageView 被绘制在您的 EAGLView 之上,那么它会在列表的后面。
如果您正在创建它们并以编程方式将它们添加为子视图,则以不同的顺序执行此操作,或从使用 addSubview: 切换到例如insertSubview:belowSubview: 用于 UIImageView。
如果您在 Interface Builder 中进行布局,那么只需确保 EAGLView 列在 UIImageView 之后。
【讨论】:
如果你使用 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);
【讨论】:
以上答案都不适合我,我使用这个代码修改 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
}
【讨论】: