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

Aktuelle Zeit: Mo Jul 14, 2025 13:55

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [C++] Textausgabe in OpenGL: Womit?
BeitragVerfasst: Mo Dez 12, 2011 11:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hallöchen,

Ja, der Tag darf euch Angst machen. Ich bin gerade bei C++ unterwegs ;). Und ich frage mich, gibt es irgendeine Bibliothek, die sich um Textausgabe kümmern kann und folgendes liefert:
  • beliebige OpenType/TrueType Fonts verwendbar [freetype2 als backend wäre z.B. cool]
  • Kerning
  • OpenGL 3 Kompatibel (i.e. VBOs o.ä.)
  • Texturatlas für die Glyphen (also nicht jede Glyphe eine Textur, wobei das hoffentlich aus obigem folgt; aber auch nicht ganze Texte als Textur)
  • Verfügbar auf Linux und Windows
  • möglichst verbreitet, sodass es in gängigen Linux Repositories ist (Fedora und Ubuntu)
  • nicht zu fette dependencies (Pango z.B. wäre übel, Freetype2 ist okay)
  • Standalone (soll nicht gleich ne ganze Engine mit dran hängen)

Oder müssen wir da selber was bauen?

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 12, 2011 15:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Soll der Text einfach nur 2D Text sein oder irgendwas besonderes. Also dreidimensional oder mit Schatten oder so?
SDL_TTF scheint doch FreeType2 als Backend zu haben. Und damit kennst du dich ja aus. Zumindest genug um mir da zu helfen.
Oder haut das dann mit deinem gewünschten Texturatlas für die Glyphen nicht hin?

Ansonsten vielleicht FTGL. Aber ich habe keinen Schimmer wie man das benutzt oder ob man da großartig an Abhängigkeiten hängt.

Anbindungen für die Libaries an C++ gibt es ja eigentlich immer.

Vielleicht findest du ja hier etwas passendes: http://www.opengl.org/resources/features/fontsurvey/

Chapter


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 12, 2011 17:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ne, nur ganz normaler 2D-Text.

Chapter hat geschrieben:
SDL_TTF scheint doch FreeType2 als Backend zu haben. Und damit kennst du dich ja aus.

Naja, SDL_TTF rendert ja keinen Text in OpenGL. Das packt das nur in eine Surface, mehr nicht. Den Glyphenatlas müsste ich dann selber bauen, wenn ich nicht jeden Frame den ganzen Text neu rastere (was definitiv nicht sinnvoll ist).

Chapter hat geschrieben:
Ansonsten vielleicht FTGL. Aber ich habe keinen Schimmer wie man das benutzt oder ob man da großartig an Abhängigkeiten hängt.

Haben wir schon in betracht gezogen. Soweit ich das rausbekommen habe verstößt das aber gegen die sache mit dem Texturatlas und es benutzt kein VBO.

Chapter hat geschrieben:
Vielleicht findest du ja hier etwas passendes: http://www.opengl.org/resources/features/fontsurvey/

Das hab ich durchgeklickt. Alles nicht geeignet afaics. [ was mich wundert. gibt denn niemand text mit opengl 3 aus? ]

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 12, 2011 19:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Zitat:
was mich wundert. gibt denn niemand text mit opengl 3 aus?

Anscheinend nicht. Die raten alle gern was da stehen könnte. :mrgreen:

Wie auch immer ... Hast du das schon gesehen -> http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Text_Rendering_02
Es werden zumindest Vertex-Arrays genutzt.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 12, 2011 20:12 
Offline
DGL Member

Registriert: Mi Jan 21, 2009 09:05
Beiträge: 13
Hi,

also ich hab da was für mein momentanes Framework programmiert. Es hat als einzige Abhängigkeit FreeType2 und die STL. Es besteht im wesentlichen aus 5 Klassen:

TextureManager -> Kümmert sich um die Erstellung des Texturatlases und die Zuordnung. Es werden nur die Glyphen erzeugt, die wirklich gebraucht werden
Texture -> Wrapper um die OpenGL Textur
Buffer -> Wrapper um VBOs
TextureManager -> Verwaltet alle Texturen
GeometryManager -> Verwaltet alle Buffer

