added image shader into unified shader
This commit is contained in:
parent
50bf39fe62
commit
b0230892ab
4 changed files with 50 additions and 71 deletions
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue