gl_Color — необъявленный идентификатор в WebGL.

Я смотрю на http://www.swiftless.com/tutorials/glsl/3_glcolor.html со следующим фрагментом кода:

void main() {
// Set the output color of our current pixel
gl_FragColor = gl_Color;}

Я пытался использовать gl_Color на своем WebGL. Я получил ошибку, что gl_Color является необъявленным идентификатором.

Что я сделал не так?

Заранее спасибо за помощь.


person pion    schedule 17.12.2010    source источник


Ответы (2)


WebGL использует Open GL ES 2.0 в качестве основы, поэтому для шейдеров следует использовать GLSL ES 1.0. В GLSL ES нет gl_Color, поэтому вам придется переписать этот шейдер.

person Gray    schedule 17.12.2010
comment
Спасибо за вашу помощь. Я просто гуглю GLSL ES 1.0. Он находится на khronos.org/registry/gles/specs/2.0. /. Как получить доступ к эквиваленту gl_Color в GLSL ES 1.0? - person pion; 17.12.2010
comment
Нет эквивалента gl_Color или gl_Vertex, gl_Normal и т. д. — ни один аспект старого фиксированного конвейера не дублируется и не моделируется, а такие функции, как glColorPointer, не работают в ES 2.0. Вам нужно определить свой собственный атрибут или униформу, как вам нужно, и получить/установить ее обычным способом. - person Tommy; 17.12.2010
comment
Я новичок в WebGL. Я просто пытаюсь смешать текущий пиксель в буфере кадра с текущим текселем. Как лучше всего это сделать? - person pion; 17.12.2010
comment
Чтобы использовать обычный режим наложения (glEnable(GL_BLEND), glBlendFunc и т. д.), просто выведите пиксель с правильной альфой. Вы не можете считывать данные из текущего буфера кадра, но можете выполнять рендеринг в текстуру, а затем семплировать из нее, хотя будьте осторожны, чтение из той же текстуры, в которую вы рендерите, имеет неопределенные результаты. Среди прочего, возможность чтения кадрового буфера либо привела бы к возникновению условий гонки во многих реализациях мультисэмплинга, либо потребовала бы гораздо более запутанного и более медленного аппаратного пути. - person Tommy; 17.12.2010

Я предполагаю, что вы пытаетесь скомпилировать код GLSL с помощью обычного компилятора C.

Похоже, что это должен быть код C, но на самом деле это исходный код GLSL, предназначенный для компиляции компилятором OpenGL GLSL, а не компилятором C вашей машины.

Фрагментный шейдер имеет предопределенную переменную gl_Color, которая является выходом вершинного шейдера.

Образец, на который вы ссылаетесь, содержит код внутри файла shaper.frag, на который ссылается функция shader.init(). Библиотека OpenGL сама скомпилирует ее в инструкции GPU для вашей машины. Поместите код в этот файл, и, надеюсь, пример будет работать :)

person matja    schedule 17.12.2010
comment
Я забыл упомянуть, что использую WebGL в своем исходном посте. Я изменяю существующий пример WebGL (и GLSL), который уже работает. Я только что попытался включить gl_Color в приведенный выше учебник. Кажется, у cheese есть правильный ответ. Возможно, WebGL использует GLSL 1.0. - person pion; 17.12.2010