查看: 1928|回复: 11

对场景进行灰度化

[复制链接]

该用户从未签到

发表于 2010-10-13 15:50:11 | 显示全部楼层 |阅读模式
我想在程序中实现一个功能,用户通过滑条控件拖拽,实现场景渐渐的变成灰度化的效果,就如同彩色电视机调整饱和度一样。
对图像的灰度化之类倒不是问题,以前我们做过许多图像分析处理的东西。

现在的问题是,我如何实现对场景进行灰度化呢?
最开始我以为使用颜色矩阵可以完成,后来发现那功能好像是专门针对像素操作才有效,比如glDrawPixel之类的东西。我只能放弃。

现在我使用GLSL来做这个事情,在GLSL中,只要指定合适的颜色值给gl_FragColor就够了。
但是现在问题有来了,我的3D场景事实上是非常复杂的,里面有大批量的模型、光照、雾效等等,而且多数模型还具备纹理,少数模型都存在多重纹理结构。那么我如何在GLSL中的片元处理器中指定gl_FragColor的值呢?

简单来说,我期望得到灰度化处理的起点颜色值,才能对这个起点颜色值进行灰度化,才能赋值给gl_FragColor。

该用户从未签到

 楼主| 发表于 2010-10-13 15:51:35 | 显示全部楼层
或者说,我这种需求,使用GLSL根本就是个错误的方向?

该用户从未签到

发表于 2010-10-13 16:28:14 | 显示全部楼层
呃,我不确定我正确理解了你的问题没有,但你要找得是不是顶点的颜色,gl_Color?

该用户从未签到

 楼主| 发表于 2010-10-13 16:34:49 | 显示全部楼层
顶点的颜色我的确可以在顶点处理器中访问,就是gl_Color。但是,若这个物体带有纹理,那么gl_Color中的值就不能代表这个物体渲染出来的颜色了。或者说,这个物体处于光照、雾效、多重纹理混合的状况下,gl_Color的值就更不能代表顶点的颜色了。

这里,我要的是:“假如场景不经过片元处理器,渲染出来的将是什么颜色”

该用户从未签到

发表于 2010-10-13 17:10:20 | 显示全部楼层
我对shader是不甚了了,不过我觉得如果只是纹理跟雾效的话,3Dlabs的ShaderGen应该就可以给出您需要的shader.
跟您一起等明白人来讲解

该用户从未签到

发表于 2010-10-13 17:14:40 | 显示全部楼层
“大批量的模型、光照、雾效等等,而且多数模型还具备纹理,少数模型都存在多重纹理结构”
首先您需要在GLSL中实现这些所有的过程,这些都是可编程管线中所需要自行编写的;这之后只要对结果的像素值进行灰度化即可

如果您感觉自己不能胜任这些效果在可编程管线的实现工作,另一个偷懒的方法是把场景先RTT渲染到一个正好覆盖整个屏幕的四边形上,然后对这个四边形简单地处理即可——这也是多遍渲染的基本概念

该用户从未签到

发表于 2010-10-19 14:27:10 | 显示全部楼层
我原来做过一个东西 也是需要整个修改场景中的颜色 我的方法和楼上ARRAY的方法比较类似,只是我更加懒,只是在视点前面直接加载矩形,相当于Zbuffer一样,呵呵 把所有的场景挡住,就可以 了 可以设置矩形的颜色和透明度什么的 就可以了、。。。。

该用户从未签到

 楼主| 发表于 2010-10-20 17:42:13 | 显示全部楼层
“大批量的模型、光照、雾效等等,而且多数模型还具备纹理,少数模型都存在多重纹理结构”
首先您需要在GLSL中实现这些所有的过程,这些都是可编程管线中所需要自行编写的;这之后只要对结果的像素值进行灰度化即可 ...
array 发表于 2010-10-13 17:14


显然我不可能在glsl中手动进行所有的纹理、光照等等计算,那要考虑的条件分支实在是太多,场景中的模型是多样的,并且是不可预期的。笼统的说,只要是OpenGL可以渲染出来的模型,在我们的场景中都可能存在。

我只能选择后者,将场景渲染到一张纹理图片上,然后将纹理图片贴到一个矩形上面,仅仅拦截这个矩形的渲染。不过老板觉得流程比较曲折,暂时先不要做。

该用户从未签到

发表于 2010-10-21 08:27:43 | 显示全部楼层
将场景渲染到纹理,处理后再输出的办法是目前实现多遍渲染的通用流程——诸如游戏中常见的godray,hdr,ssao等都是通过这一方式实现的

该用户从未签到

 楼主| 发表于 2010-11-2 10:05:45 | 显示全部楼层
已经这么实现了。为了兼容我们的项目,派生了CompositeViewer和osgViewer::View。
整体思路就是先渲染到纹理,然后将此纹理贴到一个HUD的板子上面,程序保证这个HUD总是覆盖整个窗口……反正搞了上千行代码

该用户从未签到

发表于 2010-11-2 11:04:04 | 显示全部楼层
学习下!!!

该用户从未签到

发表于 2010-11-2 12:35:40 | 显示全部楼层
10# yin_savage

Really?如果只是您所描述的这些功能,我想不超过100行代码就搞定了;我就使用这种办法实现HDR渲染效果的~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表