为什么PNG的透明度无法正确显示?

问题描述

我正在为SDL和OpenGL使用Go绑定。 这就是我加载纹理的方式:

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,&sprite.tex)
    gl.BindTexture(gl.TEXTURE_2D,sprite.tex)
    gl.TexImage2D(gl.TEXTURE_2D,gl.RGBA8,surf.W,surf.H,gl.RGBA,gl.UNSIGNED_BYTE,surf.Data())
    gl.BindTexture(gl.TEXTURE_2D,0)

    gl.GenFramebuffers(1,&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,int32(sprite.width),int32(sprite.height),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似乎没有考虑Alpha-Channel。纹理的透明部分被绘制为黑色:

Black Transparency

那我该如何使透明度起作用?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)