2

参考 http://www.chai3d.org/doc/classc_light.html

代码

    light2->setPos(cVector3d( 0, 0,0.0));  // position the light source
    light2->m_ambient.set(0.8, 0.8, 0.8);
    light2->m_diffuse.set(0.8, 0.8, 0.8);
    light2->m_specular.set(0.8, 0.8, 0.8);
    light2->setDirectionalLight(false);//make a positional light

使用opengl的渲染代码是

void cLight::renderLightSource()
{
    // check if light source enabled
    if (m_enabled == false)
    {
        // disable OpenGL light source
        glDisable(m_glLightNumber);
        return;
    }

    computeGlobalCurrentObjectOnly();

    // enable this light in OpenGL
    glEnable(m_glLightNumber);

    // set lighting components
    glLightfv(m_glLightNumber, GL_AMBIENT,  m_ambient.pColor());
    glLightfv(m_glLightNumber, GL_DIFFUSE,  m_diffuse.pColor() );
    glLightfv(m_glLightNumber, GL_SPECULAR, m_specular.pColor());

    // position the light source in (global) space (because we're not
    // _rendered_ as part of the scene graph)
    float position[4];

    position[0] = (float)m_globalPos.x;
    position[1] = (float)m_globalPos.y;
    position[2] = (float)m_globalPos.z;
    //position[0] = (float)m_localPos.x;
    //position[1] = (float)m_localPos.y;
    //position[2] = (float)m_localPos.z;

    // Directional light source...
    if (m_directionalLight) position[3] = 0.0f;

    // Positional light source...
    else position[3] = 1.0f;

    glLightfv(m_glLightNumber, GL_POSITION, (const float *)&position);

    // set cutoff angle
    glLightf(m_glLightNumber, GL_SPOT_CUTOFF, m_cutOffAngle);

    // set the direction of my light beam, if I'm a _positional_ spotlight
    if (m_directionalLight == false)
    {
        cVector3d dir = m_globalRot.getCol0();
        float direction[4];
        direction[0] = (float)dir.x;
        direction[1] = (float)dir.y;
        direction[2] = (float)dir.z;
        direction[3] = 0.0f;
        glLightfv(m_glLightNumber, GL_SPOT_DIRECTION, (const float *)&direction);
    }

    // set attenuation factors
    glLightf(m_glLightNumber, GL_CONSTANT_ATTENUATION, m_attConstant);
    glLightf(m_glLightNumber, GL_LINEAR_ATTENUATION, m_attLinear);
    glLightf(m_glLightNumber, GL_QUADRATIC_ATTENUATION, m_attQuadratic);

    // set exponent factor
    glLightf(m_glLightNumber, GL_SPOT_EXPONENT, m_spotExponent);    
}

为什么我要让整个环境均匀照明?如何在原点 0,0,0 周围获得集中光,在 1 或 2 个单位距离后消失?我的原点是网格中的中间立方体。在此处输入图像描述

4

1 回答 1

1

警告购买者:这是我过去常常摸索OpenGL时的“从头顶上”。

我认为“定向光”的 OpenGL 概念有点像无限远的点光源,这意味着光矢量在整个场景中是不变的。

为了实现聚光灯效果,您需要形成光方向和光矢量(从顶点到光的矢量)的点积,并随着角度的增加以指数方式衰减光。

我记得曾经看过一个关于这个的教程,会搜索...

对,这里 有描述 向下滚动到“聚光灯”的描述。

在您列出的代码中,我相信您需要确保m_spotExponent大于零才能获得“锥形”效果。较高的值会产生从锥体的“亮”到“暗”部分的“更清晰”的过渡(我认为)。

希望有帮助

于 2012-11-21T13:45:24.753 回答