internal/graphics: add uniform variables for source image sizes

Updates #1870
This commit is contained in:
Hajime Hoshi 2023-08-25 07:30:17 +09:00
parent 7fe89b173b
commit fd5e2d39c0
3 changed files with 39 additions and 34 deletions

View File

@ -63,14 +63,14 @@ var __imageSrcOffsets [%[2]d]vec2
var __imageSrcRegionOrigin vec2 var __imageSrcRegionOrigin vec2
// The unit is the source texture's pixel or texel. // 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. // 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. // 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. // 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) { func imageSrcRegionOnTexture() (vec2, vec2) {
return __imageSrcRegionOrigin, __imageSrcRegionSize return __imageSrcRegionOrigin, __imageSrcRegionSizes[0]
} }
`, ShaderImageCount, ShaderImageCount-1) `, ShaderImageCount, ShaderImageCount-1)
@ -97,7 +97,7 @@ func imageSrc%[1]dUnsafeAt(pos vec2) vec4 {
func imageSrc%[1]dAt(pos vec2) vec4 { func imageSrc%[1]dAt(pos vec2) vec4 {
// pos is the position of the source texture (= 0th image's texture). // 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. // 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 return __texelAt(__t%[1]d, %[2]s) * in.x * in.y
} }
`, i, pos) `, i, pos)

View File

@ -25,29 +25,22 @@ const (
// Any shaders in Ebitengine must have these uniform variables. // Any shaders in Ebitengine must have these uniform variables.
PreservedUniformVariablesCount = 1 + // the destination texture size PreservedUniformVariablesCount = 1 + // the destination texture size
1 + // the source texture sizes array 1 + // the source texture sizes array
1 + // the destination image region's origin 1 + // the destination image region origin
1 + // the destination image region's size 1 + // the destination image region size
1 + // the offsets array of the second and the following source images 1 + // the offsets array of the second and the following source images
1 + // the source image region's origin 1 + // the source image region origin
1 + // the source image region's size 1 + // the source image region sizes array
1 // the projection matrix 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 PreservedUniformUint32Count = 2 + // the destination texture size
2*ShaderImageCount + // the source texture sizes array 2*ShaderImageCount + // the source texture sizes array
2 + // the destination image region's origin 2 + // the destination image region origin
2 + // the destination image region's size 2 + // the destination image region size
2*(ShaderImageCount-1) + // the offsets array of the second and the following source images 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 origin
2 + // the source image region's size 2*ShaderImageCount + // the source image region sizes array
16 // the projection matrix 16 // the projection matrix
) )

View File

@ -709,9 +709,11 @@ func (q *commandQueue) prependPreservedUniforms(uniforms []uint32, shader *Shade
dstRegion.Height /= float32(dh) dstRegion.Height /= float32(dh)
} }
// Set the destination region. // Set the destination region origin.
uniforms[10] = math.Float32bits(dstRegion.X) uniforms[10] = math.Float32bits(dstRegion.X)
uniforms[11] = math.Float32bits(dstRegion.Y) uniforms[11] = math.Float32bits(dstRegion.Y)
// Set the destination region size.
uniforms[12] = math.Float32bits(dstRegion.Width) uniforms[12] = math.Float32bits(dstRegion.Width)
uniforms[13] = math.Float32bits(dstRegion.Height) uniforms[13] = math.Float32bits(dstRegion.Height)
@ -723,7 +725,7 @@ func (q *commandQueue) prependPreservedUniforms(uniforms []uint32, shader *Shade
srcRegion.Height /= float32(h) srcRegion.Height /= float32(h)
} }
// Set the source offsets. // Set the source region offsets.
uniforms[14] = math.Float32bits(offsets[0][0]) uniforms[14] = math.Float32bits(offsets[0][0])
uniforms[15] = math.Float32bits(offsets[0][1]) uniforms[15] = math.Float32bits(offsets[0][1])
uniforms[16] = math.Float32bits(offsets[1][0]) 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[18] = math.Float32bits(offsets[2][0])
uniforms[19] = math.Float32bits(offsets[2][1]) 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[20] = math.Float32bits(srcRegion.X)
uniforms[21] = math.Float32bits(srcRegion.Y) 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[22] = math.Float32bits(srcRegion.Width)
uniforms[23] = math.Float32bits(srcRegion.Height) 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)) // Set the projection matrix.
uniforms[25] = 0 uniforms[30] = math.Float32bits(2 / float32(dw))
uniforms[26] = 0
uniforms[27] = 0
uniforms[28] = 0
uniforms[29] = math.Float32bits(2 / float32(dh))
uniforms[30] = 0
uniforms[31] = 0 uniforms[31] = 0
uniforms[32] = 0 uniforms[32] = 0
uniforms[33] = 0 uniforms[33] = 0
uniforms[34] = math.Float32bits(1) uniforms[34] = 0
uniforms[35] = 0 uniforms[35] = math.Float32bits(2 / float32(dh))
uniforms[36] = math.Float32bits(-1) uniforms[36] = 0
uniforms[37] = math.Float32bits(-1) uniforms[37] = 0
uniforms[38] = 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 return uniforms
} }