0

我正在开发一个 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

4

1 回答 1

0

您创建的每个对象都确切地知道它使用的材料属性。只需让它推送/弹出堆栈上的相关状态。

于 2011-04-19T14:37:36.783 回答