2012-05-06 150 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