Как использовать gl_LastFragData в WEBGL? - PullRequest
0 голосов
/ 07 декабря 2018

Я сейчас работаю над проектом THREE.JS.Мне нужно настроить frag_shader с программируемым смешиванием вместо использования предопределенного смешивания.Для этого я хочу использовать gl_LastFragData в моем фрагменте.Но я получил эту ошибку. Изображение ошибки

Как я могу использовать gl_LastFragData в WEBGL или есть другой эквивалентный способ?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

gl_LastFragData отсутствует в спецификации webgl или opengl.Однако в этих API есть механизм extensions .

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

В сообщении об ошибке говорится, что вы пытаетесь использовать функциональность расширения, когда оно недоступно.

Говоря о вашем конкретном случае - проверьте расширение EXT_shader_framebuffer_fetch .Также стоит проверить ARM_shader_framebuffer_fetch , NV_shader_framebuffer_fetch.

Однако эти расширения написаны для OpenGL 2.0, OpenGL ES2.0.Я не уверен, существуют ли они как расширения webgl .

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

0 голосов
/ 07 декабря 2018

В WebGL нет gl_LastFragData.WebGL основан на OpenGL ES 2.0, WebGL2 основан на OpenGL ES 3.0.Ни один из них не поддерживает gl_LastFragData

Традиционный способ использования предыдущего результата - передать его в качестве текстуры при создании следующего результата

someOperation1(A, B)            -> TempTexture1
someOperation2(TempTexture1, C) -> TempTexture2
someOperation3(TempTexture2, D) -> TempTexture1
someOperation4(TempTexture1, E) -> TempTexture2
someOperation5(TempTexture2, F) -> resultTexture/fb/canvas/window

Пример

...