QT OpenGL STL рендеринга ошибка с нормальным вектором - PullRequest
0 голосов
/ 17 февраля 2020

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

for(uint32_t i = 0 ;i < mVertexCnt - 9;){
    int z = i/9;
    glBegin(GL_TRIANGLES);
    glNormal3f(mNorm[3*z], mNorm[3*z+1], mNorm[3*z+2]);

    glVertex3f(mVertix[i]/100,mVertix[i+1]/100,mVertix[i+2]/100); //1
    glVertex3f(mVertix[i+3]/100,mVertix[i+4]/100,mVertix[i+5]/100); //1
    glVertex3f(mVertix[i+6]/100,mVertix[i+7]/100,mVertix[i+8]/100); //1
    i += 9;
    glEnd();
}

результат будет похож на


Я думаю, это потому, что направление вектора нормали противоположно направлению света.

Мой вопрос в том, может ли OpenGL справиться сам. Проигнорируйте эту проблему направления и покажите правильный свет в каждом направлении. Кто-нибудь знает об этом?

Настройка освещения выглядит так:

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glMaterialfv(GL_BACK, GL_SPECULAR, mat_specular);
glMaterialfv(GL_BACK, GL_SHININESS, mat_shininess);

//灯光设置
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);   //散射光属性
glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);  //镜面反射光
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Light_Model_Ambient);  //环境光参数

glEnable(GL_LIGHTING);   //开关:使用光
glEnable(GL_LIGHT0);     //打开0#灯

1 Ответ

0 голосов
/ 17 февраля 2020

Если модель освещения должна быть применена к обеим сторонам многоугольника, вам необходимо включить GL_LIGHT_MODEL_TWO_SIDE (см. glLightModel). По умолчанию GL_LIGHT_MODEL_TWO_SIDE равно 0.

glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

Но учтите, что это не означает, что наилучший вектор направления направления подгонки найден магическим образом. Это просто вызывает инвертирование вектора нормалей полигонов, обращенных назад. То, является ли многоугольник (треугольник) задней стороной, определяется порядком намотки вершин в проекции в области просмотра. Будь то многоугольники по часовой стрелке или против часовой стрелки, предназначенные для лицевой стороны, можно установить с помощью glFrontFace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...