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. 

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