我正在测试YAML,看它是否适合游戏引擎的数据存储格式。我已经创建了这个示例YAML文件:
---
ShaderProperties:
EntryPoint : UnlitHomogenousVS
Profile : vs_4_0
Model : HLSL_4
Uniforms:
- name : gTint
type : kShaderUniformTypeFloat4
defaultValue : 1.0f, 1.0f, 1.0f, 1.0f
constantBuffer : cbObjectProperties
constantBufferOffset : 0
usage : Property
Samplers:
ConstantBuffers:
- name : cbObjectProperties
register : 2
size : 16
type : kShaderTypeVertex
Attributes:
- name : position
type : kShaderAttributeTypeFloat4
usage : kShaderAttributeUsagePosition
- name : color
type : kShaderAttributeTypeFloat4
usage : kShaderAttributeUsageColor0
ShaderText: >
//--
// UnlitHomogenous.vs
//
// This vertex shader will color geometry with only a homogenous transform.
//--
//--
// VertexInput
//--
struct VertexInput
{
float4 position : POSITION;
float4 color : COLOR;
};
//--
// VertexOutput
//--
struct VertexOutput
{
float4 position : SV_POSITION;
float4 color : COLOR;
};
//--
// Global Variables
//--
cbuffer cbObjectProperties : register(b2)
{
float4 gTint = float4( 1.0f, 1.0f, 1.0f, 1.0f );
};
//--
// Main Function
//--
VertexOutput UnlitHomogenousVS( VertexInput input )
{
VertexOutput output = (VertexOutput)0;
output.position = input.position * gTint;
output.color = input.color;
return output;
}
...
现在,这个文件加载并且似乎解析得很好,但是当我尝试读取节点" EntryPoint"我得到一个有效的节点返回,但是有一个未定义的节点类型,我期待一个标量。
以下是我用来读取节点的代码。
YAML::Node root = YAML::LoadFile( filepathString );
if( root.IsNull() )
{
return Failure_FileNotFound;
}
YAML::Node shaderProperties = root[ "ShaderProperties" ];
if( shaderProperties.IsNull() )
{
return Failure_MalformedData;
}
YAML::Node& entryPointNode = shaderProperties[ "EntryPoint" ];
if( entryPointNode.IsNull() || !entryPointNode.IsDefined() )
{
TC_SHADER_IMPORTER_LOG_ERROR( TCString( "Failed to parse shader: ") + mCurrentName + TCString( ", no entry point was found" ) );
return Failure_MalformedData;
}
output->mEntryPointName = entryPointNode.as<std::string>().c_str();
我有什么明显的遗失吗?我能够成功加载此文件,因此我假设YAML有效。如果我拿出支票 IsDefined()并且只是尝试将节点强制转换为字符串,我得到了错误的转换。
感谢您的帮助!
编辑:
问题是我在标签名称(EntryPoint)和冒号之间使用\ t标签而不是&#39;选项卡。