2015-07-31 6 views
0

Как название, У меня есть эта линия в пиксельный шейдер программы WebGL,Почему я не могу редактировать gl_FragCoord?

gl_FragCoord.xy = vec2(gl_FragCoord.x + 1.0,gl_FragCoord.y); 

и консоли Google Chrome рассказывает:

ОШИБКА: 0:45: 'правопреемником': L-значение требуется «gl_FragCoord» (не может изменять gl_FragCoord)

Почему?

+1

Как правило, вы перемещаете вещи в вершинном шейдере (gl_Position) и цветных вещей в пиксельный шейдер (gl_FragColor). Таким образом, вы захотите переместить свою логику в вершинный шейдер, если вы перемещаете вещи. –

+0

На самом деле, в конце концов я дошел до этого, но это может быть полезно для следующего приезда :) – LowFieldTheory

ответ

3

gl_FragCoord - координата фрагмента, в котором в данный момент работает ваш шейдер. Вы не можете динамически выбирать фрагмент, который вы обрабатываете, «по причинам параллелизма» и потому, что «графические процессоры не разработаны таким образом», если вы хотите узнать больше об архитектуре графического процессора, большой ресурс для этого будет A trip through the Graphics Pipeline by Fabian Giesen aka ryg.

Available only in the fragment language, gl_FragCoord is an input variable that contains the window relative coordinate (x, y, z, 1/w) values for the fragment. If multi-sampling, this value can be for any location within the pixel, or one of the fragment samples. This value is the result of fixed functionality that interpolates primitives after vertex processing to generate fragments. OpenGL SDK Doc

+0

Не могли бы вы дать более полный ответ ..? По крайней мере, ссылка на «причины распараллеливания» – LowFieldTheory

+0

Я добавил дополнительную информацию и ссылку, просмотрите часть 8 и 9 из * Поездка по графическому конвейеру *. Btw. даже если бы это было возможно, ваш код просто компенсировал бы конечное изображение справа на один пиксель, так что в этом смысл? –

+0

Это был просто игрушечный пример. Мне нужно сделать гораздо более сложную трансформацию – LowFieldTheory

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