MyTetra Share
Делитесь знаниями!
Примеры шейдеров со скриншотами
Время создания: 27.06.2021 23:10
Раздел: Компьютер - Программирование - Шейдеры - Шейдеры GLSL
Запись: xintrea/mytetra_syncro/master/base/1624824600egqvgo2qu2/text.html на raw.github.com

Статический шейдер с вертикально-радиальным градиентом


Данный шйдер использует функцию mix(), вычисляющую линейно-интерполированное значение входных параметров.


Скриншот:





Код (для среды ShaiderToy):



void mainImage( out vec4 fragColor, in vec2 fragCoord )

{

vec2 uv = gl_FragCoord.xy / iResolution.xy;

vec4 orange = vec4(0.533, 0.25, 0.145, 1.0);

vec4 blue = vec4(0.18, 0.23, 0.27, 1.0);

vec4 black = vec4(0.0, 0.0, 0.0, 1.0);

vec4 white = vec4(1.0, 1.0, 1.0, 1.0);


float ratio = iResolution.x / iResolution.y;

float PI = 3.14159265359;


vec4 mixC = mix(orange, blue, sin(ratio * uv.y));

mixC = mix(mixC, black, cos(2.0 * PI * uv.x) / ratio);

mixC = mix(mixC, black, cos(2.0 * PI * uv.y) / ratio);

mixC = mix(mixC, white, 0.1);

fragColor = mixC;

}



Статический шейдер с концентрическими кругами


Шейдер рисует плавные концентрические круги.


Скриншот:





Код (для среды Bonzomatic):



vec4 wavePlate(vec2 position, float maxRadius, float waveLen)

{

vec2 center=vec2(0.5);

float l=length(position - center);


if(l>maxRadius)

{

return vec4(0.0, 0.0, 0.0, 0.0); // Transparent color

}


float c=sin(l/waveLen)/2.0+0.5;

return vec4(c, c, c, 1.0);

}



void main(void)

{

// Translate XY coordinats to UV coordinats

vec2 uvPosition = vec2(gl_FragCoord.x / v2Resolution.x, gl_FragCoord.y / v2Resolution.y);

uvPosition /= vec2(v2Resolution.y / v2Resolution.x, 1);

float sideFieldWidth=(v2Resolution.x-v2Resolution.y)/2; // Width in pixel

float uvSideFieldWidth=(v2Resolution.y+sideFieldWidth)/v2Resolution.y-1;

uvPosition=uvPosition-vec2(uvSideFieldWidth, 0);


gl_FragColor = wavePlate(uvPosition, 0.4, 0.003);

}



Шейдер с солнцем на закате и водой


Мягкая поверхность воды и круглое солнце. Золотистые цвета.


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



Шейдер с бесконечным цилиндром SDF (построение через знаковое поле расстояний)


float sdTorus( vec3 p, vec2 t ) {

vec2 q = vec2(length(p.xy)-t.x,p.z);

return length(q)-t.y;

}


float sdSphere(vec3 p, float r) {

return length(p) - r;

}


float sdCylinderInf(vec2 p, float r) {

return length(p) - r;

}



float scene( vec3 p ) {

// float rt = sdTorus(p, vec2(1.0, 0.5) );

// vec3 ps = p - vec3( sin(iTime) * 0.6 , 0., 0.5);

// float rs = sdSphere(ps, 0.9);

// return min(rt, rs);

float rci=sdCylinderInf(p.yz, 0.8);

return rci;

}


void mainImage( out vec4 fragColor, in vec2 fragCoord )

{

// Normalized pixel coordinates (from 0 to 1)

vec2 uv = fragCoord/iResolution.xy * 2.0 - 1.0;

uv.x *= iResolution.x / iResolution.y; // aspect ratio


vec3 ro = vec3(0, 0, 10); // Точка - Позиция камеры

// направление луча (ray direction)

vec3 rd = normalize(vec3(uv.x, uv.y, -4.));

float shad = 0.0;

float t = 0.;


for (int i = 0; i < 64; ++ i) {

vec3 p = ro + rd * t;


float dt = scene(p);

if ( dt < 0.001 ) {

shad = 1. - float(i) / 64.0;

break;

}

t += dt;

}

vec3 col = vec3(shad*shad);

// Output to screen

fragColor = vec4(col,1.0);

}



Шейдер с текстурированным SDF цилиндром


Скриншот:





Код:


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



Скриншот:



Код:


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


#define MAX_STEPS 100

#define MAX_DIST 100.

#define SURF_DIST .001


#define S smoothstep

#define T iTime


mat2 Rot(float a) {

float s=sin(a), c=cos(a);

return mat2(c, -s, s, c);

}


float sdBox(vec3 p, vec3 s) {

p = abs(p)-s;

return length(max(p, 0.))+min(max(p.x, max(p.y, p.z)), 0.);

}


// Cylinder standing upright on the xz plane

float sdCylinder(vec3 p, float r, float height) {

float d = length(p.xz) - r;

d = max(d, abs(p.y) - height);

return d;

}



// This is analogue of "scene function"

float GetDist(vec3 p) {

// float d = sdBox(p, vec3(1));

float d = sdCylinder(p, 2.0, 0.1);

return d;

}



float RayMarch(vec3 ro, vec3 rd) {

float dO=0.;

for(int i=0; i<MAX_STEPS; i++) {

vec3 p = ro + rd*dO;

float dS = GetDist(p);

dO += dS;

if(dO>MAX_DIST || abs(dS)<SURF_DIST) break;

}

return dO;

}


vec3 GetNormal(vec3 p) {

float d = GetDist(p);

vec2 e = vec2(.001, 0);

vec3 n = d - vec3(

GetDist(p-e.xyy),

GetDist(p-e.yxy),

GetDist(p-e.yyx));

return normalize(n);

}


vec3 GetRayDir(vec2 uv, vec3 p, vec3 l, float z) {

vec3 f = normalize(l-p),

r = normalize(cross(vec3(0,1,0), f)),

u = cross(f,r),

c = f*z,

i = c + uv.x*r + uv.y*u,

d = normalize(i);

return d;

}


void mainImage( out vec4 fragColor, in vec2 fragCoord )

{

vec2 uv = (fragCoord-.5*iResolution.xy)/iResolution.y;

vec2 m = iMouse.xy/iResolution.xy;


vec3 ro = vec3(0, 3, -3);

ro.yz *= Rot(-m.y*3.14+1.);

ro.xz *= Rot(-m.x*6.2831);

vec3 rd = GetRayDir(uv, ro, vec3(0,0.,0), 1.);

vec3 col = vec3(0);

float d = RayMarch(ro, rd);


if(d<MAX_DIST) {

vec3 p = ro + rd * d;

vec3 n = GetNormal(p);

vec3 r = reflect(rd, n);


float dif = dot(n, normalize(vec3(1,2,3)))*.5+.5;

col = vec3(dif);

// Texturing plate

if( distance(abs(n), vec3(0.0, 1.0, 0.0)) < 0.001 )

{

uv=vec2( sin(p.z), cos(p.x) );

}

else // Texturing round

{

uv=vec2( atan(p.z, p.x), p.y );

}

col*=texture(iChannel0, uv).rgb;

}

col = pow(col, vec3(.4545)); // gamma correction

fragColor = vec4(col,1.0);

}



Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования