Препроцессор Unity HLSL/Cg работает неправильно?

avatar
darkspider
8 апреля 2018 в 02:56
146
1
2

Когда я реализовал макрос на HLSL в проекте Unity, я столкнулся со странной проблемой.

#define read(name) read2(TYPEOF(name), name)
#define TYPEOF(name) typeof_ ## name
#define read2(t, name) TYPEOF_READ(t, name)
#define TYPEOF_READ(a, b) a ## _read(b) 
#define typeof_X float

read(X);

Я ожидал, что это расширится, как показано ниже.

float_read(X);

Но Unity говорит

Необъявленный идентификатор 'typeof_X_read'.

Существуют ли различия в реализации между препроцессором HLSL/Cg и обычным C? Конечно проверил

gcc -E

работает, как я и ожидал.

Источник

Ответы (1)

avatar
Samaursa
8 апреля 2018 в 03:13
1

К сожалению, это связано с тем, что препроцессор HLSL делает несколько вещей иначе, чем препроцессор C: https://msdn.microsoft.com/en-us/library/windows/desktop/dd607345%28v=vs. 85%29.aspx?f=255&MSPPError=-2147217396

EDIT: В данном случае кажется, что это может быть ошибка компилятора. Макросы расширяются должным образом, и их можно протестировать здесь: https://tryhlsl.azurewebsites.net/

.
#define read(name) read2(TYPEOF(name), name)
#define TYPEOF(name) typeof_ ## name
#define read2(t, name) TYPEOF_READ(t, name)
#define TYPEOF_READ(a, b) a ## _read(b) 
#define typeof_X float

void float_read(float) {}

struct PSInput
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

PSInput VSMain(float4 position : POSITION, float4 color : COLOR)
{
    float X;
    read(X);

    PSInput result;

    return result;
}

float4 PSMain(PSInput input) : SV_TARGET
{
    return input.color;
}
darkspider
8 апреля 2018 в 03:42
0

>> вставленные токены должны быть действительными токенами. Это вызывает такую ​​разницу? Я не могу понять, что означает «действительный» в контексте.

Samaursa
8 апреля 2018 в 12:27
0

Недопустимый токен в ссылке: x4. Однако в вашем случае я не вижу недействительных токенов. Похоже, он просто не улавливает, что typeof_X был определен как float. Возможно, это ошибка компилятора (в зависимости от карты, графического драйвера и версии DirectX).

Samaursa
8 апреля 2018 в 12:42
0

Это действительно похоже на ошибку компилятора, которая, в свою очередь, может быть комбинацией вашей карты, графического драйвера и версии DirectX. Вы можете протестировать свой код здесь: tryhlsl.azurewebsites.net