OpenGL подсветка и сияние - PullRequest
       0

OpenGL подсветка и сияние

5 голосов
/ 03 ноября 2011

Я должен поместить освещение в изображение OpenGL, но я не знаю, как правильно расположить точечную подсветку, как на следующем рисунке:

right

Пока япробовал другой режим освещения, но результат следующий: (* ​​1006 *

Wrong

Я прилагаю код, который я использовал для моего результата. Что не так?

    float specref[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    // Light values and coordinates
    float ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f };
    float diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f };
    float specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};
    float lightPos[] = { 0.0f, -150.0f, -150.0f, 1.0f };

    glEnable ( GL_LIGHTING ) ;

    glLightfv(GL_LIGHT0,GL_AMBIENT, ambientLight);
    glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);
    glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
    glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
    glEnable(GL_LIGHT0);
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,specref);
    glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,128);
    glEnable ( GL_COLOR_MATERIAL ) ;

    glClearColor (1.0, 1.0, 1.0, 1.0);
    glColor3f(0.0,0.0,0.0);

Изменить 04/11/2011 0.39 CET

Я также прикрепляю свою функцию display (), вызываемую glutDisplayFunc (display);

  void display(void)

  {

  [...]

  //Draw polygons in 3d

  glColor3f(0.0,1.0,1.0);

  glBegin(GL_QUADS);

  for(i=0;i<NVERT-1;i++) {

        for (j=0;j<NVERT-1;j++) {

              glVertex3f( (GLfloat)((sb[i*NVERT+j]).x()),

                                      (GLfloat)((sb[i*NVERT+j]).y()),

                                      (GLfloat)((sb[i*NVERT+j]).z()));


              glVertex3f( (GLfloat)((sb[i*NVERT+j+1]).x()),

                                      (GLfloat)((sb[i*NVERT+j+1]).y()),

                                      (GLfloat)((sb[i*NVERT+j+1]).z()));


              glVertex3f( (GLfloat)((sb[(i+1)*NVERT+j+1]).x()),

                                      (GLfloat)((sb[(i+1)*NVERT+j+1]).y()),

                                      (GLfloat)((sb[(i+1)*NVERT+j+1]).z()));


              glVertex3f( (GLfloat)((sb[(i+1)*NVERT+j]).x()),

                                      (GLfloat)((sb[(i+1)*NVERT+j]).y()),

                                      (GLfloat)((sb[(i+1)*NVERT+j]).z()));


        }



  }

  glEnd();
  glFlush();

  }

На практике с дисплеем я пишумалые области, которые составляют 2 ° фигуру, которую я представлял (я опустил алгоритм для вычисления точек каждой области, потому что он работает).

Моя цель - получить результат, аналогичный рисунку 1 длямолния и рендеринг фигуры, но я получил только результат на рисунке 2.

Я не знаю, как правильно поставить свет и как настроить мою фигуру, чтобы получить этот рендер (как зеркало).

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Вам не хватает нормалей. Вам либо нужно предоставить один нормальный элемент для каждой вершины ( glNormal ), либо вы можете включить GL_AUTO_NORMALS, если используете glMap2 (которым вы не являетесь). На opengl.org есть статья о том, как вычислить нормали для треугольника или многоугольника , которую вы, вероятно, найдете полезной.

Begin Function CalculateSurfaceNormal (Input Polygon) Returns Vector

   Set Vertex Normal to (0, 0, 0)

   Begin Cycle for Index in [0, Polygon.vertexNumber)

      Set Vertex Current to Polygon.verts[Index]
      Set Vertex Next    to Polygon.verts[(Index plus 1) mod Polygon.vertexNumber]

      Set Normal.x to Sum of Normal.x and (multiply (Current.y minus Next.y) by (Current.z plus Next.z))
      Set Normal.y to Sum of Normal.y and (multiply (Current.z minus Next.z) by (Current.x plus Next.x))
      Set Normal.z to Sum of Normal.z and (multiply (Current.x minus Next.x) by (Current.y plus Next.y))

   End Cycle

   Returning Normalize(Normal)

End Function

Из изображения, которое вы опубликовали с результатами, кажется, что вы вычисляете и рисуете нормали (красные стрелки), но не применяете их.

0 голосов
/ 04 ноября 2011

Не могу понять, что происходит с вашим кодом. Я надеюсь, что ваши кординаты от -1 до +1. Я бы посоветовал вам работать с освещением с помощью простых примитивов. работа с вашим поколением поверхности. Положение источника освещения и расчет нормалей являются наиболее важными точками.

http://www.falloutsoftware.com/tutorials/gl/gl8.htm

http://glprogramming.com/red/chapter05.html

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