I’m try to map GLSL texture shader to 3D ring, I’ve got little working, but I think i’m miss some translation to 3D (i think), as it’s mapping it to 2D. I try use fragment from processing site. Where am I going wrong?
sketch.pde
PShape mRing;
float angle;
int time;
PShader mShader;
void setup()
{
time = 0;
size(800, 600, P3D);
mRing = loadRing(160,80,24,24);
mShader = loadShader("fragment.glsl");
}
void draw()
{
background(128);
translate(width/2, height/2);
rotateY(angle);
mShader.set("u_resolution", float(width), float(height));
mShader.set("u_time", time);
shader(mShader);
shape(mRing);
angle += 0.01;
time+= 0.5;
}
PShape loadRing(float outerRad, float innerRad, int numc, int numt)
{
textureMode(NORMAL);
PShape shape = createShape();
shape.beginShape(TRIANGLE_STRIP);
shape.noStroke();
float x, y, z, s, t, u, v;
float nx, ny, nz;
float p1, p2;
for (int a = 0; a < numc; a++)
{
for (int b = 0; b <= numt; b++)
{
for (int c = 1; c >= 0; c--)
{
s = (a + c) % numc + 0.5;
t = b % numt;
u = s / numc;
v = t / numt;
p1 = s * TWO_PI / numc;
p2 = t * TWO_PI / numt;
x = (outerRad + innerRad * cos(p1)) * cos(p2);
y = (outerRad + innerRad * cos(p1)) * sin(p2);
z = innerRad * sin(p1);
nx = cos(p1) * cos(p2);
ny = cos(p1) * sin(p2);
nz = sin(p1);
shape.normal(nx, ny, nz);
shape.vertex(x, y, z);
}
}
}
shape.endShape();
return shape;
}
fragment.glsl
#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 u_resolution;
uniform float u_time;
#define PI 3.14159265358979323846
vec2 rotate2D(vec2 _st, float _angle){
_st -= 0.5;
_st = mat2(cos(_angle),-sin(_angle),
sin(_angle),cos(_angle)) * _st;
_st += 0.5;
return _st;
}
vec2 tile(vec2 _st, float _zoom){
_st *= _zoom;
return fract(_st);
}
float box(vec2 _st, vec2 _size, float _smoothEdges){
_size = vec2(0.5)-_size*0.5;
vec2 aa = vec2(_smoothEdges*0.5);
vec2 uv = smoothstep(_size,_size+aa,_st);
uv *= smoothstep(_size,_size+aa,vec2(1.0)-_st);
return uv.x*uv.y;
}
void main(void){
vec2 st = gl_FragCoord.xy/u_resolution.xy;
vec3 color = vec3(0.0);
st = tile(st,4.);
st = rotate2D(st,PI*0.25);
color = vec3(box(st,vec2(0.7),0.01));
gl_FragColor = vec4(color,1.0);
}