Open GLES 1.1 - GLColorPointer создает радугу цветов, когда я просто хочу красный

Я визуализирую объект следующим образом:

for (int i = 0; i < COLOR_ARRAY_SIZE; i += 4) {
    colors[i] = 1.0f;
    colors[i + 1] = 0.0f;
    colors[i + 2] = 0.0f;
    colors[i + 3] = 1.0f;
}

// Clear color and depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Set GL11 flags:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glEnable(GL_DEPTH_TEST);

// make sure nothing messes with the colour
glDisable(GL_BLEND);
glDisable(GL_DITHER);
glDisable(GL_FOG);
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glShadeModel(GL_FLAT);

// Load projection matrix:
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(projectionMatrix);

// Load model view matrix and scale appropriately
int kObjectScale = 300f;
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(modelViewMatrix);
glTranslatef(0.5f, 0.5f, 0.5f);
glScalef(kObjectScale, kObjectScale, kObjectScale);

// Draw object
glVertexPointer(3, GL_FLOAT, 0, (const GLvoid*) &vertexPositions[0]);
glNormalPointer(GL_FLOAT, 0, (const GLvoid*) &vertexNormals[0]);
glColorPointer(4, GL_FLOAT, 0, (const GLvoid*) &colors[0]);
glDrawElements(GL_TRIANGLES, 11733, GL_UNSIGNED_SHORT,
        (const GLvoid*) &indices[0]);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

Я ожидал, что это сделает мой объект красным, но вместо этого это радуга разных цветов. Кто-нибудь знает, почему? Я бы предположил, что с моим буфером массива «цветов» что-то не так, но я не могу понять, что это такое. Фактические вершины, кажется, отображаются просто отлично.


person Phil Barr    schedule 09.03.2011    source источник


Ответы (1)


Ваш цикл for очень запутан. Вы каждый раз увеличиваете значение i на 4. Более того, вы индексируете со смещением 1, 2 и 3 в строках 3-5. Я предполагаю, что ваше определение COLOR_ARRAY_SIZE равно 4? Попробуйте инициализировать массив цветов следующим образом:

float colors[] = {1.0f, 0.0f, 0.0f, 1.0f};

А затем вызов glColorPointer следующим образом:

glColorPointer(4, GL_FLOAT, 0, colors);

Обратите внимание, что я установил шаг равным 0. Если ваш цветовой массив содержит только цвета, то я не вижу причин, по которым вам следует использовать шаг (шаг используется для перехода через переплетенную информацию в массиве).

person James Bedford    schedule 09.03.2011
comment
Я случайно установил шаг на 1 во время эксперимента и забыл изменить его перед публикацией, извините - я изменю это. Я заполняю массив цветов таким образом, чтобы получить буфер значений R, G, B, A, которые представляют красный цвет для каждой вершины. Я делаю это, чтобы отладить, почему мои цвета в беспорядке. В конце концов я хочу поменять этот красный буфер на мой массив реальных цветов. COLOR_ARRAY_SIZE == 15644. - person Phil Barr; 09.03.2011
comment
Должно ли это работать? Я изменил шаг обратно на 0 и все еще получаю многоцветный эффект. Конечно, заполнение моего массива 1.0, 0.0, 0.0, 1.0 сделало бы меня красным для каждой вершины? - person Phil Barr; 10.03.2011
comment
Если вы отредактировали код, который вы разместили в своем вопросе, то цикл for все еще выглядит для меня очень изворотливым! Почему вы каждый раз увеличиваете на 4, а затем индексируете свой массив со смещением? Вы пытались объявить свой массив, как я предложил? - person James Bedford; 10.03.2011
comment
Я попытался настроить его, как вы предложили, но приложение просто вышло из строя, предположительно из-за того, что было больше вершин, чем мог предоставить массив цветов. - person Phil Barr; 10.03.2011
comment
Когда я заполнил массив всеми значениями 1.0f, он оказался полностью белым, поэтому мне нужно что-то другого цвета. Я не знаю, как еще непрерывно заполнять массив 1.0f, 0.0f, 0.0f, 1.0f? Сейчас я смотрю на использование Open GL ES 2.0, и кажется, что дела идут лучше (сначала я был напуган битом «сделай сам»). Но спасибо за помощь. - person Phil Barr; 10.03.2011
comment
Аааа вижу жаль конечно! Я забыл, что вам нужен цвет для каждой вершины в массиве! Да, ваш цикл for мне кажется правильным. Кстати, я не думаю, что это будет иметь значение, но вы можете просто передать указатель на массив как: colors вместо &colors[0]. Извините, я не уверен, что еще. - person James Bedford; 10.03.2011