- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
//glsl vertex shader
attribute float mass;
uniform vec3 center;
#define RAD 10.0
const float D = RAD * 2.0;
///////////////////THIS///////////////////
float repeat(float x, float z) {
float dx = distance(x, z);
while(dx > RAD) {
if (x > z) {
x -= D;
} else {
x += D;
}
dx = distance(x, z);
}
return x;
}
///////////////////////////////////////////
vec3 repeat(vec3 x, vec3 y) {
return vec3(dr(x.x, y.x), dr(x.y, y.y), dr(x.z, y.z));
}
void main() {
vec3 pos = position;
pos.z += time;
pos = repeat(pos, center);
vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0);
gl_PointSize = 70.0 * mass;
gl_Position = projectionMatrix * mvPosition;
}
По сути функция repeat должна повторять текстуру (как background-repeat: repeat в css) в зависимости от положения точки центра, короче: двигается центр, двигается и текстура за ним. Мне даже ума не хватает описать это, поэтому формулу сам искал, хватило ума только на это говно. Спустя несколько недель додумался до следующего говна, уже без цикла:
float repeat(float x, float z) {
float mp = x > z ? -1.0 : 1.0;
z += RAD * mp;
float dx = distance(x, z);
float n = floor(dx / D) * D;
x += n*mp;
return x;
}
Тяжело не знать математики. Может местные шизы подскажут как называется такое поведение и как нормальную формулу?