Husman

人は夢見る ゆえに生きるもの
posts - 14, comments - 37, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2013年4月5日

tonemapping可以说是影响HDR最终质量关键因素之一。
这里略去HDR基本流程,这个可以在网上很容易找到,我这里只简单说一下网上没有的东西。
细心观察"HDR Lighting sample" in DirectX 9.0c SDK,会发现sample上的暗区的细节保留不够,而亮区部分又感觉有点过曝。
我在此基础上做了些修改,色调映射用了
Exponential tone mapping算法
公式:color  = 1 - exp( -Exposure * color )
在tone map之前先对场景的低亮度区域做对比度调整,color = pow(color, k1+Lum*k2);
这里k1,k2是两个可以在shader上调整的参数。
Exposure = MiddleGray / Lavg,归一化后就是1/(1+Lavg/MiddleGray),MiddleGray我们通常设成0.18,1/MiddleGray大概等于6
简化后这个公式就是Exposure = 1/(1 + 6 × Lavg)× K,K是一个可以调节的参数
Vignetting暗角可以通过采样边角饱和度低的灰度纹理实现。
代入tone mapping公式就变成
color  = 1 - exp( -Exposure * color * Vignetting )

DXsample中的效果:


改进之后的效果:


可以看到改进后暗部细节表现的更加细致,亮部也没有过曝,四周也呈现了一定的晕影

参考文献
http://megapov.inetart.net/manual-1.2/global_settings.html#film_exposure
http://filmicgames.com/archives/75
http://freespace.virgin.net/hugo.elias/graphics/x_posure.htm
"HDR Lighting sample" in DirectX 9.0c SDK

posted @ 2013-04-05 15:07 Husman 阅读(5304) | 评论 (1)编辑 收藏

2012年8月30日

     摘要: 研究了OGRE渲染框架,发现OGRE还是比较传统和通用的引擎框架,结合自己的一些经验,对于他的优化提了一些个人见解,仅供同学们参考。  阅读全文

posted @ 2012-08-30 03:47 Husman 阅读(2223) | 评论 (0)编辑 收藏

2011年12月1日

     摘要: 1个pass+MRT,在PS中实现Diablo3的描边效果  阅读全文

posted @ 2011-12-01 12:02 Husman 阅读(1299) | 评论 (2)编辑 收藏

2010年10月5日

     摘要: 轨迹跟踪条是由一串Billboard组成的,每个Billboard在轨迹跟踪条里面可以认为是一个元素。我在游戏中试过,一般12个元素就已经很完美了。
每个元素就是一个点,元素不是顶点缓存中的点,顶点缓存中的点是通过观察点和相邻两个元素连成的线做叉积算出来的。
update的时候根据被跟踪点的位置,计算每个元素的位置,从轨迹跟踪条链的头部开始比较,如果紧挨着的元素与被跟踪点的距离大于元素的长度的时候,需要更新头部的位置,有了这个更新,轨迹条就有了拐弯的效果,然后再往链条上面加一个元素,这个元素就是下一次循环的头部。
render的时候算出垂直线后就在其两边各放一个点,就成为Billboard的两个顶点,遍历所有元素,可以算出所有Billboard的顶点。
还有一点,orgre的轨迹条贴图的时候是一个Billboard贴一个纹理,而wow是所有的轨迹条对应一张纹理,所以要做出wow效果的轨迹条需要修改纹理坐标的计算方式。wow的轨迹条纹理有颜色渐变的效果,可以看到轨迹的尾部颜色淡一点。  阅读全文

posted @ 2010-10-05 17:00 Husman 阅读(707) | 评论 (0)编辑 收藏

2010年10月4日

     摘要: CEGUI的tooltip有点像windows的tooltip会做fadein,fadeout动作,而且显示的位置也不能自定义,要做成wow风格的tooltip需要对他进行修改。对应的FalagardTooltip也需要修改,FalagardTooltip的修改量不大,FalagardTooltip主要用来绘制,由控件调用,cegui这样做目的是把控件的逻辑和绘制分开来写了,Falagard通过looknfeel的配置绘制控件。  阅读全文

posted @ 2010-10-04 16:25 Husman 阅读(2414) | 评论 (4)编辑 收藏

2010年7月12日

     摘要:   阅读全文

posted @ 2010-07-12 14:20 Husman 阅读(5001) | 评论 (17)编辑 收藏

2009年6月5日

见上篇博客,由于计算水面的第一层纹理坐标的算法错误,导致相邻纹理拼接的时候出现了裂缝。
现在错误已修正,最终效果图如下:



posted @ 2009-06-05 09:51 Husman 阅读(1728) | 评论 (4)编辑 收藏

2009年6月3日

高度图动态生成的地形,其水平面的三角形列表可以用“填充”算法得到。在低配置机器下,水波的生成可以用动画纹理的方法,水的深浅可以用第二层纹理的alpha值表示,越浅的地方alpha值越小,水的深度值很容易计算出来,深度=水平面高度 - 当前网格的高度值。天龙的水面的生成就是用了上述的方法。
现在我的算法中还有一点瑕疵,如红线圈出来的地方,网格间存在比较明显的接缝。
下面放一张截图:

posted @ 2009-06-03 15:17 Husman 阅读(1354) | 评论 (2)编辑 收藏

2009年5月25日

天龙八部的粒子脚本文件是1.4版的,在1.6版的ogre下不能使用,需要子粒子名称前加上“particle_system”,
下面的代码可以对低版本的粒子脚本进行升级。以下代码在vs2005下调试通过。
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include "OgreStableHeaders.h"

using namespace Ogre;

int _tmain(int argc, _TCHAR* argv[])
{
    Ogre::String filename 
= "d:\\all.particle";
    std::ifstream fp;
    fp.open(filename.c_str(), std::ios::
in | std::ios::binary);
    DataStreamPtr stream(OGRE_NEW FileStreamDataStream(filename, 
&fp, false));
    std::ofstream outfile(
"d:\\all2.particle");
    
/* Process the file line for line */
    String line;
    StringVector buf;
    
while (!stream->eof())
    
{
        line 
= stream->getLine(false);
        buf.push_back(line);

        
if (line.find("quota"!= String::npos)
        
{
            String s1 
= buf.back();
            buf.pop_back();
            String s2 
= buf.back();
            buf.pop_back();
            String s3 
= buf.back();
            buf.pop_back();

            buf.push_back(
"particle_system " + s3);
            buf.push_back(s2);
            buf.push_back(s1);
        }

    }


    
for (size_t i = 0; i < buf.size(); ++i)
    
{
        outfile 
<< buf[i] << std::endl;
    }

    outfile.close();

    
return 0;
}

posted @ 2009-05-25 17:51 Husman 阅读(1422) | 评论 (1)编辑 收藏

2009年5月22日

天龙八部的model文件,一般包含有帧动画,其实可以把天龙的frame看成一种骨骼,只是在skeleton的基础上做了些修改,frame上可以读到bone节点,bone以层级的形式组织,model里的mesh格式需要按照bone的层次关系加到节点上,frame文件里有一个[auto]的动画作为源动画,根据这个源动画创建一个目标动画,通过NodeTrack->NodeAnimationTrack->TransformKeyFrame这样信息复制流程,就能在场景上表现动画效果。下面是其中一幅截图:

posted @ 2009-05-22 11:30 Husman 阅读(2446) | 评论 (3)编辑 收藏