fully unified into one shader

updated shadow test
This commit is contained in:
Thomas Friedel 2020-02-11 15:59:26 +01:00
parent f5e7e6a060
commit 8b79ad18fa
7 changed files with 70 additions and 134 deletions

View file

@ -40,9 +40,7 @@ func (b *GoGLBackend) Clip(pts [][2]float64) {
gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh))
gl.Uniform1f(b.shd.GlobalAlpha, 1) gl.Uniform1f(b.shd.GlobalAlpha, 1)
gl.Uniform1i(b.shd.UseAlphaTex, 0) gl.Uniform1i(b.shd.UseAlphaTex, 0)
gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.Func, shdFuncSolid)
gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.Uniform1i(b.shd.UseImagePattern, 0)
gl.EnableVertexAttribArray(b.shd.Vertex) gl.EnableVertexAttribArray(b.shd.Vertex)
gl.ColorMask(false, false, false, false) gl.ColorMask(false, false, false, false)

View file

@ -38,9 +38,7 @@ func (b *GoGLBackend) Clear(pts [4][2]float64) {
gl.Uniform4f(b.shd.Color, 0, 0, 0, 0) gl.Uniform4f(b.shd.Color, 0, 0, 0, 0)
gl.Uniform1f(b.shd.GlobalAlpha, 1) gl.Uniform1f(b.shd.GlobalAlpha, 1)
gl.Uniform1i(b.shd.UseAlphaTex, 0) gl.Uniform1i(b.shd.UseAlphaTex, 0)
gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.Func, shdFuncSolid)
gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.Uniform1i(b.shd.UseImagePattern, 0)
gl.Disable(gl.BLEND) gl.Disable(gl.BLEND)
@ -134,9 +132,7 @@ func (b *GoGLBackend) Fill(style *backendbase.FillStyle, pts [][2]float64, canOv
gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh))
gl.Uniform1f(b.shd.GlobalAlpha, 1) gl.Uniform1f(b.shd.GlobalAlpha, 1)
gl.Uniform1i(b.shd.UseAlphaTex, 0) gl.Uniform1i(b.shd.UseAlphaTex, 0)
gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.Func, shdFuncSolid)
gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.Uniform1i(b.shd.UseImagePattern, 0)
gl.EnableVertexAttribArray(b.shd.Vertex) gl.EnableVertexAttribArray(b.shd.Vertex)
gl.VertexAttribPointer(b.shd.Vertex, 2, gl.FLOAT, false, 0, nil) gl.VertexAttribPointer(b.shd.Vertex, 2, gl.FLOAT, false, 0, nil)
@ -238,14 +234,16 @@ func (b *GoGLBackend) drawBlurred(size float64) {
0, 1, 0, 0, 1, 0, 1, 1} 0, 1, 0, 0, 1, 0, 1, 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.bbshd.ID) gl.UseProgram(b.shd.ID)
gl.Uniform1i(b.bbshd.Image, 0) gl.Uniform1i(b.shd.Image, 0)
gl.Uniform2f(b.bbshd.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh))
gl.Uniform1i(b.shd.UseAlphaTex, 0)
gl.Uniform1i(b.shd.Func, shdFuncBoxBlur)
gl.VertexAttribPointer(b.bbshd.Vertex, 2, gl.FLOAT, false, 0, nil) gl.VertexAttribPointer(b.shd.Vertex, 2, gl.FLOAT, false, 0, nil)
gl.VertexAttribPointer(b.bbshd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) gl.VertexAttribPointer(b.shd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4))
gl.EnableVertexAttribArray(b.bbshd.Vertex) gl.EnableVertexAttribArray(b.shd.Vertex)
gl.EnableVertexAttribArray(b.bbshd.TexCoord) gl.EnableVertexAttribArray(b.shd.TexCoord)
gl.Disable(gl.BLEND) gl.Disable(gl.BLEND)
@ -284,22 +282,20 @@ func (b *GoGLBackend) drawBlurred(size float64) {
b.disableTextureRenderTarget() b.disableTextureRenderTarget()
b.box3(sizec, true) b.box3(sizec, true)
gl.DisableVertexAttribArray(b.bbshd.Vertex) gl.DisableVertexAttribArray(b.shd.Vertex)
gl.DisableVertexAttribArray(b.bbshd.TexCoord) gl.DisableVertexAttribArray(b.shd.TexCoord)
gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
} }
func (b *GoGLBackend) box3(size int, vertical bool) { func (b *GoGLBackend) box3(size int, vertical bool) {
gl.Uniform1i(b.bbshd.BoxSize, int32(size)) gl.Uniform1i(b.shd.BoxSize, int32(size))
if vertical { if vertical {
gl.Uniform1i(b.bbshd.BoxVertical, 1) gl.Uniform1i(b.shd.BoxVertical, 1)
gl.Uniform1f(b.bbshd.BoxScale, 1/float32(b.fh)) gl.Uniform1f(b.shd.BoxScale, 1/float32(b.fh))
} else { } else {
gl.Uniform1i(b.bbshd.BoxVertical, 0) gl.Uniform1i(b.shd.BoxVertical, 0)
gl.Uniform1f(b.bbshd.BoxScale, 1/float32(b.fw)) gl.Uniform1f(b.shd.BoxScale, 1/float32(b.fw))
} }
gl.DrawArrays(gl.TRIANGLE_FAN, 0, 4) gl.DrawArrays(gl.TRIANGLE_FAN, 0, 4)
gl.StencilFunc(gl.ALWAYS, 0, 0xFF)
} }

