Буферы рендеринга WebGL получают искаженные значения пикселей от шейдера

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

Сейчас пайплайн выглядит так:

  • Рендерим базовые полигоны (используя простой шейдер, как показано ниже) в промежуточный буфер
  • Визуализируйте буфер как четырехугольник размером с экран на экране.

Я использую WebGL Inspector (http://benvanik.github.com/WebGL-Inspector/) для просмотра промежуточных буферов (созданных с использованием gl.createFrameBuffer()).

У меня есть очень простой фрагментный шейдер при рисовании полигонов, что-то вроде этого:

gl_FragColor = vec4(1, 0, 0, 0.5);

И это до моего вызова отрисовки:

gl.disable(gl.BLEND);

Я ожидал, что это создаст пиксель в буфере со значением точно (255,0,0,128), но на самом деле он создает пиксель со значением (255,0,0,64) - вдвое меньше. альфа, как и ожидалось.

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

Спасибо!


person Ipsquiggle    schedule 23.01.2012    source источник
comment
Откуда вы знаете, что такое альфа-значение этого пикселя? Что вы рисуете, что вы пишете это значение пикселя.   -  person Nicol Bolas    schedule 24.01.2012
comment
Боюсь, что нам, вероятно, понадобится немного больше информации, но сразу же приходит в голову одна мысль: включено ли у вас сглаживание? Если это так, и если пиксель, который вы сэмплируете, находится на краю полигона, он может в конечном итоге смешаться с более низким, чем ожидалось, значением.   -  person Toji    schedule 24.01.2012
comment
@NicolBolas: я проверил значение пикселя непосредственно с помощью WebGL Inspector, сэмплировал его экранное значение при окончательном рендеринге, а также наблюдал за его поведением на последующих этапах обработки. Значение рисуется из простого многоугольника с указанным выше простым фрагментным шейдером в буфер кадра, и этот буфер кадра затем визуализируется в буфер экрана.   -  person Ipsquiggle    schedule 25.01.2012
comment
@Toji Цвет однороден по всей поверхности нескольких полигонов, я пробовал сотни точек в десятках различных рендеров, пытаясь найти причину. (Я только что узнал, что AA включен по умолчанию как в Chrome, так и в FF, что неожиданно! Спасибо, что указали на это, проверим, связано ли это.)   -  person Ipsquiggle    schedule 25.01.2012
comment
Вы проверили, что к вашей цели рендеринга не применена гамма-коррекция? Если это так, он может изменить значение, которое вы возвращаете.   -  person crazyjul    schedule 25.01.2012
comment
@crazyjul Эта гамма на самом деле кажется довольно хорошей зацепкой. Расследование...   -  person Ipsquiggle    schedule 25.01.2012
comment
Как насчет попытки gl_FragColor = vec4(1, 0, 0, 1); или gl_FragColor = vec4(1, 0, 0, 0);? Вы уверены, что для альфы выделено 8 бит? Это было бы немного странно, но нет смысла жаловаться на 0,5 = 64, если вы не знаете, что такое масштаб. Кроме того, это как-то влияет на ваш рендеринг? Или вы заметили, что значения меньше, чем ожидалось, и вам это кажется странным? @crazyjul Gamma должна влиять только на цвета. Изменение альфы было бы плохой идеей и могло бы вызвать проблемы во многих приложениях.   -  person the swine    schedule 26.01.2012


Ответы (1)


Вы установили premultilyAlpha в true? Возиться с этим — первое, что пришло на ум: странные альфа-значения.

person Ilmari Heikkinen    schedule 27.01.2012
comment
Я ожидаю, что это будет связано со значениями RGB, а не со значениями A, но я хочу это проверить. - person Ipsquiggle; 31.01.2012