2017-09-15 8 views
0

rendere Ich benutze die API glGetIntegerv, um die maximale Größe von Ansichtsfenstern und Textur zu erhalten. Beide geben 16K x 16K Pixel zurück. HierWie man super Größe Textur in OpenGL

ist der Codes:

GLint maxTexture,maxViewport; 
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexture); 
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, &maxViewport); 

Allerdings brauche ich eine größere Größe der Textur eine Reihe von Bildern mit hohen Auflösung zu zeigen. Ich habe versucht, die Größe des Darstellungsbereichs auf 32K x 32K festzulegen, und das Programm wird erfolgreich ausgeführt. Es scheint, dass das Maximum der Viewportgröße, die ich von der API glGetIntegerv erhalten habe, nicht ganz richtig ist.

Aber ich kann die Textur Größe nicht auf einen Wert größer als 16K x 16K einstellen. Vielleicht sollte ich versuchen, mehr als eine Textureinheit zu erstellen und jeder von ihnen hat die Größe von 16K x 16K.

Jemand präsentiert eine Anwendung namens Manual Whole Slide Imaging. hier ist der Hyperlink:

http://www.microvisioneer.com/

Es scheint, dass die Super-Größe Textur in dieser Anwendung realisiert. Ist OpenGL also das richtige Werkzeug, um mein Problem zu lösen, oder gibt es eine andere Lösung?

UPDATE: Gerade jetzt habe ich festgestellt, dass, wenn ich das Ansichtsfenster auf 32K x 32K eingestellt und kein Fehler aufgetreten ist, aber seine wahre Größe ist immer noch 16K x 16K.

+1

Was meinen Sie mit "1024 * 16 * 1024 * 16" Größe? Die von Ihnen verwendeten Abfragen geben einen Wert für * width * (und * height * für das Ansichtsfenster) ein. Sie können nach Werten suchen, die von cards zurückgegeben werden [hier] (http://opengl.gpuinfo.org/gl_stats_caps_single.php?listreportsbycap=GL_MAX_TEXTURE_SIZE) Werte sind genug für die maximale Anzeigegröße der installierten Hardware. – Ripi2

+0

Wie @ Ripi2 erwähnt. Sie sprechen über das Ansichtsfenster und es hat nichts mit Texturen zu tun. Texturen haben eine maximale Größe basierend auf der Hardware und Sie können jede Größe in ein beliebiges Ansichtsfenster rendern. – Ketan

+0

glViewport schaltet laut Spezifikation automatisch in den unterstützten Bereich. Dies ist kein Fehler. – Andreas

Antwort

0

Betrachten Sie einen RGBA8-Typ. In C sieht es wie folgt aus:

uint8_t rgba[4] = {0x00, 0x44, 0x66, 0xff}; 

Aber man es auch mit darstellen könnte:

uint32_t rgba = 0x004466ff; 

Ebenso für Typ RGBA32:

uint32_t rgba[4] = {0x00000000, 0x44000000, 0x66000000, 0xff000000}; 
// or 
uint128_t _rgba = 0x000000004400000066000000ff000000; // assuming there is a uint128_t... 

JEDOCH Sie erlaubt sind, jene Bits zu behandeln jede wie du willst. Sie könnten:

uint128_t rgba[4] = {tex1rgba, tex2rgba, tex3rgba, tex4rgba}; 

In obigem Beispiel Sie tex1 rgba8 Daten im roten Kanal der opengl internen RGBA32 Textur, tex2 im grünen Kanal und so weiter gesetzt worden. Unter der Annahme, dass die Texturen Kante-um-Kante im realen Leben in einer 2x2-Weise sind, würde eine Texkoord (0.1, 0.1) den rgba8-Wert in dem roten Kanal bei texcoord 2 * (0.1, 0.1) abbilden. Texcoord (0.6, 0.7) bildet das rgba8 im Alpha-Kanal bei 2 * ab (0.6-0.5, 0.7-0.5), vorausgesetzt, die Textur im Alpha-Kanal liegt diagonal zur Textur im roten Kanal.

Ich habe diese Technik selbst in die entgegengesetzte Richtung verwendet, um meine Anwendung 16-Bit-Luminanz (L16 oder R16) auf Plattformen zu unterstützen, die nur 8-Bit-Kanäle unterstützen. Im Wesentlichen habe ich eine 16-Bit-Single-Channel-Textur in eine 8-Bit-Dual-Channel-Textur geladen und im Shader als High/Low-Word aufgeteilt.

Beachten Sie, dass Sie dabei keine Texturfilterung wie GL_LINEAR verwenden können. Du musst dich selbst filtern. Meiner Erfahrung nach ist das in der Praxis kein großes Problem.