Допустима ли строка #0 в GLSL?

Мои шейдеры GLSL (OpenGL ES 2.0, "#version 100") не компилируются на графическом процессоре Vivante GC800. Шейдеры прекрасно компилируются на многих других графических процессорах.

Ошибка, которую я получаю:

(2:0) : error : Expect positive integer-line-number after #line.

я использую

#line 0

чтобы сбросить номер строки после включения кода преамбулы (например, #version и некоторых спецификаторов точности) перед «настоящим» шейдером. Кто-нибудь знает, связано ли это со сбоем компилятора шейдеров Vivante или с тем, что компиляторы шейдеров всех остальных слишком снисходительны?

Мой обходной путь заключается в том, чтобы включать эту директиву только при локальной отладке моих шейдеров.


person P.T.    schedule 11.08.2013    source источник


Ответы (1)


В спецификации GLES Shading Language говорится о проблема (раздел 3.4 «Препроцессор»):

#строка должна иметь после замены макроса одну из следующих двух форм:

#line line
#line line source-string-number

где строка и исходная строка-номер являются постоянными целочисленными выражениями. После обработки этой директивы (включая новую строку) реализация будет вести себя так, как если бы следующая строка имела номер строки и начинается с номера исходной строки source-string-number. Последующие исходные строки будут нумероваться последовательно, пока другая директива #line не переопределит эту нумерацию.

Это не исключает 0 (или даже отрицательных значений). Однако есть также

__LINE__ заменит десятичную целочисленную константу, которая на единицу больше числа предшествующих новых строк в текущей исходной строке.

Можно возразить, что это означает, что номер строки никогда не может быть меньше 1, поскольку это подразумевает отрицательное число новых строк. YMMV.

person derhass    schedule 11.08.2013
comment
Ах, так что я должен использовать #line 1. Я думал, что это отличается от C, но кажется, что #line 0 также недействительна в препроцессоре C: stackoverflow.com/a/9152887/960524. - person P.T.; 12.08.2013
comment
Вау... Отличается ли это между GLSL и GLSL ES? Я просматриваю спецификацию GLSL 1.20.8 и он говорит После обработки этой директивы (включая ее новую строку) реализация будет вести себя так, как если бы она компилировалась в строке с номером строка+1. Отсутствие плюса 1 имеет больше смысла, и я думаю, что препроцессор C делает то же самое. - person falstro; 29.11.2013