Ага, все стало понятно, проблема решена, название поменял :))
Через некоторое время вернулся к этому вопросу :))
Поставил источники света, как в максе по умолчанию стоят. Округлые модели (в которых нормали интерполируются) рендерятся нормально, а вот с обычным кубом проблемы (шейда нет от источника света).
Вот так рендерю модель:
// Визуализация модели с использованием OpenGL.
void RenderModelOpenGL(CommonData::Model* model)
{
// Устанавливаем материал
glMaterialfv(GL_FRONT, GL_AMBIENT, model->Materials[0].AmbientColor);
glMaterialfv(GL_FRONT, GL_DIFFUSE, model->Materials[0].DiffuseColor);
glMaterialfv(GL_FRONT, GL_SPECULAR, model->Materials[0].SpecularColor);
glMaterialfv(GL_FRONT, GL_EMISSION, model->Materials[0].Emission);
glMateriali(GL_FRONT, GL_SHININESS, model->Materials[0].Glossiness);
// Устанавливаем источники освещения по умолчанию
GLfloat light0Position[] = { -1.0, 1.0, -1.0, 0.0 };
GLfloat light1Position[] = { 1.0, -1.0, 1.0, 0.0 };
GLfloat light1DiffuseAndSpecular[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light0Position);
glLightfv(GL_LIGHT1, GL_POSITION, light1Position);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light1DiffuseAndSpecular);
glLightfv(GL_LIGHT1, GL_SPECULAR, light1DiffuseAndSpecular);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_DEPTH_TEST);
glEnable(GL_RESCALE_NORMAL);
// Рендеринг
glutSolidCube(1);
}
Код инициализации OpenGL (на всякий случай):
int _tmain(int argc, char** argv)
{
// Создаем модель
CreateModel();
int width = 800;
int height = 600;
// Инициализация GLUT
glutInit(&argc, argv);
// Создание окна
glutInitWindowSize(width, height);
glutInitWindowPosition(100, 100);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB | GLUT_STENCIL);
glutCreateWindow("Render Model OpenGL Test");
glutSetWindowTitle("Render Model OpenGL Test");
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
// Установка событий
atexit(OnTerminate);
glutDisplayFunc(OnDraw);
glutIdleFunc(OnTick);
glutReshapeFunc(OnReshape);
glutKeyboardFunc(OnKeyDown);
glutMotionFunc(OnMouseMoved);
glutMouseFunc(OnMouseClicked);
// Отобразить окно и запустить OpenGL цикл
glutShowWindow();
glutMainLoop();
return 0;
}
// Отрисовка изображения
void OnDraw(void)
{
// Очистка экрана и буфера глубины и буфера трафарета
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// Сбрасываем матрицу преобразования
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
// Переместить объект
glTranslatef(_modelTranslateX, _modelTranslateY, -7.0f);
// Повернуть объект
glRotatef(_modelRotateAngleX, 1.0f, 0.0f, 0.0f);
glRotatef(_modelRotateAngleY, 0.0f, 1.0f, 0.0f);
// Масштабировать объект
glScalef(_modelScaleCoefficient, _modelScaleCoefficient, _modelScaleCoefficient);
// Рендерим модель
Gralla::RenderModel(_model, Gralla::OpenGL);
glutSwapBuffers();
}
Вот что получается:
В чем может быть проблема?
Не ясно что с нормалями, не ясно вызывается ли RenderModelOpenGL вообще...
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
попробуй это, ах да, бликов ты не увидешь, ты используешь направленный источник света, и вместо положения ты указываешь направление
GLfloat light0Position[] = { -1.0, 1.0, -1.0, 0.0 };
GLfloat light1Position[] = { 1.0, -1.0, 1.0, 0.0 };
эти нули говорят как раз о том, что ты используешь направленный источник света, чтобы он стал точечным, замени нули на 1
Да и, тестируй на более высокополигональной модели, ну хотя бы на сфере, потому, что заливка гуро сильно смазывается и бликов иногда вовсе нет.
и еще glShadeModel(GL_SMOTH); без нее ты бликов никогда не увидешь. она и отвечает за их появление.
Со светом то я намудрил. Сделал его точечным, теперь отображается нормально. Спасибо!
Тема в архиве.