Android用のOpenGL-ES(1.0)での作業で、頭を包むことができないという問題が発生しました。OpenGL-ESを介して、iv'eが以下を使用してマテリアルを提供することを決定したことを示す複数の3Dオブジェクトがあります。
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();
ここで、「周囲」、「拡散」、「鏡面反射」は各オブジェクトに固有です。
その結果、たとえば1つのマテリアルでより多くの赤のアンビエントを使用すると、他の表示されているオブジェクトにも影響が出て、少し赤で表示されます。
以下に示すように、左側の3つのオブジェクトのうち2つは、マテリアル内のより赤いアンビエントを取得するように設定されています。右側の素材は光っていないはずですが、それでも光っています。(写真は明らかに少し修正されて明確になっています)。
私が使用するすべてのオブジェクトには、そのマテリアルに関する情報で構成される独自のマテリアルクラスがあります。
何かが見落とされているという考えはありますか、それともこれは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;
}