原帖地址:
http://school.ogdev.net/ArticleShow.asp?id=5552&categoryid=5编译你的shaders现在我们已经输入了我们的顶点shader,对每一个shader开发人员来说,接下来要做的事情就是编译它以确定它是否正确。要编译它,点击主工具栏中的提交改变按钮(图标为:
)。你也可以用快捷键(F7)来开始编译。这将编译所有工作区中经过修正的shaders,然后将编译结果输出到输出窗口。
输出窗口输出窗口是一个可停靠的窗口,它通常位于主用户界面底部(见图18)。该窗口用于输出shader的编译结果和不同应用程序的一些文本信息。输出窗口与shader编辑器链接用于高亮显示编译错误。
图18 输出窗口
一旦你点击了提交改变按钮,如果shader中有错误,他们将被显示在输出窗口。点击提交改变按钮不仅编译当前的shader,它还将存储shader代码的改变。还有就是,提交改变将应用到所有别改变的打开的shaders。在输出窗口中双击一个错误将打开一个纠正窗口并且高亮显示有错误的行(见图19)。如果你改变了shader的文本然后没有提交就想关闭窗口,RenderMonkey将询问在关闭窗口之前是否提交改变。
图19 HLSL shader 中的编译错误
编辑汇编
尽管我们这个练习中没有用到汇编sahders,还是让我们认识一下怎样编辑汇编shaders。汇编shader编辑器窗口有两个窗格扣组成——上面的窗格用于绑定RenderMonkey的变量节点到shader的常量寄存器中,下面的窗格用于编辑汇编shader文本。下面是汇编shader编辑器窗口的快照(如图20)
图12 汇编语言编辑器
常量储存编辑器为一个三列的视图列表。每行代表一个特定的寄存器的值。第一列(Constant)用于指定常量寄存器的索引。第二列(Name)显示连接到寄存器的节点的名字或“…”(如果没有变量链接到寄存器)。第三列显示的是连接到寄存器的变量节点的初始值。
绑定一个RenderMonkey变量节点到一个常量储存寄存器意味着软件将直接将节点的内部值绑定到寄存器值。在RenderMonkey中,向量和颜色节点表示为4个浮点值,标量被映射为四个相同的浮点值,矩阵用16个浮点值表示。
要绑定一个节点到寄存器,在你想要绑定的常量行的“Name”列上单击右键在弹出的菜单中选择一个变量节点(见图21)。该菜单包含了所有在被编辑的shader范围内的变量。一旦你选择了一个节点,他的名字将出现在“Name”列,它的初始值将显示在“Initial Value”列。
图21 映射一个节点到汇编shader常量寄存器
要清空一个常量寄存器,在上述的菜单中选择 Clear。以前与节点连接的变量名将被“…”替代,它的初始值也将被清空。
注意,如果你绑定一个矩阵到一个特殊的常量,该常量将占四个常量行。
编辑器支持像素和顶点汇编代码的自定义语法颜色。而且还能完全支持剪贴板操作。
像素shader编辑和设置
现在,我们应经对顶点shader有了一个完整的了解,接下来让我们看看像素shader。要编辑像素shader,要在shader编辑器窗口中选中Pixel Shader标签页。在开始编辑文本之前,然我们先回顾一下光照公式以确定要用到那些参数。参照公式(2)—(4)我们能确定要用到以下参数:
Ø Ka,Kd,Ks — 分别为环境,漫射和光照系数。
Ø Ia — 环境光强度。
Ø Id — 漫反射光照强度。
Ø Is — 镜面反射光强度。
Ø Ns — 镜面反射系数。
以上参数我们要将其作为常量添加到像素sahder中。Ka,Kd,Ks,ns将作为标量添加到工作区中,Ia,Id和Is能被作为颜色节点添加。根据下表将变量节的添加到工作区节点中:
1. Ka:名字为Ka的标量变量
2. Kd:名字为Kd的标量变量
3. Ks:名字为Ks的标量变量
4. ns:名字为Ns的标量变量
5. Ia:名字为Ia的颜色变量
6. Id:名字为Id的颜色变量
7. Is:名字为Is的颜色变量
下图为你定义完成后工作区树视图的快照:
好啦,让我们将这些参数添加到像素shader的声明块中。用我们在顶点shader一节中讲解的方法将他们添加到像素shader的声明中。如果你已经添加完成了最后一个节点,你应该能看到下面的声明块:
Float Ka;
Float Kd;
Float Ks;
Float Ns;
Float4 Ia;
Float4 Id;
Float4 Is;
现在,我们已经准备好要开始写我们的像素shader的代码了。这里我们将真正感受到用高级着色语言编写sahders程序的简单和优雅。如果你尝试过用汇编语言写shader程序,那么你肯定会喜欢这种改变。本例中完整的像素shader程序如下(不包含声明部分):
float4 main( float4 Diff : COLOR0,
float3 Normal : TEXCOORD0,
float3 View : TEXCOORD1,
float3 Light : TEXCOORD2 ) : COLOR
{
// Compute the reflection vector:
float3 vReflect = normalize( 2 * dot( Normal, Light) * Normal -Light );
// Compute ambient term:
float4 AmbientColor = Ia * Ka;
// Compute diffuse term:
float4 DiffuseColor = Id * Kd * max( 0, dot( Normal, Light ));
// Compute specular term:
float4 SpecularColor = Is * Ks * pow( max( 0, dot(vReflect, View)), Ns );
float4 FinalColor = AmbientColor + DiffuseColor + SpecularColor;
return FinalColor;
}
你只需要简单的将这些代码写到像素shader的文本编辑器中然后点击提交改变按钮。记住,我们用了Pow指令,所以要将我们的目标设置成ps_2_0或更高版本。
预览窗口
现在,我们已经完成了shaders的编辑工作,但是要想看到我们编辑的代码的效果,还需要一个能用于查看结果的窗口。在RendeMinkey中,预览窗口就是用来交互的预览我们编辑的结果的窗口。所有shader中的变化或参数的更新都将适时地被渲染出来,一次他是真正的交互式shader开发。图23显示了一个海洋特效的预览窗口。
图23 预览窗口
在RenderMondey的标准预览模块中提供了简单的导航系统:
l 在窗口中平移用上下左右键,
l 向前或向后移动摄像机用“Z”和“X”键,
l 用鼠标旋转屏幕
注意,预览窗口中的模型将绕着Z轴旋转。
点击“P”键将根据渲染过程的个数显示为一个视口阵列,用于预览每一个渲染过程。(如图24):
图24 预览窗口中的多重视口
你也能选择一组预定义的视图来观看你的模型。在预览窗口中单击右键,再弹出的菜单中选择一个你想要的视图。在该菜单中选择“Properties”将允许你改变预览窗口的属性。再弹出的对话框中将允许你:
l 改变预览窗口的背景色,
l 改变过程阵列视图的背景色
l 改变视域
l 改变远近剪切面值
编辑变量
现在,我们的预览窗口中将出现一个白色茶壶。茶壶的外表取决于变量的值。我们要将我们shaders中的所有参数都设定一个有意义的值。不过,在这之前,先让我们讨论一下怎样编辑变量。编辑变量有两种方法,一种是双击该变量节点,一种是右击该节点再弹出的菜单中选择“Edit”。RenderMonkey将自动选择一个与被编辑变量相匹配的编辑框。
常量变量
每个标量都可以通过下图所示的标量编辑模块编辑。注意,你可以用任何方法改变标量的值,如果你最后想反悔,可以单击“Cancel”。不过论你最后怎样,预览窗口都会交互地显示你的改变。
图25 标量编辑器
要编辑一个标量,你可以直接指定一个值,也可以通过滑动条交互的改变它的值。让我们将我们工作区中的标量设置成以下值:
1. Ka = 0.8
2. Kd = 0.8
3. Ks = 1.0
4. Ns = 100.0
正确的指定值后,你将在预览窗口中看到一个白色的茶壶。我们已经开启了光照!
向量变量每个向量能通过向量编辑模块进行编辑:
图26 向量编辑器
每一个向量组件也向标量一样能直接指定值,也能通过滑动条来改变。用户也可以钩选“Keep normalized”选项以保持向量始终是归一化的。若果你对结果不满意,也可以单击Cancel按钮。
好了,现在我们来设定光向量的值。双击lightDir变量然后输入下列值:
X = -0.4; Y = 0.3; Z = 0.8; W = 0.0;
矩阵变量尽管在本例中我们没有修改任何矩阵变量,也让我们了解一下怎样用怎样用矩阵编辑模块来编辑矩阵变量:
图27 矩阵编辑器
通过以上两例,相信读者已经知道怎样编辑矩阵变量了。矩阵变量值是多了几个值而已。这有一个选项用来将矩阵恢复为单位矩阵(Set to Identity Matrix)。
颜色变量每个颜色变量都能通过颜色编辑模块编辑:
图28 颜色编辑器
用户能通过RGB和HSV两种模式来编辑颜色。可以直接输入颜色值,也可以通过颜色各个组建后的滑动条,还可以在颜色盘上直接选择一种颜色。窗口最右边的滑动条用来调节颜色的亮度。你调节的颜色时时地显示在左上角的小方框中。Float Point 选项只对RGB模式有效,它将其各个组件值限制在-1.0和1.0范围之内。负的颜色值能用来减少颜色。同样你也可以在不满意时点击Cancel按钮。
如果我们将Ia值设置为R = 0, G = 112, B = 0, A = 255,我们将看到如图29所示的茶壶。
图29 Phong 光照特效
渲染状态块管理尽管我们已经完成了我们的第一个视觉特效。我们还是要探索一下怎样修改每一个绘制调用的渲染状态。每个过程都可能有若干个渲染状态,它可能是从一个更高级的过程继承而来也坑能就是他自己的。如果想创建一个渲染状态节点,在你想将其放置到的过程节点上单击右键,再弹出的菜单中选择“Add Render State Block”如图30:
图30 在过程中增加渲染状态块
如果一个过程中没有定义渲染状态块,应用程序将搜索整个工作区树,然后将其找到的第一个渲染状态块节点作为该过程渲染状态块的父节点。当你在一个过程中创建一个渲染状态块节点时,它将继承在工作区中找到的第一个高级别渲染状态块的值。如果以前没有创建过渲染状态块,那么它将不继承任何值。改变新创建的渲染状态块的值将覆盖其继承的值。注意,在搜索过程中应用程序只查找当前和默认特效中的各个过程。也就是说每个特效中渲染状态块的值不能被其他特效访问。要编辑渲染状态,双击渲染状态节点或在该节点上单击右键再弹出的菜单中选择“Edit”。渲染状态编辑窗口如图31所示:
图31 渲染状态编辑器
要编辑一个特定的渲染状态,在你要编辑的渲染状态行的Value列单击左键,如果该状态由于定义的值,你可以在它们中选择一个,如果没有你可以直接指定一个值。
让我们将我们的茶壶改为线框显示。要做到这点其实相当容易。在渲染状态编辑器中找到Fillmode渲染状态将其值设为WIREFRAME。你将立即在预览窗口中看到一个县矿石的茶壶:
图32 线框显示
当今的游戏中使用个工各样的纹理贴图来生成视觉特效。现在,就让我们来学一学怎样在RenderMonkey中使用纹理贴图。就像你以前学习的一样,RenderMonkey中有专门用于2D纹理,立方贴图和体积纹理的变量类型。那么现在就让我们在工作区中增加一个2D纹理贴图变量。在我们的特效工作区节点上单击右键选择Add Variable。选择Texture类型然后将其命名为baseMap。一个纹理变量将出现在你的工作区中(默认的,纹理变量都被指定为艺术家可编辑的)。
接下来,为了将纹理应用到我们的特效中,需要在顶点shader中增加一个纹理坐标流。双击名字为standard mapping的流映射节点燃后增加一个新的通道用于纹理坐标:Reg = v2, Usage = TexCoord, UsageIndex = 0, Type = Float2。这样就在我们的顶点shader中增加了一个新的流通道。
下面的步骤是在我们的顶点shader程序中增加纹理坐标。打开顶点shader的文本编辑器然后输入以下代码(下面列出了代码)。粗体显示的行和被注释的行是不同于上面例子的部分:
float4x4 view_matrix;
float4x4 view_proj_matrix;
float4 lightDir;
struct VS_OUTPUT
{
float4 Pos : POSITION;
float3 Norm : TEXCOORD0;
float3 View : TEXCOORD1;
float3 Light : TEXCOORD2;
float2 Tex : TEXCOORD3; // NEW
};
VS_OUTPUT main(
float4 inPos : POSITION,
float3 inNorm : NORMAL
float2 inTex : TEXCOORD0 ) // NEW
{
VS_OUTPUT Out = (VS_OUTPUT) 0;
// Output transformed position:
Out.Pos = mul( view_proj_matrix, inPos );
// Output light vector:
Out.Light = -lightDir;
// Compute position in view space:
float3 Pview = mul( view_matrix, inPos );
// Transform the input normal to view space:
Out.Norm = normalize( mul( view_matrix, inNorm ) );
// Compute the view direction in view space:
Out.View = - normalize( Pview );
// Propagate texture coordinate to the pixel shader:
Out.Tex = inTex; // NEW
return Out;
}
新增的三行代码将顶点shader从输入的顶点流中获取的纹理坐标输出给像素shader,但是,要想真正的在像素shader中对纹理进行采样,我们还需要将我们的纹理变量绑定到一个纹理对象中。
纹理对象
要使用纹理变量,你首先要创建一个纹理变量(在你的工作区中用增加变量对话框创建纹理变量)。一旦一个纹理变量被创建,你需要选择一个从中加载纹理的文件。要在一个过程中实际的使用一个纹理,你要在该过程中增加一个纹理对象(在过程节点上单击右键,选择Add Texture Object,如图33)。
图33 在过程中增加纹理对象
这将创建一个空的纹理对象。一个纹理对象如果没有一个有效的纹理引用,它的图标上将用一个红色的叉线:
。纹理对象映射到你shaders中的纹理阶段,他们还用于存储纹理和采样器状态。要使用一个纹理对象,还需要增加一个纹理引用。要增加一个引用,在纹理对象节点上单击右键,在弹出的菜单中选择Add Texture Reference菜单项(如图34)。
图34 为纹理对象增加一个引用
这将创建一个空的纹理引用。要实际绑定一个引用到一个纹理变量,用户还需要指定要引用的变量的名字。如果一个有效的纹理变量被找到,纹理引用上的红叉线将消失。如果红线没有消失,那就说明纹理变量没有被成功的引用。默认情况下,如果工作区有一个baseMap纹理变量,RenderMonkey会将纹理引用绑定到该变量,所以我们不需要做任何事。
如果我们想为我们想为我们的纹理贴图指定一些采样状态,我们为一个特定的纹理引用节点用纹理编辑器指定这些状态值,双击纹理引用节点即可打开纹理编辑器。(如图35)
图35 纹理编辑器
纹理编辑器为每个特效中的每个过程多分配了一个标签页。纹理编辑器的顶部包含一个纹理应用的列表。点击纹理图标,能选择观看该纹理或设置纹理状态。要设置一个特定的状态,在状态行和Value 列单击,如果该状态有预定值则选择其中一个,如果没有直接指定一个值。注意,纹理编辑器为每个有有效文件关联的纹理变量都增加显示一个小的缩略图,你将在该图的左下角看到一个小图标,这个小图标显示了纹理的类型。
注意,仅当纹理对象又有效的纹理引用的时候会出现小图标
或显示为一个缩略图。如果纹理对象的纹理引用没用被正确的连接,它将显示为一个叉图标
。纹理编辑器为所有的纹理变量都创建缩略图,可是,对立方贴图或体积纹理它只显示一个面或一个片断。
在HLSL Shaders中使用纹理要在我们的像素shader中使用纹理贴图,我们首先要增加一个采样器。添加一个采样器非常简单和添加一个常量的步骤一样。你必须有一个有效的有引用的纹理对象用来添加一个采样器。单击Sampler标签后的箭头(
)这将打开一个能映射到HLSL 采样器对象的纹理对象变量的列表。纹理引用的名字将被用于采样器。用上述的方法你可以添加也可以删除采样器对象。
如果你想绑定一个参数到一个特定的寄存器,你要在寄存器组合框的下拉列表中选择一个寄存器
。变量和采样器映射的寄存器设置是各自独立的。
然我们将我们的纹理对象映射到一个采样器。点击后面的小箭头在下拉列表中选择baseMap ,然后点击Add。你将在生命窗口中看到如下代码:
float4 Ia;
float Ka;
float4 Is;
float Kd;
float4 Id;
float Ns;
float Ks;
sampler baseMap;
在下面已经更新了的像素shader的代码(粗体显示的行为相对以前更新的代码):
float4 main( float4 Diff : COLOR0,
float3 Normal : TEXCOORD0,
float3 View : TEXCOORD1,
float3 Light : TEXCOORD2
float2 Tex : TEXCOORD3 ) : COLOR
{
// Compute the reflection vector:
float3 vReflect = normalize( 2 * dot( Normal, Light) * Normal - Light );
// Compute ambient term:
float4 AmbientColor = Ia * Ka;
// Compute diffuse term:
float4 DiffuseColor = Id * Kd * max( 0, dot( Normal, Light ));
// Compute specular term:
float4 SpecularColor = Is * Ks * pow( max( 0, dot(vReflect, View)), Ns );
float4 FinalColor =
(AmbientColor + DiffuseColor) * tex2D( baseMap, Tex ) + SpecularColor;
return FinalColor;
}
如果你现在编译它,你将在预览窗口中看到一个精细的带纹理的茶壶:
图25 带纹理的茶壶特效
渲染到纹理让我们将我们的特效变得稍微复杂一点。我们要将我们第一个过程的输出(我们刚才创建的),作文我们第二个过程的输入。这一技术叫渲染到纹理,使用它能创建各种各样有趣的特效。
渲染过程要创建一个最简单的渲染到纹理特效,我们至少需要两个过程。让我们在工作区中增加一个新的过程。要增加一个新的过程,在特效节点上单击右键在弹出的菜单中选择Add Pass 。默认的,每个新创建的过程都将包含顶点和像素shader节点,一个模型节点和一个流映射参考节点(当然,他们允许修改)。一旦你创建了一个新的过程,你将发现在预览窗口中又出现了一个红色的茶壶。这是因为,一个特效里的过程都是按顺序别调用的。要向前或向后移动一个过程,在该过程节点上单击右键,然后选择“Move Up”或“Move Down”(如图36)。你也能用“Ctrl加Up”组合键来实现一个过程的上下移动。现在我们有两个过程,如果你将过程2移动到过程1上,你将再次看到那个带纹理的茶壶,然后你再把它移回来,又将出现红色的茶壶。
图36 改变过程顺序
为了方便调试shader程序,你也能将一个过程禁用。要禁用一个过程,在该过程节点上单击右键选择“Enable/Disable Pass”。一个禁用的过程的图标上将出现一个红叉线
表示他已经被禁用了。要激活一个过程,重复上述步骤即可。
工作区试图中有一个禁用的过程的例子:
如果你已经重新排列了过程的顺序,在继续学习之前,请将其恢复到原来的顺序(过程1在过程2之前)。
可渲染的纹理支持RenderMonkey 支持将任何一个给定的过程渲染输出成一个纹理供另一个后来的过程进行采样。要在你的工作区中增加该功能,下面给出了步骤:
1. 在工作区中的任何地方创建一个可渲染的纹理。注意,一次只能将一个过程的渲染输出到该纹理。要增加一个可渲染的纹理,在任何你想将该纹理添加到的节点上击右键选择“Add Renderable Texture”:
图37 增加可渲染的纹理
2. 你将看到一个新的节点,其图标为:
。这就是可渲染纹理节点,一会儿我们要将其连接到一个渲染目标和一个纹理对象以便对其进行采样。
3. 接下来,你要在你的过程中增加一个渲染目标用来输出可渲染的纹理。在过程节点上单击右键选择“Add Render Target”增加一个宣告染目标(该节点的图标为
):
图38 在过程中增加一个渲染目标
4. 下面,你要将渲染目标节点连接到你刚创建的可渲染的纹理。你可以通过直接将渲染目标节点的名字改为可渲染纹理节点的名字来连接它,也可以右击渲染目标节点选择一个参考节点,如下图:
图39 连接渲染目标节点到一个可渲染纹理变量
5. 现在,过程的输出有了一个绘制可渲染纹理的渲染目标节点。
6. 然后,我们要将该可渲染的纹理连接到一个过程以便对其进行采样。不过在这之前,你首先要在该过程中创建一个纹理对象和一个纹理参考。一旦你有了一个纹理参考,你必须将其连接到可渲染的纹理(或通过充命名的方式或单击右键的方式,上面已经介绍过)。
图40 连接纹理对象到一个可渲染的纹理变量
7. 现在,你就能像正常的纹理一样使用该纹理对象了。
让我们在我们的工作区中增加一个可渲染的纹理。在特效工作区节点上单击右键,选择Add Renderable Texture。然后再过程1中增加一个渲染目标(在过程1节点上单击右键选择Add Render Target)。连接渲染目标到可渲染的纹理(方法不再累述)。现在,过程1的输出已经转向了可渲染纹理变量。
下面,我们要在过程2中增加对可渲染纹理的采样能力。首先,我么要保证定点shader正确的传递了纹理坐标。将下面代码下到定点shader中:
struct VS_OUTPUT
{
float4 Pos: POSITION;
float2 Tex: TEXCOORD0;
};
VS_OUTPUT main( float4 Pos: POSITION, float2 Tex: TEXCOORD0 )
{
VS_OUTPUT Out = (VS_OUTPUT) 0;
Out.Pos = mul( view_proj_matrix, Pos );
Out.Tex = Tex;
return Out;
}
这将保证我们将插值的纹理传递给了像素shader。接下来,我们在过程2中增加一个有纹理引用的纹理对象(步骤上面都已经讲过)。但这次我们不是将其连接到纹理变量,而是连接到可渲染的纹理变量。这将直接把过程1的输出传递给过程2。打开过程2的像素shader,增加一个采样器。输入以下代码:
float4 main( float4 Diff : COLOR0,
float2 Tex : TEXCOORD0 ) : COLOR
{
return tex2D( renderTexture, Tex );
}
现在,预览窗口中出现了一个带纹理的茶壶,其纹理为我们在过程1中渲染的茶壶(见图41)。设置两个过程的纹理对象的采样器状态来获得更好的渲染效果:Minfilter = LINEAR Magfilter = LINEAR。
图41 渲染到纹理特效
编辑可渲染的纹理要编辑一个可渲染纹理节点,双击该节点将弹出可渲染纹理编辑框(见图42)。
图42 可渲染纹理编辑器
在编辑器中,你能改变可编辑纹理的尺寸。要改变宽度或高度直接在编辑框中输入你想改变的大小,然后按回车确认。选中“Use viewport dimensions”将会把纹理的大小邦定为视口的大小。要改变纹理的格式下拉列表中选择一个与定义的格式。
编辑一个渲染目标要编辑渲染目标节点,用户要双击该节点打开渲染目标编辑器窗口:
图43 渲染目标编辑器
通过该编辑器,用户能通过“Enable color clear”按钮是否对一个可渲染的纹理使用一个透明色。如果用户选择用透明色,编辑器还提供了一个用于指定透明色的按钮,点击它然后回弹出颜色选择对话框,在对话框中选择一共颜色。用户也能通过“Enable depth clear”复选框来制定是否使用深度清除。如果允许,用户也能指定一个清除值。
艺术家编辑器shaders开发者面临的一个问题是怎样将其开发的特效提交给艺术家,然后通过艺术家对其进行加工来达到更好的效果。RenderMonkey 的解决方案是提供了一个艺术家编辑模块。
Shader开发人员能有选择的指定一个变量是否为艺术家可编辑。在你想要指定的变量节点上单击右键,再弹出的菜单中选择Artist Editable项,该变量节点图标的左上角将出现一个黄色的小箭头。然后你就能将你开发的特效提供给与你一起工作的艺术家了。艺术家能通过艺术标签来对艺术家可编辑变量进行编辑。当前,支持的艺术家可编辑的变量类型有向量,标量和颜色,但是,任何变量都能被指定为艺术家可编辑然后通过艺术标签进行访问。
要打开艺术家编辑器,你能通过点击应用程序工具栏中的
图标,也能在主菜单的视图菜单中选择“Artist Editor”项。
图44艺术家编辑器界面
艺术家编辑器是一个可停靠窗口,它包含了特效工作区,特效组,特效和过程标签页,只要他们中包含了艺术家可编辑的变量。如果节点中没有包含艺术家可编辑变量,那么,该节点的标签页将不会出现。
艺术家可编辑变量将按他们的类型分组(颜色,向量和标量)。每个组都能通过点击
按钮将其展开或合并。
图45 艺术家编辑器界面
在艺术家编辑模块编辑变量
颜色
每个颜色变量有三个相关的控制项——颜色样本按钮用于打开颜色拾取器,一个色调滑动条和一个强度滑动条:
图46 颜色拾取器
向量
每个向量有五个可用的控制项——一个标签按钮用于显示向量编辑器的全貌,四个带有滑动条的组件编辑框,用于编辑向量的每一个组件:
图47 艺术家编辑器中的向量编辑器
图48 展开的向量编辑框
标量
每个标量有两个相关的控制想:一个由于展开标量编辑器的标签按钮和一个用于编辑标量值得编辑框。
图49 标量编辑框
图50 展开的标量编辑器
posted on 2007-10-20 12:12
七星重剑 阅读(3288)
评论(0) 编辑 收藏 引用 所属分类:
Game Graphics 、
HLSL&ShaderMonkey