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

Aktuelle Zeit: Di Jul 08, 2025 16:29

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jan 29, 2007 14:18 
Offline
DGL Member

Registriert: Fr Jan 26, 2007 20:23
Beiträge: 12
Das Problem ist, das mit Visual Studio eine Zugriffsverletzung auspuck bei gluBuild2DMipmaps() und, das wenn ich das programm dann trotzdem starte alles rote blau ist und alles blaue rot. Ich lade eine .bmp datei. Quellcode steht unten

Code:
  1.  
  2. #include<iostream>
  3. #include<windows.h>
  4. #include<SDL.h>
  5. #include<SDL_image.h>
  6. #include<gl/gl.h>
  7. #include<gl/glu.h>
  8. using namespace std;
  9.  
  10. GLfloat x=0.0,z=-3.0;
  11. GLuint texture[1];
  12.  
  13. void InitGL()
  14. {
  15.     glEnable(GL_TEXTURE_2D);
  16.     glEnable(GL_DEPTH_TEST);
  17.     glDepthFunc(GL_LEQUAL);
  18.     glClearDepth(1.0);
  19.     glClearColor(0.0,0.0,0.0,0.0);
  20. }
  21.  
  22. void Resize(int x,int y)
  23. {
  24.     if(y==0)
  25.     {
  26.         y=1;
  27.     }
  28.     glViewport(0,0,x,y);
  29.     glMatrixMode(GL_PROJECTION);
  30.     glLoadIdentity();
  31.     gluPerspective(45.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
  32.     glMatrixMode(GL_MODELVIEW);
  33. }
  34.  
  35. void DrawGLScene()
  36. {
  37.     glLoadIdentity();
  38.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  39.     glTranslatef(0,0,z);
  40.     glRotatef(x,0.0,1.0,0.0);
  41.     glBindTexture(GL_TEXTURE_2D,texture[0]);
  42.     glBegin(GL_TRIANGLES);
  43.         glTexCoord2f(0,1);
  44.         glVertex3f(0,1,0);
  45.         glTexCoord2f(0,0);
  46.         glVertex3f(-1,0,0);
  47.         glTexCoord2f(1,0);
  48.         glVertex3f(1,0,0);
  49.  
  50.         glTexCoord2f(0,1);
  51.         glVertex3f(0,1,0);
  52.         glTexCoord2f(0,0);
  53.         glVertex3f(-1,0,0);
  54.         glTexCoord2f(0,0);
  55.         glVertex3f(0,0,1);
  56.  
  57.         glTexCoord2f(0,1);
  58.         glVertex3f(0,1,0);
  59.         glTexCoord2f(1,0);
  60.         glVertex3f(1,0,0);
  61.         glTexCoord2f(0,0);
  62.         glVertex3f(0,0,1);
  63.     glEnd();
  64.     glFlush();
  65.     SDL_GL_SwapBuffers();
  66. }
  67.  
  68. void LoadTex(char*filename)
  69. {
  70.     SDL_Surface *image=IMG_Load(filename);
  71.     memset(&texture,0,sizeof(texture));
  72.     glGenTextures(1,&texture[0]);
  73.     glBindTexture(GL_TEXTURE_2D,texture[0]);
  74.     gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA,image->w,image->h,GL_RGBA,GL_UNSIGNED_BYTE,image->pixels);
  75.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  76.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  77.     SDL_FreeSurface(image);
  78. }
  79.  
  80. int main(int argc,char**argv)
  81. {
  82.     int lastx=-1;
  83.     int done=1;
  84.     SDL_Event event;
  85.     if(SDL_Init(SDL_INIT_VIDEO)<0)
  86.     {
  87.         MessageBox(NULL,"Konnte SDL nicht initalisieren","Fehler",MB_OK | MB_ICONEXCLAMATION);
  88.         SDL_Quit();
  89.         exit(1);
  90.     }
  91.     const SDL_VideoInfo *videoInfo=SDL_GetVideoInfo();
  92.     if(videoInfo==NULL)
  93.     {
  94.         MessageBox(NULL,"Grafikkarte lies sich nicht abfragen","Fehler",MB_OK| MB_ICONEXCLAMATION);
  95.         SDL_Quit();
  96.         exit(1);
  97.     }
  98.     unsigned int videoFlags = SDL_OPENGL | SDL_DOUBLEBUF | SDL_HWPALETTE;
  99.     if(videoInfo->hw_available != 0)
  100.     {
  101.         videoFlags = videoFlags | SDL_HWSURFACE;
  102.     }
  103.     else
  104.     {
  105.         videoFlags = videoFlags | SDL_SWSURFACE;
  106.     }
  107.     if(videoInfo->blit_hw != 0)
  108.     {
  109.         videoFlags = videoFlags | SDL_HWACCEL;
  110.     }
  111.     SDL_GL_SetAttribute(SDL_GL_RED_SIZE,5);
  112.     SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,5);
  113.     SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,5);
  114.     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,16);
  115.     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
  116.     SDL_WM_SetCaption("SDL Window",NULL);
  117.     videoFlags=videoFlags | SDL_RESIZABLE;
  118.     SDL_Surface *screen=SDL_SetVideoMode(640,480,16,videoFlags);
  119.     InitGL();
  120.     LoadTex("super mario bros.bmp");
  121.     Resize(640,480);
  122.     SDL_EnableKeyRepeat(1,10);
  123.     while(done)
  124.     {
  125.         DrawGLScene();
  126.         while(SDL_PollEvent(&event))
  127.         {
  128.             switch(event.type)
  129.             {
  130.             case SDL_QUIT:
  131.                 {
  132.                     done=0;
  133.                     break;
  134.                 }
  135.             case SDL_VIDEORESIZE:
  136.                 screen = SDL_SetVideoMode(event.resize.w,event.resize.h,32,videoFlags);
  137.                 if(screen==NULL)
  138.                 {
  139.                     MessageBox(NULL,"Fehler beim Resize","Fehler",MB_OK | MB_ICONEXCLAMATION);
  140.                 }
  141.                 Resize(event.resize.w,event.resize.h);
  142.                 break;
  143.             }
  144.             if(event.key.keysym.sym == SDLK_ESCAPE)
  145.             {
  146.                 done=0;
  147.             }
  148.             if(event.key.keysym.sym == SDLK_e)
  149.             {
  150.                 done=0;
  151.             }
  152.             if(event.key.keysym.sym == SDLK_RIGHT)
  153.             {
  154.                 x+=0.1;
  155.             }
  156.             if(event.key.keysym.sym == SDLK_LEFT)
  157.             {
  158.                 x-=0.1;
  159.             }
  160.             if(event.key.keysym.sym == SDLK_UP)
  161.             {
  162.                 z-=0.1;
  163.             }
  164.             if(event.key.keysym.sym == SDLK_DOWN)
  165.             {
  166.                 z+=0.1;
  167.             }
  168.             if(event.motion.xrel != lastx)
  169.             {
  170.                 x+=event.motion.xrel;
  171.                 lastx=event.motion.xrel;
  172.             }
  173.         }
  174.     }
  175.     SDL_Quit();
  176.     return 0;
  177. }


