2011-12-16 3 views
8

Задание версии GLSL дает синтаксическую ошибку при использовании LWJGL. Я не пытался воспроизвести этот вопрос вне LWJGL. Это происходит на нескольких компьютерах Mac, на которых работает Lion.GLSL #version дает синтаксическую ошибку (LWJGL на Mac)

У меня есть как вершинные, так и фрагментарные шейдеры для работы без использования #version. Но я собираюсь использовать функцию texture, которая, как представляется, требует директивы #version.

Вот простейший провал пример:

#version 120 

void main() { 
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); 
} 

Компиляция фрагмента шейдер и вызова glGetShaderInfoLog дает эту ошибку:

ERROR: 0:1: '' : syntax error #version 

Замена 120 с чем-нибудь еще, например, 110, также дает ошибку. Любопытно, однако, если я использую 130 или выше, он дает ту же ошибку плюс жалобу на версию, не поддерживаемую beig. (я знаю, что моя система не имеет GLSL 1.3, но все же странно, что эта ошибка отображается, когда компилятор работает так, как будто он не понимает тег версии.)

Я нахожусь на Mac с ATI Radeon HD 4670. GL_VERSION - 2.1 ATI-7.12.9 и GL_SHADING_LANGUAGE_VERSION - 1.20.

Учитывая, что я не вижу причин, по которым GLSL 1.20 должен быть недоступен. И мне очень странно, что он говорит, что #version является синтаксической ошибкой, а не чем-то вроде неподдерживаемой версии GLSL.

+0

Где находится код загрузки вашего шейдера? –

+0

Я могу вставить это, как только у меня есть интернет. (Использование моего телефона прямо сейчас.) Будет ли полезен исходный код thab? – rlkw1024

ответ

17

Решенный! Это не имело ничего общего с OpenGL. В моем коде для чтения файлов были сброшены все разрывы строк. Это было прекрасно в теле шейдера, у которого были точки с запятой. Но директива препроцессора не имела точки с запятой, чтобы защитить ее от этой ошибки.

Для всех, у кого есть эта проблема, убедитесь, что код, который вы передаете glShaderSource, по-прежнему имеет свои разрывы строк.

+1

Большое спасибо, вы спасли мою ночь! Я нахожусь на Mac с SDL и C++, но с этим неясным сообщением об ошибке OpenGL пытался сказать мне то же самое. – zubko

+0

Способ для этого можно найти [здесь] (http://schabby.de/opengl-shader-example/).BufferedReader вытаскивает источник шейдера по строкам, отбрасывая символы CR/LF. Затем вы явно возвращаете символ новой строки в каждую строку, используя StringBuilder (см. Примерно 2/3 пути вниз по этой странице). –

+0

Большое спасибо. Это был точный вопрос, который у меня был. Pesky Java IO удаляет разрывы! – Textfield

1

Как вершина, так и шейдер фрагмента должны иметь одинаковую версию. Поэтому, если вы добавите #version 120 в шейдер фрагмента, вы также должны добавить его в вершинный шейдер. Но немного странно, что это сообщается как синтаксическая ошибка. Возможно, есть еще одна ошибка, но у обоих обязательно должен быть тег той же версии.

EDIT: Также имейте в виду, что тег версии должен быть первой строкой в ​​исходном коде шейдера (новые строки и комментарии должны быть Ok по спецификации, но кто знает, что думают драйверы).

+0

Я попытался использовать ту же версию в обоих, но не повезло. Поскольку это происходит при компиляции и не связывании, я не думаю, что шейдеры знают друг о друге в любом случае. – rlkw1024

+0

@Jarrett Учитывая зловещий поставщик вашей видеокарты, это может быть ошибка драйвера. Хотя это действительно очень простая функция, и не должно быть никаких проблем для поддержки, но опять же, это все еще ATI. –

+0

Я уверен, что эта проблема была решена с помощью GeForce 320M. Поэтому я начинаю сомневаться в том, что у обоих продавцов есть одна и та же ошибка в базовой функции. – rlkw1024

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