体素引擎上的立方体法线产生奇怪的结果

时间:2014-06-15 21:40:50

标签: java opengl lwjgl voxel shadows

我正在尝试将法线添加到我的体素引擎16x16多维数据集块中。当我渲染一切时,我得到奇怪的结果。我不确定我是否错误地放置了法线,或者如果使用光线实现简单的阴影,我将不会使用它。

以下是我的每个立方体的顶点和各自的法线。

public void putVertices(float tx, float ty, float tz, FloatBuffer vertexPositionData) {
    float l_length = Constants.BLOCK_SIZE;
    float l_height = Constants.BLOCK_SIZE;
    float l_width = Constants.BLOCK_SIZE;
    vertexPositionData.put(new float[]{
            xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz,
            xOffset + -l_length + tx, -l_height + ty, zOffset + -l_width + tz,
            xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz,
            xOffset + l_length + tx, l_height + ty, zOffset + -l_width + tz,

            xOffset + -l_length + tx, -l_height + ty, zOffset + l_width + tz,
            xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz,
            xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz,
            xOffset + -l_length + tx, l_height + ty, zOffset + l_width + tz,

            xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz,
            xOffset + l_length + tx, -l_height + ty,zOffset +  -l_width + tz,
            xOffset + l_length + tx, l_height + ty,zOffset +  -l_width + tz,
            xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz,

            xOffset + -l_length + tx, -l_height + ty, zOffset + -l_width + tz,
            xOffset + -l_length + tx, -l_height + ty,zOffset +  l_width + tz,
            xOffset + -l_length + tx, l_height + ty, zOffset + l_width + tz,
            xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz,

            xOffset + -l_length + tx, -l_height + ty, zOffset + -l_width + tz,
            xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz,
            xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz,
            xOffset + -l_length + tx, -l_height + ty,zOffset +  l_width + tz,

            xOffset + l_length + tx, l_height + ty,zOffset +  -l_width + tz,
            xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz,
            xOffset + -l_length + tx, l_height + ty, zOffset + l_width + tz,
            xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz

    });
}

public void putNormals(FloatBuffer vertexNormalData) {
    float[] normals = new float[] {
            0.0f, 0.0f, -1.0f,
            0.0f, 0.0f, 1.0f,
            1.0f, 0.0f, 0.0f,
            -1.0f, 0.0f, 0.0f,
            0.0f, -1.0f, 0.0f,
            0.0f, 1.0f, 0.0f,
    };

这是我运行程序时的样子, Weird shadows with normals

看起来光的计算就好像它周围的每个块都不存在一样。我怎么能纠正这个?当块像图中那样平坦时,结果看起来应该是无缝的。

1 个答案:

答案 0 :(得分:0)

您的顶点数据中有24个位置,但只有6个法线向量。每个顶点都需要一个法向量。因此,对于24个位置,您还需要24个法线向量。

由于每边的4个顶点具有相同的法向量,因此需要在normals数组中重复4次法向量,这将为您提供必要的24个法向量。

vertexNormalData.put(new float[] {
        0.0f, 0.0f, -1.0f,
        0.0f, 0.0f, -1.0f,
        0.0f, 0.0f, -1.0f,
        0.0f, 0.0f, -1.0f,
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        -1.0f, 0.0f, 0.0f,
        -1.0f, 0.0f, 0.0f,
        -1.0f, 0.0f, 0.0f,
        -1.0f, 0.0f, 0.0f,
        0.0f, -1.0f, 0.0f,
        0.0f, -1.0f, 0.0f,
        0.0f, -1.0f, 0.0f,
        0.0f, -1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f
});