Opengl ES2 Android часто меняет цвет в текстуре - PullRequest
0 голосов
/ 03 августа 2020

У меня есть виртуальная матрица куба 8x8x8 на основе учебника OpenGL ES . Я могу изменить текстуру на цветную, а не на растровую (спасибо Alexrnov). Остается вопрос, как я могу изменить цвет каждого кубика в матрице? Позже мне нужно будет часто его менять, потому что это будет светодиодный куб. Кажется, что во внутреннем классе Cubes есть функция getBuffer (). Он копирует все данные кубов в буфер VBO. Может, здесь я могу изменить цвет каждого кубика в inisde?

 fun getBuffers(
        cubePositions: FloatArray,
        cubeNormals: FloatArray,
        cubeTextureCoordinates: FloatArray,
        generatedCubeFactor: Int
    ): Array<FloatBuffer> {
        // First, copy cube information into client-side floating point buffers.
        val cubePositionsBuffer: FloatBuffer = ByteBuffer.allocateDirect(cubePositions.size * BYTES_PER_FLOAT)
            .order(ByteOrder.nativeOrder()).asFloatBuffer()
        cubePositionsBuffer.put(cubePositions).position(0)
        val cubeNormalsBuffer: FloatBuffer = ByteBuffer.allocateDirect(cubeNormals.size * BYTES_PER_FLOAT * generatedCubeFactor * generatedCubeFactor * generatedCubeFactor)
            .order(ByteOrder.nativeOrder()).asFloatBuffer()
        for (i in 0 until generatedCubeFactor * generatedCubeFactor * generatedCubeFactor) {
            cubeNormalsBuffer.put(cubeNormals)
        }
        cubeNormalsBuffer.position(0)
        val cubeTextureCoordinatesBuffer: FloatBuffer = ByteBuffer.allocateDirect(cubeTextureCoordinates.size * BYTES_PER_FLOAT * generatedCubeFactor * generatedCubeFactor * generatedCubeFactor)
            .order(ByteOrder.nativeOrder()).asFloatBuffer()
        for (i in 0 until generatedCubeFactor * generatedCubeFactor * generatedCubeFactor) {
            cubeTextureCoordinatesBuffer.put(cubeTextureCoordinates)
        }
        cubeTextureCoordinatesBuffer.position(0)
        return arrayOf(cubePositionsBuffer, cubeNormalsBuffer, cubeTextureCoordinatesBuffer)
    }

thx Zamek

1 Ответ

0 голосов
/ 04 августа 2020

Для каждого куба код может выглядеть примерно так:

public class Cube {
    private final int programObject;

    private final int colorLink;

    private final float[] color;

    Cube() {
        ... // link program 
        // reference on the uniform in shader
        colorLink = GLES20.glGetUniformLocation(this.programObject, "vColor");
    }

    public void draw() {
        ...
        if (lEDIsGreen) { // change color
            color = green();
        } else {
            color = blue();
        }
        GLES20.glUniform4fv(colorLink, 1, color, 0);
        ... // draw object
    }

    private static float[] green() {
        return new float[] {
            Color.red(Color.GREEN) / 255f,
            Color.green(Color.GREEN) / 255f,
            Color.blue(Color.GREEN) / 255f,
            1.0f};
        ...
    }
}

Класс рендеринга:

public class Render implements GLSurfaceView.Renderer {
    private Cube[] cubes = new Cube[NUMBER_CUBES];
    ...

    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
        for (int i = 0; i < NUMBER_CUBES; i++) cubes[i] = new Cube(); // create cubes
        ...
    }

    public void onDrawFrame(GL10 glUnused) {
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
        GLES20.glEnable(GLES20.GL_CULL_FACE); 
        GLES20.glCullFace(GLES20.GL_BACK); 
        GLES20.glEnable(GLES20.GL_DEPTH_TEST);
        
        for (Cube cube: cubes) cube.draw(); // draw all cubes
    }
}

Шейдеры могут выглядеть примерно так:

// vertex shader 
#version 100
precision lowp float; 
uniform mat4 u_mvpMatrix;
attribute vec4 a_position;

void main() {
    gl_Position = u_mvpMatrix * a_position;
}

// fragment shader
#version 100
precision lowp float;

uniform vec4 vColor; // color is transmitted here
void main() {
    gl_FragColor = vColor;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...