Вопрос

Я новичок в OpenGL ES и разрабатываю в Objective-C для iPhone.

То, что я пытаюсь понять, так это того, как свет расположен в моем фрукторе. Вот как я это делаю:

Я создаю квадрат и ставлю его «полом» в свой Frustum. Я ставлю свет, прямо вверх, в середину пола и указываю направление света прямо вниз. Теперь я ожидаю, что легкий круг на полу будет посередине. Но это не так, это больше сзади (БЕЛЕТ). Почему?

near = 8.0
far = 28
light position = {0.0, 0.0, -10.0}
light direction = {0.0, -1.0, 0.0}

Floor coordinates = {-0.3153, -0.473, -20.0},
{-0.3153, -0.473, 0.0},
{0.3153, -0.473, -20.0},
{0.3153, -0.473, 0.0},

Разве это не должно заставить круг света быть в середине пола и не расположить немного назад?

Вот мой значительный код:

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

 -(void)setupView:(TDRoomView*)view
    {


    const GLfloat zNear = 8, zFar = 28, fieldOfView = 5; 

 GLfloat size; 
 glEnable(GL_DEPTH_TEST);
 glMatrixMode(GL_PROJECTION); 
 size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0); 
 NSLog(@"tanf(DEGREES_TO_RADIANS(fieldOfView)/2.0); %f ", tanf(DEGREES_TO_RADIANS(fieldOfView)/2.0));

 CGRect rect = view.bounds; 
 glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size / 
      (rect.size.width / rect.size.height), zNear, zFar);  
 glViewport(-size, size, rect.size.width, rect.size.height);  
 glMatrixMode(GL_MODELVIEW);
    glShadeModel(GL_SMOOTH);
 glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glEnable(GL_LIGHT0);

 static const Color3D light0Ambient[] = {{1.0, 1.0, 1.0, 1.0}};
 glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat *)light0Ambient);

    static const Color3D light0Diffuse[] = {{0.5, 0.5, 0.5, 1.0}};
 glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat *)light0Diffuse);

    static const Color3D light0Specular[] = {{0.5, 0.5, 0.5, 1.0}};
    glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat *)light0Specular);

    static const Vertex3D light0Position[] = {{0.0, 0.473, -10.0}};
 glLightfv(GL_LIGHT0, GL_POSITION, (const GLfloat *)light0Position); 

 static const Vertex3D lightVector= {0.0, -1.0, 0.0};

    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, (GLfloat *)&lightVector);

    glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 85);

 glLoadIdentity(); 
 glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 

    }

И рисунок:

     -(void)drawView:(TDRoomView*)view
    {

        static const Vertex3D vertices[]= {
  {-0.3153, -0.473, -20.0},
  {-0.3153, -0.473, 0.0},
  {0.3153, -0.473, -20.0},
  {0.3153, -0.473, 0.0},
  {-0.1, -0.25, -3.0},
  {0.0, 0.0, -10.0},
  {0.1, -0.25, -3.0}
 };

 static const Color3D colors[] = {
  {0.7, 0.7, 0.7, 1.0},
  {0.7, 0.7, 0.7, 1.0},
  {0.7, 0.7, 0.7, 1.0},
  {0.7, 0.7, 0.7, 1.0},
  {1.0, 0.0, 0.0, 1.0},
  {0.0, 1.0, 0.0, 1.0},
  {0.0, 0.0, 1.0, 1.0}
       };


 static const GLubyte roomFaces[] = {
  0, 1, 2,
  1, 2, 3};


        static const Vector3D normals[] = {
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000}
 };

    glLoadIdentity();

    glClearColor(0.7, 0.7, 0.7, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnableClientState(GL_VERTEX_ARRAY);
 glEnableClientState(GL_COLOR_ARRAY);
 glEnableClientState(GL_NORMAL_ARRAY);

        glVertexPointer(3, GL_FLOAT, 0, vertices);
 glColorPointer(4, GL_FLOAT, 0, colors);
 glNormalPointer(GL_FLOAT, 0, normals);
 glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_BYTE, roomFaces);

        glDisableClientState(GL_NORMAL_ARRAY);
 glDisableClientState(GL_VERTEX_ARRAY);
 glDisableClientState(GL_COLOR_ARRAY); }

Кроме того, я изменил изменение

static const Vertex3D light0Position[] = {{0.0, 0.473, -10.0}};

к

static const Vertex3D light0Position[] = {{0.0, 0.473, -8.0}}; 

Борд становится темным, на него нет света. Почему я подключил свет только на два шага ближе ...? То же самое произойдет, если я перемесчу это на два шага дальше.

static const Vertex3D light0Position[] = {{0.0, 0.473, -12.0}};

Любая помощь, чтобы «пролить Som Light» на мою проблему, очень ценится! (Не могу этого поделать ...;))

Заранее спасибо!

Это было полезно?

Решение

Я предлагаю вам сделать более крупную сетку с большим количеством вершин, предпочтительно n от n квадратов. Старайтесь не иметь слишком длинных тонких треугольников. Это облегчит видеть, где, кажется, световой, так как свет рассчитывается для каждой вершины, а не для каждого пикселя для поверхности.

http://www.opengl.org/resources/features/kilgardtechniques/oglpitfall/

2. Плохая тесселяция вредит освещению

Расчеты освещения OpenGL выполняются для переносчика. Это означает, что расчеты затенения из -за источников света, взаимодействующих с поверхностным материалом трехмерного объекта, рассчитываются только на вершинах объекта. Как правило, OpenGL просто интерполят или гладкие оттенки между цветами вершины. Освещение OpenGL для переносчика работает довольно хорошо, за исключением случаев, когда эффект освещения, такой как спекулярный подсветка или прожектор, теряется или размывается, поскольку эффект недостаточно отбирается по вершинам объекта. Такое недостаточное количество эффектов освещения происходит, когда объекты грубо смоделированы для использования минимального количества вершин.

:

Новички OpenGL -программисты часто испытывают искушение обеспечить функциональность SpeedGL в центре внимания и осветить прожектор на стене, смоделированной как единственный огромный многоугольник. К сожалению, ни один резкий схема прожектора не появится, как задумал новичок; Вы, вероятно, вообще не увидите какого -либо аффекта прожектора. Проблема заключается в том, что отсечение прожектора означает, что экстремальные углы стены, где указаны вершины, не получают вклада от прожектора, и, поскольку это единственные вершины, которые есть у стены, на стене не будет рисунка прожектора.

Другие советы

GL_POSITION указан в однородных координатах, что означает, что для него требуется четыре значения, а не три. Вам нужно указать W. = 1,0 для вашего источника света, но ваш W. Компонент вместо этого исходит от того, что происходит рядом с light0Position в памяти.

(Отчасти по причине, что GL_POSITION находится в однородных координатах состо W. = 0.0.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top