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;
});
任何你能告訴我這個將不勝感激。謝謝!
您是否有權使用原作者的權利? –
是的,通用許可證。另外,一旦它正在工作,我正在另一邊做一些其他的事情。 –
這主要是想知道如何做到這一點,但我已經有3個不同的版本已經 –