为什么我的 open gl 环境照明不起作用?

发布于 2024-11-14 06:44:44 字数 1625 浏览 5 评论 0原文

我的大部分照明都按照我想要的方式工作,但我似乎完全缺少任何环境照明。也就是说,物体远离太阳的一面是完全黑色的(我希望有 50% 的环境光),而朝向太阳的一面则像我预期的那样看起来很亮。

这是我的灯光设置代码(根据原始内容编辑,请参阅下面的注释):(

- (void) setupLighting
{
    const float amb = 2.0;
    const float LightAmbient[][4]  = {  { amb, amb, amb, 1.0f },
                                        { amb, amb, amb, 1.0f }
                                    };
    const float LightDiffuse[] [4] = {  { 1.0f, 1.0f, 1.0f, 1.0f },
                                        { 1.0f, 1.0f, 1.0f, 1.0f }
                                    };
    const float LightPosition[][4] = {  { 1.0f,  4.0f, 2.0f, 0.0f },
                                        { 0.0f, 10.0f, 0.0f, 1.0f }
                                    };

    glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient[0]);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse[0]);
    glLightfv(GL_LIGHT0, GL_POSITION, LightPosition[0]);

    glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient[1]);
    // etc., snip -- no LIGHT1 for this round

    glColorMaterial (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
    glEnable(GL_COLOR);
    //glEnable(GL_COLOR_MATERIAL);

    glEnable(GL_LIGHT0);
    //glEnable(GL_LIGHT1);
    glEnable(GL_LIGHTING);
}

注意:LIGHT1 现在已注释掉 - 我只是想让 LIGHT0 做我想做的事。)

不确定这是否重要,但我使用 glDrawArrays() 绘制单位对齐、纹理映射的单位立方体(类似于 MineCraft)。我所有的常态似乎都是正确的;如果我关闭灯光,一切都会正确绘制(只是平面照明。)

有任何提示吗?

谢谢!

编辑(已添加屏幕截图。)

这是问题的屏幕截图

编辑 根据评论,我将环境值提高到 2.0,现在看起来就像我所期望的大约 50% 环境值。这看起来很奇怪——我以为照明值固定在 [0, 1]...?关于环境光的哪些基本概念我没有理解?

I got most of my lighting working the way I want, but I seem to be completely missing any ambient lighting. That is, the away-from-the-sun sides of things are completely black (I was hoping for 50% ambient), whereas the toward-the-sun sides seem lit as I'd expect.

Here's my lighting setup code (edited from original, see note below):

- (void) setupLighting
{
    const float amb = 2.0;
    const float LightAmbient[][4]  = {  { amb, amb, amb, 1.0f },
                                        { amb, amb, amb, 1.0f }
                                    };
    const float LightDiffuse[] [4] = {  { 1.0f, 1.0f, 1.0f, 1.0f },
                                        { 1.0f, 1.0f, 1.0f, 1.0f }
                                    };
    const float LightPosition[][4] = {  { 1.0f,  4.0f, 2.0f, 0.0f },
                                        { 0.0f, 10.0f, 0.0f, 1.0f }
                                    };

    glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient[0]);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse[0]);
    glLightfv(GL_LIGHT0, GL_POSITION, LightPosition[0]);

    glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient[1]);
    // etc., snip -- no LIGHT1 for this round

    glColorMaterial (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
    glEnable(GL_COLOR);
    //glEnable(GL_COLOR_MATERIAL);

    glEnable(GL_LIGHT0);
    //glEnable(GL_LIGHT1);
    glEnable(GL_LIGHTING);
}

(NOTE: LIGHT1 commented out for now -- I'm just trying to get LIGHT0 to do what I want.)

Not sure if it matters, but I'm drawing unit-aligned, texture-mapped unit cubes (a la MineCraft) using glDrawArrays(). All my normals seem correct; if I leave lighting off, everything draws correctly (just flat-lit.)

Any hints?

Thanks!

Edit (Added screenshot.)

Here's a screenshot of the problem

Edit Per comments, I bumped ambient values up to 2.0, and now it looks like what I'd expect for about 50% ambient. That seems whacky -- I thought lighting values were pinned at [0, 1]...? What fundamental concept about ambient light am I not grokking?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

残月升风 2024-11-21 06:44:44

在您的代码中,您没有启用 GL_COLOR_MATERIAL。因此,如果您没有设置环境材质颜色(通过使用 GL_AMBIENT 调用 glMaterial),其默认值为 (0.2, 0.2, 0.2),这应该会在相乘时生成屏幕截图通过 (1,1,1)(光的环境光)。

此外,无需使用大于 1 的颜色值,因为无论如何这些值都会被限制为 [0,1]。

In your code, you didn't enable GL_COLOR_MATERIAL. So if you did not set the ambient material color (by calling glMaterial with GL_AMBIENT) its default is (0.2, 0.2, 0.2), which should result in your screenshot when multiplied by (1,1,1) (the light's ambient).

Also, there's no need to use color values greater than 1 as these are clamped to [0,1] anyway.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文