OpenGL ohne Fenster?



  • Hi!

    Für eine bestimmte aufgabe muss ich ein rechteckiges Gebilde mit einer Textur überziehen und als Bild abspeichern. Bisher hab ich das mit einem Fenster gemacht, wo ich reinrendere (mit opengl) und das dann abspeichere.

    Jetzt frag ich mich: Kann ich einen rendering-context auch ohne Fenster erstellen? Ich brauche eigentlich wirklich nur einen buffer, wo reingerendert wird und den ich dann auslesen oder gleich abspeichern kann. zB sowas wie rendertotexture, aber ohne fenster.

    Hoffe, ihr könnt mir helfen 🙂
    Gruß, Maxi


  • Mod

    waere ein software renderer nicht auch ne moeglichkeit? ich glaube ohne fenster funzen zZ oGL und D3D nicht.





  • @hellihbj: Kannte ich noch nicht, leider muss es aber auch unter linux laufen ;).
    @rapso: An einen Software-Renderer hab ich ncoh gar überhaupt nicht gedacht... aber klar, der muss ja nix können und so schnell muss er auch nicht sein, denn er wird nicht oft benutzt... klasse Idee.

    Kennt ihr bsetimmte sw-renderer, die gut sind? Müssen auf alle Fälle ohne fenster arbeiten. Habe auf die schnelle Muli3D gefunden, aber die doku finde ich da nicht so toll irgendwie...
    Kennt ihr noch andere gute?



  • opengl, linux, sw-renderer

    mesa ?


  • Mod

    was genau verlangst du denn von deinem rasterizer? 😃



  • so gut wie gar nix... das hier ist alles, was ich vom dem rasterizer verlange:

    glGenTextures(1, &g_StomachTex);
    glBindTexture(GL_TEXTURE_2D, g_StomachTex);
    
    // Textur mit daten aus meinem Programm füllen
    
    // andere funktion:
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();									
    
    // vorhin geschriebene Textur laden
    glBindTexture(GL_TEXTURE_2D, g_StomachTex);
    
    glViewport(0, 0, (GLsizei)PatSize.x, (GLsizei)PatSize.y);				
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 1.0f, 1.0f, 0, -1, 1);  // einfache 2D.orthogonalprojektion
    
    glBegin(GL_TRIANGLES);
    for(size_t i = 0; i < m_Triangles.size(); i += 2)
    {
            // jetzt hier ein paar dreiecke mit bestimmten texturkoordinaten zeichnen
            // x und y ist natürlich immer verschieden
            glTexCoord2f(m_Triangles[i].a.x, m_Triangles[i].a.y);
    	glVertex2d(x, y);
    
            glTexCoord2f(m_Triangles[i].b.x, m_Triangles[i].b.y);
    	glVertex2d(x, y);
    
            glTexCoord2f(m_Triangles[i].c.x, m_Triangles[i].c.y);
    	glVertex2d(x, y);
    
            glTexCoord2f(m_Triangles[i+1].a.x, m_Triangles[i+1].a.y);
    	glVertex2d(x, y);
    
            glTexCoord2f(m_Triangles[i+1].b.x, m_Triangles[i+1].b.y);
    	glVertex2d(x, y);
    
            glTexCoord2f(m_Triangles[i+1].c.x, m_Triangles[i+1].c.y);
    	glVertex2d(x, y);
    }
    glEnd();
    
    unsigned char* Data = new unsigned char[int(3*PatSize.x*PatSize.y)];
    glFlush();
    glReadBuffer(GL_BACK);
    glPixelStorei(GL_PACK_ALIGNMENT, 1);
    glReadPixels(0, 0, (GLsizei)PatSize.x, (GLsizei)PatSize.y, GL_RGB, GL_UNSIGNED_BYTE, Data);
    
    // Daten von OpenGL wieder in eigenes Bild übertragen.
    unsigned char* ptr = Data;
    // ...
    

    Der Rasterizer muss also lediglich dreicke in orthogonalprojektion texturieren können, mehr nicht. Aber ohne Fenster auf einem internen speicherbereich, den man dann auch auslesen kann.

    Muli3d will auch immer ein Fenster erstellen, und irgendwie is mir der Code blöd.
    Mesa is auch eher mehr für linux gedacht, das ganze muss jedoch ebenfalls unter nativ unter windows laufen, am besten ncoh macos.

    Dachte zwischendurch schon an cairo, leider kann das aber soweit ich weiß keine texturkoordinaten. Ansonsten wär das glaubich genau was ich suche.



  • eine funktion die ein polygon mit textur rastert ist leicht selbst zu implementieren, insbesondere wenn man vorher dieses gelesen hat.


  • Mod

    das ist sehr overpowered *hehe*

    geht einfacher, finde heraus in welchem quadrat sich ein dreieck befindet. geh es pixel fuer pixel durch und errechne wo sie der pixel im barycentric triangle befindet. wenn ausserhalb -> naechsterpixel, wenn innerhalb vom tri, kannst du die 3 gewichtungen benutzen um dir die UV coordinate zu errechnen. damit liesst du einmal aus der quelltextur und setzt den pixel.

    nicht superschnell, aber auch nicht langsam, dafuer sehr simpel zu implementieren und eigentlich auch recht fehlerunanfaellig z.b. bezueglich rasterizations rulez etc. (viele einfachen raytracer texturieren so wenn sie den schnittpunkt mit der triangle-eben gefunden haben).


Anmelden zum Antworten