#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. Хорошо, спасибо за вашу помощь, я попробую!