2017-09-15 2 views
0

J'utilise l'API glGetIntegerv pour obtenir la taille maximale de la fenêtre et de la texture. Les deux retournent 16K x 16K pixels.Comment faire pour rendre la texture de super taille dans OpenGL

Voici les codes:

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

Cependant, je besoin d'une plus grande taille de texture pour montrer une série d'images de haute résolution. J'ai essayé de définir la taille de la fenêtre à 32K x 32K et le programme s'exécute avec succès. Il semble que le maximum de taille de fenêtre que j'ai obtenu de l'API glGetIntegerv n'est pas tout à fait correct.

Mais je ne peux pas définir la taille de la texture à une valeur supérieure à 16K x 16K. Peut-être que je devrais essayer de créer plus d'une unité de texture et chacun d'entre eux a la taille de 16K x 16K. Quelqu'un présente une application appelée Manual Full Slide Imaging. est ici le lien:

http://www.microvisioneer.com/

Il semble que la texture super taille a réalisé dans cette application. OpenGL est-il le bon outil pour résoudre mon problème ou existe-t-il d'autres solutions? MISE À JOUR: Tout à l'heure j'ai trouvé que quand j'ai placé la fenêtre à 32K x 32K et aucune erreur s'est produite, mais sa vraie taille est toujours 16K x 16K.

+1

Qu'entendez-vous par "taille 1024 * 16 * 1024 * 16"? Les requêtes que vous utilisez donnent une valeur pour * width * (et * height * pour viewport) Vous pouvez rechercher les valeurs renvoyées par des cartes [ici] (http://opengl.gpuinfo.org/gl_stats_caps_single.php?listreportsbycap=GL_MAX_TEXTURE_SIZE) les valeurs sont suffisantes pour la taille d'affichage maximale du matériel installé. – Ripi2

+0

Comme @ Ripi2 mentionné. Ce que vous parlez est à propos de viewport et il n'a rien à faire des textures. Les textures auront une taille maximale basée sur le matériel et vous pouvez rendre n'importe quelle taille à n'importe quelle taille de fenêtre. – Ketan

+0

glViewport se serre silencieusement sur la plage prise en charge conformément aux spécifications. Ce n'est pas une erreur. – Andreas

Répondre

0

Envisager d'avoir un type RGBA8. En C, il ressemble à ceci:

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

Mais vous pouvez représenter aussi avec:

uint32_t rgba = 0x004466ff; 

De même pour le type RGBA32:

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

Cependant, vous êtes autorisé à traiter ces bits tout comme tu veux. Vous pouvez:

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

Dans l'exemple ci-dessus, vous avez mis les données rgba8 de TEX1 dans le canal rouge de la texture RGBA32 interne opengl, TEX2 dans le canal vert et ainsi de suite. En supposant que les textures sont bord à bord dans la vie réelle d'une manière 2x2, une texcoord (0.1.0.1) mapperait la valeur rgba8 dans le canal rouge à texcoord 2 * (0.1, 0.1). Texcoord (0.6, 0.7) est mappé au rgba8 dans le canal alpha à 2 * (0.6-0.5, 0.7-0.5), en supposant que la texture dans le canal alpha est située en diagonale de la texture dans le canal rouge.

J'ai utilisé cette technique moi-même dans la direction opposée pour que mon application prenne en charge la luminance 16 bits (L16 ou R16) sur les plates-formes ne prenant en charge que les canaux 8 bits. Pour l'essentiel, j'ai chargé une texture à un seul canal de 16 bits dans une texture à deux canaux de 8 bits et je l'ai scindée dans le shader en tant que mot haut/bas.

Notez que vous ne pouvez pas utiliser de filtrage de texture tel que GL_LINEAR en faisant cela. Vous devez vous filtrer. D'après mon expérience, ce n'est pas un très gros problème en pratique.