botikho.ru beta

Про дизайн, шейдеры, меня и моё.

Позднее Ctrl + ↑

Раз и навсегда

Сохранить и больше никогда не терять.

Матрицы проекционной и перспективной камеры:

mat4 persProjection(float fov, float near, float far, vec2 res) {
    float aspect = res.y / res.x;
    return mat4(
    1.0 / tan(radians(fov / 2.0) * (PI/(radians(180.0)))) * aspect, 0.0, 0.0, 0.0,
    0.0, 1.0 / tan(radians(fov/2.0)*(PI/(radians(180.0)))), 0.0, 0.0,
    0.0, 0.0, -(far) / (far - near), -1.0,
    0.0, 0.0, -(far * near) / (far - near), 0.0);
}

// Прописать бы еще смещение
mat4 orthoProjection(float zoom, float near, float far, vec2 res) {
    float aspect = res.x / res.y;
    zoom = 1.0/ zoom;
    float right = zoom * aspect, left = -(zoom * aspect);
    float top = zoom, bottom = -(zoom);
    return mat4(
    2.0 / (right-left), 0.0, 0.0, 0.0,
    0.0, 2.0 / (top-bottom), 0.0, 0.0,
    0.0, 0.0, -2.0/(far-near), 0.0,
    -(right+left)/(right-left), -(top+bottom)/(top-bottom), -(far+near)/(far-near), 1.0);
}

Матрица вида типа LookAt:

mat4 LookAtRH( vec3 eye, vec3 target, vec3 up) {
    vec3 zaxis = normalize(eye - target); // forward vector
    vec3 xaxis = normalize(cross(up, zaxis)); // right vector
    vec3 yaxis = cross(zaxis, xaxis); // up vector
    return mat4(
        vec4(xaxis.x, yaxis.x, zaxis.x, 0.0),
        vec4(xaxis.y, yaxis.y, zaxis.y, 0.0),
        vec4(xaxis.z, yaxis.z, zaxis.z, 0.0),
        vec4(-dot( xaxis, eye ), -dot( yaxis, eye ), -dot( zaxis, eye ),  1.0)
    );
}

Матрицы позиции, поворота и размера:

mat4 scale(vec3 s) {
    return mat4(
    s.x, 0.0, 0.0, 0.0,
    0.0, s.y, 0.0, 0.0,
    0.0, 0.0, s.z, 0.0,
    0.0, 0.0, 0.0, 1.0);
}

mat4 rotation(float yaw, float pitch, float roll) {
    return mat4(
    cos(yaw)*cos(roll), -cos(yaw)*sin(roll), sin(yaw), 0.0,
    sin(pitch)*sin(yaw)*cos(roll) + sin(roll)*cos(pitch), -sin(pitch)*sin(yaw)*sin(roll) + cos(roll)*cos(pitch), -sin(pitch)*cos(yaw), 0.0,
    -cos(pitch)*sin(yaw)*cos(roll) + sin(pitch)*sin(roll),cos(pitch)*sin(yaw)*sin(roll) + sin(pitch)*cos(roll), cos(yaw)*cos(pitch), 0.0,
    0.0, 0.0, 0.0, 1.0
    );
}

mat4 position(vec3 p) {
    return mat4(
    1.0, 0.0, 0.0, 0.0, 
    0.0, 1.0, 0.0, 0.0, 
    0.0, 0.0, 1.0, 0.0, 
    p.x, p.y, p.z, 1.0);
}

Расчитывать поворот лучше конечно один раз с помощью процессора, но можно и видеокартой.

Далее делается просто:

vec3 cameraPosition = vec3(5.0, 4.0, 5.0);
vec3 modelPosition = vec3(0.0, 0.0, 0.0);

float yaw, pitch, roll;

mat4 model = position(modelPosition) * rotation(yaw, pitch, roll) * scale(vec3(1.0));
mat4 view = LookAtRH(cameraPosition, modelPosition - vec3(0.0, -0.25, 0.0), vec3(0.0, 1.0, 0.0));

mat4 mvp; // ModelViewProjection Matrix
mvp = persProjection(45.0, 0.1, 40.0, resolution) * view * model; // for perspective camera
mvp = orthoProjection(1.0, 0.0, 40.0, resolution) * view * model; // for orthographic camera

gl_Position = newmvp * pos;

// Далее кроме позиции, нормали и uv-координаты точки необходимо передать еще параметры камеры — ее позицию и направление, если это не передается процессором.
viewPos = cameraPos; //varying viewPos
viewDir = normalize(-cameraPos); //varying viewDir
v_position = a_position;
v_normal = mat3(rotation(rot.x, rot.y, rot.z)) * a_normal;
v_texcoord = a_texcoord;
2018   #glsl
Ранее Ctrl + ↓