gpt4 book ai didi

c - 如何启用两个对象的不同 GL_POSITION

转载 作者:行者123 更新时间:2023-11-30 19:01:41 26 4
gpt4 key购买 nike

enter image description here

我想创建两个具有不同光照位置的对象。但是即使我设置了不同的位置参数,第二个物体(金球体)的灯光位置始终与第一个物体(银球体)相同。

我已相继启用了两个对象的灯光。但第二个总是与第一个/上面的相同。

    // light from top right
GLfloat light_position_top_right[] = { 1.0, 1.0, 1.0, 0.0 };
// light from bottom left
GLfloat light_position_bottom_left[] = { -1.0, -1.0, 1.0, 0.0 };

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLightfv(GL_LIGHT0, GL_POSITION, light_position_top_right);
glLightfv(GL_LIGHT1, GL_POSITION, light_position_bottom_left);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_DEPTH_TEST);

您可以在 gist 中找到完整的代码.

我希望第二个对象具有从左下角开始的光位置。但它从右上角显示为第一个对象。

最佳答案

灯光位置的第四个坐标必须是 1.0 而不是 0.0,否则,由于投影变换的工作原理,灯光的表现就好像它们在无限远的地方一样。指定方向。

第四个坐标为0.0:

Lights are infinitely far away

第四个坐标为1.0:

Lights are properly located

至于为什么有两个高光而不是一个,您忘记为灯光设置正确的 glLight* 设置。默认情况下,GL_LIGHT0 以白色漫反射和镜面反射颜色开始,但所有其他灯光默认情况下都具有黑色漫反射和镜面反射颜色。

<小时/>

编辑:

如果您希望单独的球体使用单独的灯光,则需要在 init() 期间初始化灯光。但不要立即 glEnable 启用灯光,而是执行以下操作:

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();
glTranslatef(1.0, 0.0, -1.0);
glEnable(GL_LIGHT0);
drawGraySphere();
glutSolidSphere(0.5, 50, 50);
glDisable(GL_LIGHT0);
glPopMatrix();

glPushMatrix();
glTranslatef(-0.75, -0.8, 0.0);
glEnable(GL_LIGHT1);
drawGoldSphere();
glutSolidSphere(0.5, 50, 50);
glDisable(GL_LIGHT1);
glPopMatrix();

glFlush();
}

或者,您可以选择仅使用单个光源,并在渲染每个球体之前使用每帧 glLight* 更改其参数。如果您打算拥有一堆对象,每个对象都有自己的灯光,那么这是更好的选择。

关于c - 如何启用两个对象的不同 GL_POSITION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57439604/

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