View file

@ -21,7 +21,6 @@ type GLContext struct {
alphaTex uint32 alphaTex uint32
shd unifiedShader shd unifiedShader
bbshd boxBlurShader
offscr1 offscreenBuffer offscr1 offscreenBuffer
offscr2 offscreenBuffer offscr2 offscreenBuffer
@ -58,15 +57,6 @@ func NewGLContext() (*GLContext, error) {
return nil, err return nil, err
} }
err = loadShader(boxVS, boxFS, &ctx.bbshd.shaderProgram)
if err != nil {
return nil, err
}
ctx.bbshd.shaderProgram.mustLoadLocations(&ctx.bbshd)
if err = glError(); err != nil {
return nil, err
}
gl.GenBuffers(1, &ctx.buf) gl.GenBuffers(1, &ctx.buf)
if err = glError(); err != nil { if err = glError(); err != nil {
return nil, err return nil, err
@ -320,10 +310,7 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp
gl.Uniform1f(b.shd.GlobalAlpha, float32(style.Color.A)/255) gl.Uniform1f(b.shd.GlobalAlpha, float32(style.Color.A)/255)
gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot) gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot)
gl.Uniform1i(b.shd.UseAlphaTex, alphaVal) gl.Uniform1i(b.shd.UseAlphaTex, alphaVal)
gl.Uniform1i(b.shd.UseLinearGradient, 1) gl.Uniform1i(b.shd.Func, shdFuncLinearGradient)
gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.Uniform1i(b.shd.UseImagePattern, 0)
gl.Uniform1i(b.shd.UseImage, 0)
return b.shd.Vertex, b.shd.TexCoord return b.shd.Vertex, b.shd.TexCoord
} }
if rg := style.RadialGradient; rg != nil { if rg := style.RadialGradient; rg != nil {
@ -342,10 +329,7 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp
gl.Uniform1f(b.shd.GlobalAlpha, float32(style.Color.A)/255) gl.Uniform1f(b.shd.GlobalAlpha, float32(style.Color.A)/255)
gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot) gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot)
gl.Uniform1i(b.shd.UseAlphaTex, alphaVal) gl.Uniform1i(b.shd.UseAlphaTex, alphaVal)
gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.Func, shdFuncRadialGradient)
gl.Uniform1i(b.shd.UseRadialGradient, 1)
gl.Uniform1i(b.shd.UseImagePattern, 0)
gl.Uniform1i(b.shd.UseImage, 0)
return b.shd.Vertex, b.shd.TexCoord return b.shd.Vertex, b.shd.TexCoord
} }
if ip := style.ImagePattern; ip != nil { if ip := style.ImagePattern; ip != nil {
@ -375,10 +359,7 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp
gl.Uniform1f(b.shd.GlobalAlpha, float32(style.Color.A)/255) gl.Uniform1f(b.shd.GlobalAlpha, float32(style.Color.A)/255)
gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot) gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot)
gl.Uniform1i(b.shd.UseAlphaTex, alphaVal) gl.Uniform1i(b.shd.UseAlphaTex, alphaVal)
gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.Func, shdFuncImagePattern)
gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.Uniform1i(b.shd.UseImagePattern, 1)
gl.Uniform1i(b.shd.UseImage, 0)
return b.shd.Vertex, b.shd.TexCoord return b.shd.Vertex, b.shd.TexCoord
} }
@ -389,10 +370,7 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp
gl.Uniform1f(b.shd.GlobalAlpha, 1) gl.Uniform1f(b.shd.GlobalAlpha, 1)
gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot) gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot)
gl.Uniform1i(b.shd.UseAlphaTex, alphaVal) gl.Uniform1i(b.shd.UseAlphaTex, alphaVal)
gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.Func, shdFuncSolid)
gl.Uniform1i(b.shd.UseRadialGradient, 0)
gl.Uniform1i(b.shd.UseImagePattern, 0)
gl.Uniform1i(b.shd.UseImage, 0)
return b.shd.Vertex, b.shd.TexCoord return b.shd.Vertex, b.shd.TexCoord
} }

