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

Aktuelle Zeit: Fr Jul 18, 2025 11:20

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



Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Problem mit 3D-Textur
BeitragVerfasst: Do Jan 14, 2010 14:14 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
Hallo,

ich erstelle eine 3D-Textur die ich dann, mit verschobener Tiefe, auf verschiedene QUADS legen will.

Hier einmal wie ich die Textur erstelle:
Code:
  1.     #define WIDTH           300
  2.     #define HEIGHT          300
  3.     #define DEPTH           10
  4.     #define BYTES_PER_TEXEL 4
  5.     #define LAYER(r)        (WIDTH * HEIGHT * r * BYTES_PER_TEXEL)
  6.     #define TEXEL2(s, t)    (BYTES_PER_TEXEL * (s * WIDTH + t))
  7.     #define TEXEL3(s, t, r) (TEXEL2(s, t) + LAYER(r))
  8.  
  9.     m_ucTexels = (BYTE *)malloc(WIDTH * HEIGHT * DEPTH * BYTES_PER_TEXEL);
  10.  
  11.     for(int ImgIndex = 0; ImgIndex < DEPTH; ImgIndex++)
  12.     {
  13.         for(int s=0; s < WIDTH; s++)
  14.         {
  15.             for(int t=0; t < HEIGHT; t++)
  16.             {
  17.                 m_ucTexels[TEXEL3(s, t, ImgIndex)] = 0x80*(ImgIndex/DEPTH);
  18.                 m_ucTexels[TEXEL3(s, t, ImgIndex)+1] = 0x80*(ImgIndex/DEPTH);
  19.                 m_ucTexels[TEXEL3(s, t, ImgIndex)+2] = 0x80*(ImgIndex/DEPTH);
  20.                 m_ucTexels[TEXEL3(s, t, ImgIndex)+4] = 0x80;
  21.             }
  22.         }
  23.     }
  24.  
  25.     glGenTextures(1, &m_uiTexName);
  26.     glBindTexture(GL_TEXTURE_3D, m_uiTexName);
  27.     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  28.     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  29.     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // GL_REPEAT);
  30.     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // GL_REPEAT);
  31.     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); // GL_REPEAT);
  32.  
  33.     #if (__WIN32__)
  34.     glTexImage3D = (PFNGLTEXIMAGE3DPROC) wglGetProcAddress("glTexImage3D");
  35.         if (glTexImage3D == NULL)
  36.             return FALSE;
  37.     #endif
  38.  
  39.     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, WIDTH, HEIGHT, DEPTH, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_ucTexels);


und hier wie ich die QUADS zeichne:
Code:
  1. glBindTexture(GL_TEXTURE_3D, m_uiTexName);
  2.     glEnable(GL_TEXTURE_3D);
  3.  
  4.     glBegin(GL_QUADS);
  5.     GLdouble high=0;
  6.     GLdouble halbebreite = 150;
  7.     for(GLdouble i=0; i<10; i++)
  8.     {
  9.         glTexCoord3d((GLdouble)0.0, (GLdouble)0.0, i);
  10.         glVertex3d((GLdouble)-halbebreite, high, (GLdouble)-halbebreite);
  11.         glTexCoord3d((GLdouble)1.0, (GLdouble)0.0, i);
  12.         glVertex3d((GLdouble)halbebreite, high, (GLdouble)-halbebreite);
  13.         glTexCoord3d((GLdouble)1.0, (GLdouble)1.0, i);
  14.         glVertex3d((GLdouble)halbebreite, high, (GLdouble)halbebreite);
  15.         glTexCoord3d((GLdouble)0.0, (GLdouble)1.0, i);
  16.         glVertex3d((GLdouble)-halbebreite, high, (GLdouble)halbebreite);
  17.         high += (GLdouble)25.0;
  18.     }
  19.     glEnd();
  20.     glDisable(GL_TEXTURE_3D);


