From b0230892aba06bcfed054c88cc10da19c6bb1fc5 Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Tue, 11 Feb 2020 14:51:24 +0100 Subject: [PATCH] added image shader into unified shader --- backend/goglbackend/gogl.go | 22 ++++++-------- backend/goglbackend/imagedata.go | 25 +++++++++------- backend/goglbackend/images.go | 25 +++++++++------- backend/goglbackend/shaders.go | 49 ++++++++------------------------ 4 files changed, 50 insertions(+), 71 deletions(-) diff --git a/backend/goglbackend/gogl.go b/backend/goglbackend/gogl.go index 8473d97..f589e97 100644 --- a/backend/goglbackend/gogl.go +++ b/backend/goglbackend/gogl.go @@ -21,7 +21,6 @@ type GLContext struct { alphaTex uint32 shd unifiedShader - ir imageShader gauss15r gaussianShader gauss63r gaussianShader gauss127r gaussianShader @@ -61,15 +60,6 @@ func NewGLContext() (*GLContext, error) { return nil, err } - err = loadShader(imageVS, imageFS, &ctx.ir.shaderProgram) - if err != nil { - return nil, err - } - ctx.ir.shaderProgram.mustLoadLocations(&ctx.ir) - if err = glError(); err != nil { - return nil, err - } - err = loadShader(gaussian15VS, gaussian15FS, &ctx.gauss15r.shaderProgram) if err != nil { return nil, err @@ -353,7 +343,8 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp gl.Uniform1i(b.shd.UseLinearGradient, 1) gl.Uniform1i(b.shd.UseRadialGradient, 0) gl.Uniform1i(b.shd.UseImagePattern, 0) - return b.shd.Vertex, b.shd.AlphaTexCoord + gl.Uniform1i(b.shd.UseImage, 0) + return b.shd.Vertex, b.shd.TexCoord } if rg := style.RadialGradient; rg != nil { rg := rg.(*RadialGradient) @@ -374,7 +365,8 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.UseRadialGradient, 1) gl.Uniform1i(b.shd.UseImagePattern, 0) - return b.shd.Vertex, b.shd.AlphaTexCoord + gl.Uniform1i(b.shd.UseImage, 0) + return b.shd.Vertex, b.shd.TexCoord } if ip := style.ImagePattern; ip != nil { ipd := ip.(*ImagePattern).data @@ -406,7 +398,8 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.UseRadialGradient, 0) gl.Uniform1i(b.shd.UseImagePattern, 1) - return b.shd.Vertex, b.shd.AlphaTexCoord + gl.Uniform1i(b.shd.UseImage, 0) + return b.shd.Vertex, b.shd.TexCoord } gl.UseProgram(b.shd.ID) @@ -419,7 +412,8 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.UseRadialGradient, 0) gl.Uniform1i(b.shd.UseImagePattern, 0) - return b.shd.Vertex, b.shd.AlphaTexCoord + gl.Uniform1i(b.shd.UseImage, 0) + return b.shd.Vertex, b.shd.TexCoord } func (b *GoGLBackend) enableTextureRenderTarget(offscr *offscreenBuffer) { diff --git a/backend/goglbackend/imagedata.go b/backend/goglbackend/imagedata.go index a5161a0..86eaa3e 100644 --- a/backend/goglbackend/imagedata.go +++ b/backend/goglbackend/imagedata.go @@ -85,15 +85,20 @@ func (b *GoGLBackend) PutImageData(img *image.RGBA, x, y int) { 0, 0, 1, 0, 1, 1, 0, 1} gl.BufferData(gl.ARRAY_BUFFER, len(data)*4, unsafe.Pointer(&data[0]), gl.STREAM_DRAW) - gl.UseProgram(b.ir.ID) - gl.Uniform1i(b.ir.Image, 0) - gl.Uniform2f(b.ir.CanvasSize, float32(b.fw), float32(b.fh)) - gl.Uniform1f(b.ir.GlobalAlpha, 1) - gl.VertexAttribPointer(b.ir.Vertex, 2, gl.FLOAT, false, 0, nil) - gl.VertexAttribPointer(b.ir.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) - gl.EnableVertexAttribArray(b.ir.Vertex) - gl.EnableVertexAttribArray(b.ir.TexCoord) + gl.UseProgram(b.shd.ID) + gl.Uniform1i(b.shd.Image, 0) + gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) + gl.Uniform1f(b.shd.GlobalAlpha, 1) + gl.Uniform1i(b.shd.UseAlphaTex, 0) + gl.Uniform1i(b.shd.UseLinearGradient, 0) + gl.Uniform1i(b.shd.UseRadialGradient, 0) + gl.Uniform1i(b.shd.UseImagePattern, 0) + gl.Uniform1i(b.shd.UseImage, 1) + gl.VertexAttribPointer(b.shd.Vertex, 2, gl.FLOAT, false, 0, nil) + gl.VertexAttribPointer(b.shd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) + gl.EnableVertexAttribArray(b.shd.Vertex) + gl.EnableVertexAttribArray(b.shd.TexCoord) gl.DrawArrays(gl.TRIANGLE_FAN, 0, 4) - gl.DisableVertexAttribArray(b.ir.Vertex) - gl.DisableVertexAttribArray(b.ir.TexCoord) + gl.DisableVertexAttribArray(b.shd.Vertex) + gl.DisableVertexAttribArray(b.shd.TexCoord) } diff --git a/backend/goglbackend/images.go b/backend/goglbackend/images.go index 23969ce..b980af5 100644 --- a/backend/goglbackend/images.go +++ b/backend/goglbackend/images.go @@ -194,17 +194,22 @@ func (b *GoGLBackend) DrawImage(dimg backendbase.Image, sx, sy, sw, sh float64, gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, img.tex) - gl.UseProgram(b.ir.ID) - gl.Uniform1i(b.ir.Image, 0) - gl.Uniform2f(b.ir.CanvasSize, float32(b.fw), float32(b.fh)) - gl.Uniform1f(b.ir.GlobalAlpha, float32(alpha)) - gl.VertexAttribPointer(b.ir.Vertex, 2, gl.FLOAT, false, 0, nil) - gl.VertexAttribPointer(b.ir.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) - gl.EnableVertexAttribArray(b.ir.Vertex) - gl.EnableVertexAttribArray(b.ir.TexCoord) + gl.UseProgram(b.shd.ID) + gl.Uniform1i(b.shd.Image, 0) + gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) + gl.Uniform1f(b.shd.GlobalAlpha, float32(alpha)) + gl.Uniform1i(b.shd.UseAlphaTex, 0) + gl.Uniform1i(b.shd.UseLinearGradient, 0) + gl.Uniform1i(b.shd.UseRadialGradient, 0) + gl.Uniform1i(b.shd.UseImagePattern, 0) + gl.Uniform1i(b.shd.UseImage, 1) + gl.VertexAttribPointer(b.shd.Vertex, 2, gl.FLOAT, false, 0, nil) + gl.VertexAttribPointer(b.shd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) + gl.EnableVertexAttribArray(b.shd.Vertex) + gl.EnableVertexAttribArray(b.shd.TexCoord) gl.DrawArrays(gl.TRIANGLE_FAN, 0, 4) - gl.DisableVertexAttribArray(b.ir.Vertex) - gl.DisableVertexAttribArray(b.ir.TexCoord) + gl.DisableVertexAttribArray(b.shd.Vertex) + gl.DisableVertexAttribArray(b.shd.TexCoord) gl.StencilFunc(gl.ALWAYS, 0, 0xFF) } diff --git a/backend/goglbackend/shaders.go b/backend/goglbackend/shaders.go index 2fba576..06d4760 100755 --- a/backend/goglbackend/shaders.go +++ b/backend/goglbackend/shaders.go @@ -7,14 +7,14 @@ import ( ) var unifiedVS = ` -attribute vec2 vertex, alphaTexCoord; +attribute vec2 vertex, texCoord; uniform vec2 canvasSize; -varying vec2 v_cp, v_atc; +varying vec2 v_cp, v_tc; void main() { - v_atc = alphaTexCoord; + v_tc = texCoord; v_cp = vertex; vec2 glp = vertex * 2.0 / canvasSize - 1.0; gl_Position = vec4(glp.x, -glp.y, 0.0, 1.0); @@ -25,7 +25,7 @@ var unifiedFS = ` precision mediump float; #endif -varying vec2 v_cp, v_atc; +varying vec2 v_cp, v_tc; uniform vec4 color; uniform float globalAlpha; @@ -45,6 +45,8 @@ uniform vec2 repeat; uniform bool useAlphaTex; uniform sampler2D alphaTex; +uniform bool useImage; + bool isNaN(float v) { return v < 0.0 || 0.0 < v || v == 0.0 ? false : true; } @@ -84,10 +86,12 @@ void main() { if (imgpt.y < 0.0 || imgpt.y > 1.0) { col *= repeat.y; } + } else if (useImage) { + col = texture2D(image, v_tc); } if (useAlphaTex) { - col.a *= texture2D(alphaTex, v_atc).a * globalAlpha; + col.a *= texture2D(alphaTex, v_tc).a * globalAlpha; } else { col.a *= globalAlpha; } @@ -96,28 +100,6 @@ void main() { } ` -var imageVS = ` -attribute vec2 vertex, texCoord; -uniform vec2 canvasSize; -varying vec2 v_texCoord; -void main() { - v_texCoord = texCoord; - vec2 glp = vertex * 2.0 / canvasSize - 1.0; - gl_Position = vec4(glp.x, -glp.y, 0.0, 1.0); -}` -var imageFS = ` -#ifdef GL_ES -precision mediump float; -#endif -varying vec2 v_texCoord; -uniform sampler2D image; -uniform float globalAlpha; -void main() { - vec4 col = texture2D(image, v_texCoord); - col.a *= globalAlpha; - gl_FragColor = col; -}` - var gaussian15VS = ` attribute vec2 vertex, texCoord; uniform vec2 canvasSize; @@ -212,8 +194,8 @@ func init() { type unifiedShader struct { shaderProgram - Vertex uint32 - AlphaTexCoord uint32 + Vertex uint32 + TexCoord uint32 CanvasSize int32 Color int32 @@ -234,15 +216,8 @@ type unifiedShader struct { Image int32 ImageTransform int32 Repeat int32 -} -type imageShader struct { - shaderProgram - Vertex uint32 - TexCoord uint32 - CanvasSize int32 - Image int32 - GlobalAlpha int32 + UseImage int32 } type gaussianShader struct {