added image shader into unified shader

This commit is contained in:
Thomas Friedel 2020-02-11 14:51:24 +01:00
parent 50bf39fe62
commit b0230892ab
4 changed files with 50 additions and 71 deletions

View file

@ -21,7 +21,6 @@ type GLContext struct {
alphaTex uint32 alphaTex uint32
shd unifiedShader shd unifiedShader
ir imageShader
gauss15r gaussianShader gauss15r gaussianShader
gauss63r gaussianShader gauss63r gaussianShader
gauss127r gaussianShader gauss127r gaussianShader
@ -61,15 +60,6 @@ func NewGLContext() (*GLContext, error) {
return nil, err 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) err = loadShader(gaussian15VS, gaussian15FS, &ctx.gauss15r.shaderProgram)
if err != nil { if err != nil {
return nil, err 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.UseLinearGradient, 1)
gl.Uniform1i(b.shd.UseRadialGradient, 0) gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.Uniform1i(b.shd.UseImagePattern, 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 { if rg := style.RadialGradient; rg != nil {
rg := rg.(*RadialGradient) 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.UseLinearGradient, 0)
gl.Uniform1i(b.shd.UseRadialGradient, 1) gl.Uniform1i(b.shd.UseRadialGradient, 1)
gl.Uniform1i(b.shd.UseImagePattern, 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 ip := style.ImagePattern; ip != nil { if ip := style.ImagePattern; ip != nil {
ipd := ip.(*ImagePattern).data 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.UseLinearGradient, 0)
gl.Uniform1i(b.shd.UseRadialGradient, 0) gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.Uniform1i(b.shd.UseImagePattern, 1) 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) 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.UseLinearGradient, 0)
gl.Uniform1i(b.shd.UseRadialGradient, 0) gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.Uniform1i(b.shd.UseImagePattern, 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) { func (b *GoGLBackend) enableTextureRenderTarget(offscr *offscreenBuffer) {

View file

@ -85,15 +85,20 @@ func (b *GoGLBackend) PutImageData(img *image.RGBA, x, y int) {
0, 0, 1, 0, 1, 1, 0, 1} 0, 0, 1, 0, 1, 1, 0, 1}
gl.BufferData(gl.ARRAY_BUFFER, len(data)*4, unsafe.Pointer(&data[0]), gl.STREAM_DRAW) gl.BufferData(gl.ARRAY_BUFFER, len(data)*4, unsafe.Pointer(&data[0]), gl.STREAM_DRAW)
gl.UseProgram(b.ir.ID) gl.UseProgram(b.shd.ID)
gl.Uniform1i(b.ir.Image, 0) gl.Uniform1i(b.shd.Image, 0)
gl.Uniform2f(b.ir.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh))
gl.Uniform1f(b.ir.GlobalAlpha, 1) gl.Uniform1f(b.shd.GlobalAlpha, 1)
gl.VertexAttribPointer(b.ir.Vertex, 2, gl.FLOAT, false, 0, nil) gl.Uniform1i(b.shd.UseAlphaTex, 0)
gl.VertexAttribPointer(b.ir.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) gl.Uniform1i(b.shd.UseLinearGradient, 0)
gl.EnableVertexAttribArray(b.ir.Vertex) gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.EnableVertexAttribArray(b.ir.TexCoord) 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.DrawArrays(gl.TRIANGLE_FAN, 0, 4)
gl.DisableVertexAttribArray(b.ir.Vertex) gl.DisableVertexAttribArray(b.shd.Vertex)
gl.DisableVertexAttribArray(b.ir.TexCoord) gl.DisableVertexAttribArray(b.shd.TexCoord)
} }

View file

@ -194,17 +194,22 @@ func (b *GoGLBackend) DrawImage(dimg backendbase.Image, sx, sy, sw, sh float64,
gl.ActiveTexture(gl.TEXTURE0) gl.ActiveTexture(gl.TEXTURE0)
gl.BindTexture(gl.TEXTURE_2D, img.tex) gl.BindTexture(gl.TEXTURE_2D, img.tex)
gl.UseProgram(b.ir.ID) gl.UseProgram(b.shd.ID)
gl.Uniform1i(b.ir.Image, 0) gl.Uniform1i(b.shd.Image, 0)
gl.Uniform2f(b.ir.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh))
gl.Uniform1f(b.ir.GlobalAlpha, float32(alpha)) gl.Uniform1f(b.shd.GlobalAlpha, float32(alpha))
gl.VertexAttribPointer(b.ir.Vertex, 2, gl.FLOAT, false, 0, nil) gl.Uniform1i(b.shd.UseAlphaTex, 0)
gl.VertexAttribPointer(b.ir.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) gl.Uniform1i(b.shd.UseLinearGradient, 0)
gl.EnableVertexAttribArray(b.ir.Vertex) gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.EnableVertexAttribArray(b.ir.TexCoord) 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.DrawArrays(gl.TRIANGLE_FAN, 0, 4)
gl.DisableVertexAttribArray(b.ir.Vertex) gl.DisableVertexAttribArray(b.shd.Vertex)
gl.DisableVertexAttribArray(b.ir.TexCoord) gl.DisableVertexAttribArray(b.shd.TexCoord)
gl.StencilFunc(gl.ALWAYS, 0, 0xFF) gl.StencilFunc(gl.ALWAYS, 0, 0xFF)
} }