Das Problem ist jetzt das alle 10 Quads die gleich Textur haben, obwohl sich die Tiefe der Textur ja mit i verschieben sollte, jedenfalls wenn ich das richtig verstanden habe ;)

Ein bischen gedreht siehts dann so aus:

Bild


edit:
wenn ich versuche die layer "tiefe" zu normalisieren, ist immernoch alles schwarz :(
Code:
  1. for(GLdouble i=0; i<10; i++)
  2.     {
  3.         glTexCoord3d((GLdouble)0.0, (GLdouble)0.0, (i)*(1/9));
  4.         glVertex3d((GLdouble)-halbebreite, high, (GLdouble)-halbebreite);
  5.         glTexCoord3d((GLdouble)1.0, (GLdouble)0.0, (i)*(1/9));
  6.         glVertex3d((GLdouble)halbebreite, high, (GLdouble)-halbebreite);
  7.         glTexCoord3d((GLdouble)1.0, (GLdouble)1.0, (i)*(1/9));
  8.         glVertex3d((GLdouble)halbebreite, high, (GLdouble)halbebreite);
  9.         glTexCoord3d((GLdouble)0.0, (GLdouble)1.0, (i)*(1/9));
  10.         glVertex3d((GLdouble)-halbebreite, high, (GLdouble)halbebreite);
  11.     }


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Do Jan 14, 2010 15:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Theoretisch ja. Allerdings hast du eine offensichtliche Sache vergessen. Du hast eine Schleife von 0 bis 9 und übergibst den Wert direkt als Texturkoordinate. Die Koordinaten sind aber auf den Bereich von 0-1 normiert. Also "i / DEPTH" als Tiefe übergeben dann sollte das stimmen.

Sonst kann ich bei deinem Code jetzt so keine Ungereimtheit feststellen. Wobei es natürlich meine Flicht dich darauf hinzuweisen, dass deine Texturgröße kein PowerOfTwo sind. Könnte sein, dass du da auf einigen Karten Probleme bekommst etc. Wenn du keine Interpolataion zwischen den Ebenen bräuchtest könntest du so etwas auch durch seperate 2D Texturen lösen.

[edit] Okay. Ich sehe du hast deinen Beitrag editiert. Das kann ich auch. :P
Wie schaut es denn sonst aus.
- Licht an?
- OpenGL Farbe auf schwarz gesetzt?
- Entspricht das Schwarz überhaupt der Farbe aus deiner Textur? Kannst die komplette Textur ja auch mal tot machen um zu schauen ob da überhaupt was ankommt.
- Kann deine Karte 3D Texturen? Kann sie auch NPOT Texturen. Wenn nicht mal die Textur auf 256x256x8 anpassen.
- Testweise könntest du die 3D Textur auch mal als 2D verkaufen. Also Target ändern und TexImage2D benutzen. TexImage2D würde bei der Übergabe eines zu großen Bereiches den Rest ignorieren. Einfach um zu sehen ob es mit "normalen" Texturen klappt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Do Jan 14, 2010 15:30 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
Code:
  1. for(GLdouble i=0; i<DEPTH; i++)
  2.     {
  3.         glTexCoord3d((GLdouble)0.0, (GLdouble)0.0, i / DEPTH);
  4.         glVertex3d((GLdouble)-halbebreite, high, (GLdouble)-halbebreite);
  5.         glTexCoord3d((GLdouble)1.0, (GLdouble)0.0, i / DEPTH);
  6.         glVertex3d((GLdouble)halbebreite, high, (GLdouble)-halbebreite);
  7.         glTexCoord3d((GLdouble)1.0, (GLdouble)1.0, i / DEPTH);
  8.         glVertex3d((GLdouble)halbebreite, high, (GLdouble)halbebreite);
  9.         glTexCoord3d((GLdouble)0.0, (GLdouble)1.0, i / DEPTH);
  10.         glVertex3d((GLdouble)-halbebreite, high, (GLdouble)halbebreite);
  11.         high += (GLdouble)25.0;
  12.     }


wenn ich das so mache ist trotzdem noch alles schwarz ....

hier nochmal meine restlichen gl sachen, die evtl. von interesse sein könnten:
Code:
  1. void initializeGL()
  2. {
  3.     const GLfloat licht[4] = {1.0f,1.0f,1.0f,1.0f};
  4.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, licht);
  5.  
  6.     glEnable(GL_DEPTH_TEST);
  7.     glEnable(GL_NORMALIZE);
  8.  
  9.     glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  10.     m_RenderObject->m_bBuildTexture();
  11. }
  12.  
  13. void paintGL()
  14. {
  15.         glDrawBuffer(GL_BACK);
  16.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  17.  
  18.         glMatrixMode(GL_PROJECTION);
  19.         glLoadIdentity();
  20.         glFrustum(m_CamFrustum.Left, m_CamFrustum.Right, m_CamFrustum.Bottom, m_CamFrustum.Top, m_dPlanNear, m_dPlanFar);
  21.         glMatrixMode(GL_MODELVIEW);
  22.         glLoadIdentity();
  23.         gluLookAt(m_CamPosition.x, m_CamPosition.y, m_CamPosition.z,
  24.                   m_CamTarget.x, m_CamTarget.y, m_CamTarget.z,
  25.                   m_CamUpVector.x, m_CamUpVector.y, m_CamUpVector.z);
  26.  
  27.         glPushMatrix();
  28.         // bewegung ausführen
  29.         glRotated(xRot / 16.0, 1.0, 0.0, 0.0);
  30.         glRotated(yRot / 16.0, 0.0, 1.0, 0.0);
  31.         glRotated(zRot / 16.0, 0.0, 0.0, 1.0);
  32.         // objekte rendern
  33.         m_RenderObject->m_bDrawKontext();
  34.         glPopMatrix();
  35.  
  36.         glFlush();
  37. }
  38.  
  39. void resizeGL(int width, int height)
  40. {
  41.     glViewport(0, 0, width, height);
  42.     glMatrixMode(GL_PROJECTION);
  43.     glLoadIdentity();
  44.  
  45.     glMatrixMode(GL_MODELVIEW);
  46.     glLoadIdentity();
  47.  
  48.     m_vResizeCamera(width, height);
  49. }


