Отображение EAGLView с прозрачным фоном в UIImageView - PullRequest
3 голосов
/ 12 марта 2011

У меня есть EAGLView, отображающий 3D-модель OpenGL, и UIImageView, отображающий изображение.



Мне нужно отобразить EAGLView над этим UIImageView с прозрачным фоном.

Есть ли способ отобразить эту 3D-модель с прозрачным фоном поверх UIImageView.

Любое решение будет оценено.

Ответы [ 5 ]

11 голосов
/ 10 мая 2012

Для справки большая часть принятого ответа не нужна. Единственная ключевая часть - это (в 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, кажется, перезаписывает этот var для GL-взглядов в initWithCoder :()

Плюс, конечно, в вашем коде OpenGL вам нужно очистить до альфа = 0.0. Поэтому, где бы вы ни выполняли ваши вызовы glClear / glClearColor, замените clearColor на:

glClearColor( 0, 0, 0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
8 голосов
/ 14 марта 2011

Вот решение, которое я нашел:

При инициализации 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);
1 голос
/ 05 августа 2016

Если вы используете 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);
1 голос
/ 14 марта 2011

UIView - это базовый класс, из которого происходят как EAGLView, так и UIImageView. Поскольку вы используете EAGLView и UIImageView, вы используете UIView.

У UIViews есть подпредставления. Возможно, у вас будет UIView, для которого и UIImageView, и EAGLView являются подпредставлениями. Обычное правило заключается в том, что подпредставления отрисовываются в том порядке, в котором они перечислены. Так что, если ваш UIImageView рисуется поверх вашего EAGLView, то он позже в списке.

Если вы создаете их и добавляете их как подпредставления программно, то делайте это в другом порядке или переключитесь с использования addSubview: на, например, insertSubview: underSubview: для UIImageView.

Если вы раскладываете вещи в Интерфейсном Разработчике, просто убедитесь, что EAGLView указан после UIImageView.

0 голосов
/ 05 ноября 2012

Ни один из приведенных выше ответов не работал для меня, я использовал эту модификацию кода для 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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...