2016-04-08 12 views
0

Gibt es bestimmte Formateinschränkungen, die Texturen ebenfalls einhalten müssen?OpenGL-Texturen Formateinschränkungen

Ich lade TGA-Dateien und sie mit den folgenden Fragment-Shader Zeichnung:

varying vec2  v_texCoord; 
uniform sampler2D s_texture; 
uniform vec4  vColor4; 

void main() 
{ 
    vec4 tmpColor = texture2D(s_texture, v_texCoord); 

    tmpColor.r = vColor4.r; 
    tmpColor.g = vColor4.g; 
    tmpColor.b = vColor4.b; 

    gl_FragColor = tmpColor; 
} 

Ich finde, dass 16x16 Bilder OK angezeigt werden soll. 64x16 Anzeige OK. 72x16, 80x16 und 96x16 funktioniert nicht.

Ich werde bei Bedarf weitere Informationen einschließlich der TGA-Dateien bereitstellen.

+2

Verwenden Sie OpenGL oder OpenGL ES? Früher gab es Beschränkungen für Texturen, die in beiden Dimensionen eine Zweierpotenz sein mussten. Diese Einschränkung wurde jedoch nach Version 2.0 aus OpenGL entfernt. Mit OpenGL ES und WebGL ist diese Einschränkung möglicherweise noch vorhanden (es sei denn, Ihre Implementierung unterstützt eine Erweiterung, die die Einschränkung entfernt). – radical7

+0

@ radical7 Ich benutze OpenGL ES2.0. Das würde Sinn machen, was du sagst. Also nach 64x16 müsste es 128x16 und 256x16 usw. sein? – SparkyNZ

+0

gehen Sie einfach mit 2^n wie 2 4 8 16 32 64 128 256 512 1024 .. Es ist offensichtlich. – Sung

Antwort

0

72, 80 und 96 sind keine Zweierpotenzen; Diese Anforderung hat wenig mit dem Datenformat in OpenGL ES zu tun. Diese Anforderung ist sogar in modernen Desktop-GL, wo es auf das verwendete Datenformat abhängen kann.

Unkomprimierte Texturdaten in (Desktop) OpenGL 2.0 oder höher kann nicht-Power-of-Two-Dimensionen haben.

Komprimierte Texturdaten erfordern jedoch weiterhin Blockgrößen, die ein Vielfaches von 4 sind. Pixelübertragungsfunktionen setzen weiterhin 4-Byte-Datenausrichtung für jede Zeile in einem Bild voraus. Fließkommaltexturen benötigen ggf. ebenfalls Potenzen von zwei und so weiter.

Viele Bildbibliotheken, die für den GL entwickelt wurden, skalieren das Zeug tatsächlich auf eine Zweierpotenz, was jedes der oben diskutierten Probleme lösen kann. Es ist nicht immer der am besten geeignete Weg (es kann extrem verschwenderisch sein), Dimensionsprobleme zu beheben, aber es kann universell auf fast jedes gängige Dimensionsproblem angewendet werden.

+0

Ja, alle Texturen, die ich verwende, sind komprimiert. – SparkyNZ

+0

"* Unkomprimierte Texturdaten in (Desktop) OpenGL 2.0 oder höher können nicht zwei Dimensionen haben. *" Nein, *** alle *** Texturen in Desktop OpenGL 2.0+ können nicht-Power-of-2-Dimensionen haben. 2 Dimensionen, ob komprimiert oder nicht. Blockgrößen haben auch nichts mit der Größe der Textur zu tun, da Teilblöcke nicht durch die OpenGL-Spezifikation verboten sind. Die Spezifikation macht deutlich, wie blockkomprimierte Formate für Texturen funktionieren, deren Größe nicht durch die Blockgröße teilbar ist. Ihre Antwort gilt also nur für OpenGL. –

+0

Dieser Kommentar ist gründlich verwirrend und nachweislich falsch. DXTn-Texturen als einfaches Beispiel erzeugen 'GL_INVALID_OPERATION', wenn Sie versuchen, einen Datenspeicher mit nicht blockorientierten Dimensionen zuzuweisen.Andere komprimierte Formate haben ihre eigenen Regeln, die in ihren jeweiligen Erweiterungsspezifikationen diskutiert werden. Und natürlich gilt das nur für OpenGL. Ich versuche, meine Antworten für die diskutierten APIs relevant zu halten. Wenn Sie Vulkan, Direct3D oder eine andere API diskutieren möchten, seien Sie mein Gast, aber ich sehe nicht, welchen Wert es der Frage hinzufügen wird. –