View file

@ -7,14 +7,14 @@ import (
) )
var unifiedVS = ` var unifiedVS = `
attribute vec2 vertex, alphaTexCoord; attribute vec2 vertex, texCoord;
uniform vec2 canvasSize; uniform vec2 canvasSize;
varying vec2 v_cp, v_atc; varying vec2 v_cp, v_tc;
void main() { void main() {
v_atc = alphaTexCoord; v_tc = texCoord;
v_cp = vertex; v_cp = vertex;
vec2 glp = vertex * 2.0 / canvasSize - 1.0; vec2 glp = vertex * 2.0 / canvasSize - 1.0;
gl_Position = vec4(glp.x, -glp.y, 0.0, 1.0); gl_Position = vec4(glp.x, -glp.y, 0.0, 1.0);
@ -25,7 +25,7 @@ var unifiedFS = `
precision mediump float; precision mediump float;
#endif #endif
varying vec2 v_cp, v_atc; varying vec2 v_cp, v_tc;
uniform vec4 color; uniform vec4 color;
uniform float globalAlpha; uniform float globalAlpha;
@ -45,6 +45,8 @@ uniform vec2 repeat;
uniform bool useAlphaTex; uniform bool useAlphaTex;
uniform sampler2D alphaTex; uniform sampler2D alphaTex;
uniform bool useImage;
bool isNaN(float v) { bool isNaN(float v) {
return v < 0.0 || 0.0 < v || v == 0.0 ? false : true; 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) { if (imgpt.y < 0.0 || imgpt.y > 1.0) {
col *= repeat.y; col *= repeat.y;
} }
} else if (useImage) {
col = texture2D(image, v_tc);
} }
if (useAlphaTex) { if (useAlphaTex) {
col.a *= texture2D(alphaTex, v_atc).a * globalAlpha; col.a *= texture2D(alphaTex, v_tc).a * globalAlpha;
} else { } else {
col.a *= globalAlpha; 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 = ` var gaussian15VS = `
attribute vec2 vertex, texCoord; attribute vec2 vertex, texCoord;
uniform vec2 canvasSize; uniform vec2 canvasSize;
@ -212,8 +194,8 @@ func init() {
type unifiedShader struct { type unifiedShader struct {
shaderProgram shaderProgram
Vertex uint32 Vertex uint32
AlphaTexCoord uint32 TexCoord uint32
CanvasSize int32 CanvasSize int32
Color int32 Color int32
@ -234,15 +216,8 @@ type unifiedShader struct {
Image int32 Image int32
ImageTransform int32 ImageTransform int32
Repeat int32 Repeat int32
}
type imageShader struct { UseImage int32
shaderProgram
Vertex uint32
TexCoord uint32
CanvasSize int32
Image int32
GlobalAlpha int32
} }
type gaussianShader struct { type gaussianShader struct {