Die Funktionalität ist zwar relativ eng mit meinem Framework verknüpft aber falls interesse besteht kann den SourceCode oder teile davon posten.

Mit freundlichen Grüßen
Archaon


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 12, 2011 21:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Najo, wir haben praktisch schon alles nur keinen sauberen Speichermanager für die Texturen, Glyphenrendering und Glyphenplatzierung. Im Klartext, uns fehlt:
  • Eine ordentliche Verwaltung des Platzes in der Textur. Also das z.B. Glyphen in der Textur durch die Gegend geschoben werden, wenn das platzsparender ist (kann man aber auch drauf verzichten).
  • Glyphenrendering bedeutet einfach nur, die Glyphen zu rastern und in die Textur zu übertragen.
  • Glyphenplatzierung erfordert die Beachtung von Kerning und das Ausgeben der Geometriedaten in einer VBO-freundlichen Form.

Wenn ihr das drauf habt nehmen wir das gerne.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 12, 2011 21:35 
Offline
DGL Member

Registriert: Mi Jan 21, 2009 09:05
Beiträge: 13
Naja also Verwaltung des Platzes ist nicht implementiert die Textur wird einfach zeilenweise befüllt als beginn der nächsten Zeile wird die Höhe des größten Glyphes der vorherigen Zeile genommen.
Glyphen in Textur packen ist drin es werden auch multibyte chars unterstützt.
Zum Rendern wird für jedes Glyph einfach ein Quad erstellt. Ein String wird dann in ein VBO gepackt. Kerning wird nicht unterstützt sollte aber durch verschieben der einzelnen Quads machbar sein (denk ich mal :).)

Hier mal ein bisschen Code:

Erstellen des Texturatlases:
Code:
  1. #ifndef FONTMANAGER_H
  2.     #define FONTMANAGER_H
  3.    
  4.     #include <UECommon/Defines.h>
  5.    
  6.     #include <ft2build.h>
  7.     #include FT_FREETYPE_H
  8.    
  9.     #include <map>
  10.     #include <vector>
  11.     #include <string>
  12.    
  13.     namespace UERenderer
  14.     {
  15.         enum SpecialChar
  16.         {
  17.             NONE,
  18.             SPACE,
  19.         };
  20.    
  21.         struct CharInfo
  22.         {
  23.             CharInfo(std::string ptextureName, size_t pu, size_t pv,
  24.                              size_t pwidth, int pymin, int pymax,
  25.                              SpecialChar pspecialChar = NONE)
  26.                 {textureName = ptextureName; u = pu; v = pv; width = pwidth;
  27.                  ymin = pymin; ymax = pymax; specialChar = pspecialChar;}
  28.            
  29.             std::string textureName;
  30.             size_t u;
  31.             size_t v;
  32.             size_t width;
  33.             int ymin;
  34.             int ymax;
  35.             enum SpecialChar specialChar;
  36.         };
  37.        
  38.         struct TextInfo
  39.         {
  40.             TextInfo()
  41.             {
  42.                 width = 0;
  43.                 height = 0;
  44.             }
  45.             std::vector<CharInfo> charInfoList;
  46.             size_t width;
  47.             size_t height;
  48.             int yminMax;
  49.         };
  50.        
  51.         class UE_API FontManager
  52.         {
  53.             public:
  54.         static FontManager* getInstance();
  55.                 TextInfo getString(const std::string &string);
  56.             private:
  57.         FontManager();
  58.                 ~FontManager();
  59.                 CharInfo getCharInfo(unsigned long unicodeChar);
  60.                 void generateNewTexture();
  61.             private:
  62.         static FontManager minstance;
  63.                 std::vector<std::string> mtextureList;
  64.                 std::map<unsigned long, CharInfo> mcharMap;
  65.                 size_t mcurU;
  66.                 size_t mcurV;
  67.                 int mcurTexture;
  68.                 int mlineHeight;
  69.                 size_t mtextureWidth;
  70.                 size_t mtextureHeight;
  71.                 FT_Library mlibrary;
  72.                 FT_Face mface;
  73.         };
  74.     }
  75. #endif
  76.  

