mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-10 04:57:26 +01:00
graphics: Move texel-region adjustment from shaders to program
This reduces GPU burden.
This commit is contained in:
parent
09ca873c41
commit
b1b8d0b4b1
@ -81,10 +81,12 @@ func QuadVertices(width, height int, sx0, sy0, sx1, sy1 int, a, b, c, d, tx, ty
|
||||
wf := float32(width)
|
||||
hf := float32(height)
|
||||
u0, v0, u1, v1 := float32(sx0)/wf, float32(sy0)/hf, float32(sx1)/wf, float32(sy1)/hf
|
||||
return quadVerticesImpl(float32(sx1-sx0), float32(sy1-sy0), u0, v0, u1, v1, a, b, c, d, tx, ty, cr, cg, cb, ca)
|
||||
return quadVerticesImpl(wf, hf, float32(sx1-sx0), float32(sy1-sy0), u0, v0, u1, v1, a, b, c, d, tx, ty, cr, cg, cb, ca)
|
||||
}
|
||||
|
||||
func quadVerticesImpl(x, y, u0, v0, u1, v1, a, b, c, d, tx, ty, cr, cg, cb, ca float32) []float32 {
|
||||
const TexelAdjustmentFactor = 512.0
|
||||
|
||||
func quadVerticesImpl(sw, sh, x, y, u0, v0, u1, v1, a, b, c, d, tx, ty, cr, cg, cb, ca float32) []float32 {
|
||||
// Specifying a range explicitly here is redundant but this helps optimization
|
||||
// to eliminate boundary checks.
|
||||
//
|
||||
@ -93,6 +95,9 @@ func quadVerticesImpl(x, y, u0, v0, u1, v1, a, b, c, d, tx, ty, cr, cg, cb, ca f
|
||||
|
||||
ax, by, cx, dy := a*x, b*y, c*x, d*y
|
||||
|
||||
du := 1.0 / sw / TexelAdjustmentFactor
|
||||
dv := 1.0 / sh / TexelAdjustmentFactor
|
||||
|
||||
// Vertex coordinates
|
||||
vs[0] = tx
|
||||
vs[1] = ty
|
||||
@ -104,8 +109,8 @@ func quadVerticesImpl(x, y, u0, v0, u1, v1, a, b, c, d, tx, ty, cr, cg, cb, ca f
|
||||
vs[3] = v0
|
||||
vs[4] = u0
|
||||
vs[5] = v0
|
||||
vs[6] = u1
|
||||
vs[7] = v1
|
||||
vs[6] = u1 - du
|
||||
vs[7] = v1 - dv
|
||||
vs[8] = cr
|
||||
vs[9] = cg
|
||||
vs[10] = cb
|
||||
@ -118,8 +123,8 @@ func quadVerticesImpl(x, y, u0, v0, u1, v1, a, b, c, d, tx, ty, cr, cg, cb, ca f
|
||||
vs[15] = v0
|
||||
vs[16] = u0
|
||||
vs[17] = v0
|
||||
vs[18] = u1
|
||||
vs[19] = v1
|
||||
vs[18] = u1 - du
|
||||
vs[19] = v1 - dv
|
||||
vs[20] = cr
|
||||
vs[21] = cg
|
||||
vs[22] = cb
|
||||
@ -131,8 +136,8 @@ func quadVerticesImpl(x, y, u0, v0, u1, v1, a, b, c, d, tx, ty, cr, cg, cb, ca f
|
||||
vs[27] = v1
|
||||
vs[28] = u0
|
||||
vs[29] = v0
|
||||
vs[30] = u1
|
||||
vs[31] = v1
|
||||
vs[30] = u1 - du
|
||||
vs[31] = v1 - dv
|
||||
vs[32] = cr
|
||||
vs[33] = cg
|
||||
vs[34] = cb
|
||||
@ -144,8 +149,8 @@ func quadVerticesImpl(x, y, u0, v0, u1, v1, a, b, c, d, tx, ty, cr, cg, cb, ca f
|
||||
vs[39] = v1
|
||||
vs[40] = u0
|
||||
vs[41] = v0
|
||||
vs[42] = u1
|
||||
vs[43] = v1
|
||||
vs[42] = u1 - du
|
||||
vs[43] = v1 - dv
|
||||
vs[44] = cr
|
||||
vs[45] = cg
|
||||
vs[46] = cb
|
||||
|
@ -126,8 +126,8 @@ struct GetColorFromTexel<FILTER_NEAREST, address> {
|
||||
float2 p = AdjustTexelByAddress<address>(v.tex, v.tex_region);
|
||||
if (p.x < v.tex_region[0] ||
|
||||
p.y < v.tex_region[1] ||
|
||||
(v.tex_region[2] - texel_size.x / 512.0) <= p.x ||
|
||||
(v.tex_region[3] - texel_size.y / 512.0) <= p.y) {
|
||||
v.tex_region[2] <= p.x ||
|
||||
v.tex_region[3] <= p.y) {
|
||||
return 0.0;
|
||||
}
|
||||
return texture.sample(texture_sampler, p);
|
||||
@ -159,11 +159,11 @@ struct GetColorFromTexel<FILTER_LINEAR, address> {
|
||||
c0 = 0;
|
||||
c1 = 0;
|
||||
}
|
||||
if ((v.tex_region[2] - texel_size.x / 512.0) <= p1.x) {
|
||||
if (v.tex_region[2] <= p1.x) {
|
||||
c1 = 0;
|
||||
c3 = 0;
|
||||
}
|
||||
if ((v.tex_region[3] - texel_size.y / 512.0) <= p1.y) {
|
||||
if (v.tex_region[3] <= p1.y) {
|
||||
c2 = 0;
|
||||
c3 = 0;
|
||||
}
|
||||
|
@ -191,8 +191,8 @@ void main(void) {
|
||||
color = texture2D(texture, pos);
|
||||
if (pos.x < varying_tex_region[0] ||
|
||||
pos.y < varying_tex_region[1] ||
|
||||
(varying_tex_region[2] - texel_size.x / 512.0) <= pos.x ||
|
||||
(varying_tex_region[3] - texel_size.y / 512.0) <= pos.y) {
|
||||
varying_tex_region[2] <= pos.x ||
|
||||
varying_tex_region[3] <= pos.y) {
|
||||
color = vec4(0, 0, 0, 0);
|
||||
}
|
||||
#endif
|
||||
@ -217,11 +217,11 @@ void main(void) {
|
||||
c0 = vec4(0, 0, 0, 0);
|
||||
c1 = vec4(0, 0, 0, 0);
|
||||
}
|
||||
if ((varying_tex_region[2] - texel_size.x / 512.0) <= p1.x) {
|
||||
if (varying_tex_region[2] <= p1.x) {
|
||||
c1 = vec4(0, 0, 0, 0);
|
||||
c3 = vec4(0, 0, 0, 0);
|
||||
}
|
||||
if ((varying_tex_region[3] - texel_size.y / 512.0) <= p1.y) {
|
||||
if (varying_tex_region[3] <= p1.y) {
|
||||
c2 = vec4(0, 0, 0, 0);
|
||||
c3 = vec4(0, 0, 0, 0);
|
||||
}
|
||||
|
@ -249,8 +249,8 @@ func (i *Image) PutVertex(vs []float32, dx, dy, sx, sy float32, bx0, by0, bx1, b
|
||||
vs[3] = sy / float32(h)
|
||||
vs[4] = bx0 / float32(w)
|
||||
vs[5] = by0 / float32(h)
|
||||
vs[6] = bx1 / float32(w)
|
||||
vs[7] = by1 / float32(h)
|
||||
vs[6] = bx1/float32(w) - 1.0/float32(w)/graphics.TexelAdjustmentFactor
|
||||
vs[7] = by1/float32(h) - 1.0/float32(h)/graphics.TexelAdjustmentFactor
|
||||
vs[8] = cr
|
||||
vs[9] = cg
|
||||
vs[10] = cb
|
||||
|
Loading…
Reference in New Issue
Block a user