2012-05-17 46 views
12

Có cách nào để làm cho nền của GLKView trong suốt không? Tôi đã thử các giải pháp here nhưng điều đó không làm việc cho tôi.OpenGL ES 2.0 GLKit với nền trong suốt

* CHỈNH SỬA: Tôi cần trợ giúp làm cho nó hoàn toàn trong suốt. Nền chủ yếu là màu trắng và xám, nhưng tôi chỉ thử nghiệm nó với nhiều màu sắc sống động hơn, và chắc chắn bạn có thể nhìn qua một cách mơ hồ. Bất kỳ ý tưởng tại sao nó sẽ được một phần minh bạch nhưng không hoàn toàn với các mã sau đây?

Dưới đây là mã trong bộ điều khiển quan điểm của tôi:

- (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);  
} 

Tôi đã thử đặt backgroundColor của thành [UIColor clearColor] và thiết lập eaglLayer để không bị mờ đục. Heck, tôi thậm chí đã cố gắng thiết lập backgroundColor của eaglLayer thành CGColorRef với 0 opacity.

+2

Bạn có chắc chắn rằng bạn không làm đầy bối cảnh cảnh tại thời điểm vẽ tranh không? Tôi biết nó nghe có vẻ ngốc nghếch nhưng tôi đã thấy điều đó xảy ra với những người đang cố gắng làm điều tương tự. – mprivat

+0

Tôi hoàn toàn mới với điều này, vì vậy nó có thể, nhưng tôi 99% chắc chắn tôi chỉ vẽ một dải đường. Màu sắc rõ ràng được thiết lập để có alpha là 0,0f, nhưng tôi thậm chí còn nhận thấy nếu tôi cố gắng vẽ các đỉnh có thuộc tính màu sắc đặt alpha thành 0.0f, chúng vẫn vẽ. Điều đó có ý nghĩa gì không/giúp bạn động não? – prplehaze

+3

Một bình luận tôi có thể làm ở đây là tôi sẽ tránh sử dụng chế độ xem lưu trữ OpenGL ES không mờ đục nếu bạn có thể. Điều này sẽ làm chậm đáng kể hiển thị của bạn so với chế độ xem OpenGL ES mờ đục bình thường. Nếu bạn có thể, hãy kéo nội dung nền mà bạn muốn kết xuất trong khung cảnh OpenGL ES và hiển thị tất cả nội dung đó thành chế độ xem mờ. –

Trả lời

15

Vâng, tôi đã không nghĩ rằng điều này sẽ thành vấn đề vì alpha đã ở 0.0f, nhưng khi tôi thay đổi

glClearColor(0.65f, 0.65f, 0.65f, 0.0f); 

để

glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

nó làm nền hoàn hảo trong suốt.

Cảm ơn mọi người đã đề xuất và trợ giúp của bạn!

+1

Tôi đang nhìn thấy cùng một điều - trừ khi clearColor là tất cả các số không nó sẽ không thực sự xóa theo cách tôi mong đợi. Nice tìm! –

+4

điều này chỉ làm nền đen, không trong suốt – zurbergram

+1

Nó sẽ có màu đen trừ khi bạn đặt rõ ràng thuộc tính mờ của lớp của chế độ xem thành NO như được hiển thị ở trên trong đoạn mã của câu hỏi. – tlbrack

6

Đối với tôi nó đã góp phần làm cho quan điểm không đục:

view.opaque = NO 

ngoài các cuộc gọi với transparancy tất nhiên glClearColor.

Độ trong suốt 0.5f hòa trộn hoàn hảo nền trên một UIImageview khác với độ mờ một nửa.

Các vấn đề liên quan