战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

最近翻出很早之前自己写的一套使用Direct3D 9  Effect系统的纯shader 3d引擎,打算使用最新技术重写。重写的主要修改在于:

1. 去掉Effect系统,改用HLSL + 渲染脚本

2. 优化渲染接口,使用材质统一shader和渲染状态

随即参考了DirectX SDK的Graphics部分文档:DirectX9 时代的Effect系统纯粹只是一个HLSL的简单渲染脚本实现,除了DXUT,FXComposer等极少程序使用这套东西外,大型的引擎很少使用这种半成品系统。到了DirectX10甚至11,因为架构更改,去掉固定管线,因此Effect成为较为高效和便捷的渲染脚本,如果不是要求较高的3d引擎,一般的游戏使用DirectX10的Effect渲染脚本还是很不错的。

DX10的fx脚本与DX9的差异在于

渲染状态,采样器状态等都变为对象,并与API高度统一

在脚本与API中均可以设置

DepthStencilState EnableDepth
{
    DepthEnable = TRUE;
    DepthWriteMask = ALL;
    DepthFunc = LESS_EQUAL;
};

BlendState NoBlending
{
    AlphaToCoverageEnable = FALSE;
    BlendEnable[0] = FALSE;
};

technique10 Render
{
    pass P0
    {

        SetDepthStencilState( EnableDepth, 0 );
        SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
    }
}

本人觉得,这样的设计让图形API更为敏捷与归类化,另外,也便于StateManager或者自己做渲染状态转移及差异比较时更为高效

 

Vista操作系统推出很久后,DX10的显卡也占有了大量的市场份额。但是由于DX10仍然是一个过渡API(类似于DX8),因此,很多3D游戏要么仍然支持DX9,要不然即支持DX9也支持DX10,甚至DX11.

   看博客上有达人组团编写类似DX10接口和系统的软渲染,DX10的设计是优秀的。因此,在DX9 HLSL基础上,结合自己编写的渲染脚本会是非常好的选择。

    渲染脚本我的设计思路是这样的:

1. 只是一种预处理脚本,并非实时运行脚本。

编译器将文本解析后,转化为一些运行指令,比如:本pass使用一块小纹理,下一pass的target是这个纹理,并且开启哪些渲染状态。

2. 自定义格式的解析脚本。

使用lua,python等脚本其实也是可以的。但是在出现错误时,报出的错可能会让不熟悉这个脚本语言的人莫名其妙。

使用松鼠sq脚本语言?可惜其在lua基础上,对table的slot初次赋值时必须使用<-而不是统一使用=,因此会让你的脚本稀奇古怪

XML脚本? XML可以避免复杂的语法检查,写完就是归整的,但也是罗嗦的,本来Texture[2]可以表达完毕的,非要<Texture index = 2/>来罗嗦下。

OGRE的compositor脚本和材质脚本就是自己解析的,不过出乎预料的使用了BNF范式这类较为正规的方法。这就是说,需要先解析BNF表达式,然后再输入脚本解析,编写过程和系统复杂度会变得异常复杂。

最终选择还是使用自己解析的脚本,使用一些具体代码结构来替代BNF这类高深的东西

决定以后,下一步需要制定渲染脚本具体各部分及制作过程

1. 基本lexer

   从文本得到各种token

1. 渲染状态对象

   照着DX10抄就好

2. Shader导入口

     shader文件来自于何处,入口怎样定义

3. 渲染脚本VM及指令

  决定一个纹理怎样设置,RenderTarget怎样使用等的指令

posted on 2010-02-15 23:18 战魂小筑 阅读(2393) 评论(0)  编辑 收藏 引用 所属分类: 脚本技术渲染 Shader 引擎

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理