wenn ich farben ändere, z.B. auf rot dann ist alles rot ;) ich hab auch schon mal ein 300x300 bilder rein geladen, das wurde auch angezeit, aber halt auf allein quads das gleich :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Do Jan 14, 2010 16:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Code:
  1. i / DEPTH

Das ist C++, oder? Macht dein Compiler hier vielleicht aus irgendeinem komischen Grund eine Integer-Division? Mit GCC sollte das gehen, da i ein double ist, aber bei anderen Compilern? Nur so eine Idee....

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Fr Jan 15, 2010 10:27 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
ja, ist c++, verwende das qt4.6 sdk unter win, compiler ist da mingw32. Ich habs jetzt so probiert:
Code:
  1.     glBegin(GL_QUADS);
  2.     GLdouble high=0;
  3.     GLdouble tiefe = DEPTH;
  4.     GLdouble halbebreite = 100;
  5.     for(GLdouble i=0; i<tiefe; i++)
  6.     {
  7.         glTexCoord3d((GLdouble)0.0, (GLdouble)0.0, i / tiefe);
  8.         glVertex3d(-halbebreite, high, -halbebreite);
  9.         glTexCoord3d((GLdouble)1.0, (GLdouble)0.0, i / tiefe);
  10.         glVertex3d(halbebreite, high, -halbebreite);
  11.         glTexCoord3d((GLdouble)1.0, (GLdouble)1.0, i / tiefe);
  12.         glVertex3d(halbebreite, high, halbebreite);
  13.         glTexCoord3d((GLdouble)0.0, (GLdouble)1.0, i / tiefe);
  14.         glVertex3d(-halbebreite, high, halbebreite);
  15.         high += (GLdouble)25.0;
  16.     }
  17.     glEnd();