View file

@ -90,10 +90,7 @@ func (b *GoGLBackend) PutImageData(img *image.RGBA, x, y int) {
gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh))
gl.Uniform1f(b.shd.GlobalAlpha, 1) gl.Uniform1f(b.shd.GlobalAlpha, 1)
gl.Uniform1i(b.shd.UseAlphaTex, 0) gl.Uniform1i(b.shd.UseAlphaTex, 0)
gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.Func, shdFuncImage)
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.Vertex, 2, gl.FLOAT, false, 0, nil)
gl.VertexAttribPointer(b.shd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) gl.VertexAttribPointer(b.shd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4))
gl.EnableVertexAttribArray(b.shd.Vertex) gl.EnableVertexAttribArray(b.shd.Vertex)

View file

@ -199,10 +199,7 @@ func (b *GoGLBackend) DrawImage(dimg backendbase.Image, sx, sy, sw, sh float64,
gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh))
gl.Uniform1f(b.shd.GlobalAlpha, float32(alpha)) gl.Uniform1f(b.shd.GlobalAlpha, float32(alpha))
gl.Uniform1i(b.shd.UseAlphaTex, 0) gl.Uniform1i(b.shd.UseAlphaTex, 0)
gl.Uniform1i(b.shd.UseLinearGradient, 0) gl.Uniform1i(b.shd.Func, shdFuncImage)
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.Vertex, 2, gl.FLOAT, false, 0, nil)
gl.VertexAttribPointer(b.shd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) gl.VertexAttribPointer(b.shd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4))
gl.EnableVertexAttribArray(b.shd.Vertex) gl.EnableVertexAttribArray(b.shd.Vertex)

View file

