3D 堆叠物体(立方体和球体)

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没有任何纹理变量,而仅使用对象的材料的环境,分散和镜面值。 了解这些着色器的差异至关重要。 如果您提供错误的着色器,那么您将无法获得预期的结果,并且该程序也可能崩溃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值