Code:
  1. #include <UERenderer/TextureManager.h>
  2. #include <UERenderer/FontManager.h>
  3.  
  4. #include FT_GLYPH_H
  5.  
  6. #include <sstream>
  7.  
  8. namespace UERenderer
  9. {
  10.   FontManager FontManager::minstance;
  11.  
  12.   FontManager *FontManager::getInstance()
  13.   {
  14.     return &minstance;
  15.   }
  16.  
  17.   FontManager::FontManager()
  18.   {
  19.     mcurU = 0;
  20.     mcurV = 0;
  21.     mcurTexture = -1;
  22.     mlineHeight = 0;
  23.     mtextureWidth = 512;
  24.     mtextureHeight = 512;
  25.     mlibrary = NULL;
  26.     mface = NULL;
  27.  
  28.     //Create And Initilize A FreeType Font Library.
  29.     if(FT_Init_FreeType(&mlibrary) )
  30.       throw std::string("FT_Init_FreeType failed");
  31.      
  32.     //This Is Where We Load In The Font Information From The File.
  33.     //Of All The Places Where The Code Might Die, This Is The Most Likely,
  34.     //As FT_New_Face Will Fail If The Font File Does Not Exist Or Is Somehow
  35.     //Broken.
  36.     std::string fontName("fonts/FreeMono.ttf");
  37.     if(FT_New_Face(mlibrary, fontName.c_str(), 0, &mface) )
  38.       throw std::string("FT_New_Face failed (there is probably a problem with \
  39.                         your font file)");
  40.  
  41.     //For Some Twisted Reason, FreeType Measures Font Size
  42.     //In Terms Of 1/64ths Of Pixels.  Thus, To Make A Font
  43.     //h Pixels High, We Need To Request A Size Of h*64.
  44.     //(h << 6 Is Just A Prettier Way Of Writing h*64)
  45.     unsigned int h = 12;
  46.     FT_Set_Char_Size(mface, 0, h << 6, 96, 96);
  47.   }
  48.  
  49.   FontManager::~FontManager()
  50.   {
  51.     FT_Done_Face(mface);
  52.  
  53.     FT_Done_FreeType(mlibrary);
  54.   }
  55.  
  56.   TextInfo FontManager::getString(const std::string &string)
  57.   {
  58.     TextInfo textInfo;
  59.    
  60.     //use map to sort after texture
  61.     //std::map<Texture*, struct CharInfo> sortMap;
  62.     for(unsigned int i = 0; i < string.length(); i++)
  63.     {
  64.       unsigned long unicodeChar = 0;
  65.      
  66.       unicodeChar = string[i];
  67.  
  68.       if(unicodeChar > 0x7F)
  69.       {
  70.         //first byte
  71.         unicodeChar = (string[i++] & 0x3F);
  72.        
  73.         //read the rest
  74.         while(((string[i] >> 6) & 0x3) == 2)
  75.           unicodeChar = (unicodeChar << 6) | (string[i++] & 0x3F);
  76.        
  77.         //decrease i by one because it will be increased by the for loop
  78.         i--;
  79.       }
  80.      
  81.       CharInfo charInfo = getCharInfo(unicodeChar);
  82.      
  83.       textInfo.charInfoList.push_back(charInfo);
  84.       textInfo.width += charInfo.width;
  85.     }
  86.    
  87.     int ascend = mface->ascender >> 6;
  88.     int descend = mface->descender >> 6;
  89.  
  90.     textInfo.height = ascend - descend;
  91.     textInfo.yminMax = descend;
  92.    
  93.     return textInfo;
  94.   }
  95.  
  96.   CharInfo FontManager::getCharInfo(unsigned long unicodeChar)
  97.   {
  98.     //Unicode for space is U+0020
  99.     if(unicodeChar == 0x20)
  100.       return CharInfo("", 0, 0, mface->glyph->advance.x >> 6, 0, 0, SPACE);
  101.  
  102.     std::map<unsigned long, CharInfo>::iterator it =
  103.       mcharMap.find(unicodeChar);
  104.    
  105.     if(it == mcharMap.end() )
  106.     {
  107.       //Load The Glyph For Our Character.
  108.       if(FT_Load_Glyph(mface, FT_Get_Char_Index(mface, unicodeChar),
  109.                        FT_LOAD_DEFAULT) )
  110.         throw std::string("FT_Load_Glyph failed");
  111.  
  112.       //Move The Face's Glyph Into A Glyph Object.
  113.       FT_Glyph glyph;
  114.       if(FT_Get_Glyph(mface->glyph, &glyph) )
  115.         throw std::string("FT_Get_Glyph failed");
  116.  
  117.       //Convert The Glyph To A Bitmap.
  118.       FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, 0, 1 );
  119.       FT_BitmapGlyph bitmapGlyph = (FT_BitmapGlyph)glyph;
  120.  
  121.       //This Reference Will Make Accessing The Bitmap Easier.
  122.       FT_Bitmap& bitmap = bitmapGlyph->bitmap;
  123.      
  124.       //Line end reached start new line
  125.       if((mcurU + bitmap.width) > mtextureWidth)
  126.       {
  127.         mcurU = 0;
  128.         mcurV += mlineHeight;
  129.         mlineHeight = 0;
  130.       }
  131.      
  132.       //End of texture reached generate new one
  133.       if((mcurV + bitmap.rows) > mtextureHeight || mcurTexture == -1)
  134.       {
  135.         ++mcurTexture;
  136.        
  137.         generateNewTexture();
  138.        
  139.         mcurU = 0;
  140.         mcurV = 0;
  141.         mlineHeight = 0;
  142.       }
  143.      
  144.       if(bitmap.rows > mlineHeight)
  145.         mlineHeight = bitmap.rows;
  146.      
  147.       FT_BBox bbox;
  148.       FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_PIXELS, &bbox);
  149.      
  150.       TextureManager::getInstance()->
  151.         getTexture(mtextureList[mcurTexture] )->
  152.         edit(static_cast<unsigned int>(mcurU),
  153.              static_cast<unsigned int>(mcurV),
  154.              bitmap.width, bitmap.rows, ALPHA, bitmap.buffer);
  155.      
  156.       struct CharInfo charInfo(mtextureList[mcurTexture], mcurU, mcurV,
  157.                                bbox.xMax - bbox.xMin, bbox.yMin, bbox.yMax);
  158.                        
  159.       //move to new position
  160.       mcurU += bitmap.width;
  161.      
  162.       mcharMap.insert(std::make_pair(unicodeChar, charInfo) );
  163.      
  164.       FT_Done_Glyph(glyph);
  165.      
  166.       return charInfo;
  167.     }
  168.     else
  169.       return it->second;
  170.   }
  171.  
  172.   void FontManager::generateNewTexture()
  173.   {
  174.     std::stringstream sstream;
  175.    
  176.     sstream << "FontTexture" << mcurTexture;
  177.    
  178.     TextureManager::getInstance()->
  179.       addTexture(sstream.str(), static_cast<unsigned int>(mtextureWidth),
  180.                  static_cast<unsigned int>(mtextureHeight),
  181.                  UEImage::RGBA, ALPHA, NULL);
  182.    
  183.     mtextureList.push_back(sstream.str() );
  184.   }
  185. }
  186.  