@ -21,16 +21,15 @@ precision mediump float;
varying vec2 v_cp, v_tc; varying vec2 v_cp, v_tc;
uniform int func;
uniform vec4 color; uniform vec4 color;
uniform float globalAlpha; uniform float globalAlpha;
uniform bool useLinearGradient;
uniform bool useRadialGradient;
uniform sampler2D gradient; uniform sampler2D gradient;
uniform vec2 from, dir, to; uniform vec2 from, dir, to;
uniform float len, radFrom, radTo; uniform float len, radFrom, radTo;
uniform bool useImagePattern;
uniform vec2 imageSize; uniform vec2 imageSize;
uniform sampler2D image; uniform sampler2D image;
uniform mat3 imageTransform; uniform mat3 imageTransform;
@ -39,7 +38,9 @@ uniform vec2 repeat;
uniform bool useAlphaTex; uniform bool useAlphaTex;
uniform sampler2D alphaTex; uniform sampler2D alphaTex;
uniform bool useImage; uniform int boxSize;
uniform bool boxVertical;
uniform float boxScale;
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;
@ -48,12 +49,29 @@ bool isNaN(float v) {
void main() { void main() {
vec4 col = color; vec4 col = color;
if (useLinearGradient) { if (func == 5) {
vec4 sum = vec4(0.0);
if (boxVertical) {
vec2 start = v_tc - vec2(0.0, (float)(boxSize) * boxScale);
for (int i=0; i<boxSize*2; i++) {
sum += texture2D(image, start + vec2(0.0, (float)(i) * boxScale));
}
} else {
vec2 start = v_tc - vec2((float)(boxSize) * boxScale, 0.0);
for (int i=0; i<boxSize*2; i++) {
sum += texture2D(image, start + vec2((float)(i) * boxScale, 0.0));
}
}
gl_FragColor = sum / float(boxSize * 2);
return;
}
if (func == 1) {
vec2 v = v_cp - from; vec2 v = v_cp - from;
float r = dot(v, dir) / len; float r = dot(v, dir) / len;
r = clamp(r, 0.0, 1.0); r = clamp(r, 0.0, 1.0);
col = texture2D(gradient, vec2(r, 0.0)); col = texture2D(gradient, vec2(r, 0.0));
} else if (useRadialGradient) { } else if (func == 2) {
float o_a = 0.5 * sqrt( float o_a = 0.5 * sqrt(
pow(-2.0*from.x*from.x+2.0*from.x*to.x+2.0*from.x*v_cp.x-2.0*to.x*v_cp.x-2.0*from.y*from.y+2.0*from.y*to.y+2.0*from.y*v_cp.y-2.0*to.y*v_cp.y+2.0*radFrom*radFrom-2.0*radFrom*radTo, 2.0) pow(-2.0*from.x*from.x+2.0*from.x*to.x+2.0*from.x*v_cp.x-2.0*to.x*v_cp.x-2.0*from.y*from.y+2.0*from.y*to.y+2.0*from.y*v_cp.y-2.0*to.y*v_cp.y+2.0*radFrom*radFrom-2.0*radFrom*radTo, 2.0)
-4.0*(from.x*from.x-2.0*from.x*v_cp.x+v_cp.x*v_cp.x+from.y*from.y-2.0*from.y*v_cp.y+v_cp.y*v_cp.y-radFrom*radFrom) -4.0*(from.x*from.x-2.0*from.x*v_cp.x+v_cp.x*v_cp.x+from.y*from.y-2.0*from.y*v_cp.y+v_cp.y*v_cp.y-radFrom*radFrom)
@ -70,7 +88,7 @@ void main() {
float o = max(o1, o2); float o = max(o1, o2);
o = clamp(o, 0.0, 1.0); o = clamp(o, 0.0, 1.0);
col = texture2D(gradient, vec2(o, 0.0)); col = texture2D(gradient, vec2(o, 0.0));
} else if (useImagePattern) { } else if (func == 3) {
vec3 tfpt = vec3(v_cp, 1.0) * imageTransform; vec3 tfpt = vec3(v_cp, 1.0) * imageTransform;
vec2 imgpt = tfpt.xy / imageSize; vec2 imgpt = tfpt.xy / imageSize;
col = texture2D(image, mod(imgpt, 1.0)); col = texture2D(image, mod(imgpt, 1.0));
@ -80,7 +98,7 @@ 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) { } else if (func == 4) {
col = texture2D(image, v_tc); col = texture2D(image, v_tc);
} }
@ -94,52 +112,14 @@ void main() {
} }
` `
var boxVS = ` const (
attribute vec2 vertex, texCoord; shdFuncSolid int32 = iota
shdFuncLinearGradient
uniform vec2 canvasSize; shdFuncRadialGradient
shdFuncImagePattern
varying vec2 v_cp, v_tc; shdFuncImage
shdFuncBoxBlur
void main() { )
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);
}
`
var boxFS = `
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_cp, v_tc;
uniform int boxSize;
uniform bool boxVertical;
uniform float boxScale;
uniform sampler2D image;
void main() {
vec4 color = vec4(0.0, 0.0, 0.0, 0.0);
vec4 sum = vec4(0.0);
if (boxVertical) {
vec2 start = v_tc - vec2(0.0, (float)(boxSize) * boxScale);
for (int i=0; i<boxSize*2; i++) {
sum += texture2D(image, start + vec2(0.0, (float)(i) * boxScale));
}
} else {
vec2 start = v_tc - vec2((float)(boxSize) * boxScale, 0.0);
for (int i=0; i<boxSize*2; i++) {
sum += texture2D(image, start + vec2((float)(i) * boxScale, 0.0));
}
}
color = sum / float(boxSize * 2);
gl_FragColor = color;
}
`
type unifiedShader struct { type unifiedShader struct {
shaderProgram shaderProgram
@ -151,32 +131,22 @@ type unifiedShader struct {
Color int32 Color int32
GlobalAlpha int32 GlobalAlpha int32
Func int32
UseAlphaTex int32 UseAlphaTex int32
AlphaTex int32 AlphaTex int32
UseLinearGradient int32
UseRadialGradient int32
Gradient int32 Gradient int32
From, To, Dir int32 From, To, Dir int32
Len int32 Len int32
RadFrom, RadTo int32 RadFrom, RadTo int32
UseImagePattern int32
ImageSize int32 ImageSize int32
Image int32 Image int32
ImageTransform int32 ImageTransform int32
Repeat int32 Repeat int32
UseImage int32
}
type boxBlurShader struct {
shaderProgram
Vertex uint32
TexCoord uint32
CanvasSize int32
BoxSize int32 BoxSize int32
BoxVertical int32 BoxVertical int32
BoxScale int32 BoxScale int32
Image int32
} }

BIN
testdata/Shadow.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2 KiB