如何在C ++ / DirectX和HLSL之间共享结构?

时间:2016-01-19 20:37:52

标签: c++ visual-c++ directx directx-11 hlsl

我正在学习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 ++之间的结构保持通用?或者它是不可行的,并且需要复制两个源树之间的结构?

1 个答案:

答案 0 :(得分:5)

您可以在编译C ++时使用函数宏来删除语义说明符

#ifdef __cplusplus
#define SEMANTIC(sem) 
#else
#define SEMANTIC(sem) : sem
#endif

struct VertexInput
{
    float4 Position SEMANTIC(POSITION0);
    float4 Color SEMANTIC(COLOR0);
};