2017-05-03 4 views
1

shadertoy의이 쉐이더를 GPUImage 기반 iOS 플랫폼 용 glsl로 포팅하려고합니다.왜이 shadertoy가 glsl에서 올바르게 표시되지 않습니까?

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

기술적으로, 효과적으로 장치에서 실행중인. 그러나 그것은 단지 배경을 표시하는 것이지 서클은 표시하지 않는 것이 전체 점입니다.

누군가가 나에게 이것이 제대로 표시되지 않는 이유에 대한 단서를 줄 수 있는지 궁금합니다. 어떤 이유로 든 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; 
}); 

아무것도 당신이 말해 줄 수

다음은 shaderfrog 링크입니다. 감사!

+0

원본 저자의 허락을 받았습니까? –

+0

예, 일반 라이센스. 게다가 그것이 작동하면 다른 측면에서 다른 것들을하고 있습니다. –

+0

이것은 정확히 정확히 어떻게하는지 알아내는 것에 관한 것이지만 이미 3 가지 버전이 있습니다. –

답변

3

문제는 당신이 색상 color을 수정하고자

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

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

BokehLayer

inout로 표시하지 않습니다하지만 inout 키워드없이 함수에 불과 매개 변수입니다이다. inout으로 참조 용 변수입니다.

관련 문제