Das Problem ist, das mit Visual Studio eine Zugriffsverletzung auspuck bei gluBuild2DMipmaps() und, das wenn ich das programm dann trotzdem starte alles rote blau ist und alles blaue rot. Ich lade eine .bmp datei


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 14:34 
Offline
DGL Member

Registriert: So Feb 19, 2006 23:46
Beiträge: 55
Das Problem ist dass du das Bild aus IMG_Load direkt weiterverwendest. Dabei ist kein bestimmtes Format garantiert, denn meistens wird dsa Format der Bilddatei übernommen. Da aber gluBuild2DMipmaps die bestimmte Anordnung erwartet die du auch angegeben hast.
Deshalb musst du zur Konvertierung ein zusätzliches SDL_Surface anlegen, das die gwünschten Eigenschaften besitzt und dann das geladene Bild darauf blitten. SDL erledigt dann automatisch die nötigen Konvertierungen. Der Code dazu könnte etwas so aussehen:
Code:
  1.  
  2. SDL_Surface *bitmap = IMG_Load(filename);
  3. SDL_Surface *conv = SDL_CreateRGBSurface(
  4.             SDL_SWSURFACE, bitmap->w, bitmap->h, 32,
  5.             0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
  6. SDL_BlitSurface(bitmap, 0, conv, 0);
  7.  


Dann kannst du conv->pixels an gluBuild2DMipmaps übergeben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 14:48 
Offline
DGL Member

Registriert: Fr Jan 26, 2007 20:23
Beiträge: 12
Die Texturen werden richtig angezeigt, aber beim debuggen mit dem Visual C++ express wird immer noch eine zugriffsverletzung angezeigt vom debugger

folgende Zugriffsverletzung tritt auf
Code:
  1.  
  2. Unbehandelte Ausnahme bei 0x00411bb6 in SDL.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000000c.
  3.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 14:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Um das Post von yonibear noch ein bisschen zu erweitern. Ich denke du hast versucht ein TGA zu laden. Dieses Format befinden sich aber beide im BGRA Format auf der Festplatte. Weswegen du bei gluBuild2DMipmaps als Format Parameter (Der Vierte) nicht GL_RGBA angeben darfst. Das besagt nämlich, dass Rot und Blau miteinander vertauscht sind. Seit OpenGL 1.2 gibt es aber die Möglichkeit GL_BGRA anzugeben. Das würde schon vollkommen ausreichen. Aber nur, wenn du dir immer sicher sein kannst, dass du solche Dateien laden kannst. BMPs sind im übrigen auch in BGR gespeichert. Nur um noch mal zu verdeutlichen wo das eigentlich Problem liegt.

Ein anderes Problem ist dein Magfilter. Der ist nämlich falsch. Dieser akzeptiert nur GL_LINEAR oder GL_NEAREST. Nur der Minfilter akzeptiert MipMaps. (Ich muss auch jedes Mal naschschauen ;))

