如何在OpenGL中创建平滑的边缘聚光灯?

时间:2015-04-04 19:18:47

标签: java opengl 2d lwjgl lighting

我目前正致力于使用OpenGL为我的项目实现照明。仍然致力于基本实现(让灯光正确显示),我遇到了一个奇怪的问题。当试图创建一个带有截止的聚光灯(受光影响的有限角度)时,我会得到非常坚硬的边缘,几乎像楼梯一样,如图所示:

没有环境光(使用glLightModel(GL_LIGHT_MODEL_AMBIENT, colorToFloatBuffer(new Color(0.0f, 0.0f, 0.0f, 1.0f)))),我也禁用了点指数(指定光在锥体中的分布方式)和所有衰减以使效果更清晰,背景是一个大的白色图像(由于缺乏环境光而变成黑色;我也想知道为什么我甚至不需要使用图像来观察光线。

Weird light

以下是我设置灯光的方法:

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);

另一方面,我还在应用任何这些效果之前缩放上下文(我使用透视视图来获取某些视觉效果,但又希望保持正交坐标),如果有任何帮助的话。

1 个答案:

答案 0 :(得分:1)

有很多方法可以实现这一目标:

  1. 继续使用每顶点照明。但是,您应该提高场景的分辨率 - 将更多的多边形放入其中!
  2. 更改为每像素照明。您将需要学习着色器程序。 Here are some tutorials on the topic
相关问题