2012-03-14 5 views
1

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

varying highp vec2 textureCoordinate; 
uniform sampler2D videoFrame; 

void main(){ 
    vec4 CurrentColor = vec4(0.0); 

    if(textureCoordinate.y < 0.5){ 
     CurrentColor = texture2D(videoFrame,vec2(textureCoordinate.x,(textureCoordinate.y-0.125)));  
    } else{ 
     CurrentColor = texture2D(videoFrame,vec2(textureCoordinate.x,(textureCoordinate.y+0.125))); 
    } 

    gl_fragColor = CurrentColor;  
} 

Приведенный выше код приводит к изображению внизу.

Actual:

Actual

Центр покрой:

Centre cut

Желаемая Выход:

Desired output

Что я хочу это резкого сокращения не должно быть там, должно быть плавное градиентное слияние обеих половин.

+0

Не могли бы вы сделать фотошоп, чтобы продемонстрировать желаемый результат? – datenwolf

+0

@ datenwolf это желаемый результат. [link] (http://i.imgur.com/XRKUf.jpg) – Manish

+0

datenwolf хорошо справляется с актуальным вопросом; мой единственный комментарий заключается в том, что вы, вероятно, увидите лучшую производительность с двумя изменениями, которые представляют две возможные координаты выборки, а не одну, которую вы динамически изменяете. Противоинтуитивно, возможно, даже быстрее выполнить оба примера безоговорочно, а затем выбрать цвет (но вам нужно будет профилировать - см. Стр. 87 из https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/ OpenGLES_ProgrammingGuide/OpenGLES_ProgrammingGuide.pdf) – Tommy

ответ

2

Вы хотите фактическое размытие или просто линейную смесь? Поскольку размытие связано с размытым ядром, тогда как смесь будет простой интерполяцией между этими двумя, в зависимости от y-координаты.

Это код для линейной смеси.

varying highp vec2 textureCoordinate; 
uniform sampler2D videoFrame; 

void main(){ 
    float steepness = 20; /* controls the width of the blending zone, larger values => shaper gradient */ 
    vec4 a = texture2D(videoFrame,vec2(textureCoordinate.x,(textureCoordinate.y-0.125)));  
    vec4 b = texture2D(videoFrame,vec2(textureCoordinate.x,(textureCoordinate.y+0.125))); 

    /* EDIT: Added a clamp to the smoothstep parameter -- should not be neccessary though */ 
    vec4 final = smoothstep(a, b, clamp((y-0.5)*steepness, 0., 1.)); /* there's also mix instead of smoothstep, try both */ 

    gl_FragColor = final;  
} 

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

+0

Hi @datenwolf, вышеизложенное не помогает мне достичь желаемого эффекта. То, что он делает, - это сделать гладкий шаг целых пикселей, но в соответствии с тем, что я хочу, это только в центре. – Manish

+0

Чтобы уточнить мою потребность, я пытаюсь сделать так, чтобы срезать центральную часть изображения (например, 20 пикселей) и, кроме того, присоединиться к другим 2 полушариям с плавным слиянием градиента. Надеюсь, это поможет вам понять мою потребность и помочь мне дальше. – Manish

+0

@Manish: Для этого требуется крутизна параметра. Увеличьте этот параметр по своему желанию, чем больше значение, тем меньше область интерполяции. Лучше сделайте ее униформой, чтобы ее можно было настроить в качестве параметра. – datenwolf

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