ebiten/graphics/opengl/rendertarget/render_target.go

64 lines
1.6 KiB
Go
Raw Normal View History

2013-10-27 11:54:28 +01:00
package rendertarget
// #cgo LDFLAGS: -framework OpenGL
//
// #include <OpenGL/gl.h>
import "C"
import (
2013-12-18 10:05:28 +01:00
"github.com/hajimehoshi/go-ebiten/graphics"
2013-10-27 11:54:28 +01:00
"github.com/hajimehoshi/go-ebiten/graphics/opengl/texture"
)
type Framebuffer C.GLuint
2014-01-08 06:37:07 +01:00
type RenderTarget struct {
Framebuffer
Width int
Height int
}
2013-11-28 01:57:30 +01:00
func createFramebuffer(nativeTexture C.GLuint) Framebuffer {
2013-10-27 11:54:28 +01:00
framebuffer := C.GLuint(0)
C.glGenFramebuffers(1, &framebuffer)
origFramebuffer := C.GLint(0)
C.glGetIntegerv(C.GL_FRAMEBUFFER_BINDING, &origFramebuffer)
2013-10-27 13:27:16 +01:00
2013-10-27 11:54:28 +01:00
C.glBindFramebuffer(C.GL_FRAMEBUFFER, framebuffer)
2013-10-27 13:27:16 +01:00
defer C.glBindFramebuffer(C.GL_FRAMEBUFFER, C.GLuint(origFramebuffer))
2013-10-27 11:54:28 +01:00
C.glFramebufferTexture2D(C.GL_FRAMEBUFFER, C.GL_COLOR_ATTACHMENT0,
C.GL_TEXTURE_2D, nativeTexture, 0)
if C.glCheckFramebufferStatus(C.GL_FRAMEBUFFER) !=
C.GL_FRAMEBUFFER_COMPLETE {
panic("creating framebuffer failed")
}
2013-10-27 14:58:56 +01:00
// Set this framebuffer opaque because alpha values on a target might be
// confusing.
C.glClearColor(0, 0, 0, 1)
C.glClear(C.GL_COLOR_BUFFER_BIT)
2013-11-28 01:57:30 +01:00
return Framebuffer(framebuffer)
2013-10-27 11:54:28 +01:00
}
2013-12-18 10:05:28 +01:00
func Create(width, height int, filter graphics.Filter) (
2014-01-08 06:37:07 +01:00
*RenderTarget, *texture.Texture, error) {
2013-11-28 18:38:18 +01:00
tex, err := texture.Create(width, height, filter)
2013-10-27 11:54:28 +01:00
if err != nil {
2013-10-27 14:09:19 +01:00
return nil, nil, err
2013-10-27 11:54:28 +01:00
}
2014-01-08 06:37:07 +01:00
framebuffer := createFramebuffer(C.GLuint(tex.Native))
return &RenderTarget{framebuffer, tex.Width, tex.Height}, tex, nil
2013-10-27 11:54:28 +01:00
}
2013-11-28 18:38:18 +01:00
func CreateWithFramebuffer(width, height int, framebuffer Framebuffer) (
2014-01-08 06:37:07 +01:00
*RenderTarget, error) {
return &RenderTarget{framebuffer, width, height}, nil
}
2014-01-08 06:37:07 +01:00
func (r *RenderTarget) Dispose() {
f := C.GLuint(r.Framebuffer)
C.glDeleteFramebuffers(1, &f)
}