【问题标题】:OpenGL - creating a plane surface with a cone-like spotlightOpenGL - 创建一个带有锥形聚光灯的平面
【发布时间】:2011-10-17 16:33:41
【问题描述】:

我在创建一个具有锥形聚光灯指向的矩形表面时遇到了麻烦。到目前为止,我已经尝试创建一个 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();
}

【问题讨论】:

    标签: c opengl


    【解决方案1】:

    标准固定函数 OpenGL 照明仅在顶点位置进行评估,并且在图元上插值确定的颜色。因此,要获得聚光灯效果,必须以高分辨率评估照明。您可以通过细分您的平面或使用片段着色器来实现此目的,每个片段照明


    编辑以回复评论

    镶嵌

    Tesselation 意味着,将您的飞机细分为大量“补丁”。像这样:

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

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

    每个片段照明

    每个片段照明意味着,照明方程在每个光栅化片段上进行评估(片段是通常称为像素的内容)。为此,使用了一个片段着色器,即加载到图形处理器 (GPU) 中的一个小程序,针对光栅化图元(三角形、线、点)的每个片段/像素执行。

    Lighthouse3D 有一个关于它的教程:http://www.lighthouse3d.com/tutorials/glsl-tutorial/spot-light-per-pixel/ 我建议你在那里阅读完整的 GLSL 教程,以了解发生了什么。

    【讨论】:

    • +1 回答我,但你能解释一下这两种技术,因为我是 openGL 的新手 :) 真的很喜欢。
    猜你喜欢
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多