gpt4 book ai didi

c++ - 如何在opengl中获得聚光灯?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:30:01 25 4
gpt4 key购买 nike

引用资料 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 个单位距离后逐渐消失?我的原点是网格中的中间立方体。 enter image description here

最佳答案

注意买者:这是“从我的头顶”从我过去摸索 OpenGL 的时候开始的。

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

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

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

对,它描述了here向下滚动到“聚光灯”的描述。

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

希望对你有帮助

关于c++ - 如何在opengl中获得聚光灯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13494019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com