Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:17

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Nov 26, 2008 15:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich arbeite aktuell an meiner Bachelor Arbeit und dabei habe ich ein Prototypen für Virtual Texture.
Ich zeichne mit folgendem Shader mein Quad in ein FBO.
Das FBO lade ich mir in den Arbeitsspeicher und lasse es Pixelweise durcharbeiten.
Dabei Frage ich für jeden Pixel, ob schon im Textur Atlas(Textur wo alle Texturblöcke untergebracht werden) liegen und wenn ja, dann flag ich das als Used und gehe zum nächsten Pixel sonnst wird der neue Texturblock in einer Liste hinzu gepackt.
Sind alle Pixel verarbeitet dann hab ich schonmal die Liste mit allen wiederverwendeten Texturblöcken und eine Liste mit neuen.
Nun werden die neuen Texturblöcke in freie Blöcke, auf dem Textur Atlas, gepackt und aus der NeueTexturBlöcke Liste entfernt.
Ist die Liste Leer oder kein freier Block mehr übrig, dann wird die Schleife beendet und die UpdateTextureAtlas Methode aufgerufen.
In dieser Methode werden abhängig von der Texturblock position, in der Virtuellen Textur, ein 32x32Pixel Feld in den Zielblock, des Textur Atlas, gezeichnet.
Nun wird noch die UpdateLookupMap Methode aufgerufen, wo die Offsets, für die Texturblöcke neu geschrieben werden.
Bild
Jetzt wird die Szene gezeichnet, im oberen hälfte des Bildschirms, wird der FBO ausgegeben und im unterem Teil, wird die Szene mit dem Quad und dem Virtual Texture Shader gezeichnet. Der Shader Schaut in die Lookup-Map, nimmt die dort liegende Texturkoordinate und liest den Texel auf dem Textur Atlas aus. Der TexturAtlas(rechts) und die Lookup-Map(links) werden zusätzlich Orthogonal oben links gezeichnet.
Die Texturen für FBO, Atlas und LookUp-Map sind alle mit GL_LINEAR Filter erstellt worden.

Die Rot Umkreisten Blöcke sind falsch.
Ich suche nun das Problem schon mehrere Stunden und finde ihn nicht.

Shader für das schreiben in den FBO mit TexCoords
Code:
  1. const vec2 TextureSize=vec2(512.0,512.0);
  2. void main(void)
  3. {
  4. float MipMapLevel=-1.0-log2(min(length(dFdx(gl_TexCoord[0].st)),length(dFdy(gl_TexCoord[0].st))));
  5. vec4 Color=vec4(TextureSize[0],TextureSize[1],MipMapLevel/5.0,0.0);
  6. vec4 TexCoord=gl_TexCoord[0];
  7. //Um den Texturblock zu erhalten, wird die Texturkoordinate mit der
  8. //Texturgröße multipliziert, dann durch die Blockgröße dividiert und
  9. //der Nachkommateil entfernt.
  10. //BlockX=floor(Breite*U/32.0);
  11. //BlockY=floor(Höhe*V/32.0);
  12.  
  13. //Multipliziere Breite*U, Höhe*V.
  14. //TexturID und MipMapLevel bleiben erhalten, da diese mit 1.0
  15. //multipliziert werden.
  16. TexCoord[2]=1.0;
  17. TexCoord[3]=1.0;
  18. Color*=TexCoord;
  19. //Multipliziere 0,03125 mit Höhe und Breite(entspricht Höhe/32 und Breite/32).
  20. //Multiplikation ist schneller als Division und daher die Umwandlung.
  21. vec4 Scale=vec4(0.03125,0.03125,1.0,1.0);
  22. Color*=Scale;
  23.  
  24. //Nachkommastellen entfernen und damit die Position, des entsprechenden
  25. //Texturblockes erhalten.
  26. Color[0]=floor(Color[0])/(TextureSize[0]*0.03125);
  27. Color[1]=floor(Color[1])/(TextureSize[0]*0.03125);
  28. gl_FragColor=Color;
  29. }


Shader zum zeichnen der Virtuellen Textur
Code:
  1. uniform sampler2D Atlas;
  2. uniform sampler2D Lookup;
  3. void main(void)
  4. {
  5. vec4 TexColor=texture2D(Lookup,gl_TexCoord[0].st);
  6. vec2 UV=vec2(TexColor.g,TexColor.b);
  7. vec4 Color=texture2D(Atlas,UV);
  8. gl_FragColor=Color;
  9. }


Default Vertex Shader
Code:
  1. void main(void)
  2. {
  3. gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex;
  4. gl_TexCoord[0]=gl_MultiTexCoord0;
  5. }


