Я изучаю 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++? Или это неосуществимо и требует дублирования структур между двумя деревьями-источниками?
Обратите внимание, что это обычно считается плохая идеей поставить «с помощью пространства имен» в несвязанном заголовочном файле (так как это делает случайные столкновения имен более вероятно). – immibis
Это хороший момент! Это началось как заголовок C++, и я забыл его удалить. Спасибо что подметил это! – berwyn