我正在开发一个 Android opengl lib 并遇到了一个小问题。我知道这很容易解决,但我在追踪它时遇到了很多麻烦。简而言之,我正在开发一个 3d 场景图形库,它基于真正轻量级且很棒的 Scenario 2D 场景图形库。深入解释结构需要很长时间,但基本上树中的每个节点都有一个 load(GL10 gl) 方法,在该方法中会发生任何纹理和/或材质初始化。然后有用于形状节点的 draw() 方法,以及用于材质的 killDraw() 方法。
我的材料课程旨在为像我这样从 3d 建模应用程序程序的角度(对我来说是 3ds max)的人来说是用户友好的。这是问题:
我在一个场景中创建了一些 3d 形状:
FXShape shape4 = new FXShape();
shape4.setShape(new Model("cup.obj"));
Material material = new Material();
material.setAmientAndDiffuse(1,0,0,1);
shape5.addMaterial(material);
add(shape4);
FXShape shape5 = new FXShape();
shape5.setShape(new Cube());
shape5.addMaterial(new TextureMaterial(shape5.getShape(),R.drawable.crate));
add(shape5);
一切都很好,除了为第一个形状创建的红色材料不仅适用于那个形状,而且适用于第二个形状,即使它有自己的纹理。
这是相关的材料方法
@Override
public void loadMaterial(GL10 gl) {
}
@Override
public void draw(GL10 gl){
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT,his.ambientBuffer);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, this.diffuseBuffer);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, this.specularBuffer);
gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, Math.min(shininess, 128));
}
@Override
public void killDraw(GL10 gl) {
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
}
如果我在场景中放置 10 个形状并为形状 1 和 5 添加有色材质,那么 1-5 是第一个材质,6-10 是第二个材质。
我认为我应该能够做的只是调用 gl.glLoadIdentity() 之类的东西并将其清除,但我找不到材料参数。任何人都可以帮忙吗?
谢谢
对不起,我尽量简洁。如果有人对 lib 或更多信息感兴趣,我在 git hub https://github.com/ghostandthemachine/DroidGraph