#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 не должен использоваться таким образом.