Und hier das erstellen des VBOs
Code:
  1.  void Label::setText(std::string text)
  2.   {
  3.     UERenderer::TextInfo tmp = UERenderer::FontManager::getInstance()->
  4.                                                             getString(text);
  5.  
  6.     if(tmp.charInfoList.size() > 0)
  7.     {
  8.       float *data = new float[tmp.charInfoList.size() * 12];
  9.       float *texData = new float[tmp.charInfoList.size() * 12];
  10.       float *colorData = new float[tmp.charInfoList.size() * 18];
  11.      
  12.       for(unsigned int i = 0; i < (tmp.charInfoList.size() * 18); i += 3)
  13.       {
  14.         colorData[i] = mfgColor.getRed() / 255.0f;
  15.         colorData[i + 1] = mfgColor.getGreen() / 255.0f;
  16.         colorData[i + 2] = mfgColor.getBlue() / 255.0f;
  17.       }
  18.  
  19.       float width = 0;
  20.       float height = 0;
  21.       size_t id = 0;
  22.      
  23.       for(unsigned int i = 0; i < tmp.charInfoList.size(); i++)
  24.       {
  25.         size_t charHeight = (tmp.charInfoList[i].ymax -
  26.                              tmp.charInfoList[i].ymin);
  27.        
  28.         float charWidth = static_cast<float>(tmp.charInfoList[i].width);
  29.         if(tmp.charInfoList[i].specialChar == UERenderer::SPACE)
  30.         {
  31.           width += charWidth;
  32.           continue;
  33.         }
  34.        
  35.         float calcedHeight = static_cast<float>(tmp.height -
  36.                               (tmp.charInfoList[i].ymax - tmp.yminMax) );
  37.        
  38.         //top left
  39.         data[id] = width;
  40.         data[id + 1] = calcedHeight;
  41.         texData[id] = tmp.charInfoList[i].u / 512.0f;
  42.         texData[id + 1] = tmp.charInfoList[i].v / 512.0f;
  43.         id += 2;
  44.         //bottom left
  45.         data[id] = width;
  46.         data[id + 1] = calcedHeight + charHeight;
  47.         texData[id] = tmp.charInfoList[i].u / 512.0f;
  48.         texData[id + 1] = (tmp.charInfoList[i].v + charHeight) / 512.0f;
  49.         id += 2;
  50.         //bottom right
  51.         data[id] =  width + charWidth;
  52.         data[id + 1] = calcedHeight + charHeight;
  53.         texData[id] = (tmp.charInfoList[i].u + tmp.charInfoList[i].width) / 512.0f;
  54.         texData[id + 1] = (tmp.charInfoList[i].v + charHeight) / 512.0f;
  55.         id += 2;
  56.         //top left
  57.         data[id] = width;
  58.         data[id + 1] = calcedHeight;
  59.         texData[id] = tmp.charInfoList[i].u / 512.0f;
  60.         texData[id + 1] = tmp.charInfoList[i].v / 512.0f;
  61.         id += 2;
  62.         //bottom right
  63.         data[id] = width + charWidth;
  64.         data[id + 1] = calcedHeight + charHeight;
  65.         texData[id] = (tmp.charInfoList[i].u + tmp.charInfoList[i].width) / 512.0f;
  66.         texData[id + 1] = (tmp.charInfoList[i].v + charHeight) / 512.0f;
  67.         id += 2;
  68.         //top right
  69.         data[id] = width + charWidth;
  70.         data[id + 1] = calcedHeight;
  71.         texData[id] = (tmp.charInfoList[i].u + tmp.charInfoList[i].width) / 512.0f;
  72.         texData[id + 1] = tmp.charInfoList[i].v / 512.0f;
  73.         id += 2;
  74.  
  75.         width += charWidth;
  76.       }
  77.  
  78.       if(mbuffer != NULL)
  79.         UERenderer::GeometryManager::getInstance()->deleteBuffer(mbuffer);
  80.  
  81.       mbuffer = UERenderer::GeometryManager::getInstance()->createBuffer();
  82.  
  83.       if(mbuffer != NULL)
  84.       {
  85.         mbuffer->setVertexData(tmp.charInfoList.size() * 6, 2, data);
  86.         mbuffer->setColorData(tmp.charInfoList.size() * 6, 3, colorData);
  87.         mbuffer->setTextureData(UERenderer::FIRST, tmp.charInfoList.size() * 6,
  88.                                                         2, texData, tmp.charInfoList[0].textureName);
  89.       }
  90.  
  91.       delete [] data;
  92.       delete [] texData;
  93.       delete [] colorData;
  94.  
  95.       mtext = text;
  96.     }
  97.   }
  98.  


