2015-04-04 1 views
2

В настоящее время я работаю над реализацией освещения для своего проекта с OpenGL. Все еще работала над базовой реализацией (правильно отображая индикаторы), и я столкнулся с какой-то странной проблемой. Когда вы пытаетесь создать прожектор с отсечкой (ограниченный угол, на который влияет свет), я получаю очень жесткие края, почти как лестницы, как видно на рисунке:Как создать гладкие окантованные прожекторы в 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

Есть в пути вы можете добиться того, что:

  1. Продолжить использование в-вершинного освещения. Вы, однако, должны увеличить разрешение вашей сцены - поместите больше полигонов внутрь!
  2. Изменение на пиксельное освещение. Вам нужно будет изучить шейдерные программы. Here are some tutorials on the topic.
+0

Если бы я знал это только 5 дней назад;) Удивительно долгое время, чтобы понять, что один из них и понять, как это основано на вершинах. Теперь я понимаю. Урок, который вы связали, действительно * действительно * действительно хорош, я использовал его, и он (почти) полностью работает сейчас. – 1337