PDA

View Full Version : beginNativePainting() with QPainter's shader (for transformation and opacity purpose)



diro
6th September 2011, 09:38
I created a object inherited from QGraphicsItem and reimplement the paint() function.
Inside the paint() function, I draw something by QPainter and call painter->beginNativePainting() to draw some elements with native openGL command.
It all works well, but when I rotate the object( object->rotate(45)), only the elements drawn by QPainter is rotated, the elements drawn by openGL command doesn't work.
It seems the QPainter use the shader to do those transformation(rotate), how can I apply the shader to my openGL elements?

Sample Code:

class MyItem:public QGraphicsItem
{
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->drawText(0, 0, "123");
painter->fillRect(0, 0, 128, 128, Qt::green);
painter->beginNativePainting();

glEnable(GL_SCISSOR_TEST);
glScissor(0, 0, 64, 64);

glClearColor(1, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);

glDisable(GL_SCISSOR_TEST);

glEnd();
painter->endNativePainting();
}
QRectF boundingRect(void) const
{
return QRectF(0, 0, 100, 100);
}
};

UASlaX
6th September 2011, 12:30
I think, you need to use glRotate function and Qt rotate ( if you paint something with QPainter ).

diro
7th September 2011, 02:54
I think, you need to use glRotate function and Qt rotate ( if you paint something with QPainter ).
Yes, I know this. But there may have some other transformations, if I call glRotate manually, it would be complexity. So, I am wonder if I could apply the shader in QPainter :)

wysota
7th September 2011, 23:21
What happens if you don't call beginNativePainting() at all?

diro
8th September 2011, 03:23
What happens if you don't call beginNativePainting() at all?
Explain it clearly, the QPainter's drawing function all works well with transformation. But the elements drawn by gl command (follow by beginNativePainting()) won't be affected by the transformations.

wysota
8th September 2011, 11:43
Ok but what happens if you don't use beginNativePainting() and just start making gl calls?

diro
9th September 2011, 03:16
Ok but what happens if you don't use beginNativePainting() and just start making gl calls?
Oh, I got you! I have trace into the beginNativePainting() function, and it will call glUseProgram(0) to unload the shader program.
But I have two questions about don't use beginNativePainting() before gl calls:
1.Will it cause any side-effect? If not, why Qt design this function?
2.Because I use shader program, too. Could we have two program at the same time?

Anyway, really thanks for your suggestion :-)

wysota
9th September 2011, 10:06
1.Will it cause any side-effect?
I don't know, make an example and find it out on your own. I don't even know if it works at all.

diro
9th September 2011, 10:18
I don't know, make an example and find it out on your own. I don't even know if it works at all.
After some testing..
1.Will it cause any side-effect? If not, why Qt design this function?
Not sure, but the projection seems wrong, the elements didn't draw in the position I wanted.

2.Because I use shader program, too. Could we have two program at the same time?
Yes, I still can use my own shader program.

Finally, I give up this way and solve this problem by my own transformation matrix.

diro
13th September 2011, 03:04
I think I have to apology first, after many study and experiments, I got a new conclusion now.
For Qt painting framework, after calling the beginNativePainting(), the following gl commands will be affected by the shaders constructed by Qt(all transformation of coz)
So, you don't have to do anything, and all the elements drawn by gl commands will also be rotate, flip and so on.

The code I made in previous edition, I use some custom projection in openGL, so it looks like the previous shaders is not enabled, it is a wrong concept.