mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 18:58:54 +01:00
internal/graphics: add uniform variables for source image sizes
Updates #1870
This commit is contained in:
parent
7fe89b173b
commit
fd5e2d39c0
@ -63,14 +63,14 @@ var __imageSrcOffsets [%[2]d]vec2
|
||||
var __imageSrcRegionOrigin vec2
|
||||
|
||||
// The unit is the source texture's pixel or texel.
|
||||
var __imageSrcRegionSize vec2
|
||||
var __imageSrcRegionSizes [%[1]d]vec2
|
||||
|
||||
// imageSrcRegionOnTexture returns the source image's region (the origin and the size) on its texture.
|
||||
// The unit is the source texture's pixel or texel.
|
||||
//
|
||||
// As an image is a part of internal texture, the image can be located at an arbitrary position on the texture.
|
||||
func imageSrcRegionOnTexture() (vec2, vec2) {
|
||||
return __imageSrcRegionOrigin, __imageSrcRegionSize
|
||||
return __imageSrcRegionOrigin, __imageSrcRegionSizes[0]
|
||||
}
|
||||
`, ShaderImageCount, ShaderImageCount-1)
|
||||
|
||||
@ -97,7 +97,7 @@ func imageSrc%[1]dUnsafeAt(pos vec2) vec4 {
|
||||
func imageSrc%[1]dAt(pos vec2) vec4 {
|
||||
// pos is the position of the source texture (= 0th image's texture).
|
||||
// If pos is in the region, the result is (1, 1). Otherwise, either element is 0.
|
||||
in := step(__imageSrcRegionOrigin, pos) - step(__imageSrcRegionOrigin + __imageSrcRegionSize, pos)
|
||||
in := step(__imageSrcRegionOrigin, pos) - step(__imageSrcRegionOrigin + __imageSrcRegionSizes[%[1]d], pos)
|
||||
return __texelAt(__t%[1]d, %[2]s) * in.x * in.y
|
||||
}
|
||||
`, i, pos)
|
||||
|
@ -25,29 +25,22 @@ const (
|
||||
// Any shaders in Ebitengine must have these uniform variables.
|
||||
PreservedUniformVariablesCount = 1 + // the destination texture size
|
||||
1 + // the source texture sizes array
|
||||
1 + // the destination image region's origin
|
||||
1 + // the destination image region's size
|
||||
1 + // the destination image region origin
|
||||
1 + // the destination image region size
|
||||
1 + // the offsets array of the second and the following source images
|
||||
1 + // the source image region's origin
|
||||
1 + // the source image region's size
|
||||
1 + // the source image region origin
|
||||
1 + // the source image region sizes array
|
||||
1 // the projection matrix
|
||||
|
||||
TextureDestinationSizeUniformVariableIndex = 0
|
||||
TextureSourceSizesUniformVariableIndex = 1
|
||||
ImageDestinationRegionOriginUniformVariableIndex = 2
|
||||
ImageDestinationRegionSizeUniformVariableIndex = 3
|
||||
ImageSourceOffsetsUniformVariableIndex = 4
|
||||
ImageSourceRegionOriginUniformVariableIndex = 5
|
||||
ImageSourceRegionSizeUniformVariableIndex = 6
|
||||
ProjectionMatrixUniformVariableIndex = 7
|
||||
ProjectionMatrixUniformVariableIndex = 7
|
||||
|
||||
PreservedUniformUint32Count = 2 + // the destination texture size
|
||||
2*ShaderImageCount + // the source texture sizes array
|
||||
2 + // the destination image region's origin
|
||||
2 + // the destination image region's size
|
||||
2 + // the destination image region origin
|
||||
2 + // the destination image region size
|
||||
2*(ShaderImageCount-1) + // the offsets array of the second and the following source images
|
||||
2 + // the source image region's origin
|
||||
2 + // the source image region's size
|
||||
2 + // the source image region origin
|
||||
2*ShaderImageCount + // the source image region sizes array
|
||||
16 // the projection matrix
|
||||
)
|
||||
|
||||
|
@ -709,9 +709,11 @@ func (q *commandQueue) prependPreservedUniforms(uniforms []uint32, shader *Shade
|
||||
dstRegion.Height /= float32(dh)
|
||||
}
|
||||
|
||||
// Set the destination region.
|
||||
// Set the destination region origin.
|
||||
uniforms[10] = math.Float32bits(dstRegion.X)
|
||||
uniforms[11] = math.Float32bits(dstRegion.Y)
|
||||
|
||||
// Set the destination region size.
|
||||
uniforms[12] = math.Float32bits(dstRegion.Width)
|
||||
uniforms[13] = math.Float32bits(dstRegion.Height)
|
||||
|
||||
@ -723,7 +725,7 @@ func (q *commandQueue) prependPreservedUniforms(uniforms []uint32, shader *Shade
|
||||
srcRegion.Height /= float32(h)
|
||||
}
|
||||
|
||||
// Set the source offsets.
|
||||
// Set the source region offsets.
|
||||
uniforms[14] = math.Float32bits(offsets[0][0])
|
||||
uniforms[15] = math.Float32bits(offsets[0][1])
|
||||
uniforms[16] = math.Float32bits(offsets[1][0])
|
||||
@ -731,28 +733,38 @@ func (q *commandQueue) prependPreservedUniforms(uniforms []uint32, shader *Shade
|
||||
uniforms[18] = math.Float32bits(offsets[2][0])
|
||||
uniforms[19] = math.Float32bits(offsets[2][1])
|
||||
|
||||
// Set the source region of texture0.
|
||||
// Set the source region origin.
|
||||
uniforms[20] = math.Float32bits(srcRegion.X)
|
||||
uniforms[21] = math.Float32bits(srcRegion.Y)
|
||||
|
||||
// Set the source region sizes.
|
||||
// TODO: Set a different sizes for a different source (#1870).
|
||||
uniforms[22] = math.Float32bits(srcRegion.Width)
|
||||
uniforms[23] = math.Float32bits(srcRegion.Height)
|
||||
uniforms[24] = math.Float32bits(srcRegion.Width)
|
||||
uniforms[25] = math.Float32bits(srcRegion.Height)
|
||||
uniforms[26] = math.Float32bits(srcRegion.Width)
|
||||
uniforms[27] = math.Float32bits(srcRegion.Height)
|
||||
uniforms[28] = math.Float32bits(srcRegion.Width)
|
||||
uniforms[29] = math.Float32bits(srcRegion.Height)
|
||||
|
||||
uniforms[24] = math.Float32bits(2 / float32(dw))
|
||||
uniforms[25] = 0
|
||||
uniforms[26] = 0
|
||||
uniforms[27] = 0
|
||||
uniforms[28] = 0
|
||||
uniforms[29] = math.Float32bits(2 / float32(dh))
|
||||
uniforms[30] = 0
|
||||
// Set the projection matrix.
|
||||
uniforms[30] = math.Float32bits(2 / float32(dw))
|
||||
uniforms[31] = 0
|
||||
uniforms[32] = 0
|
||||
uniforms[33] = 0
|
||||
uniforms[34] = math.Float32bits(1)
|
||||
uniforms[35] = 0
|
||||
uniforms[36] = math.Float32bits(-1)
|
||||
uniforms[37] = math.Float32bits(-1)
|
||||
uniforms[34] = 0
|
||||
uniforms[35] = math.Float32bits(2 / float32(dh))
|
||||
uniforms[36] = 0
|
||||
uniforms[37] = 0
|
||||
uniforms[38] = 0
|
||||
uniforms[39] = math.Float32bits(1)
|
||||
uniforms[39] = 0
|
||||
uniforms[40] = math.Float32bits(1)
|
||||
uniforms[41] = 0
|
||||
uniforms[42] = math.Float32bits(-1)
|
||||
uniforms[43] = math.Float32bits(-1)
|
||||
uniforms[44] = 0
|
||||
uniforms[45] = math.Float32bits(1)
|
||||
|
||||
return uniforms
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user