您的位置:首页 > 其它

Hello,Structs!

2016-07-03 09:22 267 查看

Hello,Structs!

 

在本节,使用C风格的结构体重新编写HelloShaders effect。使用数据结构比单个的参数能更好的组织多个shader输入和输出。首先在NVIDIA FX Composer中创建一个新effect和material,就像本章开始那样,使用Add Effect向导添加effect,或者简单的拷贝HelloShaders.fx到一个新文件HelloStructs.fx中。我偏向于第二个选择,因为经常需要重用shader代码,建立在以前的材质基础上。拷贝到HelloStructs.fx文件之后,在Assets
panel的Materials部分点击鼠标右键,并选择Add Materials from File就可以把该shader文件添加到NVIDIA FX Composer中。找到并选中HelloStructs.fx文件,就会看到在Assets panel中已经有了新建的HelloStructs和HelloStructs_Material objects。

列表4.6 contains a full listing of the HelloStructs.fx effect.

列表4.6 HelloStructs.fx

cbuffer CBufferPerObject
{
float4x4 WorldViewProjection : WORLDVIEWPROJECTION;
}
RasterizerState DisableCulling
{
CullMode = NONE;
};
struct VS_INPUT
{
float4 ObjectPosition: POSITION;
};
struct VS_OUTPUT
{
float4 Position: SV_Position;
};
VS_OUTPUT vertex_shader(VS_INPUT IN)
{
VS_OUTPUT OUT = (VS_OUTPUT)0;
OUT.Position = mul(IN.ObjectPosition, WorldViewProjection);
return OUT;
}
float4 pixel_shader(VS_OUTPUT IN) : SV_Target
{
return float4(1, 0, 0, 1);
}
technique10 main10
{
pass p0
{
SetVertexShader(CompileShader(vs_4_0, vertex_shader()));
SetGeometryShader(NULL);
SetPixelShader(CompileShader(ps_4_0, pixel_shader()));
SetRasterizerState(DisableCulling);
}
}


HelloShaders.fx和HelloStructs.fx之间的差别是微小的,但又是很重要的,因为他们建立了本书中使用的规范。首先要注意哪些是没有改变的,CBufferPerObject和DisableCulling objects都是一样的,main10 technique和对应的pass也是一样的。Pixel shader的内部代码也没有变化。主要是新加了两个结构体VS_INPUT和VS_OUTPUT,分别表示vertex shader的输入和输出。在HelloStructs.fx中的VS_INPUT也有一个与HelloShaders
vertex shader中相同的输入变量ObjectPosition。唯一的区别是,在HelloStructs中该变量声明为float4类型而不是float3类型。也就不需要在向量中增加一个w分量。此外,vertex shadre现在返回一个VS_OUTPUT实例而不是一个float4类型的值,而且SV_Position语义不再直接与返回值关联,而是与VS_OUTPUT结构体中的Postion成员对应。该Postion成员取代了HelloShaders effect中的vertex shader的未命名的返回值。

下一步,分析最新的vertex shader的代码块。在该段代码中,声明并返回了一个VS_OUTPUT实例,就像C编程样式一样,可以通过dot opertator(点操作符)来访问VS_OUTPUT实例中的Position成员。同样,VS_INPUT结构体类型的参数IN中的ObjectPosition成员用于mul函数调用中。另外,使用了C风格的类型转换把OUT结构体变量中的成员都初始化为0。虽然初始化这一步不是强制的,但是却是一种好的编程习惯。最后,可以看到pixel shader中输入参数的类型正是vertex
shader中的输出参数。在目前的例子中,还没有使用输入参数中的任何成员,但是在后面的shaders中将会用到。使用结构体重新组织的意义在于,现在可以增加shader输入和输出而不用修改vertex shaders和pixel shaders。HelloStructs的输出应用与HelloShaders的输出一致,与图4.3一样。

 

总结

 

本章编写了第一个HLSL shaders!学习了FX文件格式,constant buffer以及render states的部分知识。也进一步了解了HLSL语法,包括vector和matrix数据类型(比如float3,flaot4,float4×4)以及自定义的结构体。并在NVIDIA FX Composer中使用了这些知识生成了第一个渲染输出。本章完成的学习任务将是第二部分,“Shader Authoring with HLSL”后面章节的基础。

 

Exercises

1. Change the values of the RGB channels in the HelloShaders or HelloStructs pixel shader, and

observe the results.

2. Modify the DisableCulling rasterizer state object by setting CullMode = FRONT and then BACK, and

observe the results.

3. Now that you have a couple effects, get comfortable working within NVIDIA FX Composer. Create

Teapot, Torus, and Plane objects, and assign them either the HelloShaders or HelloStructs materials.

Notice how all objects that are assigned the same material are impacted when you change and recompile

the associated effect.

1.改HelloShaders或HelloStructs中pixel shader的RGB颜色通道值,并观察输出结果。

2.修改DisableCulling渲染状态,设置CullMode = FRONT,观察输出结果,再修改为CullMode = BACK观察输出结果。

3.现在你已经创建了两种effects,并学会了使用NVIDIA FX Composer。可以创建一些别的objects,比如Teapot,Torus以及Plane,并为这些objects指定HelloShaders或HelloStructs材质。注意观察在重新编译对应的effect之后,所有Objects都指定同一种材质的效果。

本意配套的学习代码:

http://download.csdn.net/detail/chenjinxian_3d/9570518

9e2b
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: