[Qt-interest] QGL2PaintEngineEx vc QGLContext

John Clayton john_clayton at me.com
Thu Dec 10 18:29:46 CET 2009


> John Clayton wrote:
>> Hi All
>> From testing - I notice that drawing a texture to my GL surface (on  
>> a  Mac, using 4.6.0, in a QGraphicsItem paint() method) can be done  
>> in  two different ways.
>> Method 1 - use QPainter->drawImage(QRectF, QImage)
>> or
>> Method 2 - use QGLWidget->drawTexture(QRectF, int, int)
>> Method 1 works perfectly in my case, and looking at its code it is   
>> using the new Qt4.6 opengl code.
>> Method 2 fails to draw anything (it used to work in 4.5.3), and  
>> the  code to draw looks *totally* different compared with Method 1.
>> So, how can I use Method 1 to draw - given that i have a texture  
>> ID.   My requirement is to draw textures into a QGraphicsItem, and  
>> QGLWidget-  >drawTexture() appears to fit the bill - but it doesn't  
>> draw anything  (unless I call beginNativePainting first - but that  
>> wipes out the  clipping path).
>> Is there a way I can use the QPainter based method to draw textures?
>> Thanks
>> --
>> John Clayton
>> Skype: johncclayton
>
> For the modelview and projection matrices to be set up as you would  
> expect you need to call beginNativePainting() in 4.6. How the GL  
> paint engine handles clipping is an internal detail, it might use  
> the depth buffer, stencil buffer, or a different approach, so we  
> don't want to expose that through beginNativePainting(). Instead you  
> should manually make sure to paint within the clip path, or ideally  
> simplify your graphics item so it only uses a rectangle clip (path  
> clips are more expensive in any case).
>

How can I manually ensure that? Isn't the whole point of the clip path  
the fact that I *dont* need to manually ensure this kind of thing  
while drawing?  I can draw, it gets clipped - that's [I hope] what the  
API guarantee was/is supposed to be.  But; do tell me if I read the  
docs wrong or am assuming to much here.

> There _is_ a drawTexture call in QGL2PaintEngineEx (which you can  
> get by static_cast<QGL2PaintEngineEx *>(painter->paintEngine()) if  
> the paint engine's type function returns QPaintEngine::OpenGL2, but  
> it's internal private API, so you shouldn't use it unless you're  
> prepared that it might break in any future release. For now  
> QGLWidget::drawTexture() is the only supported way to go, but it  
> doesn't regard the current painter's state as you've noticed.
>

I'm missing something - what do you mean the drawTexture( )  
disgregards the painter state - isn't the painter state simply a copy  
of the GL state?  Hang on; are you saying that the methods used to  
draw a texture via QGLWidget bypass the painter state used to hold the  
clipping region?  Putting two & two together from what I've read of  
the code so far - the clipping stuff looks like it is implemented in  
4.6 as shader/vertex programs - and I'm not sure how that interacts in  
the render pipeline is one just renders a texture ala  
QGLWidget::drawTexture() - so is that why if I render with QGLWidget  
the entire texture surface is rendered, whereas the QPainter based  
routines are combining rendering of a texture with the already  
constructed shader/vertex code and thus honour clipping?

> We might get some better options for using OpenGL in graphics items  
> in the future, potentially through the (currently in research) Qt/3D  
> project:
> http://labs.trolltech.com/blogs/2009/11/18/qt3d-brings-qt-style-coding-to-3d/
>
> --
> Samuel

I did some more digging, and now I have a concrete error to work  
with.  During the QGLContext::drawTexture() call - the glBindTexture(



More information about the Qt-interest-old mailing list