我正在尝试将法线添加到我的体素引擎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,
};
这是我运行程序时的样子,
看起来光的计算就好像它周围的每个块都不存在一样。我怎么能纠正这个?当块像图中那样平坦时,结果看起来应该是无缝的。
答案 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
});