Iphone 具有透明背景的OpenGL ES 2.0 GLKit
有没有办法使GLKView的背景透明?我尝试过这个解决方案,但对我来说不起作用 *编辑:我需要帮助使它完全透明。背景大部分是白色和灰色,但我只是用更鲜艳的颜色测试了一下,你肯定可以模糊地看到背景。你知道为什么用下面的代码部分透明但不完全透明吗 以下是我的视图控制器中的代码:Iphone 具有透明背景的OpenGL ES 2.0 GLKit,iphone,ios,opengl-es,glkit,Iphone,Ios,Opengl Es,Glkit,有没有办法使GLKView的背景透明?我尝试过这个解决方案,但对我来说不起作用 *编辑:我需要帮助使它完全透明。背景大部分是白色和灰色,但我只是用更鲜艳的颜色测试了一下,你肯定可以模糊地看到背景。你知道为什么用下面的代码部分透明但不完全透明吗 以下是我的视图控制器中的代码: - (void)viewDidLoad { [super viewDidLoad]; self.context = [[[EAGLContext alloc] initWithAPI:kEAGLRender
- (void)viewDidLoad
{
[super viewDidLoad];
self.context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2] autorelease];
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.view.layer;
eaglLayer.opaque = NO;
if (!self.context) {
NSLog(@"Failed to create ES context");
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.backgroundColor = [UIColor clearColor];
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
[self setupGL];
}
- (void)setupGL
{
[EAGLContext setCurrentContext:self.context];
self.effect = [[[GLKBaseEffect alloc] init] autorelease];
self.effect.light0.enabled = GL_FALSE;
self.effect.light0.diffuseColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 0.0f);
self.effect.light0.ambientColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 0.0f);
glDisable(GL_DEPTH_TEST);
glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, VERTEX_POS_DATA_SIZE, GL_FLOAT, GL_FALSE, VERTEX_DATA_SIZE * sizeof(GLfloat), BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, VERTEX_COLOR_DATA_SIZE, GL_FLOAT, GL_FLOAT, VERTEX_DATA_SIZE * sizeof(GLfloat), BUFFER_OFFSET(VERTEX_POS_DATA_SIZE * sizeof(GLfloat)));
glLineWidth(10.0);
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
if (!needsRedraw) return;
needsRedraw = NO;
glClearColor(0.65f, 0.65f, 0.65f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self.effect prepareToDraw];
glDrawArrays(GL_LINE_STRIP, 0, vertexCount);
}
我已经尝试将背景色设置为[UIColor clearColor],并将EagleLayer设置为不透明。见鬼,我甚至尝试将EagleLayer的背景色设置为CGColorRef,不透明度为0 嗯,我不认为这有什么关系,因为阿尔法已经是0.0f了,但当我改变时
glClearColor(0.65f, 0.65f, 0.65f, 0.0f);
到
它使背景完全透明
谢谢大家的建议和帮助 对我来说,这有助于使视图不不透明:
view.opaque = NO
除了glClearColor调用外,当然还有透明性
透明度为0.5f时,另一个UIImageview上的背景完全混合为半不透明。绘制场景时,您确定没有填充场景背景吗?我知道这听起来很愚蠢,但我也见过有人尝试做同样的事情。我对这个完全陌生,所以这是可能的,但我99%确定我只画了一条线。“透明颜色”设置为alpha为0.0f,但我甚至注意到,如果我尝试绘制颜色属性将alpha设置为0.0f的顶点,它们仍然会绘制。这有什么意义/帮助你进行头脑风暴吗?我在这里可能会说的一点是,如果可以的话,我会避免使用非不透明的OpenGL ES宿主视图。与普通不透明的OpenGL ES视图相比,这将显著降低渲染速度。如果可以的话,把你想在OpenGL ES场景中渲染的背景内容拉过来,然后渲染到一个不透明的视图中。布拉德,我真的试着创造性地避免这种情况,但是,唉,我想不出一种解决透明度问题的方法。我有一个动态内容的视图,用户可以拖放它,我需要这个GLKView来允许他们绘制。即使拍摄一张屏幕截图并将其用作背景也不起作用,因为一旦他们关闭绘图,绘图需要保留,但下面的内容是动态的。我只是渲染线条,所以在渲染方面并不繁重。有什么想法吗?具有讽刺意味的是,事实上,正是你在cocoaconf上的演讲让我决定尝试OpenGL。没有压力:)是的,这可能是你唯一的选择。有时候,这是不可避免的。对于用户界面元素顶部的二维图形,您甚至可能没有注意到减速。只有当你进入更强烈的渲染时,这才变得明显。最坏的情况,试试看。这只是在分析时要注意的一点。我看到了同样的情况——除非clearColor都是零,否则它实际上不会以我期望的方式擦除。好发现!这只会使背景变黑,而不是透明。除非您在问题的代码片段中将视图的“图层不透明”属性显式设置为“否”,否则背景将变黑。为了清楚起见,您需要:
opaque=NO
,backgroundColor=[UIColor clearColor]
和glClearColor(0,0,0)
。尝试在IE builder中将“不透明”设置为“否”,但无效-仅在代码中有效。有人知道可能是什么问题吗?
view.opaque = NO