我遇到了使用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;
}
您可以發佈一些實際完整的代碼示例,除了設置材質(例如,某人可以從頭到尾遵循流程)之外,還可以顯示繪製對象的實例嗎?我不認爲有什麼特定的opengl會導致這個,除非你做了一些非常錯誤的事情。 – Tim
是的,我可以看到我的問題中缺少信息/代碼。我編輯並添加了繪圖時發生的事情。 – Henrik