2012-05-06 132 views
0

我遇到了使用OpenGL-ES(1.0)进行android的问题,我无法将头部包裹起来。我已经通过的OpenGL-ES表示iv'e决定使用以得到一些材料的多个3D对象:影响其他纹理的OpenGL-ES中的材质

gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL _...,...,0);

对于每个对象我画我做这样的事情:

gl.glPushMatrix(); 
*make some adjustment to object* 
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, ambient, 0); 
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, diffuse, 0); 
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, specular, 0); 
gl.glPopMatrix(); 

其中“环境”,“漫”和“镜面”是唯一的每个对象。

结果是,如果我在一种材质中使用较大量的红色环境,这会影响另一个可见对象,同时也会显示一点红色。

如下所示,左侧三个物体中的两个被设置为在其材料中获得更多的红色环境。右边的材料不应该发光,因为它的材料没有,但它仍然是。 (图片显然有点修改,使其更清晰)。

每一个对象,我使用有一个自己的材料类,包括关于它的材料的信息。

任何想法iv'e错过或这是如何材料在OpenGL中实际工作?

(我用的是direcitonal光的方向照亮了整个场景)

编辑:只是为了更清楚,它并不影响其他对象只是周围环境的颜色,例如,如果有材料的对象,在环境,镜面和漫反射中,所有颜色的0.2个接近另一个具有较高值(例如高光)的物体,第一个物体也将更加明亮。

EDIT2:

这是绘制所有对象

 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 


    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); 

    Enumeration<String> key = objects.keys(); 
    while (key.hasMoreElements()) 
    { 
     String k = key.nextElement(); 

     if(objects.get(k).visible) 
     { 
      gl.glPushMatrix(); 
      try 
      { 
       gl.glBindTexture(GL10.GL_TEXTURE_2D, texturemanager._tm.get(k.trim()) 
        .getTexture()[filter]); 
      } 
      catch(Exception e){}; 

      adjust(gl, objects.get(k)); 
      objects.get(k).draw(gl, 1); 
      gl.glPopMatrix(); 
     } 
    } 

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glDisableClientState(GL10.GL_NORMAL_ARRAY); 

的对象类的平局发生的是以下

protected void draw(GL10 gl, int filter) 
{ 
    updatePhysics(); 
    bounds.center.set(this); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, data.vertexBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, data.textureBuffer); 
    gl.glNormalPointer(GL10.GL_FLOAT, 0, data.normalBuffer); 

    gl.glDrawElements(GL10.GL_TRIANGLES, data.numIndices, 
      GL10.GL_UNSIGNED_SHORT, data.indicesBuffer); 
} 

调节功能(GL,objects.get (K));导致以下

// rotating, translating and scaling object 

    if (obj.blend) 
    { 
     gl.glEnable(GL10.GL_BLEND); 
     gl.glDisable(GL10.GL_DEPTH_TEST); 
    } else 
    { 
     gl.glDisable(GL10.GL_BLEND); 
     gl.glEnable(GL10.GL_DEPTH_TEST); 
    } 
    if(obj.enableMaterial) 
    { 
     obj.getMaterial().enable(gl); 
    } 

并且其中obj.getMaterial()启用(GL)。将是物体的材质。 以下是我的材料类

public void enable(GL10 gl) 
{ 
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, ambient, 0); 
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, diffuse, 0); 
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, specular, 0); 
    gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, shininess); 
} 

凡为环境,漫反射,镜面反射和光泽变量设置像以下

public void setAmbient(float r, float g, float b, float a) 
{ 
    ambient[0] = r; 
    ambient[1] = g; 
    ambient[2] = b; 
    ambient[3] = a; 
} 
+0

您可以发布一些实际完整的代码示例,除了设置材质(例如,某人可以从头到尾遵循流程)之外,还可以显示绘制对象的实例吗?我不认为有什么特定的opengl会导致这个,除非你做了一些非常错误的事情。 – Tim

+0

是的,我可以看到我的问题中缺少信息/代码。我编辑并添加了绘图时发生的事情。 – Henrik

回答

1

,如果你有一个针对“enableMaterial”的对象会发生什么是假的?你有没有重置材料?它似乎仍将用于未来的任何对象。

+0

实际上,当我为你写一个答案时,我设法描述了我的问题,以便它对我来说很明显是什么问题,它比我想象的更复杂,但问题仍然存在于我的代码中(当然),本质上你描述了它的根源。所以谢谢你,大拇指! – Henrik