Я использую обычный массив для визуализации нормального набора данных следующим образом:
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);
Я ожидал, что каждый отдельный треугольник будет иметь совершенно разные значения оттенков серого, но это не так. Любая помощь о том, где я иду не так, приветствуется.
Метод затенения, который я использую:
glShadeModel(GL_FLAT);
С тобой пока.
Когда я рендерим выходные данные, «нормали» отображаются следующим образом. Мне все равно, что он не вычисляет правильную норму, но это кажется, что нормали для двух соседних треугольников одинаковы
Ага, вы просили это через GL_FLAT
:
Примитивы GL могут иметь либо плоскую, либо гладкую штриховку. По умолчанию плавное затенение приводит к интерполяции вычисленных цветов вершин при растеризации примитива, обычно назначая разные цвета каждому результирующему фрагменту пикселя. Плоское затенение выбирает вычисленный цвет только одной вершины и присваивает его всем фрагментам пикселей, сгенерированным растеризацией одного примитива.
Если вы хотите интерполировать между нормалями всех трех вершин, вам нужно использовать GL_SMOOTH
,
Других решений пока нет …