我正在学习C ++和DirectX,并且在尝试保持HLSL着色器和C ++代码中的结构同步时,我注意到了很多重复。我想分享结构,因为两种语言都具有相同的#include
语义和头文件结构。
// ColorStructs.h
#pragma once
#ifdef __cplusplus
#include <DirectXMath.h>
using namespace DirectX;
using float4 = XMFLOAT4;
namespace ColorShader
{
#endif
struct VertexInput
{
float4 Position;
float4 Color;
};
struct PixelInput
{
float4 Position;
float4 Color;
};
#ifdef __cplusplus
}
#endif
问题是,在编译这些着色器时,FXC告诉我{P}着色器的主要功能input parameter 'input' missing sematics
:
#include "ColorStructs.h"
void main(PixelInput input)
{
// Contents elided
}
我知道我需要拥有像float4 Position : POSITION
这样的语义,但我无法想出一种不会违反C ++语法的方法。
有没有办法让HLSL和C ++之间的结构保持通用?或者它是不可行的,并且需要复制两个源树之间的结构?
答案 0 :(得分:5)
您可以在编译C ++时使用函数宏来删除语义说明符
#ifdef __cplusplus
#define SEMANTIC(sem)
#else
#define SEMANTIC(sem) : sem
#endif
struct VertexInput
{
float4 Position SEMANTIC(POSITION0);
float4 Color SEMANTIC(COLOR0);
};