在游戏或应用程序中使用三维资产
本文介绍如何将 Visual Studio 用于处理三维资产并将其包括在您的生成中。
在 Visual Studio 使用工具创建三维资产之后,下一步是在您的应用程序使用它们。 但,您可以使用它们之前,您的资产必须转换为 DirectX 可以理解的格式。 为帮助您转换自己的资产,Visual Studio 为可能会生成各类资产提供了生成自定义。 为您的生成中包括资产,只需配置您的项目来使用生成自定义,向您的项目添加浙西资产,然后配置这些资产,以便使用正确的生成自定义。 在此之后,可以加载资产到您的应用程序以及通过创建和填充 DirectX 资源使用它们,和在任何其他 DirectX app 做的一样。
配置项目
作为生成的一部分,在部署您的三维资产之前,Visual Studio 必须知道要部署的资产的种类。 Visual Studio 已了解许多常见的文件类型,但是因为只有某些类型的应用程序使用 3-D 资产,所以 Visual Studio 不假定项目将生成这些类型的文件。 通过使用“生成自定义”(用为每个资产类型提供的有用的方法告知 Visual Studio 如何处理不同类型文件的文件),您可以告知 Visual Studio 您的应用程序使用资产的这些种类。 由于这些自定义是应用于每个项目基础,只需将相应的自定义项添加到项目中。
将生成自定义项添加到项目中
在**“解决方案资源管理器”中,打开该项目的快捷菜单,然后选择“生成自定义”。 显示“Visual C++ 生成自定义文件”**对话框。
您只需将这些生成自定义项添加到 Visual Studio;如果您已经添加了它们,则可以跳过此步骤。
选择**“查找存在”按钮,然后定位到 Visual Studio 安装目录\ Common7 \ IDE \ extensions \ Microsoft \ VSGraphics \,包含支持三维资产生成的三个生成自定义项。 选择一个生成自定义文件—例如,ImageContentTask.目标—然后选择“打开”按钮。 当询问该消息是否希望将目录添加到生成自定义项搜索路径,选择“是”**按钮。 这使三个生成自定义均可用。
选择**“刷新列表”按钮刷新“可用生成自定义文件”**网格视图控件。
在**“可用生成自定义文件”**网格视图控件中,请选择对应于您想要在项目中使用的资产类型的复选框,如表中所述:
资产类型
生成自定义名称
纹理和图像
ImageContentTask(.targets, .props)
3-D 模型
MeshContentTask(.targets、.props)
着色器
ShaderGraphContentTask(.targets, .props)
选择**“确定”**按钮。
包括生成中的资产
既然您的项目了解您要使用的不同种类的三维资产,那么下一步是告诉它哪些文件是三维资产以及其资产类别。
向您的生成添加资产
在**“解决方案资源管理器”中,打开您的项目中的资源快捷菜单,然后选择“属性”。 随即出现资源的“属性页”**对话框。
确保**“配置”和“平台”**属性设置为您要对其应用更改的值。
在**“配置属性”下选择“常规”,然后在属性网格的“常规”下,设置“物料类型”属性为相应的内容管线物料类型。 例如,对于图像或纹理文件,请选择“图像内容管线”**。
重要
默认情况下,Visual Studio 假定,通过使用内置 Visual Studio 的“图像”项类型应分类许多图像文件。因此,您必须更改每个您要通过图像内容管线处理的图像的“项目类型”属性。三维模型的其他类型的内容管道源文件和可视化着色器图形默认为正确的“项类型”。
选择**“确定”**按钮。
这是三种内容管线项类型,及其相关资源和输出文件类型。
项类型 |
源文件类型 |
输出文件格式 |
---|---|---|
图像内容管线 |
可迁移网络图形 (.png) JPEG (.jpg, .jpeg, .jpe, .jfif) 直接绘制图面 (.dds) 可交换图像格式 (.gif) 位图 (.bmp, .dib) 带标记的图像文件格式 (.tif, .tiff) Targa (.tga) |
直接绘制图面 (.dds) |
网格内容管道 |
Autodesk FBX 交换文件 (.fbx) Collada DAE 文件 (.dae) 波前 OBJ 文件 (.obj) |
三维网格文件 (.cmo) |
着色器内容管线 |
“可视化着色器关系图”(.dgsl) |
编译着色器输出 (.cso) |
配置资产内容管线属性
您可以设置每个资产文件的内容管线属性,以便用特定方法生成它。
配置内容管线属性
在**“解决方案资源管理器”的项目中,打开资源文件的快捷菜单,然后选择“属性”。 随即出现资源的“属性页”**对话框。
确保**“配置”和“平台”**属性设置为您要对其应用更改的值。
在**“配置属性”下,选择内容管线节点—例如,纹理和图像资产的“图像内容管线”—然后在属性网格中,将属性设置为相应的值。 例如,要在生成时为纹理资产生成 mipmaps,请将“生成 Mips”属性设置为“是”**。
选择**“确定”**按钮。
图像内容管线配置
当您使用图像内容管线工具来生成纹理资产时,可以用多种方式压缩纹理,指示是否应在生成时生成 MIP 级别,并更改输出文件的名称。
属性 |
描述 |
---|---|
压缩 |
指定输出文件使用的压缩类型。 可用的选项包括:
有关不同版本的 DirectX 支持何种压缩格式的信息,请参见 DXGI 编程指南。 |
生成 Mip |
生成完整的 MIP 链在生成时并在输出文件中为“是”;否则为“否”。 如果"否",并且源文件已包含 mipmap 链,则输出文件将具有 MIP 链;否则,输出文件没有 MIP 链。 |
内容输出 |
指定输出文件的名称。 ![]()
更改输出文件的文件扩展名对其文件布局的影响。
|
网格内容管道配置
当您使用网格内容管线工具来生成网格资产时,可以更改输出文件的名称。
属性 |
描述 |
---|---|
内容输出 |
指定输出文件的名称。 ![]()
更改输出文件的文件扩展名对其文件布局的影响。
|
着色器内容管线配置
当您使用着色器内容管线工具来生成着色器资产时,可以更改输出文件的名称。
属性 |
描述 |
---|---|
内容输出 |
指定输出文件的名称。 ![]()
更改输出文件的文件扩展名对其文件布局的影响。
|
运行时加载和使用三维资产
使用纹理和图像
Direct3D 提供用于创建纹理资源的功能。 在 Direct3D 11 中,D3DX11 实用工具库为创建纹理资源和资源视图直接从图像文件中提供其他功能。 有关如何在 Direct3D 11 中创建纹理资源的更多信息,请参见纹理。 有关如何使用 D3DX11 库的更多信息创建纹理资源或资源视图从图像文件,请参见 如何:初始化纹理从文件。
使用 3-D 模型
Direct3D 11 未提供用于从三维模型创建资源的功能。 相反,您必须读取三维模型文件中编写的代码并创建表示三维模型的顶点和索引缓冲区和模型要求的任何资源—例如,纹理或着色器。
使用着色器
Direct3D 用于创建着色器资源和绑定提供了它们正在向可编程的图像管线。 有关如何创建着色器资源在呈现并将其绑定的更多信息到管线,请参见 HLSL 的过程指南。
在可编程的图像管线中,管线的每个阶段必须为管线的下一阶段的格式结果提供可以理解的方法。 由于着色器设计器只能创建像素着色器,这意味着它负责确保您的应用程序收到的数据是否采用它需要的格式。 多个可编程着色器阶段发生,在像素着色器和执行几何图形转换为顶点着色器、船身着色器、字段着色器和geometry 着色器之前。 还在像素着色器前发生非编程分割阶段。 不管哪个阶段直接位于像素着色器前,它都必须按以下格式生成其结果:
struct PixelShaderInput
{
float4 pos : SV_POSITION;
float4 diffuse : COLOR;
float2 uv : TEXCOORD0;
float3 worldNorm : TEXCOORD1;
float3 worldPos : TEXCOORD2;
float3 toEye : TEXCOORD3;
float4 tangent : TEXCOORD4;
float3 normal : TEXCOORD5;
};
根据您的着色器使用的着色器设计器节点,可能还必须根据这些定义提供其他数据格式:
Texture2D Texture1 : register( t0 );
Texture2D Texture2 : register( t1 );
Texture2D Texture3 : register( t2 );
Texture2D Texture4 : register( t3 );
Texture2D Texture5 : register( t4 );
Texture2D Texture6 : register( t5 );
Texture2D Texture7 : register( t6 );
Texture2D Texture8 : register( t7 );
TextureCube CubeTexture1 : register( t8 );
TextureCube CubeTexture2 : register( t9 );
TextureCube CubeTexture3 : register( t10 );
TextureCube CubeTexture4 : register( t11 );
TextureCube CubeTexture5 : register( t12 );
TextureCube CubeTexture6 : register( t13 );
TextureCube CubeTexture7 : register( t14 );
TextureCube CubeTexture8 : register( t15 );
SamplerState TexSampler : register( s0 );
cbuffer MaterialVars : register (b0)
{
float4 MaterialAmbient;
float4 MaterialDiffuse;
float4 MaterialSpecular;
float4 MaterialEmissive;
float MaterialSpecularPower;
};
cbuffer LightVars : register (b1)
{
float4 AmbientLight;
float4 LightColor[4];
float4 LightAttenuation[4];
float3 LightDirection[4];
float LightSpecularIntensity[4];
uint IsPointLight[4];
uint ActiveLights;
}
cbuffer ObjectVars : register(b2)
{
float4x4 LocalToWorld4x4;
float4x4 LocalToProjected4x4;
float4x4 WorldToLocal4x4;
float4x4 WorldToView4x4;
float4x4 UVTransform4x4;
float3 EyePosition;
};
cbuffer MiscVars : register(b3)
{
float ViewportWidth;
float ViewportHeight;
float Time;
};