2016-02-24 3 views
0

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

varying vec3 v_Position;   
    varying vec4 v_Color;   

    varying vec3 v_Normal;   
    varying vec2 v_TexCoordinate; 

    void main() 
    { 
     var col = texture2D(u_Texture, v_TexCoordinate); 
     col.r = 0.5; 
     gl_FragColor = col; 
    } 

Это где я заблудиться. Как изменить положение пикселей, чтобы исказить текстуру? могу ли я установить любые другие свойства, но gl_FragColor? или мне нужно создать плоскость с множеством вершин и исказить расположение вершин? Можно ли получить значения цвета пикселя «сосед»? Благодаря!

ответ

3

Как изменить расположение пикселей, чтобы исказить текстуру?

Редактирование местоположения, из которого вы производите текстуру. Это будет второй параметром texture2D

var col = texture2D(u_Texture, v_TexCoordinate); 
           ^-------------^ 
      Texture distortion goes here 

Можно ли получить значение цвета пикселя «сосед»?

Да, и это правильный способ сделать это. В фрагментном шейдере место, которое вы пишете, является неизменным¹, поэтому все это нужно сделать через местоположение выборки. Также обратите внимание, что вы можете пробовать одну и ту же текстуру произвольное число раз, что позволяет реализовать эффекты размытия.


¹: записывает свободно определяет местоположение изображений (разброс пишет) поддерживается OpenGL-4 класса аппаратных средств, но разброс запись крайне неэффективна и его следует избегать.

²: существует практический предел общей продолжительности работы шейдера, который может быть ограничен ОС, а также требуемой частотой кадров.

³: эффекты размытия должны быть реализованы с использованием так называемого separable filters для большей эффективности.

+0

Большое спасибо, сэр! – user3578847

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