Я работаю над 2D-iOS-игрой, используя OpenGL 2.0, и мне интересно, можно ли написать шейдер, который будет отображать изображения с сиянием. Все изображения являются двумерными спрайтами. Примеры шейдеров, которые я видел для выделения, предназначены для трехмерных объектов, поэтому я не уверен, что это возможно для 2D-изображений.OpenGL ES Shader для выделения 2D-изображений
ответ
Вы принимаете фильтр обнаружения края (например, Sobel), создавая изображение, подобное тому, которое показано в the Wikipedia article, а затем гауссовское размытие по результатам этого, чтобы смягчить края и дать ему больше свечения, затем составной это изображение на вашей сцене?
На практике вы, вероятно, могли бы просто повторно использовать триггерные шейдеры, которые вы видели - хотя теоретически можно было бы проверить количество глубин (с некоторыми расширенными усилиями в ES), каждый из тех, что я когда-либо видел, был всего лишь 2d-эффектом на отображаемое изображение.
EDIT: при дальнейшем рассмотрении лапласиан может быть немного легче применен, чем Sobel, поскольку он может быть выполнен как простые сверточные шейдеры (как описано в местах like this). Хотя, чтобы быть в безопасности на мобильном телефоне, вы, возможно, захотите больше придерживаться ядер 3x3 и писать разные шейдеры для каждого эффекта, а не делать это с данными. Так, например, грубый Гауссово размывание, выписана в длину:
void main()
{
mediump vec4 total = vec4(0.0);
mediump vec4 grabPixel;
total += texture2D(tex2D, texCoordVarying + vec2(-1.0/width, -1.0/height));
total += texture2D(tex2D, texCoordVarying + vec2(1.0/width, -1.0/height));
total += texture2D(tex2D, texCoordVarying + vec2(1.0/width, 1.0/height));
total += texture2D(tex2D, texCoordVarying + vec2(-1.0/width, 1.0/height));
grabPixel = texture2D(tex2D, texCoordVarying + vec2(0.0, -1.0/height));
total += grabPixel * 2.0;
grabPixel = texture2D(tex2D, texCoordVarying + vec2(0.0, 1.0/height));
total += grabPixel * 2.0;
grabPixel = texture2D(tex2D, texCoordVarying + vec2(-1.0/width, 0.0));
total += grabPixel * 2.0;
grabPixel = texture2D(tex2D, texCoordVarying + vec2(1.0/width, 0.0));
total += grabPixel * 2.0;
grabPixel = texture2D(tex2D, texCoordVarying);
total += grabPixel * 4.0;
total *= 1.0/16.0;
gl_FragColor = total;
}
И лапласиане край обнаружения заканчивает тем, что аналогичные, но с различными константами.
Как оптимизация, вы должны выработать свои относительные точки выборки в вершинном шейдере, а не в шейдере фрагмента, насколько это возможно, учитывая ограничение на изменения, так как это позволит избежать зависимых текстурных прочтений.
Возможно, я не смотрю на правильные 3D-модели, но те, которые я видел, в какой-то степени работают на источнике света, который я не дал, это 2D. Я очень новичок в шейдерах, поэтому я, вероятно, не замечаю здесь очевидного. –
Многие ячеистые шейдеры пост-струйной установки используют положение камеры для обнаружения краев, определяя край, чтобы быть соединением между передним лицом к краю и обратным обратным краем. Очевидно, вы не сможете использовать один из них. Но такие подходы, как Собель и Лапласиан, ищут разрывы в цвете в двухмерном изображении, чтобы пятно краев, так что вполне уместны. Вероятно, полезно читать на фильтрах свертки, если вы еще этого не сделали, тогда исследуйте лапласианское и гауссовское размытие. Я добавил несколько поспешно собранных примеров кода для последнего. – Tommy
- 1. Shader не работает - OpenGL ES
- 2. OpenGL ES shader multi textures
- 3. Opengl ES diffuse shader не работает
- 4. PowerVR SGX535 Shader Performance (OpenGL ES 2.0)
- 5. 2 Текстуры, 1 Shader - OpenGL ES 2.0
- 6. OpenGL ES 2.0: Shader Linking Fail
- 7. Плазменного Shader Производительность в OpenGL ES 2.0
- 8. Java: OpenGl ES 2.0 Shader Light
- 9. Android OpenGL ES Fragement Shader 1282 error
- 10. opengl-es shader language if statement vs?
- 11. OpenGL ES 2.0 Shader Float Data Precision
- 12. Имя переменной Эффективность Shader (OpenGL ES 2)
- 13. Использование opengl es shader для преобразования YUV в RGB
- 14. opengl es shader id программы и идентификатор буфера vbo одинаковы
- 15. Создание вершин в OpenGL ES 2.0 Vertex Shader
- 16. Масштаб и краска с помощью OpenGL ES shader на android
- 17. Определение вершины треугольника, которое вычисляется в openGL ES vertex shader
- 18. OpenGL ES 2.0 Vertex Shader Texture Не читается из FBO?
- 19. OpenGL ES 2.0 Shader на текстурах не работает
- 20. OpenGL ES 2.0: Несколько источников света: Shader проблема
- 21. Android OpenGL ES 2.0 shader texture2d Диапазон значений RGB
- 22. Как передать массив float в Shader в OpenGL ES 2.0?
- 23. Использование Android 4x5 ColorMatrix в OpenGL ES 2 Shader
- 24. Передача собственной структуры в opengl es 2.0 shader
- 25. Подходящий чертеж к текстуре FBO в OpenGL ES Фрагмент Shader
- 26. OpenGL ES 2.0 GLSL Barrel Distortion Shader не работает
- 27. Поддерживается ли modf() в OpenGL ES 2.0 Shader Language?
- 28. OpenGL ES учебник для Android не работает
- 29. glPushMatrix и OpenGL ES
- 30. OpenGL ES Для Iphone
так что свечение, которое вы хотите добавить, похоже на тень? –
Больше обводки вокруг изображения, которое будет иметь мягкие края. –