Und hier noch das Editieren der Texture
Code:
  1. //We want every pixel to be white, not black
  2. glPixelTransferf(GL_RED_BIAS, 1.0f);
  3. glPixelTransferf(GL_GREEN_BIAS, 1.0f);
  4. glPixelTransferf(GL_BLUE_BIAS, 1.0f);
  5. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  6.            
  7. glBindTexture(GL_TEXTURE_2D, mid);
  8. glTexSubImage2D(GL_TEXTURE_2D, 0, mxoffsetList[i], myoffsetList[i],
  9.             meditWidthList[i], meditHeightList[i], glTextureFormat,
  10.             GL_UNSIGNED_BYTE, meditDataList[i]);
  11. glBindTexture(GL_TEXTURE_2D, 0);
  12.        
  13. glPixelTransferf(GL_RED_BIAS, 0.0f);
  14. glPixelTransferf(GL_GREEN_BIAS, 0.0f);
  15. glPixelTransferf(GL_BLUE_BIAS, 0.0f);
  16. glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4 is default
  17.  


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Dez 13, 2011 20:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Das zeichnen der einzelnen Symbole läuft immer noch über den guten alten weg der display liste(ein link wurde schon im Thread geposted).
Was eher neu ist, sind 2 Techniken, zum rendern der Symbole selbst.

