Skoči na vsebino



glsl represent 1 big texture as 4 smaller ones (tearing)

glsl shader

3 odgovorov na to temo

#1 Samurai Jack

    ne ve, kaj je kumkvat.

  • mn3njalničarji
  • 180 sporočil

Objavljeno 22 junij 2016 - 10:39

Bog daj! Lahko kdo to pogleda prosim:

I would like to represent 1 big texture (1024x1024) as 4 smaller textures (4x 512x512).
The reason of doing so is that mobile devices do usually not support textures greater
than 4096x4096 and I need to represent for example a 8192x8192 as 4 4096x4096
textures.

So the idea is very simple:

1.) Take one texture and split it into 4 smaller ones
2.) Instead of one 1024x1024 you get 4x 512x512 textures ( Upper left, Upper right, Lower right, Lower left)
3.) According to the UV coordinate, the shader picks the correct tile

When using 1 single texture on a geosphere (icosa) everything looks just fine.
Objavljena slika

When I use a pixel shader that selects out of 4 textures I do get artifacts on
the clipping / boarder regions:
Objavljena slika

The fragment/pixel shader code:

/* Texture clips */
uniform sampler2D clipTopLeft;
uniform sampler2D clipTopRight;
uniform sampler2D clipBottomRight;
uniform sampler2D clipBottomLeft;
/* UV from the vertex shader */
varying vec2 srcUv;
void main( void )
{
  /* Scale up source uv */
  vec2 dstUv = vec2(srcUv.x * 2.0, srcUv.y * 2.0);
  /* Clip & wrap the UV */
  if (dstUv.x > 1.0) dstUv.x -= 1.0;
  if (dstUv.x < 0.0) dstUv.x += 1.0;
  if (dstUv.y > 1.0) dstUv.y -= 1.0;
  if (dstUv.y < 0.0) dstUv.y += 1.0;
  /* Select clip */
  if (srcUv.x < 0.5 && srcUv.y > 0.5)
	gl_FragColor = texture2D( clipTopLeft, dstUv );
  else if (srcUv.x >= 0.5 && srcUv.y > 0.5)
	gl_FragColor = texture2D( clipTopRight, dstUv );
  else if (srcUv.x < 0.5 && srcUv.y <= 0.5)
	gl_FragColor = texture2D( clipBottomRight, dstUv );
  else if (srcUv.x >= 0.5 && srcUv.y <= 0.5)
	gl_FragColor = texture2D( clipBottomLeft, dstUv );
}

What could be wrong?
a) The if statement selection the correct clip
b) Destination UVs
c) Both ?
d) Something else?

Thank you in advance!

#2 Zizy

    več kot očitno žre doručak na mn3njalu.

  • prostozidarji
  • 4 281 sporočil

Objavljeno 22 junij 2016 - 11:12

srcUv.x, y je v kakih mejah? Ce 0-1 kar pricakujem, potem zakaj imas sploh dstUv.x < 0 pogoje, sej ne bojo nikoli izpolnjeni. Ce karkoli drugega, zamenjej if z while (kot najenostavnejsi korak. A nimas wrap pa clamp funkcij?)
Kot drugo pa, a ni 0,0 zgorej levo in bi nucal za y imeti zamenjane koordinate?

#3 Samurai Jack

    ne ve, kaj je kumkvat.

  • mn3njalničarji
  • 180 sporočil

Objavljeno 22 junij 2016 - 11:45

Ne razumem kako bi mi to bilokako pomagalo. UVji so 100% pravilni, ker pridejo iz 3ds Max in ce se uporablja zgolj in samo 1 textura, povsem je vse ok.

#4 n3Xus

    eden od desetih najboljših fafačev

  • mn3njalničarji
  • 215 sporočil

Objavljeno 27 junij 2016 - 19:56

Mogoče kakšen fuck up interpolacije če delaš kaj zelo čudnega ali pa se wrapa kaj v integer/fixed point mogoče ker ni popolne podpore floating point?





1 Uporabnik(ov) bere to temo

0 članov, 1 gostov, 0 anonimnih uporabnikov