& OpenGL - Texutren Einlesen

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • & OpenGL - Texuren Einlesen

    Hallo erstmal!

    Ich versuche derzeit OpenGL zu lernen, allerdings stehe ich schon vor dem ersten Problem: Wie binde ich bequem mehrere Texturen ein? Meine derzeitige Lösung funktioniert nichtmal wirklich, außerdem ist sie sehr unpraktisch. Sie besteht eigentlich nur in Wiederholen der Funktionsaufrufe, allerdings funktioniert das nicht. Die Bitmaps "dice5" und "dice6" werden nämlich nicht eingebunden, obwohl es keine Fehlermeldung gibt.

    Der Code ist von NeHe (GameDev) da ich deren Tutorials verwende.

    Quellcode

    1. int LoadGLTextures() // Load Bitmaps And Convert To Textures
    2. {
    3. int Status=FALSE; // Status Indicator
    4. AUX_RGBImageRec *TextureImage[6]; // Create Storage Space For The Texture
    5. memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
    6. // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
    7. if (TextureImage[0]=LoadBMP("Data/dice1.bmp"))
    8. {
    9. Status=TRUE; // Set The Status To TRUE
    10. glGenTextures(1, &texture[0]);
    11. // Create MipMapped Texture
    12. glBindTexture(GL_TEXTURE_2D, texture[0]);
    13. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    14. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); // ( NEW )
    15. gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); // ( NEW )
    16. }
    17. if (TextureImage[0]) // If Texture Exists
    18. {
    19. if (TextureImage[0]->data) // If Texture Image Exists
    20. {
    21. free(TextureImage[0]->data); // Free The Texture Image Memory
    22. }
    23. free(TextureImage[0]); // Free The Image Structure
    24. }
    25. if (TextureImage[1]=LoadBMP("Data/dice2.bmp"))
    26. {
    27. Status=TRUE; // Set The Status To TRUE
    28. glGenTextures(1, &texture[1]);
    29. // Create MipMapped Texture
    30. glBindTexture(GL_TEXTURE_2D, texture[1]);
    31. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    32. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); // ( NEW )
    33. gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TextureImage[1]->sizeX, TextureImage[1]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[1]->data); // ( NEW )
    34. }
    35. if (TextureImage[1]) // If Texture Exists
    36. {
    37. if (TextureImage[1]->data) // If Texture Image Exists
    38. {
    39. free(TextureImage[1]->data); // Free The Texture Image Memory
    40. }
    41. free(TextureImage[1]); // Free The Image Structure
    42. }
    43. if (TextureImage[2]=LoadBMP("Data/dice3.bmp"))
    44. {
    45. Status=TRUE; // Set The Status To TRUE
    46. glGenTextures(1, &texture[2]);
    47. // Create MipMapped Texture
    48. glBindTexture(GL_TEXTURE_2D, texture[2]);
    49. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    50. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); // ( NEW )
    51. gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TextureImage[2]->sizeX, TextureImage[2]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[2]->data); // ( NEW )
    52. }
    53. if (TextureImage[2]) // If Texture Exists
    54. {
    55. if (TextureImage[2]->data) // If Texture Image Exists
    56. {
    57. free(TextureImage[2]->data); // Free The Texture Image Memory
    58. }
    59. free(TextureImage[2]); // Free The Image Structure
    60. }
    61. if (TextureImage[3]=LoadBMP("Data/dice4.bmp"))
    62. {
    63. Status=TRUE; // Set The Status To TRUE
    64. glGenTextures(1, &texture[3]);
    65. // Create MipMapped Texture
    66. glBindTexture(GL_TEXTURE_2D, texture[3]);
    67. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    68. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); // ( NEW )
    69. gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TextureImage[3]->sizeX, TextureImage[3]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[3]->data); // ( NEW )
    70. }
    71. if (TextureImage[3]) // If Texture Exists
    72. {
    73. if (TextureImage[3]->data) // If Texture Image Exists
    74. {
    75. free(TextureImage[3]->data); // Free The Texture Image Memory
    76. }
    77. free(TextureImage[3]); // Free The Image Structure
    78. }
    79. return Status; // Return The Status
    80. if (TextureImage[4]=LoadBMP("Data/dice5.bmp"))
    81. {
    82. Status=TRUE; // Set The Status To TRUE
    83. glGenTextures(1, &texture[4]);
    84. // Create MipMapped Texture
    85. glBindTexture(GL_TEXTURE_2D, texture[4]);
    86. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    87. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); // ( NEW )
    88. gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TextureImage[4]->sizeX, TextureImage[4]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[4]->data); // ( NEW )
    89. }
    90. if (TextureImage[4]) // If Texture Exists
    91. {
    92. if (TextureImage[4]->data) // If Texture Image Exists
    93. {
    94. free(TextureImage[4]->data); // Free The Texture Image Memory
    95. }
    96. free(TextureImage[4]); // Free The Image Structure
    97. }
    98. if (TextureImage[5]=LoadBMP("Data/dice6.bmp"))
    99. {
    100. Status=TRUE; // Set The Status To TRUE
    101. glGenTextures(1, &texture[5]);
    102. // Create MipMapped Texture
    103. glBindTexture(GL_TEXTURE_2D, texture[5]);
    104. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    105. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); // ( NEW )
    106. gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TextureImage[5]->sizeX, TextureImage[5]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[5]->data); // ( NEW )
    107. }
    108. if (TextureImage[5]) // If Texture Exists
    109. {
    110. if (TextureImage[5]->data) // If Texture Image Exists
    111. {
    112. free(TextureImage[5]->data); // Free The Texture Image Memory
    113. }
    114. free(TextureImage[5]); // Free The Image Structure
    115. }
    116. return Status;
    117. }
    Alles anzeigen


    Ich hätte drei Ideen das zu Lösen:
    1. Speichern der Bitmapnamen in einem Array
    2. Speichern der Bitmapnamen in einer Textdatei
    3. einbinden aller Bitmaps in einem Verzeichnis


    mfg, bloodycross

    Edit: Ich werde es jetzt mal mit einem string-Array oder einem zweidimensionalem char-Array versuchen, wobei ich immer den Zeiger übergebe.


    Edit2:
    Mittlerweile, einige Stunden Coding und vor allem Bücher lesen später, habe ich eine funktionierende Lösung gefunden.

    Die Pfade sind in Strings gespeichert, welche dann in C-Strings (char-Arrays) kopiert werden. Anschließen wird auf jeden C-String eine Zeiger erstellt, dieser wird dann übergeben. Die Funktion zum einbinden der Grafiken wird in einer Schleife aufgerufen.

    Vielleicht füge ich noch eine Funktion ein, die die Pfade aus einer Textdatei einliest.

    Quellcode

    1. std::string Pfad[7];
    2. std::string::iterator i;
    3. Pfad[0] = "Data/dice1.bmp"; //Pfade zu den Grafiken
    4. Pfad[1] = "Data/dice2.bmp";
    5. Pfad[2] = "Data/dice3.bmp";
    6. Pfad[3] = "Data/dice4.bmp";
    7. Pfad[4] = "Data/dice5.bmp";
    8. Pfad[5] = "Data/dice6.bmp";
    9. char *Zeiger[7]; //Zeiger fuer das laden der Grafiken
    10. char charPfad[7][100];
    11. for(int j=0;j<6;j++) //Auf 0 setzen
    12. {
    13. for(int k=0; k<100; k++)
    14. {
    15. charPfad[j][k] = 0;
    16. }
    17. }
    18. for(int j=0;j<6;j++) //Strings in C-Strings (char-Arrays) kopieren
    19. {
    20. int k = 0;
    21. for(i=Pfad[j].begin(); i!=Pfad[j].end(); i++)
    22. {
    23. charPfad[j][k] = *i;
    24. k++;
    25. }
    26. }
    27. for(int j=0; j<6; j++) //Zeiger Array belegen
    28. {
    29. Zeiger[j] = charPfad[j];
    30. }
    31. for(int j=0; j<6; j++)
    32. {
    33. // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
    34. if (TextureImage[j]=LoadBMP(Zeiger[j]))
    35. {
    36. Status=TRUE; // Set The Status To TRUE
    37. glGenTextures(1, &texture[j]);
    38. // Create MipMapped Texture
    39. glBindTexture(GL_TEXTURE_2D, texture[j]);
    40. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    41. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); // ( NEW )
    42. gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TextureImage[j]->sizeX, TextureImage[j]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[j]->data); // ( NEW )
    43. }
    44. if (TextureImage[0]) // If Texture Exists
    45. {
    46. if (TextureImage[0]->data) // If Texture Image Exists
    47. {
    48. free(TextureImage[0]->data); // Free The Texture Image Memory
    49. }
    50. free(TextureImage[0]); // Free The Image Structure
    51. }
    52. }
    Alles anzeigen