Gunnar, Texture was being correctly generated aside of positioning problem of the font drawing. The problem was on vertex and texture coordinates. I was not taking correctly into account left and right bearing of the fonts.
Thanks, Regards, Nuno On 06 Nov 2014, at 12:15, Nuno Santos <[email protected]> wrote: > Gunnar, > > I will run your debugging suggestions. > > Thanks, > > Regards, > > Nuno > > On 05 Nov 2014, at 17:39, Gunnar Sletta <[email protected]> wrote: > >> >> On 04 Nov 2014, at 23:20, Nuno Santos <[email protected]> wrote: >> >>> Gunnar, >>> >>> I have implemented a really basic node for text rendering on scene graph >>> based on my previous approach but adapter to Qt API. The setup code is >>> below. I can already draw a string on OpenGL but the characters are not >>> smooth at small sizes with a pixel font. With a non pixel font, even at big >>> sizes the size is not appearing really good. I was wondering if the method >>> i’m performing and/or setup is the most appropriated. >> >> Is the contents of the QImage correct? If so, then your geometry data is >> probably using the wrong texture or vertex coordinates. If you want to dig >> through Qt's sources, the equivalent bits for drawing pixel-by-pixel (aka >> Text.NativeRendering) fonts in Qt are in the >> qtdeclarative/src/quick/scenegraph/qsgdefaultglyphnode* files. >> >> cheers, >> Gunnar >> >> PS, always use QImage::Format_ARGB32_Premultiplied or >> QImage::Format_RGBA32_Premultiplied when working alpha images with QPainter. >> It is faster than ARGB32. >> >> >> >>> >>> Below is the code that draws the glyphs in a texture and then transfers it >>> to a texture. I haven’t included the texture mapping into the vertices but >>> I don’t think that’s the origin of the problem. I would love to have your >>> feedback on this. >>> >>> Regards, >>> >>> Nuno >>> >>> // setup >>> >>> QFont font("OpenSans"); >>> font.setPixelSize(32); >>> QFontMetrics fm(font); >>> QPainter painter; >>> >>> _gs = qMax(fm.maxWidth(), fm.height()); >>> _ts = nextPowerOfTwo(_gs)*16; >>> >>> for (int i=0; i<256; i++) >>> { >>> _glyphs[i].character = (char) i; >>> _glyphs[i].pos.setX((i % 16) * _gs); >>> _glyphs[i].pos.setY((i / 16) * _gs); >>> _glyphs[i].rect = fm.boundingRect(QChar((char) i)); >>> } >>> >>> QImage image(_ts, _ts, QImage::Format_ARGB32); >>> >>> painter.begin(&image); >>> //painter.setRenderHint(QPainter::TextAntialiasing, false); >>> //painter.setRenderHint(QPainter::SmoothPixmapTransform, false); >>> painter.setFont(font); >>> painter.setBrush(QBrush(Qt::white)); >>> painter.setPen(QPen(Qt::black)); >>> >>> for (int i=0; i<256; i++) >>> { >>> painter.drawText(_glyphs[i].pos,QString(_glyphs[i].character)); >>> } >>> >>> painter.end(); >>> >>> _geometry.setDrawingMode(GL_TRIANGLES); >>> setGeometry(&_geometry); >>> >>> QSGTexture *t = window->createTextureFromImage(image); >>> >>> //t->setMipmapFiltering(QSGTexture::Nearest); >>> //t->setFiltering(QSGTexture::Linear); >>> >>> _material.setTexture(t); >>> setMaterial(&_material); >>> >>> On 03 Nov 2014, at 21:11, Gunnar Sletta <[email protected]> wrote: >>> >>>> >>>> On 03 Nov 2014, at 17:15, Nuno Santos <[email protected]> wrote: >>>> >>>>> Hi, >>>>> >>>>> I’m trying to render text on scene graph. My strategy consists in >>>>> creating a texture with all the glyphs and then draw a specific subset of >>>>> the texture for each glyph. I have already done this for iOS and Android >>>>> native API’s but now, i’m porting my app to Qt/Qml and need to do it on >>>>> scene graph. >>>> >>>> If you already have working GL code, then maybe >>>> QQuickWindow::beforeRendering() is a more straightforward way to get this >>>> working? You only need to go through scene graph API if you want this to >>>> interact with a QML UI. >>>> >>>>> >>>>> My new node is extending QSGSimpleTextureNode. The code below is just for >>>>> the most basic test purpose. >>>> >>>> QSGSimpleTextureNode only supports drawing a textured quad. If you want to >>>> draw a bunch of glyphs on one node (like a word or a sentence), you >>>> probably want to use a QSGGeomtryNode with TexturedPoint2D as attribute >>>> set combined with a QSGTextureMaterial. >>>> >>>>> >>>>> unsigned char *data = (unsigned char*) malloc(ts*ts*4); >>>>> uint8_t * p = data; >>>>> >>>>> for(int i=0; i<ts*ts; ++i) >>>>> { >>>>> *p = 0; ++p; >>>>> *p = 255; ++p; >>>>> *p = 255; ++p; >>>>> *p = 0; ++p; >>>>> } >>>>> >>>>> glGenTextures(1, &_texture); >>>>> >>>>> glBindTexture(GL_TEXTURE_2D, _texture); >>>>> >>>>> glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); >>>>> glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >>>>> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ts, ts, 0, GL_RGBA, >>>>> GL_UNSIGNED_BYTE, data); >>>> >>>> You create QSGTexture instances from a GL texture id with >>>> QQuickWindow::createTextureFromId(). If your texture has special needs, >>>> you can also subclass QSGTexture and reimplement the pure virtuals. >>>> >>>>> >>>>> // how do I set data to the texture? >>>>> setTexture() >>>>> >>>>> free(data); >>>>> >>>>> The essential question right now is how do I set my custom texture data >>>>> to a texture? >>>>> >>>>> I have a Googled a lot about QSGSimpleTextureNode and QSGTexture but >>>>> couldn’t find any clear example on how to do this. >>>>> >>>>> Any thoughts? >>>> >>>> There are several examples that show how the scene graph APIs work in the >>>> qtdeclarative/examples/quick/scenegraph folder. That is the place to start. >>>> >>>> cheers, >>>> Gunnar >>>> >>>>> >>>>> Thanks, >>>>> >>>>> Nuno Santos >>>>> _______________________________________________ >>>>> Interest mailing list >>>>> [email protected] >>>>> http://lists.qt-project.org/mailman/listinfo/interest >>> >> > > _______________________________________________ > Interest mailing list > [email protected] > http://lists.qt-project.org/mailman/listinfo/interest _______________________________________________ Interest mailing list [email protected] http://lists.qt-project.org/mailman/listinfo/interest
