Tekstury NPOT w OpenGL
Ostatnio przyszło mi skorzystać z tekstur nie mających wymiarów będących potęgami liczby 2 (NonPowerOfTwo). Dawniej radziłem sobie z takimi teksturami rozciągając mniejszą teksturę na większą mającą rozmiar będący potęgą 2 lub wklejając ją na fragment takiej tekstury. Dostępne są jeszcze dwa rozszerzenia wspomagające pracę z teksturami NPOT: texture_non_power_of_two i texture_rectangle. Oba są w standardzie OpenGL, texture_rectangle jest troche starsze. Przyjrzyjmy się im bliżej.
cechy texture_rectangle:
- koordynaty tekstur musimy podawać nieznormalizowane, tzn.: [0..szerokosc_tekstury],[0,wysokosc_tekstury]
- nie można używać mipmapingu, filtrowanie 'zmienia sie' na liniowe (GL_LINEAR)
- taka tekstura nie może mieć ramki
- zawijanie tekstur musi być typu GL_CLAMP_*
- zamiast np. GL_TEXTURE_2D używamy GL_TEXTURE_RECTANGLE, w shaderach GLSL zamiast sampler2d i texture2d: sampler2dRect, texture2DRect
cechy texture_non_power_of_two:
- koordynaty podajemy 'normalnie' czyli [0..1],[0..1]
- można używać dowolnego filtrowania
- można używać mipmapingu
- tekstura może mieć ramkę
- dowolny format zawijania tekstur
Jak widać używanie texture_rectangle jest problematyczne, natomiast texture_non_power_of_two nie zmusza do wprowadzania zmian w programie: po prostu tworzymy teksturę podając 'dowolny' wymiar i używamy jak zwykłą teksturę. Wybieram ARB_texture_non_power_of_two.
W moim przypadku nie obyło się bez niespodzianek :) Oczywiście mój Radeon 9600 obsługuje oba rozszerzenia, ale nie do końca... Czasem działa, czasem nie - pełna losowość. A jak renderuję do tekstury NPOT to w ogóle nie działa. Szybka zmiana parametrów tekstury i wniosek: Po wyłączeniu filtrowania, ustawieniu zawijania na GL_CLAMP_TO_EDGE i nie generowaniu mipmap wszystko działa. Działa tak jak texture_rectangle, a ma ograniczenia jak texture_non_power_of_two, achh te 'ogl-owskie' sterowniki ATI...
Tagi: Programowanie OpenGL