Note de curs, programare grafică, 16 decembrie 2013

From Algopedia
Jump to navigationJump to search

În acest curs am discutat despre obiectele de tip textură.

Obiectele de tip textură se folosesc, de regulă, pentru stocarea de imagini în memoria plăcii video și aplicarea acestora pe suprafețele obiectelor desenate.

Texture units

Texture units sunt identificatori utilizați în shadere (de cele mai multe ori de către fragment shader). Acești identificatori sunt numere naturale consecutive strict pozitive (1, 2, ...). Numărul acestor identificatori este limitat și dependent de implementare. Toate implementările trebuie să accepte cel puțin 8 identificatori.

Interogarea numărului de texture units permise:

OOGLES20.implementation.getMaximumTextureUnits
GLES20.glGetIntegerv GLES20.GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS

În orice moment o singură texture unit este activă. Texture unit activă poate fi specificată astfel:

OOGLES20TextureUnit textureUnit = OOGLES20.textureUnit(i)
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i)

Fiecărei textutre unit i se asociază două ținte specifice texturilor.

Țintele (targets) care acceptă obiecte de tip textură

Ținta la care se atașează texturile 2D:

OOGLES20Texture2D texture2DTarget = textureUnit.tex2D
int texture2DTarget = GLES20.GL_TEXTURE_2D

Texturile 2D stochează o imagine obișnută.

Ținta la care se atașează texturile cubice:

OOGLES20TextureCubeMap textureCubeMapTarget = textureUnit.texCubeMap
int textureCubeMapTarget = GLES20.GL_TEXTURE_CUBE_MAP

Texturile cubice sunt formate dintr-un grup de 6 fotografii, care reprezintă suprafața unui cub cu 6 fețe. Exemple de astfel de texturi puteți găsi la adresa: http://www.humus.name/index.php?page=Textures

Imaginile

Imaginea unei texturi 2D:

OOGLES20TextureImage textureImage = textureUnit.tex2D.tex2D
int textureImage = GLES20.GL_TEXTURE_2D

Imaginea perpendiculară pe axa Ox, pe direcția pozitivă:

OOGLES20TextureImage textureImage = textureUnit.texCubeMap.texPositiveX
int textureImage = GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_X

Imaginea perpendiculară pe axa Ox, pe direcția negativă:

OOGLES20TextureImage textureImage = textureUnit.texCubeMap.texNegativeX
int textureImage = GLES20.GL_TEXTURE_CUBE_MAP_NEGATIVE_X

Imaginea perpendiculară pe axa Oy, pe direcția pozitivă:

OOGLES20TextureImage textureImage = textureUnit.texCubeMap.texPositiveY
int textureImage = GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_Y

Imaginea perpendiculară pe axa Oy, pe direcția negativă:

OOGLES20TextureImage textureImage = textureUnit.texCubeMap.texNegativeY
int textureImage = GLES20.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y

Imaginea perpendiculară pe axa Oz, pe direcția pozitivă:

OOGLES20TextureImage textureImage = textureUnit.texCubeMap.texPositiveZ
int textureImage = GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_Z

Imaginea perpendiculară pe axa Oz, pe direcția negativă:

OOGLES20TextureImage textureImage = textureUnit.texCubeMap.texNegativeZ
int textureImage = GLES20.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z

Mipmapping

Mipmap-urile sunt reprezentări tot mai mici ale aceleiași imagini de textură.

Având imaginea unei texturi, OpenGL poate calcula setul complet de mipmap-uri ale acesteia. Acest proces poate fi configurat cu comanda:

OOGLES20.setGenerateMipmapHint
GLES20.glHint GLES20.GL_GENERATE_MIPMAP_HINT

Calitatea procesului se poate specifica astfel:

  • cât mai rapid, de calitate proastă:
OOHintMode.FASTEST
GLES20.GL_FASTEST
  • cât mai lent, de cea mai bună calitate:
OOHintMode.NICEST
GLES20.GL_NICEST
  • indiferent cu privire la calitate și viteză:
OOHintMode.DONT_CARE
GLES20.GL_DONT_CARE

Calitatea procesului de mipmapping poate fi interogat astfel:

OOGLES20.getGenerateMipmapHint
GLES20.glGetIntegerv GLES20.GL_GENERATE_MIPMAP_HINT

Micșorare (minification) și mărire (magnification)

Atunci când afișăm o textură pe suprafața unui obiect, va trebui să desenăm pe ecran o versiune mai mare sau mai mică a imaginii originale. Algoritmii folosiți pentru pentru micșorarea și mărirea imaginilor se numesc minification filters respectiv magnification filters și sunt funcții matematice care se folosesc pentru calcularea fiecărui pixel care trebuie afișat pe ecran.

Funcțiile de micșorare (minification filters) disponibile sunt:

  • se folosește un singur texel din imaginea originală:
OOTextureMinificationFilter.NEAREST
GLES20.GL_NEAREST
  • se interpolează liniar patru texeli din imaginea originală:
OOTextureMinificationFilter.LINEAR
GLES20.GL_LINEAR
  • se folosește un texel din versiunea de dimensiune adecvată a imaginii:
OOTextureMinificationFilter.NEAREST_MIPMAP_NEAREST
GLES20.GL_NEAREST_MIPMAP_NEAREST
  • se interpolează liniar patru texeli din versiunea de dimensiune adecvată a imaginii:
