2013-08-11 3 views
2

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

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

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

Я использую

#line 0 

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

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

ответ

4

GLES Shading Language spec это сказать о проблеме (раздел 3.4 "Препроцессор"):

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

#line line 
#line line source-string-number 

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

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

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

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

+0

Ах, поэтому я должен использовать «#line 1». Я думал, что это отличается от C, но, похоже, «#line 0» недопустимо в препроцессоре C: http://stackoverflow.com/a/9152887/960524. –

+0

Wow ... Разница между GLSL и GLSL ES? Я смотрю на [Спецификация GLSL 1.20.8] (http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf), и он говорит: «После обработки этой директивы (включая его новая строка), реализация будет вести себя так, как если бы она компилировалась в строке номера строки + 1 "_. Не имея плюса 1 имеет больше смысла, и я думаю, что так препроцессор C делает это. – falstro

Смежные вопросы