added a function to switch to an offscreen framebuffer

This commit is contained in:
Thomas Friedel 2018-06-11 21:47:33 +02:00
parent aabe03b003
commit 0cb030619e
3 changed files with 106 additions and 14 deletions

View file

@ -190,6 +190,11 @@ var (
lgar *linearGradientAlphaShader
ipar *imagePatternAlphaShader
ir *imageShader
offScrTex uint32
offScrW int
offScrH int
renderStencilBuf uint32
frameBuf uint32
glChan = make(chan func())
)
@ -509,6 +514,53 @@ func (cv *Canvas) useAlphaShader(style *drawStyle, alphaTexSlot int32) (vertexLo
return sar.vertex, sar.alphaTexCoord
}
func (cv *Canvas) enableTextureRenderTarget() {
if offScrW != cv.w || offScrH != cv.h {
if offScrW != 0 && offScrH != 0 {
gli.DeleteTextures(1, &offScrTex)
gli.DeleteFramebuffers(1, &frameBuf)
gli.DeleteRenderbuffers(1, &renderStencilBuf)
}
offScrW = cv.w
offScrH = cv.h
gli.GenTextures(1, &offScrTex)
gli.BindTexture(gl_TEXTURE_2D, offScrTex)
// todo do non-power-of-two textures work everywhere?
gli.TexImage2D(gl_TEXTURE_2D, 0, gl_RGB, int32(cv.w), int32(cv.h), 0, gl_RGB, gl_UNSIGNED_BYTE, nil)
gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MAG_FILTER, gl_NEAREST)
gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, gl_NEAREST)
gli.GenFramebuffers(1, &frameBuf)
gli.BindFramebuffer(gl_FRAMEBUFFER, frameBuf)
gli.GenRenderbuffers(1, &renderStencilBuf)
gli.BindRenderbuffer(gl_RENDERBUFFER, renderStencilBuf)
gli.RenderbufferStorage(gl_RENDERBUFFER, gl_DEPTH_STENCIL, int32(cv.w), int32(cv.h))
gli.FramebufferRenderbuffer(gl_FRAMEBUFFER, gl_DEPTH_STENCIL_ATTACHMENT, gl_RENDERBUFFER, renderStencilBuf)
gli.FramebufferTexture(gl_FRAMEBUFFER, gl_COLOR_ATTACHMENT0, offScrTex, 0)
if gli.CheckFramebufferStatus(gl_FRAMEBUFFER) != gl_FRAMEBUFFER_COMPLETE {
// todo this should maybe not panic
panic("Failed to set up framebuffer for offscreen texture")
}
gli.Clear(gl_COLOR_BUFFER_BIT | gl_STENCIL_BUFFER_BIT)
} else {
gli.BindFramebuffer(gl_FRAMEBUFFER, frameBuf)
}
}
func (cv *Canvas) disableTextureRenderTarget() {
gli.BindFramebuffer(gl_FRAMEBUFFER, 0)
}
func (cv *Canvas) renderOffscreenTexture() {
img := Image{w: cv.w, h: cv.h, tex: offScrTex}
cv.DrawImage(&img, 0, 0, cv.fw, cv.fh)
}
// SetLineWidth sets the line width for any line drawing calls
func (cv *Canvas) SetLineWidth(width float64) {
if width < 0 {

View file

@ -24,6 +24,12 @@ func (_ GLImpl) AttachShader(program uint32, shader uint32) {
func (_ GLImpl) BindBuffer(target uint32, buffer uint32) {
gl.BindBuffer(target, buffer)
}
func (_ GLImpl) BindFramebuffer(target uint32, framebuffer uint32) {
gl.BindFramebuffer(target, framebuffer)
}
func (_ GLImpl) BindRenderbuffer(target uint32, renderbuffer uint32) {
gl.BindRenderbuffer(target, renderbuffer)
}
func (_ GLImpl) BindTexture(target uint32, texture uint32) {
gl.BindTexture(target, texture)
}
@ -33,6 +39,9 @@ func (_ GLImpl) BlendFunc(sfactor uint32, dfactor uint32) {
func (_ GLImpl) BufferData(target uint32, size int, data unsafe.Pointer, usage uint32) {
gl.BufferData(target, size, data, usage)
}
func (_ GLImpl) CheckFramebufferStatus(target uint32) uint32 {
return gl.CheckFramebufferStatus(target)
}
func (_ GLImpl) Clear(mask uint32) {
gl.Clear(mask)
}
@ -54,6 +63,12 @@ func (_ GLImpl) CreateShader(xtype uint32) uint32 {
func (_ GLImpl) DeleteShader(shader uint32) {
gl.DeleteShader(shader)
}
func (_ GLImpl) DeleteFramebuffers(n int32, framebuffers *uint32) {
gl.DeleteFramebuffers(n, framebuffers)
}
func (_ GLImpl) DeleteRenderbuffers(n int32, renderbuffers *uint32) {
gl.DeleteRenderbuffers(n, renderbuffers)
}
func (_ GLImpl) DeleteTextures(n int32, textures *uint32) {
gl.DeleteTextures(n, textures)
}
@ -72,9 +87,21 @@ func (_ GLImpl) Enable(cap uint32) {
func (_ GLImpl) EnableVertexAttribArray(index uint32) {
gl.EnableVertexAttribArray(index)
}
func (_ GLImpl) FramebufferRenderbuffer(target uint32, attachment uint32, renderbuffertarget uint32, renderbuffer uint32) {
gl.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer)
}
func (_ GLImpl) FramebufferTexture(target uint32, attachment uint32, texture uint32, level int32) {
gl.FramebufferTexture(target, attachment, texture, level)
}
func (_ GLImpl) GenBuffers(n int32, buffers *uint32) {
gl.GenBuffers(n, buffers)
}
func (_ GLImpl) GenFramebuffers(n int32, framebuffers *uint32) {
gl.GenFramebuffers(n, framebuffers)
}
func (_ GLImpl) GenRenderbuffers(n int32, renderbuffers *uint32) {
gl.GenRenderbuffers(n, renderbuffers)
}
func (_ GLImpl) GenTextures(n int32, textures *uint32) {
gl.GenTextures(n, textures)
}
@ -119,6 +146,9 @@ func (_ GLImpl) GetUniformLocation(program uint32, name string) int32 {
func (_ GLImpl) LinkProgram(program uint32) {
gl.LinkProgram(program)
}
func (_ GLImpl) RenderbufferStorage(target uint32, internalformat uint32, width int32, height int32) {
gl.RenderbufferStorage(target, internalformat, width, height)
}
func (_ GLImpl) ReadPixels(x int32, y int32, width int32, height int32, format uint32, xtype uint32, pixels unsafe.Pointer) {
gl.ReadPixels(x, y, width, height, format, xtype, pixels)
}

View file

@ -797,9 +797,12 @@ type GL interface {
ActiveTexture(texture uint32)
AttachShader(program uint32, shader uint32)
BindBuffer(target uint32, buffer uint32)
BindFramebuffer(target uint32, framebuffer uint32)
BindRenderbuffer(target uint32, renderbuffer uint32)
BindTexture(target uint32, texture uint32)
BlendFunc(sfactor uint32, dfactor uint32)
BufferData(target uint32, size int, data unsafe.Pointer, usage uint32)
CheckFramebufferStatus(target uint32) uint32
Clear(mask uint32)
ClearColor(red float32, green float32, blue float32, alpha float32)
ColorMask(red bool, green bool, blue bool, alpha bool)
@ -807,13 +810,19 @@ type GL interface {
CreateProgram() uint32
CreateShader(xtype uint32) uint32
DeleteShader(shader uint32)
DeleteFramebuffers(n int32, framebuffers *uint32)
DeleteRenderbuffers(n int32, renderbuffers *uint32)
DeleteTextures(n int32, textures *uint32)
Disable(cap uint32)
DisableVertexAttribArray(index uint32)
DrawArrays(mode uint32, first int32, count int32)
Enable(cap uint32)
EnableVertexAttribArray(index uint32)
FramebufferRenderbuffer(target uint32, attachment uint32, renderbuffertarget uint32, renderbuffer uint32)
FramebufferTexture(target uint32, attachment uint32, texture uint32, level int32)
GenBuffers(n int32, buffers *uint32)
GenFramebuffers(n int32, framebuffers *uint32)
GenRenderbuffers(n int32, renderbuffers *uint32)
GenTextures(n int32, textures *uint32)
GenerateMipmap(target uint32)
GetAttribLocation(program uint32, name string) int32
@ -825,6 +834,7 @@ type GL interface {
GetUniformLocation(program uint32, name string) int32
LinkProgram(program uint32)
ReadPixels(x int32, y int32, width int32, height int32, format uint32, xtype uint32, pixels unsafe.Pointer)
RenderbufferStorage(target uint32, internalformat uint32, width int32, height int32)
Scissor(x int32, y int32, width int32, height int32)
ShaderSource(shader uint32, source string)
StencilFunc(xfunc uint32, ref int32, mask uint32)