OOTextureMinificationFilter.LINEAR_MIPMAP_NEAREST
GLES20.GL_LINEAR_MIPMAP_NEAREST
  • se interpolează liniar doi texeli, câte unul din cele două versiuni de dimensiuni adecvate ale imaginii:
OOTextureMinificationFilter.NEAREST_MIPMAP_LINEAR
GLES20.GL_NEAREST_MIPMAP_LINEAR
  • se interpolează liniar opt texeli, câte patru din cele două versiuni de dimensiuni adecvate ale imaginii:
OOTextureMinificationFilter.LINEAR_MIPMAP_LINEAR
GLES20.GL_LINEAR_MIPMAP_LINEAR

Funcțiile de mărire (magnification filters) disponibile sunt:

  • se folosește un singur texel din imaginea originală:
OOTextureMagnificationFilter.NEAREST
GLES20.GL_NEAREST
  • se interpolează liniar patru texeli din imaginea originală:
OOTextureMagnificationFilter.LINEAR
GLES20.GL_LINEAR

Wrapping

Wrapping-ul definește modul în care o textură acoperă un obiect cu o suprafață mai mare decât cea a texturii. Modurile disponibile sunt:

  • textura se repretă:
OOTextureWrapMode.REPEAT
GLES20.GL_REPEAT
  • textura se oglindește și se repetă:
OOTextureWrapMode.MIRRORED_REPEAT
GLES20.GL_MIRRORED_REPEAT
  • textura se limitează la marginile sale:
OOTextureWrapMode.CLAMP_TO_EDGE
GLES20.GL_CLAMP_TO_EDGE

Operații de bază

Alocarea unui nume (identificator) pentru un obiect de tip textură:

OOTexture textureObject = new OOTexture
GLES20.glGenTextures

Ștergerea un obiect de tip textură:

textureObject.delete
GLES20.glDeleteTextures

Atașarea unui obiect de tip textură la o țintă:

textureTarget.bind
GLES20.glBindTexture textureTarget

Detașarea unui obiect de tip textură de o țintă:

textureTarget.unbind
GLES20.glBindTexture 0

Operații asupra imaginilor

Încărcarea unei imagini într-o imagine de textură:

textureImage.setImage2D
GLES20.glTexImage2D textureImage
GLUtils.texImage2D textureImage

Încărcarea unei imagini într-o regine dintr-o imagine de textură:

textureImage.setSubImage2D
GLES20.glTexSubImage2D textureImage
GLUtils.texSubImage2D textureImage

Încărcarea unei imagini în format comprimat într-o imagine de textură:

textureImage.setCompressedImage2D
GLES20.glCompressedTexImage2D textureImage

Încărcarea unei imagini în format comprimat într-o regine dintr-o imagine de textură:

textureImage.setCompressedSubImage2D
GLES20.glCompressedTexSubImage2D textureImage

Operații asupra texturilor

Crearea unui set complet de mipmap-uri pe baza unei imagini originale:

textureTarget.generateMipmap
GLES20.glGenerateMipmap textureTarget

Specificarea funcției de micșorare (minification filter):

textureTarget.setMinificationFilter
GLES20.glTexParameteri textureTarget, GLES20.GL_TEXTURE_MIN_FILTER

Specificarea funcției de mărire (magnification filter):

textureTarget.setMagnificationFilter
GLES20.glTexParameteri textureTarget, GLES20.GL_TEXTURE_MAG_FILTER

Specificarea funcției de wrapping de-a lungul coordonatei s (orizontal):

textureTarget.setWrapS
GLES20.glTexParameteri textureTarget, GLES20.GL_TEXTURE_WRAP_S

Specificarea funcției de wrapping de-a lungul coordonatei t (vertical):

textureTarget.setWrapT
GLES20.glTexParameteri textureTarget, GLES20.GL_TEXTURE_WRAP_T

Interogări asupra texturilor

Obținerea funcției de micșorare (minification filter):

textureTarget.getMinificationFilter
GLES20.glGetTexParameteriv textureTarget, GLES20.GL_TEXTURE_MIN_FILTER

Obținerea funcției de mărire (magnification filter):

textureTarget.getMagnificationFilter
GLES20.glGetTexParameteriv textureTarget, GLES20.GL_TEXTURE_MAG_FILTER

Obținerea funcției de wrapping de-a lungul coordonatei s (orizontal):

textureTarget.getWrapS
GLES20.glGetTexParameteriv textureTarget, GLES20.GL_TEXTURE_WRAP_S

Obținerea funcției de wrapping de-a lungul coordonatei t (vertical):

textureTarget.getWrapT
GLES20.glGetTexParameteriv textureTarget, GLES20.GL_TEXTURE_WRAP_T

Interogări asupra implementării

Obținerea dimensiunii maxime (lățime sau înălțime) a unei texturi 2D:

OOGLES20.implementation.getMaximum2DTextureSize
GLES20.glGetIntegerv GLES20.GL_MAX_TEXTURE_SIZE

Obținerea dimensiunii maxime (lățime sau înălțime) a unei texturi cubice:

OOGLES20.implementation.getMaximumCubeMapTextureSize
GLES20.glGetIntegerv GLES20.GL_MAX_CUBE_MAP_TEXTURE_SIZE