1.) Distant field Font
http://www.valvesoftware.com/publicatio ... cation.pdf
Kurz umschrieben, man speichert nicht die alphamask der Symbole, sondern die distanz zum nächsten punkt auf der Symbolsiluette. Der Shader ist einfach primitiv , aktueller "abs(texel) < x" dann zeichne sonnst nicht und man kann auch einfach einen 2. shader bereit stellen, der noch kantenglättung macht.

2.) http://research.microsoft.com/en-us/um/ ... proj/ravg/
Umrechnung von bezierkurven in texture space und die Kontrollpunkte werden mit trianguliert.
So kann an normalen triangle ein standard shader durchlaufen und für die teile, wo bezierkurven benötigt werden, läuft ein 2. shader, welcher eine approximation verwendet, welcher nahe an eine quadratische und kubische bezierkurve ran kommt.
Die Technik ist nahe perfekt, erlaubt beliebige skalierung, einfach um AA zu erweitern und unglaublich umständlich -_-

Ich würde 1. empfehlen, da sehr einfach ist und sehr gute qualität abliefert.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 16, 2011 14:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Danke TAK, hab mich mal durchgelesen. Erscheint mir aber alles als ziemlicher Overkill für das Rendern von Fonts in einer GUI.
Aber du erwähntest Displaylisten. Sind die noch OpenGL 3 kompatibel? Beziehungsweise habe ich es korrekt in Erinnerung, dass man auch Vertex Arrays aus dem RAM heraus verwenden kann?

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 16, 2011 15:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Aber du erwähntest Displaylisten. Sind die noch OpenGL 3 kompatibel?
Bin zwar nicht gefragt aber ich bin so unhöflich und misch mich mal ein: Displaylisten sind m.E. in OpenGL3 abgeschrieben.

Das was Tak empfohlen hat, ist gar nicht so ein Overkill, wenn man bedenkt, dass Du z.B. ja auch Kerning dabei hast.
Viele Grüße übrigens :wink:
Traude


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 16, 2011 15:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hm, also die erste Technik scheint mir vorallem für größere Texte zu sein. Kann mir kaum vorstellen, wie das für kleine Glyphen (8-12pt) funktionieren soll. Aber bin gerade auch nicht ganz auf der Höhe, vielleicht übersehe ich was. Ich denke wir werden einfach selber etwas auf Basis von FreeType und nem kleinen Texturmanager bauen… Wenn hier nicht noch überzeugende Vorschläge kommen ;).

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 16, 2011 23:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Displaylisten sind mit OpenGL 3.2 deprecated gemarked worden und mit 4.0 raus geflogen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 08, 2012 10:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Für's Protokoll: Der Vorschlag in diesem Post erscheint ganz brauchbar.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


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


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 17 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.011s | 15 Queries | GZIP : On ]