3D 堆叠物体(立方体和球体)
创建了三个单独的模型,其中包括使用新的球体类,该类别以过程为基础创建所需的顶点和连接信息。 使用了五个纹理,一个用于地板,各个纹理用于立方体和球体。 地板使用Chequerboard纹理。 立方体和球体每个都有一个弥漫性和镜面图。
地板是两个三角形数据的缩放版本,因此地板的尺寸为16x16单元。 对于立方体,模型矩阵转换首先将Cube 0.5沿正方向转换为0.5(以将立方体的底部放在点(0,0,0)),然后缩放4个以创建4x4x4个立方体 其基地的中心位于(0,0,0)。 球体转换为位于立方体的顶部(y高为4-应将其存储在变量中而不是使用文字中)。
public void initialise(GL3 gl) {
createRandomNumbers();
int[] textureId0 = TextureLibrary.loadTexture(gl, "textures/chequerboard.jpg");
int[] textureId1 = TextureLibrary.loadTexture(gl, "textures/container2.jpg");
int[] textureId2 = TextureLibrary.loadTexture(gl, "textures/container2_specular.jpg");
int[] textureId3 = TextureLibrary.loadTexture(gl, "textures/jade.jpg");
int[] textureId4 = TextureLibrary.loadTexture(gl, "textures/jade_specular.jpg");
light = new Light(gl);
light.setCamera(camera);
Mesh m = new Mesh(gl, TwoTriangles.vertices.clone(), TwoTriangles.indices.clone());
Shader shader = new Shader(gl, "vs_tt_05.txt", "fs_tt_05.txt");
Material material = new Material(new Vec3(0.0f, 0.5f, 0.81f),
new Vec3(0.0f, 0.5f, 0.81f),
new Vec3(0.3f, 0.3f, 0.3f), 32.0f);
Mat4 modelMatrix = Mat4Transform.scale(16,1f,16);
tt1 = new Model(gl, camera, light, shader, material, modelMatrix, m, textureId0);
m = new Mesh(gl, Cube.vertices.clone(), Cube.indices.clone());
shader = new Shader(gl, "vs_cube_04.txt", "fs_cube_04.txt");
material = new Material(new Vec3(1.0f, 0.5f, 0.31f),
new Vec3(1.0f, 0.5f, 0.31f),
new Vec3(0.5f, 0.5f, 0.5f), 32.0f);
modelMatrix = Mat4.multiply(Mat4Transform.scale(4,4,4),
Mat4Transform.translate(0,0.5f,0));
cube = new Model(gl, camera, light, shader, material, modelMatrix, m,
textureId1, textureId2);
m = new Mesh(gl, Sphere.vertices.clone(), Sphere.indices.clone());
shader = new Shader(gl, "vs_sphere_04.txt", "fs_sphere_04.txt");
// no texture version
// shader = new Shader(gl, "vs_sphere_04.txt", "fs_sphere_04_notex.txt");
material = new Material(new Vec3(1.0f, 0.5f, 0.31f),
new Vec3(1.0f, 0.5f, 0.31f),
new Vec3(0.5f, 0.5f, 0.5f), 32.0f);
modelMatrix = Mat4.multiply(Mat4Transform.scale(3,3,3),
Mat4Transform.translate(0,0.5f,0));
modelMatrix = Mat4.multiply(Mat4Transform.translate(0,4,0), modelMatrix);
sphere = new Model(gl, camera, light, shader, material, modelMatrix, m,
textureId3, textureId4);
// no texture version
// sphere = new Model(gl, camera, light, shader, material, modelMatrix, m);
}
程序清单中的评论线线条适用于球体的非纹理版本,以替换纹理版本。 重要的是,您必须了解非纹理版本需要不同的片段着色器。 Fragment着色器FS_SPHERE_04.TXT希望提供两种纹理,并利用着色器中的相关变量来采样这些纹理。 Fragment着色器FS_SPHERE_04_NOTEX.TXT没有任何纹理变量,而仅使用对象的材料的环境,分散和镜面值。 了解这些着色器的差异至关重要。 如果您提供错误的着色器,那么您将无法获得预期的结果,并且该程序也可能崩溃。