Построение треугольника, каждая вершина которого имеет свой собственный цвет

#opengl

#opengl

Вопрос:

     int COORDS_PER_VERTEX = 2;
    int vertexStride = COORDS_PER_VERTEX * 4;

    // Prepare the triangle coordinate data
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                                 GLES20.GL_FLOAT, false,
                                 vertexStride, vertexBuffer);
    GLES20.glEnableVertexAttribArray(mPositionHandle);


    // Pass in the color information
    GLES20.glVertexAttribPointer(mColorHandle, COLOR_DATA_SIZE, GLES20.GL_FLOAT, false,
            colorStride, colorBuffer);

    GLES20.glEnableVertexAttribArray(mColorHandle);
  

Я пытаюсь сделать так, чтобы каждая вершина моего треугольника имела свой собственный цвет. Я использую только координаты x, y для представления точки. Таким образом, треугольник может быть представлен как {1, 0, 1, 1, 0, 0} например.

Мой вопрос в том, что я должен сделать colorStride и COLOR_DATA_SIZE переменные для достижения этой цели.

РЕДАКТИРОВАТЬ: мой массив цветов и вершин…

 float[] colors = new float[] {1.0f, 0.0f, 0.0f, 1.0f,
                              0.0f, 1.0f, 0.0f, 1.0f,
                              0.0f, 0.0f, 1.0f, 1.0f }
float[] tCoords= new float[] {0.0f, 0.0f
                              0.0f, 1.0f
                              1.0f, 1.0f }
  

ПРАВКА2:

 private void init() {
        vertexCount = triangleCoords.length/COORDS_PER_VERTEX;
        vertexStride = COORDS_PER_VERTEX * 4;
        // initialize vertex byte buffer for shape coordinates
        ByteBuffer bb = ByteBuffer.allocateDirect(
                // (number of coordinate values * 4 bytes per float)
                triangleCoords.length * 4);
        // use the device hardware's native byte order
        bb.order(ByteOrder.nativeOrder());

        // create a floating point buffer from the ByteBuffer
        vertexBuffer = bb.asFloatBuffer();
        // add the coordinates to the FloatBuffer
        vertexBuffer.put(triangleCoords);
        // set the buffer to read the first coordinate
        vertexBuffer.position(0);

        // initialize vertex byte buffer for shape coordinates
        bb = ByteBuffer.allocateDirect(
                // (number of coordinate values * 4 bytes per float)
                color.length * 4);
        // use the device hardware's native byte order
        bb.order(ByteOrder.nativeOrder());

        // create a floating point buffer from the ByteBuffer
        colorBuffer = bb.asFloatBuffer();
        // add the coordinates to the FloatBuffer
        colorBuffer.put(color);
        // set the buffer to read the first coordinate
        colorBuffer.position(0);

        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
        int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

        mProgram = GLES20.glCreateProgram();             // create empty OpenGL ES Program
        GLES20.glAttachShader(mProgram, vertexShader);   // add the vertex shader to program
        GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
        GLES20.glLinkProgram(mProgram);                  // creates OpenGL ES program executables
    }
  

Ответ №1:

COLOR_DATA_SIZE = компоненты цвета для каждой вершины (3 или 4 из которых вам нужны альфа)

colorStride = sizeof(GLfloat) * COLOR_DATA_SIZE

Или вы можете оставить stride равным 0, что означает, что данные плотно упакованы и между ними нет пробелов.

Комментарии:

1. Массив цветов не влияет на форму. Как заполняются данные вашего массива?

2. Что такое colorBuffer и vertexBuffer ? Это должны быть либо сами массивы (кстати, где массив positions?), Если буфер вершин не привязан, либо смещение байта в буфере вершин. Если буфер вершин привязан, он должен быть заполнен данными и правильно привязан в момент использования vertexAttribPointer.

3. colorBuffer и VertexBuffer являются буферами с плавающей запятой. Я просто говорю colorBuffer.put(colors) и vertexBuffer.put(tCoords)

4. Пожалуйста, посмотрите мое второе редактирование, чтобы увидеть, как я это делаю

5. Вызовы GL кажутся правильными. Я не знаю, что это за язык, возможно, массивы живут недостаточно долго, или ByteBuffer не должен использоваться таким образом.