mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 02:38:53 +01:00
parent
d08a04a635
commit
ca3fd4eaa4
@ -26,9 +26,17 @@ const (
|
||||
//
|
||||
// All the preversed uniform variables are vec2 so far.
|
||||
PreservedUniformVariablesNum = 1 + // the destination texture size
|
||||
ShaderImageNum + // the texture sizes
|
||||
(ShaderImageNum - 1) // the offsets of the second and the following images
|
||||
)
|
||||
|
||||
func TextureOffsetUniformVariableIndex(i int) int {
|
||||
if i == 0 {
|
||||
panic("graphics: the texture 0 doesn't have its offset")
|
||||
}
|
||||
return 1 + ShaderImageNum + i - 1
|
||||
}
|
||||
|
||||
const (
|
||||
IndicesNum = (1 << 16) / 3 * 3 // Adjust num for triangles.
|
||||
VertexFloatNum = 8
|
||||
|
@ -304,8 +304,19 @@ func (g *Graphics) DrawShader(dst driver.ImageID, srcs [graphics.ShaderImageNum]
|
||||
us[0].name = "U0"
|
||||
us[0].value = []float32{float32(vw), float32(vh)}
|
||||
|
||||
for i, o := range offsets {
|
||||
for i, src := range srcs {
|
||||
img := g.images[src]
|
||||
var w, h int
|
||||
if img != nil {
|
||||
w, h = img.framebufferSize()
|
||||
}
|
||||
const offset = 1
|
||||
us[i+offset].name = fmt.Sprintf("U%d", i+offset)
|
||||
us[i+offset].value = []float32{float32(w), float32(h)}
|
||||
}
|
||||
|
||||
for i, o := range offsets {
|
||||
const offset = 1 + graphics.ShaderImageNum
|
||||
o := o
|
||||
us[i+offset].name = fmt.Sprintf("U%d", i+offset)
|
||||
us[i+offset].value = o[:]
|
||||
|
@ -71,20 +71,26 @@ func (i *Image) Pixels() ([]byte, error) {
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (i *Image) framebufferSize() (int, int) {
|
||||
if i.screen {
|
||||
// The (default) framebuffer size can't be converted to a power of 2.
|
||||
// On browsers, i.width and i.height are used as viewport size and
|
||||
// Edge can't treat a bigger viewport than the drawing area (#71).
|
||||
return i.width, i.height
|
||||
}
|
||||
return graphics.InternalImageSize(i.width), graphics.InternalImageSize(i.height)
|
||||
}
|
||||
|
||||
func (i *Image) ensureFramebuffer() error {
|
||||
if i.framebuffer != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
w, h := i.framebufferSize()
|
||||
if i.screen {
|
||||
// The (default) framebuffer size can't be converted to a power of 2.
|
||||
// On browsers, c.width and c.height are used as viewport size and
|
||||
// Edge can't treat a bigger viewport than the drawing area (#71).
|
||||
i.framebuffer = newScreenFramebuffer(&i.graphics.context, i.width, i.height)
|
||||
i.framebuffer = newScreenFramebuffer(&i.graphics.context, w, h)
|
||||
return nil
|
||||
}
|
||||
|
||||
w, h := graphics.InternalImageSize(i.width), graphics.InternalImageSize(i.height)
|
||||
f, err := newFramebufferFromTexture(&i.graphics.context, i.textureNative, w, h)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -351,7 +351,7 @@ func ShaderProgramImages(imageNum int) shaderir.Program {
|
||||
texPos,
|
||||
{
|
||||
Type: shaderir.UniformVariable,
|
||||
Index: 1 + i - 1,
|
||||
Index: graphics.TextureOffsetUniformVariableIndex(i),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
10
shader.go
10
shader.go
@ -36,6 +36,16 @@ func textureDstSize() vec2 {
|
||||
}
|
||||
`
|
||||
|
||||
for i := 0; i < graphics.ShaderImageNum; i++ {
|
||||
shaderSuffix += fmt.Sprintf(`
|
||||
var __textureSize%[1]d vec2
|
||||
|
||||
func texture%[1]dSize() vec2 {
|
||||
return __textureSize%[1]d
|
||||
}
|
||||
`, i)
|
||||
}
|
||||
|
||||
for i := 0; i < graphics.ShaderImageNum; i++ {
|
||||
var offset string
|
||||
if i >= 1 {
|
||||
|
Loading…
Reference in New Issue
Block a user