QOpenGLFramebufferObject目前无法支持阴影映射,必须使用原生的算法实现



  • 现在已经有人实验过了,QOpenGLFramebufferObject这个类无法实现阴影映射效果,即使系统支持浮点型纹理。因为Qt无法让我们访问深度纹理的ID,或者让我们设定深度纹理,相反,它返回给我们的是GL_RGBA类型的纹理,这样不是正确的返回方法。所以我们的解决办法是:

    1. 使用原生的OpenGL语句实现相同的效果;
    2. 修改Qt的源代码增加接口来实现这样的效果,这个难度较大,还要重新编译Qt;
    3. 引入Qt源代码的qopenglframebufferobject_p.h文件,新增helper类,实现返回纹理ID,但是这个绑定的是特定版本的Qt,如果以后API改变了,就容易出错。所以也不是很容易的事儿。

    具体代码可以参考stackoverflow里面的:这里
    还有一个建议,需要重新构造QOpenGLFramebufferObject的API,新增接口来实现:这里

    补充:
    这里给出我今天实现的阴影映射效果图:
    0_1478597828513_upload-2c38ff25-f286-41b4-b7a8-247154cf1358



  • 请问能分享一下代码您的阴影映射效果的代码吗?

    万分感谢





  • @jiangcaiyang 请问楼主:
    我在调查Qt与Osg结合,使用FBO的离屏渲染。结果osg添加阴影的时候就显示异常了。怀疑就是您这个帖子上所讲。

    opengl不太懂,osg只提供了一个frame()渲染函数。我该如何解决这个问题?



  • @tuange OSG这块儿是否觉得框架过大?我直接使用OpenGL进行渲染的,感觉还行。OSG由于框架过大以及移植性受限(不像Qt那样可以跨移动和嵌入式平台),我没有予以采用。我现在是自己研究的一套框架来实现我们的动画以及其它功能的。



  • @jiangcaiyang osg这块公司积累了挺长时间了,目前我主要是在PC上使用,暂时没有考虑跨平台。
    我现在主要在研究如何把OSG跟QQuickItem结合。所以用到了QOpenGLFramebufferObject。
    这边因为osg提供了一个frame()绘制函数,所以osg渲染并不复杂。贴一下代码吧:
    qtRenderFbo->bind();
    qtOpenGLfunc->glViewport(0,0,size.width(),size.height());

        osgViewer->frame();
    
        qtOpenGLfunc->glFlush();
        qtRenderFbo->bindDefault();
        QOpenGLFramebufferObject::blitFramebuffer(qtDisplayFbo,qtRenderFbo);


  • 问题在于osg一加阴影就黑屏。怀疑如你帖子上所说,返回的不是正确的深度纹理的ID。该怎么解决啊



  • @tuange 不用Qt的函数。直接使用OpenGL的API来获得纹理的ID。



  • @tuange 难道你就是那个在Android上用OSG+Qt然后说坑得不行的人:bow_tone4:



  • @MidoriYakumo Qt结合QSG再上Android,肯定要解决很多技术问题吧。还有一般Android可能带不动呢。


登录后回复
 

与 萌梦社区 的连接断开,我们正在尝试重连,请耐心等待