RenderSystem负责场景的绘制。 TinyRenderEngine目前实现了基于D3D10的绘制系统。 绘制系统其实就是一个状态机。 我们先设置好图形管线上的状态,包括rasterizer state,blend state,depthstencil state等, 然后往图形管线上发送绘制任务。有新的绘制任务时,可能需要重新设置管线上某些state的值。 整个绘制系统的工作流程就是: set state -> draw -> set state -> draw -> ... 在TinyRenderEngine中, 用一个绘制上下文类(RenderContext)来定义图形管线的状态。 所有的绘制任务都按RenderContext来分组绘制,拥有相同RenderContext的绘制任务属于同一个组并会一起绘制,这样可以尽可能的减少state重新设置的次数。这样的每一个组是一个RenderTask。 下面详细介绍RenderContext和RenderTask里有什么东西:
RenderContext: RenderContext里主要有以下一些成员
1) 优先级:定义了绘制任务的优先级,绘制任务按优先级高低来进行绘制,以保证图像的正确
2) RenderTarget(s):用来存放绘制图象的缓存,就像绘画中的画布一样。 RenderTarget可以是一个窗口(RenderWindow), 也可以是一
张Texture。 如果是窗口,那么我们绘制的东西通常会在屏幕显示出来,如果是texture, 那么绘制的东西作为一个texture(可以在后面
的绘制中应用)。 我们可以在一次绘制(draw call)中同时绘制到多个RenderTarget上
3) RasterizerState: Rasterize stage 的状态,包括FillMode,CullMode等. 它是对ID3D10RasterizerState的抽象.
4) BlendState:位于OM stage, 包括blend相关的state,以及write mask等。 它是对ID3D10BlendState的抽象
5) DepthStencilState:位于OM stage, 包括depth test,stencil test 等。 它是对ID3D10DepthStencilState的抽象
6) Effect:Effect 是对D3D10中ID3D10Effect的抽象,他从一个.fx 创建出来,包括Shader,Technique,Pass 等,它还可以包括
state,texture sampler以及一些其他的参数。 通常通过Effect(编辑.fx)来实现各种视觉效果
7) Texture/Sampler: 目前还没加入Texture支持。 Texture在真实感绘制中是不可或缺的。很多逼真的效果都是通过texture mapping来
实现的
8) 其他:比如Viewport
RenerTask:每个RenderTask是在某个RenderContext下的一组绘制任务的列表。 这里的绘制任务是最小的绘制单位(RenderOperation),可以和SubMesh对应起来。RenderTask包含了以下东西:
1) RenderContext 引用:指定了在什么RenderContext下绘制
2) RenderList: 绘制任务列表,每个绘制任务是RenderOperation,它包含了VertexData,IndexData(如果用到index buffer)和用到的材
质等
一个简单的render cycle大概是这样的:
RenderSystem 提供的接口:
1) 创建RenderTarget (RenderWindow/RenderTexture)
2) 创建 render state(RasterizerState/BlendState/DepthStencilState)
3) 创建 Effect
4) 创建 RenderContext
5) 绘制