ПрограммированиеФорумГрафика

Настройка освещения OpenGL (2 стр)

Страницы: 1 2
#15
20:01, 21 мар 2010

Ага, все стало понятно, проблема решена, название поменял :))

#16
17:27, 27 мар 2010

Через некоторое время вернулся к этому вопросу :))
Поставил источники света, как в максе по умолчанию стоят. Округлые модели (в которых нормали интерполируются) рендерятся нормально, а вот с обычным кубом проблемы (шейда нет от источника света).
Вот так рендерю модель:

// Визуализация модели с использованием 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();
}

Вот что получается:
Куб | Настройка освещения OpenGL

В чем может быть проблема?

#17
21:46, 27 мар 2010

Не ясно что с нормалями, не ясно вызывается ли RenderModelOpenGL вообще...

#18
21:53, 27 мар 2010

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

#19
21:59, 27 мар 2010

Да и, тестируй на более высокополигональной модели, ну хотя бы на сфере, потому, что заливка гуро сильно смазывается и бликов иногда вовсе нет.
и еще glShadeModel(GL_SMOTH); без нее ты бликов никогда не увидешь. она и отвечает за их появление.

#20
11:08, 28 мар 2010

Со светом то я намудрил. Сделал его точечным, теперь отображается нормально. Спасибо!

Страницы: 1 2
ПрограммированиеФорумГрафика

Тема в архиве.