Textur neu laden und anzeigen

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

  • Textur neu laden und anzeigen

    Hey Leute,
    ich bin noch ein Cocoa/objective C-Newbie.
    Ich versuche ein Programm zu schreiben, dass 3d Mengen berechnen (zB Mandelbulb oder Äquipotentialflächen über Molekülen).
    Gedacht war das so, dass die Berechnung in OpenCL geschieht, die Ausgabe und das Interface (Werteingabe, Start der Simulation) aber mit Cocoa und IB geschrieben sind.
    Dazu wird erst erst diese ganze vektorielle Berechnung getätigt und das ganze dann mit
    clCreateFromGLTexture2D auf die Textur,
    die beim Start des Programms geladen wurde, geschrieben.
    Wie oben angedeutet habe ich aber ein Problem eine neue Textur zu laden und Anzuzeigen.
    Die Textur verändert aber nach Anklicken des Start-Buttons nicht.


    Hier mal die Essenz meines Problemcodes (wie ich denke):



    GUIController.h

    Quellcode

    1. #import
    2. @interface GUIController : NSObject {
    3. IBOutlet id MyOpenGLView;
    4. IBOutlet NSString *label;
    5. IBOutlet id value;
    6. }
    7. - (IBAction)exec:(id)sender;
    8. - (IBAction)changeValue:(id)sender;
    9. - (IBAction)changeLabel:(id)sender;
    10. @end
    Alles anzeigen



    GUIController.m

    Quellcode

    1. - (IBAction)exec:(id)sender
    2. {
    3. [MyOpenGLView initGL];
    4. [MyOpenGLView initTexture:"test.bmp"];
    5. [MyOpenGLView drawRect:[MyOpenGLView bounds]];}


    Wobei "test.bmp" erstmal ein ganz normales bitmap ist.(hat auch die richtigen Maße)


    MyOpenGLView.m:

    Quellcode

    1. -(void) drawRect: (NSRect) bounds
    2. {
    3. if(!texture){
    4. [self initGL];
    5. [self initTexture:"lena.bmp"];
    6. }
    7. if(success){
    8. glBegin( GL_QUADS );
    9. glTexCoord2f( 1.0f, 1.0f );
    10. glVertex2f( -1.0f, 1.0f );
    11. glTexCoord2f( 1.0f, 0.0f );
    12. glVertex2f( -1.0f, -1.0f );
    13. glTexCoord2f( 0.0f, 0.0f );
    14. glVertex2f( 1.0f, -1.0f );
    15. glTexCoord2f( 0.0f, 1.0f );
    16. glVertex2f( 1.0f, 1.0f );
    17. glEnd();}
    18. else drawAnObject();
    19. glFlush();
    20. }
    21. - (void) initTexture:(NSString*)filename {
    22. [ self loadBitmap:[ NSString stringWithFormat:@"%@/%s",
    23. [[NSBundle mainBundle] resourcePath], filename ]];
    24. [self loadGLTextures];
    25. }
    Alles anzeigen


    "lena.bmp" ist das bitmap, welches zu Anfang geladen wird.(Das funktioniert auch.)
    Der Button ist auch ordentlich mit mit den GUIController verbunden.

    Könnt ihr mir bitte helfen ?

  • Zuallererst solltest Du das initGL nicht in drawRect packen, drawRect rufst Du nicht selber auf, das macht das Framework, dann lässt Du leider ganz wesentliche Punkte weg, wie sieht initGL aus, wie loadGLTextures, dann setzt Du keine Projektionsmatrix und last but not least ist mir nicht ganz klar, was genau denn nun nicht funktioniert? Vielleicht postest Du ein Beispielprojekt?

    Zur Initialisierung eines OpenGL-context schau Dir mal den OpenGL-Programming Guide in der Apple-Doku an (oder gleich NSOpenGLView benutzen).
  • Generell würde ich von OpenCL in ein PBO rendern und daraus dann in OpenGL die Texturen neu ziehen. Wenn Du ohnehin alles in CL machst und mit GL nur anzeigen willst, kannst Du auch ganz ohne Textur die Pixel aus dem PBO direkt mit DrawPixels auf den Schirm bringen.
    Ausserdem denk dran, den CL Context als Shared (CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE) zu initialisieren, damit der Austausch mit OpenGL auch ohne Probleme klappt.

    Ansonsten muss ich mich Markus Müller anschliessen: So richtig weiss ich auch gar nicht, was bei Dir nicht funktioniert.
    C++
  • Danke für eure Hilfe.
    Ich werde das mal mit einem PBO probieren, würde aber trotzdem gern wissen woran es liegt,
    dass die Textur nicht angezeigt wird.

    Hier nochmal der Rest aus MyOpenGLView:

    Quellcode

    1. -(BOOL) initGL {
    2. glDisable(GL_DEPTH_TEST);
    3. glLoadIdentity();
    4. glEnable( GL_TEXTURE_2D );
    5. return TRUE;
    6. }
    7. - (void) loadGLTextures;
    8. {
    9. if(success)
    10. {
    11. success=FALSE;
    12. glGenTextures( 1, &texture );
    13. glBindTexture( GL_TEXTURE_2D, texture );
    14. glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    15. glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    16. glTexImage2D( GL_TEXTURE_2D, 0, 3, texSize.width,
    17. texSize.height, 0, texFormat,
    18. GL_UNSIGNED_BYTE, texBytes );
    19. free( texBytes );
    20. success=TRUE;
    21. }
    22. }
    23. - (void) loadBitmap:(NSString *)filename
    24. {
    25. success = FALSE;
    26. NSBitmapImageRep *Image;
    27. int bitsPPixel, bytesPRow;
    28. unsigned char *theImageData;
    29. int rowNum, destRowNum;
    30. Image = [ NSBitmapImageRep imageRepWithContentsOfFile: filename ];
    31. if( theImage != nil )
    32. {
    33. bitsPPixel = [Image bitsPerPixel];
    34. bytesPRow = [Image bytesPerRow];
    35. if( bitsPPixel == 24 )
    36. texFormat = GL_RGB;
    37. else if( bitsPPixel == 32 )
    38. texFormat = GL_RGBA;
    39. texSize.width = [Image pixelsWide];
    40. texSize.height = [Image pixelsHigh];
    41. texBytes = calloc( bytesPRow * texSize.height, 1 );
    42. if( texBytes != NULL )
    43. {
    44. imageData = [Image bitmapData];
    45. destRowNum = 0;
    46. for( rowNum = texSize.height - 1; rowNum >= 0;
    47. rowNum--, destRowNum++ )
    48. {
    49. memcpy( texBytes + ( destRowNum * bytesPRow ),
    50. theImageData + ( rowNum * bytesPRow ),
    51. bytesPRow );
    52. }
    53. success = TRUE;
    54. }
    55. }
    56. }
    Alles anzeigen


    Ich habe das Programm nach dem MVC-Paradigma aufgebaut.
    (model hab ich aus Platzgünden nicht gepostet, da das Programm nicht mal so, wie es oben steht, läuft)
    Dann habe ich mit IB ein Fenster mit einem NSOpenGLView-Objekt und unter anderem einem Button für das Ändern der Textur erstellt.
    Wenn man das Programm ausführt lädt es zwar die Standardtextur, lädt aber beim klicken auf den Exec-Button nicht die neue
    (oder zeigt sie einfach nur nicht an).
    Die Projektionsmatrix habe ich nicht gesetzt, weil ja sowieso nur 2D gezeichnet werden soll, ich weiß nicht ob man das darf.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von blaubaer ()

  • Wird vielleicht einfach kein "refresh" aufgerufen, also wird das Fenster überhaupt neu gezeichnet?

    Ansonsten sehe ich grad nichts auffälliges..mhh.. Check mal, ob irgendwo Fehler auftreten etc., das übliche Debugging halt.

    Und Matrizen brauchst Du natürlich nicht zu setzen, wenn sie nicht vom Default (=Identity) abweichen. Ich mach das auch immer genauso wie Du.
    C++