rust 如何用胶质照亮旋转立方体的所有面

a2mppw5e  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(125)
    • 我用glium制作了旋转立方体,但是只有一个面是彩色的。我用 * Gouraud着色 *(来自glium教程)来照明。**立方体是由定义的24个顶点和6个法线制作的。

旋转由两个矩阵完成:

let m = [
            [1.0, 0.0, 0.0, 0.0],
            [0.0, t.cos(), -t.sin(), 0.0],
            [0.0, t.sin(), t.cos(), 0.0],
            [0.0, 0.0, 0.0, 1.0f32]
        ];

        let n = [
            [t.cos(), 0.0, t.sin(), 0.0],
            [0.0, 1.0, 0.0, 0.0],
            [-t.sin(), 0.0, t.cos(), 0.0],
            [0.0, 0.0, 0.0, 1.0f32]
        ];

片段着色器(glsl):

#version 150

in vec3 v_normal;
out vec4 color;
uniform vec3 u_light;

void main() {
    float brightness = dot(normalize(v_normal), normalize(u_light));
    vec3 dark_color = vec3(0.6, 0.0, 0.0);
    vec3 regular_color = vec3(1.0, 0.0, 0.0);
    color = vec4(mix(dark_color, regular_color, brightness), 1.0);
}

灯光:

let light = [-1.0, 0.4, 0.9f32];

光线应该在某个旋转点照射到立方体的另一个面上,我试着改变光线的方向,什么也改变不了,有人知道吗?
有关多维数据集的更多信息,请参见:my previous q.(某些信息,如旋转,在此并不实际)
立方体的图像:第一节第一节第一节第一节第一次

bzzcjhmw

bzzcjhmw1#

我认为你在眼睛空间中有法线方向,在世界空间中有光线方向。所以你必须在进入着色器之前将光线方向转换到相机(眼睛)空间中,类似于(伪代码):

normalize(VIEW_MATRIX * light)

另外,对于亮度,我认为你不希望有负值,所以它必须是一种形式

max(dot(N, L), 0.0)

我建议阅读关于照明的介绍文章,例如在learnOpenGL -https://learnopengl.com/Lighting/Basic-Lighting上,你可以看到关于什么方向以及如何准备它们的描述。或者一些关于在相机空间中拥有灯光方向的GLSL教程-https://www.lighthouse3d.com/tutorials/glsl-tutorial/directional-lights/

相关问题