[Qt-interest] GLSL and two semi-transparent textures

Samuel Rødal samuel.rodal at nokia.com
Wed Aug 11 14:05:49 CEST 2010


On 08/10/2010 11:16 PM, ext Josiah Bryan wrote:
> Hello, everyone!
>
> Odd problem here - I'm using a QGLWidget and GLSL vertex shaders to draw
> live video captured via V4L2 into OpenGL textures. I've used the shaders
> from QPainterVideoSurface from the QtMultimedia module by bashing
> together code from QPainterVideoSurface and the
> qt/examples/opengl/textures example.
>
> It works great! High FPS, low latency - very quick. (Less than 10ms
> latency from the moment we capture a frame till it's finished rendering
> in the paintGL() function. Not bad.)
>
> Just one problem - When I draw two textures, one over top of the other
> (think a PiP), and the top (pip) has an alpha channel (say, the Qt cube
> logo from the pbuffers examples), the qglClearColor shows thru in the
> transparent areas of the top texture, NOT the bottom texture!
>
> Screen shot of the problem here:
> http://corp.productiveconcepts.com/dropbox/TextureSnapshot.jpg
>
> (qglClearColor is Qt::green - the green you see surrounding the qt loog.
> The blue in the snapshot is the 'no signal' color from the video capture
> card at /dev/video0 - two different textures. The green background to
> the Qt logo *should* just show the same blue as the rest of the window.)
>
> The drawing method begins here:
> http://code.google.com/p/dviz/source/browse/trunk/src/glvidtex/glwidget.cpp#602
>
> The shader being used to draw the overlay (PiP texture) is here:
> http://code.google.com/p/dviz/source/browse/trunk/src/glvidtex/glwidget.cpp#63
>
> And, yes, GL_BLEND is enabled - the qt cube logo does properly blend
> with the background - just the wrong background! It uses the clear
> color, not the underlying texture. See here for the glEnable call:
> http://code.google.com/p/dviz/source/browse/trunk/src/glvidtex/glwidget.cpp#1045
>
> I thought it might have something to do with depth testing, or the Z
> value of the textures, so I set that up properly, enabled GL_DEPTH_TEST,
>    set glDepthFunc, and added a Z component to the vertex buffers used in
> the paint method starting on line 602 - that didn't help at all. Same
> exact outcome.
>
> Any suggestions on what I'm doing wrong or how I can get the overlay to
> blend with the texture behind it instead of the clear color?
>
> Thanks!
> -Josiah Bryan
>

I'd say try to make sure depth testing is completely disabled. If you 
just want to paint two textures on top of each other you don't need it. 
It might be that the z values from the last frame are left in the z 
buffer causing the bottom texture to not be painted in that area.

--
Samuel



More information about the Qt-interest-old mailing list