Нормали OpenGL не отображаются в треугольниках

Я использую обычный массив для визуализации нормального набора данных следующим образом:

glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer( GL_FLOAT, 0, nArray );

Мои вершины отображаются следующим образом:

glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 3, GL_FLOAT, 0, vArray );
glDrawElements( GL_TRIANGLES, iSize, GL_UNSIGNED_INT, iArray );
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_NORMAL_ARRAY );

Ради этого примера я заполняю свой nArray следующим образом (ошибка все еще возникает, когда нормальные значения рассчитаны правильно):

for(int i = 0; i < nSize * 3; ++i){
    nArray[i] = randomNumber();
}

куда randomNumber() возвращает случайное число с плавающей точкой от 0 до 1.

Я ожидаю что nArray должны быть заполнены случайными числами от 0 до 1, и они должны отображаться совершенно случайно на поверхности, которую я генерирую.

Когда я рендерим выходные данные, "нормали" отображаются следующим образом. Мне все равно, что он не вычисляет правильную нормаль, но кажется, что нормали для двух соседних треугольников одинаковы.

Изображение нормалей не в треугольниках

Ниже приведен каркас поверхности, чтобы показать отдельные треугольники: Каркас изображения выше изображения

Метод затенения, который я использую: glShadeModel(GL_FLAT);

Я ожидал, что каждый отдельный треугольник будет иметь совершенно разные значения оттенков серого, но это не так. Любая помощь о том, где я иду не так, приветствуется.

1 ответ

Решение

Метод затенения, который я использую: glShadeModel(GL_FLAT);

С тобой пока.

Когда я рендерим выходные данные, "нормали" отображаются следующим образом. Мне все равно, что он не вычисляет правильную нормаль, но кажется, что нормали для двух соседних треугольников одинаковы

Да, вы просили это черезGL_FLAT:

Примитивы GL могут иметь либо плоскую, либо гладкую штриховку. По умолчанию плавное затенение приводит к интерполяции вычисленных цветов вершин при растеризации примитива, обычно назначая разные цвета каждому результирующему фрагменту пикселя. Плоское затенение выбирает вычисленный цвет только одной вершины и присваивает его всем фрагментам пикселей, сгенерированным растеризацией одного примитива.

Если вы хотите интерполировать между нормалями всех трех вершин, вам нужно использовать GL_SMOOTH,

Другие вопросы по тегам