ATI的财宝箱

ATI的财宝箱

V0.1

Liker

 

      这是ati的一个开源demo,展示了一些d3d8.1的特性。这篇文章主要是我读代码时候作的笔记,由于我还是个初学者,所以如果有什么理解错误的地方还要请各位老大帮忙提出来。Demo和源码可以在http://www.ati.com/developer/Treasurechest.html找到。

 

流程框架

       是我们都很熟悉的d3d81Framework

While(1)

{

       Render3DEnvironment()

       {

              FrameMove()

              {

                     RenderSceneIntoCubeMap()

                     {

                            For(6)

                            {

                                   RenderScene(ReflectionCubeMap)

                                   RenderScene(DiffuseCubeMap)

                            }

                     }

              }

              Render()

              {

                     RenderScene( NORMAL )

              }

       }

}

 

 

场景组织

       Object主要分为两大类,一类是静止的相当于环境,包括墙地板门窗和箱子;另一类是活动的装在箱子里的(财宝^_^)。其中箱子由好几部分组成,金属部分可以反光,木头部分不行。需要说一下ButtonModeObjectManagement.cpp_15)这个结构:

typedef struct _ButtonMode

{

    int   x;

    int   y;

    DWORD object;

    DWORD objectEffect;

    char* objectTechnique;

    DWORD WoodEffect;

    char* WoodTechnique;

    DWORD MetalEffect;

    char* MetalTechnique;

    DWORD KeepEffect;

    char* KeepTechnique;

} ButtonMode;

 

       前两个是button坐标,之后分别是活动物体,木箱上的木头,金属,以及周围环境所用的effect filetechnique name。有些演示当中没有活动物体。这四项中每一项都可能有多个effect file,每个effect file中有多个technique

关于Cubemap

       将环境rendercubemap时需要把camera放在需要做环境影射物体的重心上。代码如下,当场景中只有chest的时候,它的重心是0, 2.5f , 0;其他情况时需要找活动物体的重心,这个时候的cubemap是围绕着活动物体的,所以在chest上会看到错误的反射。


ShaderDemo.cpp_323

if (m_pDisplayObject[0])

cameraPos = m_pDisplayObject[0]->GetWorldCenterOfGravity();

else

cameraPos = D3DXVECTOR3(0, 2.5f ,0);

matViewDir._41 = -cameraPos.x; matViewDir._42 = -cameraPos.y; matViewDir._43 =-cameraPos.z;

 

Pofmesh.cpp_407

m_centroid = (m_maxPos+m_minPos)*.5;

 

 

 

 

Normalizer

       Normalizer是一个cubemap,把需要normalize的向量用vsTexCoord的形式传到ps(或者是普通的pixel管道),sample出来的颜色值就是Normalize的结果,而且是Clamp0~1的,可以直接做dot3了。当然事先要做恐怖的precompute

 

 

 

节省带宽 or 节省指令

       TreasureChest里边使用了COMPACT_BUFFER顶点格式。为了节省带宽,把法线存成4byte的压缩格式(注意倒装……),同时仅仅保存了切线空间3basis的两条。然后在vs中解压缩,同时cross另一条basis。两者到底应该节省哪一个取决于不同的硬件。

PerVertex & PerPixel Cubemap

       我们很熟悉PerVertexcubemap,也很熟悉Perpixel的光照。跟光照很类似,perpixelcubemap也是用很少的顶点实现凹凸不平的效果,这次是反射。


(很光滑的金属)


(有花纹的金属)

 

其实已经有很多地方介绍过perpixel cubemap,不像perpixel lighting,这次好像只能在ps里做。

       Ps1.1~1.3中用texm3x3vspec这个凶猛的指令来计算反射光线。说它凶猛是因为它实在做了太多的计算。在1.4中又回到了dp3muladd的套路。大体上,我们需要在vs中把世界空间的basis变换到切线坐标[1],所以他们组成了从切线空间变换到世界空间的矩阵。之后我们把世界空间的vertex to eye向量保存在3basisw分量中(texm3x3vspec必需),然后在ps中,把从normal map取出来的法线变换到世界坐标,再与视线向量一起计算反射向量。这样就会有从凹凸不平的表面上反射的效果了。

      关于Perpixel cubemap,推荐参考NVEffectsBrowser中的Bump refraction

更精确的cube寻址

       Cube是靠一个世界空间的方向向量来寻址的,但是我们计算出来的反射向量都是从vertex出发,指向我们所希望采样的地方。采样的时候它被平移到cube的中心,很可能会指向不同的采样点。

       所以我们让反射向量加上一个从cube中心指向vertex方向的向量来计算精确的方向。这个方向向量要scale到某个特定的长度才能达到要求。

       Perpixel的时候把顶点的世界坐标传到ps,插值以后就可以跟vs一样了。

       ShaderX里边有详细介绍。这本书的电子版网上到处都是,真后悔买了纸版,555555555

Diffuse Cube Map

       CubeMap上保存的是多个光的叠加,它的好处是无论有多少个光源,只要一个pass,而且可以动态修改光源的个数。叠加的时候需要这样:

ZEnable = False;

AlphaBlendEnable = True;

SrcBlend = One;

DestBlend = One;

Bump Specular

       base*(ambient+N.L)) + (Gloss*Highlight)

       gloss保存在base texturealpha中,与N.H64次方相乘得到真正的specular

 

待续…



[1] 我们经常使用的将顶点从object space变换到world space的矩阵,其实就是世界坐标系的3basis在那个object space中的值,竖着排列为[x,y,z]

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐:加入 “特定曲风子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值