Render Monkey v1.82 基本使用方法

Render Monkey 是一个 shader 开发工具,免去了与具体 API 打交道的繁杂,使用者可以专心于 shader 的开发.

该软件貌似已经停止更新了,最终版本为 1.82,以下使用 DirectX ,且不包括 Artist 模式的使用方法.

打开RM,会看到界面包括菜单栏,工具栏, Workspace 窗口和 Output 窗口.工具栏上有许多按钮,鼠标停在上面会有提示信息,前两个是工作空间的打开保存,后四个是几个主要窗口的开关,再后面三个是 shader 的编译,后面的都是在 preview 窗口里对摄像机的操作模式,简单明了不多说.

首先新建个工程,在 Workspace 窗口里右键 Effect Workspace 选择 add Effect Group ->Effect Group w/ DirectX Effect. 软件会自动生成一个可运行的 Effect1. 单击名称按 F2 可以改名. 在右边会出现 preview 窗口,里面可以看到当前 Effect 的效果,这是一个球体的渲染效果,因为全是红的,所以看不太出来,用鼠标在 preview 窗口操作, 可以改变摄像机从而看到一些变化.

demo0

Effect1 有许多子元素,在 Pass 0 之上的为所有 pass 可以使用的资源.右键 Effect1, 弹出菜单里以 Add 开头的都可以向该 Effect 添加资源.我们首先看看自动生成的元素: matViewProjection, Stream Mapping, Model. matViewProjection 是一个软件自动生成的变换矩阵, 在 preview 窗口改变摄像机, 该矩阵也随之改变. 双击 Stream Mapping, 可以看到有 Position 通道, 还可以向其中添加其他通道如纹理坐标等,该元素告诉软件该如何向 shader 发送模型的信息. 右键 Model, 在弹出菜单里的 Change Model 里可以选择其他的 model 用于渲染, RM 附带了许多模型,假如选择 teapot, preview里就会出现该茶壶的形状.

下面是 pass 0, 每个 pass 都要有一个 model, 一个 vertex shader ,一个 pixel shader, 一个 Stream Mapping. 其中 model 和 Stream Mapping 都是 reference, 指向前面添加的某个元素,在右键菜单 Reference Node 里可以选择.双击 shader 元素可以打开 shader 编辑窗口,该窗口里可以在 shader 间快速切换,若修改了 shader, 要对其进行编译才可以反映到 preview 窗口,若 shader 编译失败, Output 窗口会显示相关的信息. 编译可以按快捷键 F7 或使用工具栏上的按钮.右键 Effect1 可以添加其他的 pass.注意 pass 的渲染顺序与名称无关,而是从上到下的.

下面我们删掉 Effect1 的所有子元素从头开始创建一个简单的例子.

  1. 右键 Effect1, 选择 Add Variable -> Matrix -> Predefined -> matViewProjection.
  2. 右键 Effect1, 选择 Add Texture -> Add 2D Texture -> …\Examples\Media\Textures\Fieldstone.tga.
  3. 右键 Effect1, 选择 Add Stream Mapping. 双击 Stream Mapping, 单击 Add, 选择新添加的 Usage 为 TEXCOORD.点击 OK.
  4. 右键 Effect1, 选择 Add Model -> …\Examples\Media\Models\Teapot.3ds.
  5. 右键 Effect1, 选择 Add Pass. 删掉 Pass 0 下的所有元素.
  6. 右键 Pass 0, 选择 Add Model Reference -> Teapot.
  7. 右键 Pass 0, 选择 Add Stream Mapping Reference -> Stream Mapping.
  8. 右键 Pass 0, 选择 Add Vertex Shader -> DirectX HLSL.
  9. 右键 Pass 0, 选择 Add Pixel Shader -> DirectX HLSL.
  10. 右键 Pass 0, 选择 Add Texture Object -> Fieldstone.
  11. 双击 shader 节点打开编辑器,将 vs 修改如下:
float4x4 matViewProjection;

struct VS_INPUT 
{
   float4 Position : POSITION0;
   float2 Tex: TEXCOORD0;
};

struct VS_OUTPUT 
{
   float4 Position : POSITION0;
   float2 Tex: TEXCOORD0;
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;

   Output.Position = mul( Input.Position, matViewProjection );
   Output.Tex = Input.Tex;

   return( Output );

}

ps修改如下:

sampler Texture0;

float4 ps_main(float2 tex : TEXCOORD0) : COLOR0
{   
   return( tex2D(Texture0, tex) );

}

按 F7 编译,若不出错,在 preview 窗口可以看到如下结果:

demo

下面在上面例子的基础上,介绍 Render Target 的使用方法.

右键 Effect1 ,选择 Add Texture -> Add Renderable Texture, 新添加了一个默认名称为 renderTexture 的元素. 双击该元素打开一个对话框,勾选 Use viewport dimentions ,这样 render target 的大小就会自动保持和视口一样的大小.

右键 Pass 0, 选择 Add Render Target -> renderTexture.这样就不会渲染到视口,而是渲染到 renderTexture 中了.

右键 Effect1, 选择 Add Pass, 新建了一个 Pass 1.

右键 Effect1, 选择 Add Model -> …\Examples\Media\Models\ScreenAlignedQuad.3ds. 该模型就是一个正方形,顶点的xy坐标为 1 或 -1. 这样就不用进行投影变换,始终占据整个视口.

右键 Pass 1的 Model, 选择 Reference Node -> ScreenAlignedQuad.

右键 Pass 1, 选择 Add Texture Object -> renderTarget. 将渲染好的纹理应用到模型上去.

右键 Pass 1, 选择 Add Render State Block. 双击, 在打开的对话框中将 D3DRS_CULLMODE 一项改为 D3DCULL_NONE.

右键 Effect1, 选择 Add Variable -> Float -> Predefined -> fInverseViewportWidth.

右键 Effect1, 选择 Add Variable -> Float -> Predefined -> fInverseViewportHeight.

修改 Pass 1 的 VS 如下:

float fInverseViewportWidth;
float fInverseViewportHeight;

struct VS_OUTPUT 
{
   float4 Position : POSITION0;
   float2 Tex: TEXCOORD0;
};

VS_OUTPUT vs_main( float4 Position : POSITION0 )
{
   VS_OUTPUT Output;

   Output.Position = Position;
   Output.Tex.x = (Position.x + 1 + fInverseViewportWidth) * 0.5;
   Output.Tex.y = (-Position.y + 1 + fInverseViewportHeight) * 0.5;

   return( Output );

}

PS 与 Pass 0 的相同.

渲染结果与上面的相同.