OpenGL Texture Mapping (auch mit .png)

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

  • OpenGL Texture Mapping (auch mit .png)

    Hallo OSX Entwickler,

    kann mir mal bitte jemand erklären oder einen Link schicken, wie man Texturen in OpenGL verwendet?
    Ich finde immer nur C++ und anderes Zeug, aber nicht Objektive-C.

    Da steht immer da, dass man nur Bitmap als Bild verwenden kann.
    Wie kann man denn PNGs verwenden?
  • NeHe versuch ich gerade.
    Der macht aber nur Windows.
    Ich hab da mal in ein Beispiel für Mac geguckt, aber es geht bei mir nicht:

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. #import <OpenGL/gl.h>
    3. #import <OpenGL/glu.h>
    4. @interface GLT_OpenGLView : NSOpenGLView
    5. {
    6. GLuint uiTexture;
    7. char *cTextureBytes;
    8. GLenum eTextureFormat;
    9. NSSize siTextureSize;
    10. }
    11. // Methods
    12. - (BOOL)LoadGLTextures;
    13. - (BOOL)LoadBitmap:(NSString *)sName;
    14. @end
    Alles anzeigen


    Quellcode

    1. - (void)prepareOpenGL
    2. {
    3. glEnable(GL_TEXTURE_2D);
    4. glEnable(GL_DEPTH_TEST);
    5. glShadeModel(GL_SMOOTH);
    6. glClearDepth(1.0f);
    7. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    8. [self LoadGLTextures];
    9. }
    Alles anzeigen


    Quellcode

    1. - (void)drawRect:(NSRect)dirtyRect
    2. {
    3. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    4. glLoadIdentity();
    5. glTranslatef(0.0f, 0.0f, -5.0f);
    6. glRotatef(30, 1.0f, 1.0f, 0.0f);
    7. glBindTexture(GL_TEXTURE_2D, uiTexture);
    8. glBegin( GL_QUADS );
    9. {
    10. // Vorn
    11. glTexCoord2f( 0.0f, 0.0f );
    12. glVertex3f( -1.0f, -1.0f, 1.0f );
    13. glTexCoord2f( 1.0f, 0.0f );
    14. glVertex3f( 1.0f, -1.0f, 1.0f );
    15. glTexCoord2f( 1.0f, 1.0f );
    16. glVertex3f( 1.0f, 1.0f, 1.0f );
    17. glTexCoord2f( 0.0f, 1.0f );
    18. glVertex3f( -1.0f, 1.0f, 1.0f );
    19. // Hinten
    20. glTexCoord2f( 1.0f, 0.0f );
    21. glVertex3f( -1.0f, -1.0f, -1.0f );
    22. glTexCoord2f( 1.0f, 1.0f );
    23. glVertex3f( -1.0f, 1.0f, -1.0f );
    24. glTexCoord2f( 0.0f, 1.0f );
    25. glVertex3f( 1.0f, 1.0f, -1.0f );
    26. glTexCoord2f( 0.0f, 0.0f );
    27. glVertex3f( 1.0f, -1.0f, -1.0f );
    28. // Oben
    29. glTexCoord2f( 0.0f, 1.0f );
    30. glVertex3f( -1.0f, 1.0f, -1.0f );
    31. glTexCoord2f( 0.0f, 0.0f );
    32. glVertex3f( -1.0f, 1.0f, 1.0f );
    33. glTexCoord2f( 1.0f, 0.0f );
    34. glVertex3f( 1.0f, 1.0f, 1.0f );
    35. glTexCoord2f( 1.0f, 1.0f );
    36. glVertex3f( 1.0f, 1.0f, -1.0f );
    37. // Unten
    38. glTexCoord2f( 1.0f, 1.0f );
    39. glVertex3f( -1.0f, -1.0f, -1.0f );
    40. glTexCoord2f( 0.0f, 1.0f );
    41. glVertex3f( 1.0f, -1.0f, -1.0f );
    42. glTexCoord2f( 0.0f, 0.0f );
    43. glVertex3f( 1.0f, -1.0f, 1.0f );
    44. glTexCoord2f( 1.0f, 0.0f );
    45. glVertex3f( -1.0f, -1.0f, 1.0f );
    46. // Rechts
    47. glTexCoord2f( 1.0f, 0.0f );
    48. glVertex3f( 1.0f, -1.0f, -1.0f );
    49. glTexCoord2f( 1.0f, 1.0f );
    50. glVertex3f( 1.0f, 1.0f, -1.0f );
    51. glTexCoord2f( 0.0f, 1.0f );
    52. glVertex3f( 1.0f, 1.0f, 1.0f );
    53. glTexCoord2f( 0.0f, 0.0f );
    54. glVertex3f( 1.0f, -1.0f, 1.0f );
    55. // Links
    56. glTexCoord2f( 0.0f, 0.0f );
    57. glVertex3f( -1.0f, -1.0f, -1.0f );
    58. glTexCoord2f( 1.0f, 0.0f );
    59. glVertex3f( -1.0f, -1.0f, 1.0f );
    60. glTexCoord2f( 1.0f, 1.0f );
    61. glVertex3f( -1.0f, 1.0f, 1.0f );
    62. glTexCoord2f( 0.0f, 1.0f );
    63. glVertex3f( -1.0f, 1.0f, -1.0f );
    64. }
    65. glEnd();
    66. glFlush();
    67. }
    Alles anzeigen


    Quellcode

    1. -(BOOL)LoadGLTextures
    2. {
    3. if ([self LoadBitmap:[NSString stringWithFormat:@"%@/%s", [[NSBundle mainBundle] resourcePath], "NeHe.bmp"]])
    4. {
    5. glGenTextures(1, &uiTexture);
    6. glTexImage2D(GL_TEXTURE_2D, 0, 3, siTextureSize.width, siTextureSize.height, 0, eTextureFormat, GL_UNSIGNED_BYTE, cTextureBytes);
    7. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    8. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    9. free(cTextureBytes);
    10. return YES;
    11. }
    12. return NO;
    13. }
    Alles anzeigen


    Quellcode

    1. - (BOOL)LoadBitmap:(NSString *)sName
    2. {
    3. NSBitmapImageRep *birImage = [NSBitmapImageRep imageRepWithContentsOfFile:sName];
    4. if (birImage != nil)
    5. {
    6. if ([birImage bitsPerPixel] == 24)
    7. {
    8. eTextureFormat = GL_RGB;
    9. }
    10. else if ([birImage bitsPerPixel] == 32)
    11. {
    12. eTextureFormat = GL_RGBA;
    13. }
    14. siTextureSize.width = [birImage pixelsWide];
    15. siTextureSize.height = [birImage pixelsHigh];
    16. cTextureBytes = calloc([birImage bytesPerRow] * siTextureSize.height, 1);
    17. if (cTextureBytes != nil)
    18. {
    19. int iDestinationRow = 0;
    20. unsigned char *cImageData = [birImage bitmapData];
    21. for (int iRow = siTextureSize.height - 1; iRow >= 0; iRow --, iDestinationRow ++)
    22. {
    23. memcpy(cTextureBytes + iDestinationRow * [birImage bytesPerRow], cImageData + iRow * [birImage bytesPerRow], [birImage bytesPerRow]);
    24. }
    25. return YES;
    26. }
    27. }
    28. return NO;
    29. }
    Alles anzeigen


    Dabei entsteht ein weisser Würfel.
  • Schau Dir mal die Apple-Samples zu OpenGL an. Hier steht dann noch was in der Doku dazu:
    developer.apple.com/library/ma…uid/TP40001987-CH407-SW28

    Auf die Gefahr hin, mich zu wiederholen - Du verwendest veraltetes OpenGL. Und wie zerm schon geschrieben hat: OpenGL ist SEHR low level. Du musst Dich um beinahe alles selber kümmern. Ich empfehle Dir ein Buch über modernes OpenGL (OpenGL Superbible, 5th Edition). Hier noch ein paar Tutorials zum Thema:

    duriansoftware.com/joe/An-intr…L.-Table-of-Contents.html
    arcsynthesis.org/gltut/

    Gruß, Markus
  • Weißer Würfel und keine Textur?

    Hi!
    Ich hoffe dir hilft die Antwort noch ;)
    Wahrscheinlich wird bei dir nur eine weiße Fläche gerendert, da das Bild, das du verwendest, keine Zweierpotenz als Seitenlänge hat.
    In OpenGL ES 1.1 MUSS ein Bild eine Zweierpotenz als Seitenlänge besitzen!
    Also z.B:
    16x16 32x32 oder 16x32
    2 hoch x halt ;)

    Ich suche auch nach einer besseren Methode.
    (Will nämlich nicht alle Bilder auf 2er Potenzen ändern und später beim Rendern skalieren)

    Naja das ist hoffentlich die Lösung für dein Problem. Zumindest war es bei mir so ;)

    Wünsche weiterhin viel Erfolg bei deiner App
    :D