2017-05-03 110 views
1

我正致力於將此着色器從shadertoy移植到基於GPUImage的iOS平臺的glsl中。爲什麼不在glsl中正確顯示這個shadertoy?

https://www.shadertoy.com/view/4s2yW1

技術上講,它在設備上運行有效。但是,它只顯示背景,而不是圓圈,這是整個點。

我想知道如果有人可以給我一些線索,爲什麼這不是正確顯示。無論出於什麼原因,我在使用shaderfrog時都會得到相同的結果。

這裏的shaderfrog鏈接: http://shaderfrog.com/app/view/1463

和代碼本身:

#define PI 3.14159265359 

NSString *const kGPUImageBokehFragmentShaderString = SHADER_STRING 
(
precision highp float; 
varying highp vec2 textureCoordinate; 
uniform sampler2D inputImageTexture; 
uniform highp float time; 


void Rotate(vec2 p, float a) 
{ 
    p = cos(a) * p + sin(a) * vec2(p.y, -p.x); 
} 

float Circle(vec2 p, float r) 
{ 
    return (length(p/r) - 1.0) * r; 
} 

float Rand(vec2 c) 
{ 
    return fract(sin(dot(c.xy, vec2(12.9898, 78.233))) * 43758.5453); 
} 

float saturate(float x) 
{ 
    return clamp(x, 0.0, 1.0); 
} 

void BokehLayer(vec3 color, vec2 p, vec3 c) 
{ 
    float wrap = 450.0; 
    if (mod(floor(p.y/wrap + 0.5), 2.0) == 0.0) 
    { 
     p.x += wrap * 0.5; 
    } 

    vec2 p2 = mod(p + 0.5 * wrap, wrap) - 0.5 * wrap; 
    vec2 cell = floor(p/wrap + 0.5); 
    float cellR = Rand(cell); 

    c *= fract(cellR * 3.33 + 3.33); 
    float radius = mix(30.0, 70.0, fract(cellR * 7.77 + 7.77)); 
    p2.x *= mix(0.9, 1.1, fract(cellR * 11.13 + 11.13)); 
    p2.y *= mix(0.9, 1.1, fract(cellR * 17.17 + 17.17)); 

    float sdf = Circle(p2, radius); 
    float circle = 1.0 - smoothstep(0.0, 1.0, sdf * 0.04); 
    float glow = exp(-sdf * 0.025) * 0.3 * (1.0 - circle); 
    color += c * (circle + glow); 
} 

void main() 
{ 
    vec2 iResolution = vec2(1., 1.); 
    vec2 uv = textureCoordinate.xy/iResolution.xy; 
    vec2 p = (2.0 * textureCoordinate - iResolution.xy)/iResolution.x * 1000.0; 

    // background 
    vec3 color = mix(vec3(0.3, 0.1, 0.3), vec3(0.1, 0.4, 0.5), dot(uv, vec2(0.2, 0.7))); 

    float timeElapsed = time - 15.0; 

    Rotate(p, 0.2 + timeElapsed * 0.03); 
    BokehLayer(color, p + vec2(-50.0 * timeElapsed + 0.0, 0.0 ), 3.0 * vec3(0.4, 0.1, 0.2)); 
    Rotate(p, 0.3 - timeElapsed * 0.05); 
    BokehLayer(color, p + vec2(-70.0 * timeElapsed + 33.0, -33.0), 3.5 * vec3(0.6, 0.4, 0.2)); 
    Rotate(p, 0.5 + timeElapsed * 0.07); 
    BokehLayer(color, p + vec2(-60.0 * timeElapsed + 55.0, 55.0), 3.0 * vec3(0.4, 0.3, 0.2)); 
    Rotate(p, 0.9 - timeElapsed * 0.03); 
    BokehLayer(color, p + vec2(-25.0 * timeElapsed + 77.0, 77.0), 3.0 * vec3(0.4, 0.2, 0.1)); 
    Rotate(p, 0.0 + timeElapsed * 0.05); 
    BokehLayer(color, p + vec2(-15.0 * timeElapsed + 99.0, 99.0), 3.0 * vec3(0.2, 0.0, 0.4)); 

    vec4 bokehColor = vec4(color, 1.0); 
    gl_FragColor = bokehColor; 
}); 

任何你能告訴我這個將不勝感激。謝謝!

+0

您是否有權使用原作者的權利? –

+0

是的,通用許可證。另外,一旦它正在工作,我正在另一邊做一些其他的事情。 –

+0

這主要是想知道如何做到這一點,但我已經有3個不同的版本已經 –

回答

3

的問題是你沒有的顏色標記爲inout

void BokehLayer(vec3 color, vec2 p, vec3 c) // bad 

void BokehLayer(inout vec3 color, vec2 p, vec3 c) // good 

BokehLayer想要修改color但沒有inout關鍵字,它只是給函數的參數。使用inout它是一個參考原始變量。

相關問題