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
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) {

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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;
@ -213,7 +195,7 @@ type unifiedShader struct {
shaderProgram
Vertex uint32
AlphaTexCoord 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 {