Почему прозрачность PNG отображается неправильно?

#go #opengl #graphics #png #sdl-2

#Вперед #opengl #графика #png #sdl-2

Вопрос:

Я использую привязки Go для SDL и OpenGL. Вот как я загружаю текстуру:

 func (sprite *Sprite) loadImage(name string) {
    surf, err := img.Load(name)
    if err != nil {
        panic(err)
    }

    sprite.width = surf.W
    sprite.height = surf.H

    gl.Enable(gl.TEXTURE_2D)
    gl.GenTextures(1, amp;sprite.tex)
    gl.BindTexture(gl.TEXTURE_2D, sprite.tex)
    gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, surf.W, surf.H, 0, gl.RGBA, gl.UNSIGNED_BYTE, surf.Data())
    gl.BindTexture(gl.TEXTURE_2D, 0)

    gl.GenFramebuffers(1, amp;sprite.framebuffer)
    gl.BindFramebuffer(gl.READ_FRAMEBUFFER, sprite.framebuffer)
    gl.FramebufferTexture2D(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, sprite.tex, 0)
    gl.BindFramebuffer(gl.READ_FRAMEBUFFER, 0)
}
  

Я рисую это с помощью:

 func (sprite *Sprite) draw() {
    gl.Enable(gl.BLEND)
    gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)

    gl.BindFramebuffer(gl.READ_FRAMEBUFFER, sprite.framebuffer)
    gl.BlitFramebuffer(0, 0, int32(sprite.width), int32(sprite.height), 0, 0, 100, 100, gl.COLOR_BUFFER_BIT, gl.LINEAR)
    gl.BindFramebuffer(gl.READ_FRAMEBUFFER, 0)

    gl.Disable(gl.BLEND)
}
  

Цикл рисования:

 for running {
    for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
        switch event.(type) {
        case *sdl.QuitEvent:
            running = false
            break
        }
    }
    gl.ClearColor(0.3, 1.0, 0.3, 1.0)
    gl.Clear(gl.COLOR_BUFFER_BIT)

    sp.draw()

    window.GLSwap()
}
  

Он работает правильно, однако альфа-канал, похоже, не учитывается OpenGL. Прозрачные части текстур a отображаются черным цветом:

Черная прозрачность

Итак, как я могу заставить прозрачность работать?

Комментарии:

1. BlitFramebuffer это операция копирования. Смешивание применяется только к операциям рисования.

2. Какую функцию я бы использовал вместо этого?

3. Вам нужно нарисовать прямоугольную форму и наложить на нее текстуру.

4. Хорошо, спасибо за вашу помощь, я попробую!