2012-10-16 2 views
-1

У меня проблемы с тенями в OpenGL. Модели имеют тень на каждом лице, OpenGL дает ему темноту, через какое направление лицо указывает от источника света. Я заметил, что свет просто проходит через грани, а это означает, что две плоскости, где рядом друг с другом и источник света находятся с одной стороны, плоскость на дальней стороне все еще светится.LWJGL с тенями для всей 3D-среды

Как я могу остановить это? Мне нужен теневой код, который работает для всей 3D-среды.

private static void setUpLighting() { 
    glShadeModel(GL_SMOOTH); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glLightModel(GL_LIGHT_MODEL_AMBIENT, BufferTools.asFlippedFloatBuffer(new float[]{0.05f, 
      0.05f, 0.05f, 1f})); 
    glLight(GL_LIGHT0, GL_POSITION, 
      BufferTools.asFlippedFloatBuffer(new float[]{0, 0, 0, 1})); 
    glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 
    glEnable(GL_COLOR_MATERIAL); 
    glColorMaterial(GL_FRONT, GL_DIFFUSE); 
    glEnable(GL_TEXTURE_2D); 
} 
+0

Какой теневой алгоритм вы используете? –

ответ

2

Я заметил, что свет просто проходит через лица, то есть, если две плоскости, где в непосредственной близости друг от друга и источника света с одной стороны, самолет на дальней стороне еще загореться.

Вы ошибаетесь OpenGL для чего-то, чего нет: OpenGL - это не граф сцены. В OpenGL нет внутреннего представления сцены. Каждая точка, линия и треугольник вы отправляете ее, чтобы рисовать ее индивидуально, без учета каких-либо других точек, линий и треугольников. На самом деле OpenGL больше похожа на сложную бумагу и карандаши.

Поскольку OpenGL не поддерживает представление сцены, он не может сделать так называемую модель «глобального освещения» самостоятельно. Поэтому, если вы хотите иметь тени в своей сцене, вам нужно управлять сценой и реализовывать алгоритмы рисования (которые используют OpenGL), результат которых выглядит как тени и глобальное освещение.

Вы должны изучить темы «Тени теней трафарета» и «Карты тени глубинного буфера».

+0

Я искал, как использовать те, но ни один из них не работает –

+0

@JasperCreyf: Что вы попробовали? «Это не работает» - это наиболее общее, необъяснимое описание ошибки. – datenwolf

+3

@JasperCreyf: Я принял ваш комментарий, так как вы попытались реализовать алгоритм самостоятельно. Для рабочих демонстраций: Вот демо-версия Stencil Shadows http://humus.name/index.php?page=3D&ID=10 и вот демоверсия Shadow Mapping (которая также цветовых теней!) Http://humus.name/index. php? page = 3D & ID = 39 – datenwolf

Смежные вопросы