Note de curs, programare grafică, 16 decembrie 2013
Î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