gluBuild2DMipmaps solltest man mittlerweile eigentlich nicht mehr verwenden. Bzw gibt es dazu eine wesentlich bessere Alternative. Seit OpenGL 1.4 oder mit der Extension GL_SGIS_generate_mipmap kannst du die MipMaps auch von der Grafikkarte erzeugen lassen.
Code:
  1.   glTexParameteri(Target, GL_GENERATE_MIPMAP, GL_TRUE);
  2.   glTexImage2D(...)

Kleine Anmerkung dazu. gluBuild2DMipMaps passt auch falsche Texturgrößen automatisch an was so nicht gemacht werden würde. Halte ich persönlich auch für besser. Aber dann musst du selber darauf achten, dass deine Texturgrößen eine Potenz von 2 sind.

PS: Zur Exception. Das sagt so leider nicht viel aus. Haben die Texturen eine Größe mit der Potenz von 2? 64, 128 etc. Wenn nicht passe das mal bitte an. Ansonsten musst du mal schauen wo im Debugger der Fehler passiert bzw mal Zeile für Zeile durchsteppen und schauen wo es kracht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 15:01 
Offline
DGL Member

Registriert: Fr Jan 26, 2007 20:23
Beiträge: 12
Das GL_BGR Symbol kennt mein Compiler nicht, vielleicht liegt es daran das ich falsche header benutzt. Die Header welche ich benutzt lagen dem Platform SDK von Microsoft bei.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 15:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Schau mal beim OpenGL® Extension Registry vorbei. Dort solltest du Zeitnah immer die neusten Header finden. In Verbindung mit deinem bestehenden Header solltest du keine Wünsche mehr haben. Der aus dem SDK dürfte bis OpenGL 1.1 sein und die von der Seite "geben dir den Rest". ;)

Außerdem findest du dort recht viele Spezifikationen zu den OpenGL Extensions.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 15:37 
Offline
DGL Member

Registriert: Fr Jan 26, 2007 20:23
Beiträge: 12
WEnn ich mit glTexParamteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE) eine Mipmap machen will, dann wird das bild komisch dargestellt[/img]


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 16:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Okay. Dann machen wir das mal anders. Kannst du bitte mal das zu ladende Bild posten? Bzw hast du in deinem obrigen Post etwas von GL_BGR gesagt. Da du vorher aber immer mit GL_RGBA gearbeitet hast müsste das eigentlich GL_BGRA heißen. Versuch das erst einmal. Sollte das nicht gehen, dann bitte mal das Bild.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 16:11 
Offline
DGL Member