Quellcodeauszug
Code:
  1. unsigned int p[512*512];
  2. unsigned int Atlas[512*512];
  3. unsigned int LookupMap[256];
  4.  
  5. struct TexBlock
  6. {
  7.     unsigned int Index;
  8.     unsigned short MipMapLevel;
  9.     unsigned short Used;
  10.     TexBlock()
  11.     {
  12.         Index=0;
  13.         MipMapLevel=0;
  14.         Used=0;
  15.     }
  16.     TexBlock(unsigned int X, unsigned int Y, unsigned int AMipMapLevel)
  17.     {
  18.         Index=(Y*16)+X;
  19.         MipMapLevel=AMipMapLevel;
  20.         Used=1;
  21.     }
  22. };
  23. TexBlock Textureblocks[16*16];
  24. vector<TexBlock*> NewTextureBlocks;
  25.  
  26. int IsTextureBlockLoaded(unsigned int x, unsigned int y, unsigned int MipMapLevel)
  27. {
  28.     unsigned int index=(y*16)+x;
  29.     for (unsigned int i=0;i<16*16;i++)
  30.         if ((Textureblocks[i].Index==index) && (Textureblocks[i].MipMapLevel==MipMapLevel))
  31.             return i;
  32.     return -1;
  33. }
  34.  
  35. int IsNewTextureBlock(unsigned int x, unsigned int y, unsigned int MipMapLevel)
  36. {
  37.     unsigned int index=(y*16)+x;
  38.     for (unsigned int i=0;i<NewTextureBlocks.size();i++)
  39.         if ((NewTextureBlocks[i]->Index==index) && (NewTextureBlocks[i]->MipMapLevel==MipMapLevel))
  40.             return i;
  41.     return -1;
  42. }
  43.  
  44. void UseTextureBlock(unsigned int Index)
  45. {
  46.     Textureblocks[Index].Used=1;
  47. }
  48.  
  49. void FillBlock(unsigned int Pos,unsigned int Index)
  50. {
  51.     unsigned int x=(Pos % 16)*32;
  52.     unsigned int y=((unsigned int)floor(((float)Pos)/16.0f))*32;
  53.     unsigned int ind=(y*512)+x;
  54.  
  55.     unsigned int color=0xFF000000;
  56.     unsigned int tx=(Index % 16);
  57.     unsigned int ty=(unsigned int)floor(((float)Index)/16.0f);
  58.     if ((((tx % 2)+(ty % 2))% 2)==1)
  59.         color=0xFF0000FF+(tx*17<<16)+(ty*17<<8);
  60.  
  61.     for (unsigned int py=0;py<32;py++)
  62.     {
  63.         for (unsigned int px=0;px<32;px++)
  64.         {
  65.             Atlas[ind]=color;
  66.             ind++;
  67.         }
  68.         ind+=480;
  69.     }
  70. }
  71.  
  72. void UpdateAtlas()
  73. {
  74.     unsigned int ind=0;
  75.     for (unsigned int i=0;i<NewTextureBlocks.size();i++)
  76.         while (ind<256)
  77.         {
  78.             if (Textureblocks[ind].Used==0)
  79.             {
  80.                 Textureblocks[ind].Index=NewTextureBlocks[i]->Index;
  81.                 Textureblocks[ind].MipMapLevel=NewTextureBlocks[i]->MipMapLevel;
  82.                 Textureblocks[ind].Used=1;
  83.                 FillBlock(ind,Textureblocks[ind].Index);
  84.                 break;
  85.             }
  86.             ind++;
  87.         }
  88.     ((TKar_TextureOGL*)Application.GetWindow((unsigned int)0)->GetContext()->TextureManager->GetTexture("TextureAtlas"))->UpdateTextureData(&Atlas[0],0);
  89. }
  90.  
  91. void GenerateLookupMaps()
  92. {
  93.     unsigned int val=0;
  94.     unsigned char x=0;
  95.     unsigned char y=0;
  96.     for (unsigned int i=0;i<256;i++)
  97.         if (Textureblocks[i].Used==1)
  98.         {
  99.             x=(i % 16)*17;
  100.             y=(unsigned char)(floor(((float)i)/17.0f)*17.0f);
  101.             val=x<<8;
  102.             val+=y;
  103.             LookupMap[Textureblocks[i].Index]=val;
  104.         }
  105.     ((TKar_TextureOGL*)Application.GetWindow((unsigned int)0)->GetContext()->TextureManager->GetTexture("Lookup"))->UpdateTextureData(&LookupMap[0],0);
  106. }
  107.  
  108. void ProcessTexture()
  109. {
  110.     int x,y,ml;
  111.     //change all textureblocks to unused
  112.     for (unsigned int i=0;i<256;i++)
  113.     {
  114.         Textureblocks[i].Used=0;
  115.     }
  116.  
  117.     x=(p[0]>>8&0xFF)*15/256;
  118.     y=(p[0]>>16&0xFF)*15/256;
  119.     ml=(p[0]>>24&0xFF)*5/256;
  120.     int ind=IsTextureBlockLoaded(x,y,ml);
  121.     if (ind==-1)
  122.     {
  123.         ind=IsNewTextureBlock(x,y,ml);
  124.         if (ind==-1)
  125.             NewTextureBlocks.push_back(new TexBlock(x,y,ml));
  126.     }
  127.     else
  128.         UseTextureBlock(ind);
  129.    
  130.     for (unsigned int i=1;i<512*512;i++)
  131.     {
  132.         if (p[i]!=p[i-1])
  133.         {
  134.             x=(p[i]>>16&0xFF)*15/256;
  135.             y=(p[i]>>8&0xFF)*15/256;
  136.             ml=(p[i]>>24&0xFF)*5/256;
  137.             ind=IsTextureBlockLoaded(x,y,ml);
  138.             if (ind==-1)
  139.             {
  140.                 ind=IsNewTextureBlock(x,y,ml);
  141.                 if (ind==-1)
  142.                     NewTextureBlocks.push_back(new TexBlock(x,y,ml));
  143.             }
  144.             else
  145.                 UseTextureBlock(ind);
  146.         }
  147.     }
  148.  
  149.     UpdateAtlas();
  150.     GenerateLookupMaps();
  151.     NewTextureBlocks.clear();
  152. }

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2008 15:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Problem gelöst und thx nochmal an Oc2k1, der mich auf den kleinen und simplen Fehler aufmerksam gemacht hat.
Das Problem lag in den Wertebereich von OpenGL Texturkoordinaten und der Textur.
Hier das neue Ergebnis.
Bild

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]