ändert sich aber auch nichts durch, ich versteh das nich :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Mo Jan 18, 2010 18:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Zwei sachen:
1. Ist sichergestellt, dass deine Texturdaten auch wirklich richtig sind?
2. Ist das richtig:
Zitat:
Code:
  1.                 m_ucTexels[TEXEL3(s, t, ImgIndex)] = 0x80*(ImgIndex/DEPTH);
  2.                 m_ucTexels[TEXEL3(s, t, ImgIndex)+1] = 0x80*(ImgIndex/DEPTH);
  3.                 m_ucTexels[TEXEL3(s, t, ImgIndex)+2] = 0x80*(ImgIndex/DEPTH);
  4.                 m_ucTexels[TEXEL3(s, t, ImgIndex)+4] = 0x80;

Ich hätte in der letzten Zeile eher ein +3 anstatt einem +4 erwartet.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Mi Jan 20, 2010 13:24 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
zu 2.: Ja stimmt, der Index ist falsch gewesen, hatte da getestet ob sich irgent etwas ändert wenn ich richtigen Fehler einbaue ;)

zu 1.: Nun ich dachte das sie richtig sind. Habe jetzt aber einmal massig dran herum gefuscht um eine Reaktion zu bekommen.
Code:
  1. bool RenderObject::m_bBuildTexture()
  2. {
  3.     m_ucTexels = (BYTE *)malloc(WIDTH * HEIGHT * DEPTH * BYTES_PER_TEXEL);
  4.  
  5.     for(int ImgIndex = 0; ImgIndex < DEPTH; ImgIndex++)
  6.     {
  7.         QImage* image = new QImage();
  8.         image->load("../testbilder/img" + QString::number(ImgIndex).sprintf("000") +".tif");
  9.         for(int s=0; s < WIDTH; s++)
  10.         {
  11.             for(int t=0; t < HEIGHT; t++)
  12.             {
  13.                 BYTE rot, gruen, blau, alpha;
  14.                 int red, green, blue, alph;
  15.  
  16.                 red = qRed(image->pixel(s,t)); // qRed liefert int
  17.                 green = qGreen(image->pixel(s,t));
  18.                 blue = qBlue(image->pixel(s,t));
  19.                 alph = qAlpha(image->pixel(s,t));
  20.  
  21.                 rot = static_cast<BYTE>(red);
  22.                 gruen =  static_cast<BYTE>(green);
  23.                 blau = static_cast<BYTE>(blue);
  24.                 alpha = static_cast<BYTE>(alph);
  25.  
  26.                 //rot = 255*(ImgIndex/DEPTH);     // Hier wird jede Ebene-Schwarz!!!
  27.                 rot = 100*ImgIndex;                // Entsteht die Roten-QUADS die auf dem Bild unten zu sehen sind
  28.                 blau = 0;
  29.                 gruen = 0;
  30.                 alpha = 255;
  31.  
  32.                 /*m_ucTexels[(ImgIndex*HEIGHT*WIDTH*BYTES_PER_TEXEL)+((s*WIDTH+t)*BYTES_PER_TEXEL)] =  rot;
  33.                 m_ucTexels[(ImgIndex*HEIGHT*WIDTH*BYTES_PER_TEXEL)+((s*WIDTH+t)*BYTES_PER_TEXEL)+1] = gruen;
  34.                 m_ucTexels[(ImgIndex*HEIGHT*WIDTH*BYTES_PER_TEXEL)+((s*WIDTH+t)*BYTES_PER_TEXEL)+2] = blau;
  35.                 m_ucTexels[(ImgIndex*HEIGHT*WIDTH*BYTES_PER_TEXEL)+((s*WIDTH+t)*BYTES_PER_TEXEL)+3] = alpha;*/
  36.  
  37.                 /*m_ucTexels[TEXEL3(t,s, ImgIndex)] =  static_cast<BYTE>(255*(ImgIndex/DEPTH));
  38.                 m_ucTexels[TEXEL3(t,s, ImgIndex)+1] = static_cast<BYTE>(0);// 255*(ImgIndex/DEPTH);
  39.                 m_ucTexels[TEXEL3(t,s, ImgIndex)+2] = static_cast<BYTE>(0);// 255*(ImgIndex/DEPTH);
  40.                 m_ucTexels[TEXEL3(t,s, ImgIndex)+3] = static_cast<BYTE>(255);*/
  41.  
  42.                 m_ucTexels[TEXEL3(s, t, ImgIndex)] =  rot;
  43.                 m_ucTexels[TEXEL3(s, t, ImgIndex)+1] = gruen;
  44.                 m_ucTexels[TEXEL3(s, t, ImgIndex)+2] = blau;
  45.                 m_ucTexels[TEXEL3(s, t, ImgIndex)+3] = alpha;
  46.             }
  47.         }
  48.         delete image;
  49.     }
  50.  
  51.     glGenTextures(1, &m_uiTexName);
  52.     glBindTexture(GL_TEXTURE_3D, m_uiTexName);
  53.     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  54.     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  55.     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  56.     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  57.     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
  58.  
  59.     #if (__WIN32__)
  60.     glTexImage3D = (PFNGLTEXIMAGE3DPROC) wglGetProcAddress("glTexImage3D");
  61.         if (glTexImage3D == NULL)
  62.             return FALSE;
  63.     #endif
  64.  
  65.     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, WIDTH, HEIGHT, DEPTH, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_ucTexels);
  66.  
  67.     if(glGetError() != GL_NO_ERROR) return false;
  68.         return true;
  69. }


