opengl进阶技巧(四)两个Shadertoy十行代码实现水面波动效果的例子

第一个 

#define F cos(x-y)*cos(y),sin(x+y)*sin(y)
vec2 s(vec2 p){
    float d=iTime*0.2;
    float x=8.*(p.x+d);
    float y=8.*(p.y+d);
    return vec2(F);}
void mainImage( out vec4 f, in vec2 w ){
    vec2 i=iResolution.xy;
    vec2 r=w/i;
    q=r+10./iResolution.x*(s(r)-s(r+i));
    f=texture(iChannel0,q);}

关于最后一行texture的问题,如果把q改成r,那么就是一副正常的图像,因为texture函数第一行指定采样器,即图片,第二行指定纹理坐标。 不过第一行的函数哪里来的?很是迷惑

https://www.shadertoy.com/view/Mls3DH

第二个:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
	vec2 uv = fragCoord.xy / iResolution.xy;
	float time = iTime;
	vec3 raintex = texture(iChannel1,vec2(uv.x,uv.y)).rgb/8.;
	vec2 where = (uv.xy-raintex.xy);
	vec3 texchur1 = texture(iChannel0,vec2(where.x,where.y)).rgb;
	fragColor = vec4(texchur1,1.0);
}

iChannel1是一张类似噪音的黑白图。这样就很好理解了。白颜色的RGB值是(1,1,1),然而如果让整体偏移1的话那么原图像都偏没了,毕竟屏幕只是0到1而已,所有除以8,没什么特别的含义,想偏移大点就除个小数字,反之除个大数字就行了。

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

发布了194 篇原创文章 · 获赞 8 · 访问量 9858

猜你喜欢

转载自blog.csdn.net/qq_43439240/article/details/104234867