簡體   English   中英

OpenGL-ES 中的材質影響其他紋理

[英]Materials in OpenGL-ES affecting other textures

我在使用 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();

其中“環境”、“漫反射”和“鏡面反射”對於每個對象都是獨一無二的。

結果是,如果我在一種材料中使用更多的紅色環境,這將影響另一個可見對象也顯示為紅色。

如下所示,左側的三個對象中的兩個設置為在其材質中獲得更多的紅色環境。 右邊的材料不應該發光,因為它的材料沒有但仍然發光。 (圖片顯然稍作修改以使其更清晰)。

我使用的每個對象都有自己的材質類,其中包含有關其材質的信息。

知道我遺漏了什么,或者這就是材質在 OpenGL 中的實際工作方式嗎?

(我使用一個方向燈照亮整個場景)

編輯:為了更清楚地說明這一點,影響其他對象的不僅僅是環境顏色,例如,如果一個對象的材質在環境、鏡面反射和漫反射中的所有顏色都為 0.2,那么它接近另一個具有更高值的物體,例如鏡面反射,第一個物體也會更加明亮。

編輯2:

這是繪制所有對象的功能

        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().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;
}

那么如果您有一個“enableMaterial”為假的對象會發生什么? 你有沒有重置材料? 似乎它仍將應用於任何未來的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM