Почему у моих спрайтов есть темная тень / линия / рамка вокруг текстуры? - PullRequest
0 голосов
/ 16 декабря 2011

Я запускаю OpenGL с руки Apple GLKit. У меня возникли проблемы с отображением моих спрайтов.Проблема в том, что все они окружены тонкими темными линиями.На приведенном ниже снимке экрана показаны два прямоугольника с текстурами изображений png, которые содержат прозрачность (очевидно).

enter image description here

Черные тени, окружающие их, определенно не являются частью pngS.Зеленый png выполняется без сглаживания, синий имеет сглаженную границу.Черная рамка также очевидна, если я нарисую только один спрайт.

То есть соответствующая часть (надеюсь, что ...) кода:

//render the scene
-(void)render
{
    glClearColor(69./255., 115./255., 213./255., 1.);
    glClear(GL_COLOR_BUFFER_BIT);
    [shapes enumerateObjectsUsingBlock:^(AAAShape *shape, NSUInteger idx, BOOL *stop)   
     {
         [shape renderInScene:self];
     }];
}

//creating and storing the effect inside shape class
-(GLKBaseEffect *)effect
{
    if(!effect)
    {
        effect = [[GLKBaseEffect alloc] init];
    } 
    return effect;
}

//rendering the shape (including effect configuration)   
-(void)renderInScene:(AAAScene *)scene 
{
    //TODO: Storing vertices in Buffer
    self.effect.transform.projectionMatrix = scene.projectionMatrix; 
    self.effect.transform.modelviewMatrix = self.objectMatrix; 
    if(texture)
    {
        self.effect.texture2d0.enabled = GL_TRUE;
        self.effect.texture2d0.envMode = GLKTextureEnvModeReplace;
        self.effect.texture2d0.target = GLKTextureTarget2D;
        self.effect.texture2d0.name = texture.name;
    }
    [self.effect prepareToDraw];

    if(texture)
    {
        glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
        glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, self.textureCoordinates);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    }

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, self.vertices);
    glDrawArrays(GL_TRIANGLE_FAN, 0, self.vertexCount);
    glDisableVertexAttribArray(GLKVertexAttribPosition);

    if(texture)
    {
        glDisableVertexAttribArray(GLKVertexAttribTexCoord0);
        glDisable(GL_BLEND);
    }
}

Любые идеи кто-нибудь?Спасибо.

Ответы [ 2 ]

1 голос
/ 31 декабря 2013

Это сработало для меня:

glEnable( GLES20.GL_BLEND );
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
0 голосов
/ 17 декабря 2011

Заходите на stackoverflowers, 14 часов и ответов нет ;-). На gamedev Дэвиду понадобилось 14 минут, чтобы дать этот замечательный ответ . Проголосуй за него!

...