Gunnar,

I will run your debugging suggestions.

Thanks,

Regards,

Nuno

On 05 Nov 2014, at 17:39, Gunnar Sletta <gun...@sletta.org> wrote:

> 
> On 04 Nov 2014, at 23:20, Nuno Santos <nunosan...@imaginando.pt> 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 <gun...@sletta.org> wrote:
>> 
>>> 
>>> On 03 Nov 2014, at 17:15, Nuno Santos <nunosan...@imaginando.pt> 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
>>>> Interest@qt-project.org
>>>> http://lists.qt-project.org/mailman/listinfo/interest
>> 
> 

_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to