2016-01-19 2 views
4

Я изучаю C++ и DirectX, и я замечаю много дублирования, пытаясь сохранить структуры в моих шейдерах HLSL и C++-коде в синхронизации. Я хотел бы поделиться структурами, поскольку оба языка имеют одинаковую семантику и структуру заголовка #include. Я встретил успех сКак разделить структуру между C++/DirectX и HLSL?

// 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 говорит мне input parameter 'input' missing sematics на главной функции моего пиксельных шейдеров:

#include "ColorStructs.h" 

void main(PixelInput input) 
{ 
    // Contents elided 
} 

Я знаю, что мне нужно имеют семантику, как float4 Position : POSITION, но я не могу придумать способ сделать это, чтобы не нарушать синтаксис C++.

Есть ли способ, которым я могу хранить структуры, общие между HLSL и C++? Или это неосуществимо и требует дублирования структур между двумя деревьями-источниками?

+2

Обратите внимание, что это обычно считается плохая идеей поставить «с помощью пространства имен» в несвязанном заголовочном файле (так как это делает случайные столкновения имен более вероятно). – immibis

+1

Это хороший момент! Это началось как заголовок C++, и я забыл его удалить. Спасибо что подметил это! – berwyn

ответ

5

Вы можете использовать функцию макрос для удаления семантических определителей при компиляции C++

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

struct VertexInput 
{ 
    float4 Position SEMANTIC(POSITION0); 
    float4 Color SEMANTIC(COLOR0); 
}; 
Смежные вопросы