如何在 OpenGL 中创建边缘平滑的聚光灯?
How can one create smooth edged spotlights in OpenGL?
我目前正在使用 OpenGL 为我的项目实现光照。仍在进行基本实现(让灯正确显示),我遇到了一个奇怪的问题。当尝试创建带有截止点(受光影响的有限角度)的聚光灯时,我得到非常硬的边缘,几乎像楼梯,如图所示:
没有环境光(使用glLightModel(GL_LIGHT_MODEL_AMBIENT, colorToFloatBuffer(new Color(0.0f, 0.0f, 0.0f, 1.0f)))
)并且我还禁用了点指数(指定光在锥体中的分布方式)和所有衰减以使效果更清晰并且背景是大白色图像(由于缺乏环境光而变黑;我也想知道为什么我什至根本不需要使用图像来看到光)。
我是这样设置灯光的:
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glLight(glLightID, GL_AMBIENT, colorToFloatBuffer(Color.blue));
glLight(glLightID, GL_DIFFUSE, colorToFloatBuffer(Color.black));
glLight(glLightID, GL_SPECULAR, colorToFloatBuffer(Color.black));
glLight(glLightID, GL_POSITION, floatBuffer.put(position.x).put(position.y).put(0.0f).put(1.0f));
glLight(glLightID, GL_SPOT_DIRECTION, otherFloatBuffer.put(1.0f, 0.0f, 0.0f));
glLightf(glLightID, GL_SPOT_EXPONENT, 0);
glLightf(glLightID, GL_SPOT_CUTOFF, 22.5f);
glLightf(glLightID, GL_CONSTANT_ATTENUATION, 1.0f);
glLightf(glLightID, GL_LINEAR_ATTENUATION, 0.0f);
glLightf(glLightID, GL_QUADRATIC_ATTENUATION, 0.0f);
另一方面,如果有帮助的话,我还会在应用任何这些效果之前缩放上下文(我对某些视觉效果使用透视图,但仍想保持正交坐标)。
有多种方法可以实现:
- 继续使用逐顶点光照。但是,您应该提高场景的分辨率 - 在里面放更多的多边形!
- 更改为逐像素照明。您将需要学习着色器程序。 Here are some tutorials on the topic.
我目前正在使用 OpenGL 为我的项目实现光照。仍在进行基本实现(让灯正确显示),我遇到了一个奇怪的问题。当尝试创建带有截止点(受光影响的有限角度)的聚光灯时,我得到非常硬的边缘,几乎像楼梯,如图所示:
没有环境光(使用glLightModel(GL_LIGHT_MODEL_AMBIENT, colorToFloatBuffer(new Color(0.0f, 0.0f, 0.0f, 1.0f)))
)并且我还禁用了点指数(指定光在锥体中的分布方式)和所有衰减以使效果更清晰并且背景是大白色图像(由于缺乏环境光而变黑;我也想知道为什么我什至根本不需要使用图像来看到光)。
我是这样设置灯光的:
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glLight(glLightID, GL_AMBIENT, colorToFloatBuffer(Color.blue));
glLight(glLightID, GL_DIFFUSE, colorToFloatBuffer(Color.black));
glLight(glLightID, GL_SPECULAR, colorToFloatBuffer(Color.black));
glLight(glLightID, GL_POSITION, floatBuffer.put(position.x).put(position.y).put(0.0f).put(1.0f));
glLight(glLightID, GL_SPOT_DIRECTION, otherFloatBuffer.put(1.0f, 0.0f, 0.0f));
glLightf(glLightID, GL_SPOT_EXPONENT, 0);
glLightf(glLightID, GL_SPOT_CUTOFF, 22.5f);
glLightf(glLightID, GL_CONSTANT_ATTENUATION, 1.0f);
glLightf(glLightID, GL_LINEAR_ATTENUATION, 0.0f);
glLightf(glLightID, GL_QUADRATIC_ATTENUATION, 0.0f);
另一方面,如果有帮助的话,我还会在应用任何这些效果之前缩放上下文(我对某些视觉效果使用透视图,但仍想保持正交坐标)。
有多种方法可以实现:
- 继续使用逐顶点光照。但是,您应该提高场景的分辨率 - 在里面放更多的多边形!
- 更改为逐像素照明。您将需要学习着色器程序。 Here are some tutorials on the topic.