我遇到了使用OpenGL-ES(1.0)for android的问题,我无法解决这个问题。我有多个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();
其中“ambient”,“diffuse”和“specular”对每个对象都是唯一的。
结果是,如果我在一种材质中使用更多的红色环境,这将影响另一个可见对象也显示一点红色。
如下所示,左侧三个对象中的两个被设置为在其材质中获得更多红色环境。右边的材料不应该发光,因为它的材料还没有,但它仍然没有。 (图片显然有点修改,以使其更清晰)。
我使用的每个对象都有一个自己的材料类,其中包含有关材料的信息。
任何想法都不会错过,或者这是材料在OpenGL中如何实际运作的?
(我使用一个方向灯照亮整个场景的方向)
编辑:为了使其更清晰,不仅仅是影响其他物体的环境颜色,例如,一个物体的材料在环境,镜面和漫反射中重新获得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);
}
adjust(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()。enable(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 :(得分:1)
那么如果你有一个“enableMaterial”为false的对象会怎么样?你有没有重置材料?它似乎仍将应用于任何未来的对象。