Eigentlich hatte ich vor einen Img-Stack von der Platte zu laden, sieht man hier noch im Ansatz.

An den beiden Zeilen wird mir das Problem langsam klar, die Umwandung in einen BYTE (also typedef unsigned char BYTE;) läuft nicht, denke ich. Hat jemand einen Hinweis?
Code:
  1. //rot = 255*(ImgIndex/DEPTH);     // Hier wird jede Ebene-Schwarz!!!
  2. rot = 100*ImgIndex;                // Entsteht die Roten-QUADS die auf dem Bild unten zu sehen sind


Es entsteht folgendes Bild:
Bild


EDIT:
Sooo habe das Problem gefunden, und wie immer war es etwas ganz anderes!
In dieser Zeile war die String-Formatierung falsch, deswegen wurde immer nur das Img000.tif gelesen...
Code:
  1. image->load("../testbilder/img" + QString::number(ImgIndex).sprintf("000") +".tif");

Das ganze sieht jetzt so aus:
Code:
  1. image->load("../testbilder/img" + QString::number(ImgIndex).sprintf("%03i", ImgIndex) +".tif");

und als Bild:
Bild
Jetzt werden die Img gelesen und auch in allein drei Texturebenen dargestellt.
Hab jetzt nur noch das Problem das die Bilder sich "überlagern" aber das kommt warscheinlich durch die
Code:
  1. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  2. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  3. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
oder bin ich da auf dem Holzweg?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Mi Jan 20, 2010 15:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Hab jetzt nur noch das Problem das die Bilder sich "überlagern" aber das kommt warscheinlich durch die
Code:
  1. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  2. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  3. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);

oder bin ich da auf dem Holzweg?

Da bist du tatsächlich auf dem Holzweg. Die Überlagerung kommt dadurch das eben auch 3D-Dimensional zwischen den "Texturebenen" interpoliert wird. Du könntest
Code:
  1. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  2. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

setzen, dann wird aber auch nicht mehr in XY-Richtung interpoliert.

Was du wahrscheinlich willst ist keine 3D textur sondern eine 2D array texture. Also einfach mehrere 2D Texturen in einem Buffer. Ich habe die aber noch nie benutzt und weiß nicht mal was das für Hardwareanforderungen hat.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Mi Jan 20, 2010 15:43 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Addiere mal auf die 3. Texturkoordinate ein halbes Texel drauf. Eventuell erwischt du immer genau den Übergang zwischen 2 Texturscheiben.
Denn eigentlich ist eine 3D Textur ein Texturstack. Nur halt, dass in den bereichen zwischen den Texturen interpoliert wird. Aber irgendwo muss(!) die reingeladene Textur komplett ohne Einwirkung der Umgebung liegen.