Registriert: Fr Jan 26, 2007 20:23
Beiträge: 12
das ist der Code zum generieren der Mipmap

Code:
  1.  
  2. void LoadTex(char*filename)
  3. {
  4.     SDL_Surface *image=IMG_Load(filename);
  5.     SDL_Surface *conv=SDL_CreateRGBSurface(SDL_SWSURFACE,image->w,image->h,32,0x000000ff,0x0000ff00,0x00ff0000,0xff000000);
  6.     SDL_BlitSurface(image,0,conv,0);
  7.     memset(&texture,0,sizeof(texture));
  8.     glGenTextures(1,&texture[0]);
  9.     glBindTexture(GL_TEXTURE_2D,texture[0]);
  10.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  11.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  12.     glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);
  13.     glTexImage2D(GL_TEXTURE_2D,0,GL_BGRA,conv->w,conv->h,0,GL_BGRA,GL_UNSIGNED_BYTE,conv->pixels);
  14.     SDL_FreeSurface(image);
  15.     SDL_FreeSurface(conv);
  16. }
  17.  


und das Bild das ich zu einer Mipmap machen will


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 16:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Okay. War oben vielleicht ein bisschen komisch ausgedrückt. Wenn du das Bild konvertierst dann darfst du es natürlich nicht als BGRA übergeben sondern musst es als RGBA übergeben. Zu mindest in diesem Falle. BGRA sollte man dann verwenden wenn man sich das Konvertieren sparen möchte. Und wenn du immer 32Bit Bilder im BGRA Format lädst. Was bei deinem BMP nicht der Fall ist.

Und der dritte Parameter von glTexImage2D gibt das Interneformat für OpenGL an. Da ist BGRA nicht erlaubt. Das muss immer RGBA (oder entsprechendes) bleiben.

Code:
  1. void LoadTex(char*filename)
  2. {
  3.    SDL_Surface *image=IMG_Load(filename);
  4.    SDL_Surface *conv=SDL_CreateRGBSurface(SDL_SWSURFACE,image->w,image->h,32,0x000000ff,0x0000ff00,0x00ff0000,0xff000000);
  5.    SDL_BlitSurface(image,0,conv,0);
  6.  
  7.    memset(&texture,0,sizeof(texture));
  8.    glGenTextures(1,&texture[0]);
  9.    glBindTexture(GL_TEXTURE_2D,texture[0]);
  10.    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  11.    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  12.    glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);
  13.  
  14.    /* Hier also wieder wie zu Begin GL_RGBA aber eben nur mit automatisch erstellten MipMap*/
  15.    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,conv->w,conv->h,0,GL_RGBA,GL_UNSIGNED_BYTE,conv->pixels);
  16.  
  17.    SDL_FreeSurface(image);
  18.    SDL_FreeSurface(conv);
  19. }


Ich denke der Zugriffsfehler ist vorher nur dadurch entstanden, dass du ein 24 Bit Bild (ohne Alpha) an gluBuild2DMipMaps übergeben hast dort aber gesagt hast, dass es 32 Bit groß ist. Aber mit dem Code sollte es hoffentlich gehen. Kann das so nicht ausprobieren.

PS: Ich glaube ich habe das mit meinen BGRAs gerade alles ein bisschen unnötig verkompliziert. :roll:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 16:58 
Offline
DGL Member

Registriert: Fr Jan 26, 2007 20:23
Beiträge: 12
Der Zugriffsfehler ist zwar immer noch da beim debuggen, aber das Mipmap funktioniert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 29, 2007 17:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wo tritt der denn genau auf? Bzw tritt der nur beim Debuggen auf oder auch außerhalb von Visual Studio? Nicht, das es nachher etwas im Zusammenspiel mit Visual Studio ist.

Weil von den Größen müsste das alles eigentlich passen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 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 | 17 Queries | GZIP : On ]