OpenGL, как установить монохромную текстуру в цветную форму? - PullRequest
1 голос
/ 15 мая 2010

Я разрабатываю на Android с OpenGL ES, рисую несколько кубов и меняю их цвета с помощью glColor4f. Теперь я хочу, чтобы кубы были более реалистичными, поэтому я создаю монохромный файл PNG с глубиной 8 бит и размером 64x64 пикселя. Я загрузил на текстуру, и вот моя проблема, какой способ объединить цвет и текстуру, чтобы получить цветные и текстурированные кубы на экране?

Я не эксперт по OpenGL, я пробовал это:

При создании:

public void asignBitmap(GL10 gl, Bitmap bitmap)
{
    int[] textures = new int[1];
    gl.glGenTextures(1, textures, 0);

    mTexture = textures[0];
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexture);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_ALPHA, bitmap, 0);

    ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4);
    tbb.order(ByteOrder.nativeOrder());
    mTexBuffer = tbb.asFloatBuffer();
    for (int i = 0; i < 48; i++) mTexBuffer.put(texCoords[i]);
    mTexBuffer.position(0);
}

и OnDraw:

public void draw(GL10 gl, int alphawires) {
    gl.glColor4f(1.0f, 0.0f, 0.0f, 0.5f); //RED
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexture);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glEnable(GL10.GL_BLEND);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTexBuffer);

    //Set the face rotation
    gl.glFrontFace(GL10.GL_CW);

    //Point to our buffers
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    //Enable the vertex and color state
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    //Draw the vertices as triangles, based on the Index Buffer information
    gl.glDrawElements(GL10.GL_TRIANGLES, 36, GL10.GL_UNSIGNED_BYTE, indexBuffer);

    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDisable(GL10.GL_BLEND);
    gl.glDisable(GL10.GL_TEXTURE_2D);
}

Я даже не уверен, должен ли я использовать параметр наложения, потому что мне не нужна прозрачность, но это плюс:)

1 Ответ

4 голосов
/ 16 мая 2010

Когда вы устанавливаете режим текстурной среды, используйте GL_MODULATE вместо GL_REPLACE. MODULATE умножит интерполированный цвет на выбранный цвет текстуры, где REPLACE полностью отбрасывает интерполированный цвет и заменяет его на выбранный цвет текстуры.

...