Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2011, 01:35   #1
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию OpenGL. Проекционные тени и их отрисовка на плоскости стен комнаты

Здравствуйте.
При реализации комнаты с различными предметами стала необходимость нарисовать тени от точечного источника света, находящегося в центре комнаты
проблема встала такая: тени отрисовываются, но продолжаются и за стенами комнаты
вопрос такой: как этого избежать?

код такой:

Код:
double[] T = new double[16];
            Gl.glClear(Gl.GL_STENCIL_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
//буфер трафарета
            Gl.glEnable(Gl.GL_STENCIL_TEST);
//настройки на плоскости отсечения
            Gl.glStencilFunc(Gl.GL_ALWAYS, 1, 0xffffffff);
            Gl.glStencilOp(Gl.GL_REPLACE, Gl.GL_REPLACE, Gl.GL_REPLACE);
//рисование геометрии плоскости отсечения (сама комната, без передней стенки, проекция комнаты - перспективная
            DrawRoom();

            Gl.glStencilFunc(Gl.GL_EQUAL, 1, 0xffffffff);
            Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_INCR);
            
//отключаем буфер глубины
            Gl.glDisable(Gl.GL_DEPTH_TEST);
//наложение цветов
            Gl.glEnable(Gl.GL_BLEND);
//использование альфа-канала
            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
//отключение освещения
            Gl.glDisable(Gl.GL_LIGHTING); 
//интенсивность тени и ее цвет
            Gl.glColor4d(0.0, 0.0, 0.0, 0.3);
//вывод теней от всех объектов
//применяется матрица теней, сформирована в массив T
//i - номер плоскости (стенки комнаты), тень накладывается на i-ую плоскость
            for (uint i = 0; i < 5; i++)
            {
                ShadowMatrix(i, T);
                Gl.glPushMatrix();
                Gl.glMultMatrixd(T);
                DrawCone();
                DrawSphere();
                DrawTorus();
                Gl.glPopMatrix();
            }
//далее по коду идет прорисовка самих объектов
            Gl.glColorMask(Gl.GL_TRUE, Gl.GL_TRUE, Gl.GL_TRUE, Gl.GL_TRUE);
            Gl.glDisable(Gl.GL_STENCIL_TEST);
            Gl.glEnable(Gl.GL_DEPTH_TEST);
            Gl.glEnable(Gl.GL_LIGHTING);
Картинка на рисунке p1.bmp

Если в коде закомментировать отключение буфера глубины
Код:
Gl.glDisable(Gl.GL_DEPTH_TEST);
то картина получается как нарисунке p2.bmp

Мне нужно, чтобы цвет тени был равномерным и бликов, как в случае со включенным буфером глубины, не появлялось, но в то же время в случае со включенным буфером глубины, тень отрисовывается с точки зрения геометрии правильно и не проходит через стены

подскажите, пожалуйста, как это реализовать

Код:
private void DrawRight()
        {
            //боковая правая стенка
            RoomMaterial(2, true);
            SetCurrentTexture(texture_list[0]);
            Gl.glEnable(Gl.GL_TEXTURE_2D);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glNormal3d(-1.0, 0.0, 0.0); Gl.glTexCoord2d(8.0, 1.0); Gl.glVertex3d(1.0, -1.0, 1.0);
            Gl.glNormal3d(-1.0, 0.0, 0.0); Gl.glTexCoord2d(8.0, 0.0); Gl.glVertex3d(1.0, 1.0, 1.0);
            Gl.glNormal3d(-1.0, 0.0, 0.0); Gl.glTexCoord2d(0.0, 0.0); Gl.glVertex3d(1.0, 1.0, -1.0);
            Gl.glNormal3d(-1.0, 0.0, 0.0); Gl.glTexCoord2d(0.0, 1.0); Gl.glVertex3d(1.0, -1.0, -1.0);
            Gl.glEnd();
            RoomMaterial(2, false);
            Gl.glDisable(Gl.GL_TEXTURE_2D);
            return;
        }

        private void DrawRoom()
        {
            DrawBack();
            DrawLeft();
            DrawRight();
            DrawCeiling();
            DrawFloor();
            return;
        }
По такому же принципу как и DrawRight() организованы
Код:
DrawLeft();
            DrawBack();
            DrawCeiling();
            DrawFloor();
спасибо
Изображения
Тип файла: jpg p1.jpg (20.1 Кб, 142 просмотров)
Тип файла: jpg p2.jpg (21.6 Кб, 151 просмотров)
capta1n вне форума Ответить с цитированием
Старый 07.12.2011, 19:48   #2
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Тема неактуальна
Весь вопрос был составить вот такой код:

Код:
private void BuildShadows()
        {
            double[] T = new double[16];
            Gl.glEnable(Gl.GL_STENCIL_TEST);
            Gl.glClearStencil(0);
            Gl.glClear(Gl.GL_STENCIL_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT | Gl.GL_COLOR_BUFFER_BIT);
            Gl.glStencilFunc(Gl.GL_ALWAYS, 1, 1);
            Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_REPLACE);

            DrawRoom();

            Gl.glDisable(Gl.GL_LIGHTING);
            Gl.glDisable(Gl.GL_DEPTH);
            Gl.glColor4d(0.0, 0.0, 0.0, 0.5);

            Gl.glStencilFunc(Gl.GL_EQUAL, 1, 1);
            Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_KEEP);

            for (uint i = 0; i < 5; i++)
            {
                ShadowMatrix(i, T);
                Gl.glPushMatrix();
                Gl.glMultMatrixd(T);
                DrawCone();
                DrawSphere();
                DrawTorus();
                Gl.glPopMatrix();
            }

            Gl.glEnable(Gl.GL_LIGHTING);
            Gl.glEnable(Gl.GL_DEPTH);

            return;
        }

Еще в настройках элемента OpenGLControlElement поставить свойство StencilBits не в ноль
capta1n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отрисовка ребер в OpenGL Xcopy Помощь студентам 0 14.05.2011 13:02
статья - Делаем динамические тени на OPENGL. Часть 1 Pblog Обсуждение статей 0 25.08.2010 20:00
Помогите с построением тени в OpenGL PitNN Помощь студентам 4 08.04.2010 14:05
Отрисовка круга в OpenGl Oburec Мультимедиа в Delphi 1 04.07.2009 15:22
Тени в OpenGL - оцените, пожалуйста мой метод... WittySpark Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 14.11.2007 17:54