buffered: Add Shader

This commit is contained in:
Hajime Hoshi 2020-05-30 03:21:45 +09:00
parent 218b6fc172
commit f92253487f
4 changed files with 39 additions and 4 deletions

View File

@ -331,7 +331,7 @@ func (i *Image) DrawTriangles(vertices []Vertex, indices []uint16, img *Image, o
is := make([]uint16, len(indices))
copy(is, indices)
i.buffered.DrawTriangles(img.buffered, vs, is, options.ColorM.impl, mode, filter, driver.Address(options.Address))
i.buffered.DrawTriangles(img.buffered, vs, is, options.ColorM.impl, mode, filter, driver.Address(options.Address), nil, nil)
}
// SubImage returns an image representing the portion of the image p visible through r. The returned value shares pixels with the original image.

View File

@ -22,6 +22,7 @@ import (
"github.com/hajimehoshi/ebiten/internal/affine"
"github.com/hajimehoshi/ebiten/internal/driver"
"github.com/hajimehoshi/ebiten/internal/mipmap"
"github.com/hajimehoshi/ebiten/internal/shaderir"
)
type Image struct {
@ -286,7 +287,7 @@ func (i *Image) drawImage(src *Image, bounds image.Rectangle, g mipmap.GeoM, col
// DrawTriangles draws the src image with the given vertices.
//
// Copying vertices and indices is the caller's responsibility.
func (i *Image) DrawTriangles(src *Image, vertices []float32, indices []uint16, colorm *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) {
func (i *Image) DrawTriangles(src *Image, vertices []float32, indices []uint16, colorm *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address, shader *Shader, uniforms []interface{}) {
if i == src {
panic("buffered: Image.DrawTriangles: src must be different from the receiver")
}
@ -297,7 +298,7 @@ func (i *Image) DrawTriangles(src *Image, vertices []float32, indices []uint16,
if needsToDelayCommands {
delayedCommands = append(delayedCommands, func() error {
// Arguments are not copied. Copying is the caller's responsibility.
i.DrawTriangles(src, vertices, indices, colorm, mode, filter, address)
i.DrawTriangles(src, vertices, indices, colorm, mode, filter, address, shader, uniforms)
return nil
})
return
@ -305,5 +306,36 @@ func (i *Image) DrawTriangles(src *Image, vertices []float32, indices []uint16,
src.resolvePendingPixels(true)
i.resolvePendingPixels(false)
i.img.DrawTriangles(src.img, vertices, indices, colorm, mode, filter, address, nil, nil)
var s *mipmap.Shader
if shader != nil {
s = shader.shader
}
us := make([]interface{}, len(uniforms))
for k, v := range uniforms {
switch v := v.(type) {
case *Image:
i.resolvePendingPixels(true)
us[k] = v.img
default:
us[k] = v
}
}
i.img.DrawTriangles(src.img, vertices, indices, colorm, mode, filter, address, s, us)
}
type Shader struct {
shader *mipmap.Shader
}
func NewShader(program *shaderir.Program) *Shader {
return &Shader{
shader: mipmap.NewShader(program),
}
}
func (s *Shader) MarkDisposed() {
s.shader.MarkDisposed()
s.shader = nil
}

View File

@ -306,3 +306,5 @@ func TestReplacePixelsAndModifyBeforeMain(t *testing.T) {
t.Errorf("got: %v, want: %v", got, want)
}
}
// TODO: Add tests for shaders and ReplacePixels to check resolvePendingPiexles works correctly.

View File

@ -184,6 +184,7 @@ func (m *Mipmap) DrawTriangles(src *Mipmap, vertices []float32, indices []uint16
vertices[i*n+11] *= ca
}
}
var s *shareable.Shader
if shader != nil {
s = shader.shader