Lasse mich da gern vom Gegenteil überzeugen.
Aber was ich im Bild oben sehe ist, dass jeweils 2 Texturen 50:50 geblendet werden.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Mi Jan 20, 2010 16:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Aber was ich im Bild oben sehe ist, dass jeweils 2 Texturen 50:50 geblendet werden.

Hm, stimmt eigentlich. Ganz raus bekommt man die Anteile nicht ohne auf NEAREST zu stellen, aber so was wie 99:1 sollte machbar sein.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Do Jan 21, 2010 02:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 04, 2008 23:15
Beiträge: 39
Wohnort: Oberösterreich
Programmiersprache: ObjPas, C, DivASM
Die beste Lösung hier wäre GL_TEXTURE_2D_ARRAY. Die Anforderungen sind allerdings relativ hoch (ab Geforce 8 als Extension und ab OpenGL3.0 als Kern-Funktion), ist aber auch von der Performance besser, da zwischen den einzelnen Ebenen die Farbe nicht Interpoliert werden muss.
Ich verwende GL_TEXTURE_2D_ARRAY zum Beispiel für Font-Texturen.

humflo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Do Jan 21, 2010 09:28 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Vielleicht hab ich ja auch gar keine Ahnung, aber wieso interpolieren zwischen den Tiefenkoordinaten?

Im Beispiel oben wird auf ganz konkrete Schichten zugegriffen. Die 3D Textur besteht aus 8 2D Texturen.

8 ist eine Zweierpotenz und mit denen kann man doch rundungsfehlerfrei rechnen auf der CPU (oder?).
Das heißt, man müsste genau auf einer Textur rauskommen und dann muss auch nichts mehr interpoliert werden. Oder wird immer interpolliert - auch wenn Anteile 0 sind?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Do Jan 21, 2010 12:14 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
Erstmal danke für die Denkanstöße! :)

Also die Interpolation ist schon gewollt, also ein 2D-Textur-Array hab ich bewusst nicht benutzt. Die "8" vom letzten Img auf dem 1. QUAD entsteht durch das REPEAT in der Tiefen-Ebene und die Interpolation, warum auch immer die 8 gespiegelt ist?! egal!!! ;) Lässt sich durch das setzen der Filter-Parameter auf GL_NEAREST aber auch ändern.

Jetzt stellt sich mit einen neue Frage! Gibt es eine Möglichkeit eine 3D-Textur in einen Würfel zu zeichen und diesen über die Textur-Alpha-Werte so darzustellen das eine Art "Nebelstruktur" aus der 3D-Textur entsteht? Quasi als Ersatz für die einzelnen QUADS, einen "gefüllten" Würfel zu verwenden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Do Jan 21, 2010 12:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
So etwas wie einen gefüllten Würfel gibt es nicht. Das sind immer alles normale Fläche und fiese optische Tricks. Aber mal eine ganz andere Frage. Was genau hast du denn damit vor? Ich denke das ist ein Punkt an dem es uns (besonders den Grafikcracks) mangelt. Kann ja sein, dass es noch eine super einfache Lösung gibt die genau das macht was du haben willst. Wäre zu mindest nicht das erste Mal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit 3D-Textur
BeitragVerfasst: Do Jan 21, 2010 13:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Gibt es eine Möglichkeit eine 3D-Textur in einen Würfel zu zeichen und diesen über die Textur-Alpha-Werte so darzustellen das eine Art "Nebelstruktur" aus der 3D-Textur entsteht?

Klar das geht, letztlich renderst du da aber auch nur Quads nur optimal orientiert und mit korrekter Dichtefunktion.

_________________
Yeah! :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 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.018s | 16 Queries | GZIP : On ]