OpenGL - создание плоской поверхности с конусообразным прожектором - PullRequest
1 голос
/ 16 октября 2011

У меня проблемы с созданием прямоугольной поверхности, на которую направлен конусообразный прожектор. До сих пор я пытался создать поверхность 2D-куба (glutSolidCube()) и использовать GL_SPOT_XXX для создания прожектора. Но я не знаю, по какой причине свет просто рассеивается по всей поверхности, а не собирается в месте.

Итак, пока мой код, вы можете просто сосредоточиться на функциях init_light() и display(). Другие функции доступны для вас, если вам нужно:)

void rotateCamera()
{
    /* Rotate camera 2 degrees about selected axis */
    theta[axis] += dtheta;
    if (theta[axis] > 360.0 ) theta[axis] -= 360.0;
    glutPostRedisplay();
}

void computeCameraPosition() {
    GLdouble M[16];

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    glTranslatef(centroid[0], centroid[1], centroid[2]);
    glRotatef(theta[0], 1.0, 0.0, 0.0);
    glRotatef(theta[1], 0.0, 1.0, 0.0);
    glRotatef(theta[2], 0.0, 0.0, 1.0);
    glTranslatef(-centroid[0], -centroid[1], -centroid[2]);
    glGetDoublev(GL_MODELVIEW_MATRIX, M);

    GLdouble newvec[16];

    glMultMatrixd(init_vec);
    glGetDoublev(GL_MODELVIEW_MATRIX, newvec);
    glPopMatrix();

    /* the 1st and 2nd columns are the eye position and new y-axis direction */
    memcpy(eye, newvec, sizeof(GLdouble)*4);
    memcpy(yaxis, newvec+4, sizeof(GLdouble)*4);
}

void init_light()
{
    GLfloat spot_direction[] = { 1.0, 1.0, 0.0 };
    glLightfv( GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction );
    glLightf( GL_LIGHT0, GL_SPOT_EXPONENT, 2.0 );
    glLightf( GL_LIGHT0, GL_SPOT_CUTOFF, 45.0 );

    glShadeModel(GL_SMOOTH);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_COLOR_MATERIAL);
}


void display() {
    computeCameraPosition();
    glClearColor(0.9, 0.9, 0.9, 1.0);
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(eye[0], eye[1], eye[2], 
          centroid[0], centroid[1], centroid[2], 
          yaxis[0], yaxis[1], yaxis[2]); 
    glutSolidCube(2.0);
    glFlush();
    glutSwapBuffers();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800, 800);
    glutInitWindowPosition (200, 100);
    glutCreateWindow("Scene Editor");
    init_light();
    glutDisplayFunc(display);
    glutMainLoop();
}

1 Ответ

5 голосов
/ 16 октября 2011

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


РЕДАКТИРОВАТЬ, чтобы ответить на комментарий

Тесселяция

Тесселяция означает разделение вашего самолета на большое количество «заплаток».Например:

+---------------------+
|                     |
|                     |
|                     |
|                     |
|                     |
|                     |
|                     |
|                     |
|                     |
|                     |
+---------------------+

+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+

Освещение на фрагмент

Освещение на фрагмент означает, что уравнение освещения оценивается на каждом растеризованном фрагменте (фрагментчто обычно называют пикселем).Для этого используется фрагментный шейдер , то есть небольшая программная загрузка в графический процессор (GPU), которая выполняется для каждого фрагмента / пикселя растеризованного примитива (треугольник, линия, точка).

У Lighthouse3D есть учебник об этом: http://www.lighthouse3d.com/tutorials/glsl-tutorial/spot-light-per-pixel/ Я рекомендую вам прочитать там полное руководство по GLSL, чтобы понять, что происходит.

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