mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 10:48:53 +01:00
internal/graphics: use pixels for offsets
This commit is contained in:
parent
9d2178cf71
commit
56b4cdc3c4
@ -56,7 +56,7 @@ func imageDstRegionOnTexture() (vec2, vec2) {
|
||||
return __textureDestinationRegionOrigin, __textureDestinationRegionSize
|
||||
}
|
||||
|
||||
// The unit is the source texture's pixel or texel.
|
||||
// The unit is the source texture's pixel.
|
||||
var __textureSourceOffsets [%[2]d]vec2
|
||||
|
||||
// The unit is the source texture's pixel or texel.
|
||||
@ -82,7 +82,7 @@ func imageSrcRegionOnTexture() (vec2, vec2) {
|
||||
case shaderir.Pixel:
|
||||
pos = fmt.Sprintf("pos + __textureSourceOffsets[%d]", i-1)
|
||||
case shaderir.Texel:
|
||||
pos = fmt.Sprintf("(pos + __textureSourceOffsets[%d]) * __textureSizes[0] / __textureSizes[%d]", i-1, i)
|
||||
pos = fmt.Sprintf("(pos * __textureSizes[0] + __textureSourceOffsets[%d]) / __textureSizes[%d]", i-1, i)
|
||||
default:
|
||||
return "", fmt.Errorf("graphics: unexpected unit: %d", unit)
|
||||
}
|
||||
|
@ -621,10 +621,6 @@ func (q *commandQueue) prependPreservedUniforms(uniforms []uint32, shader *Shade
|
||||
srcRegion.Y /= float32(h)
|
||||
srcRegion.Width /= float32(w)
|
||||
srcRegion.Height /= float32(h)
|
||||
for i := range offsets {
|
||||
offsets[i][0] /= float32(w)
|
||||
offsets[i][1] /= float32(h)
|
||||
}
|
||||
}
|
||||
|
||||
// Set the source offsets.
|
||||
|
@ -1761,3 +1761,54 @@ func Fragment(position vec4, texCoord vec2, color vec4) vec4 {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestShaderDifferentTextureSizes(t *testing.T) {
|
||||
src0 := ebiten.NewImageWithOptions(image.Rect(0, 0, 20, 4000), &ebiten.NewImageOptions{
|
||||
Unmanaged: true,
|
||||
}).SubImage(image.Rect(4, 1025, 6, 1028)).(*ebiten.Image)
|
||||
defer src0.Dispose()
|
||||
|
||||
src1 := ebiten.NewImageWithOptions(image.Rect(0, 0, 4000, 20), &ebiten.NewImageOptions{
|
||||
Unmanaged: true,
|
||||
}).SubImage(image.Rect(2047, 7, 2049, 10)).(*ebiten.Image)
|
||||
defer src1.Dispose()
|
||||
|
||||
src0.Fill(color.RGBA{0x10, 0x20, 0x30, 0xff})
|
||||
src1.Fill(color.RGBA{0x30, 0x20, 0x10, 0xff})
|
||||
|
||||
for _, unit := range []string{"texel", "pixel"} {
|
||||
unit := unit
|
||||
t.Run(fmt.Sprintf("unit %s", unit), func(t *testing.T) {
|
||||
shader, err := ebiten.NewShader([]byte(fmt.Sprintf(`//kage:unit %s
|
||||
|
||||
package main
|
||||
|
||||
func Fragment(position vec4, texCoord vec2, color vec4) vec4 {
|
||||
return imageSrc0At(texCoord) + imageSrc1At(texCoord)
|
||||
}
|
||||
`, unit)))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer shader.Dispose()
|
||||
|
||||
dst := ebiten.NewImage(2, 3)
|
||||
defer dst.Dispose()
|
||||
|
||||
op := &ebiten.DrawRectShaderOptions{}
|
||||
op.Images[0] = src0
|
||||
op.Images[1] = src1
|
||||
dst.DrawRectShader(2, 3, shader, op)
|
||||
|
||||
for j := 0; j < 3; j++ {
|
||||
for i := 0; i < 2; i++ {
|
||||
got := dst.At(i, j).(color.RGBA)
|
||||
want := color.RGBA{0x40, 0x40, 0x40, 0xff}
|
||||
if !sameColors(got, want, 1) {
|
||||
t.Errorf("dst.At(%d, %d): got: %v, want: %v", i, j, got, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user