Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 07.09.2022
Сообщений: 6
1

Проблемы с созданием карты теней в opengl

07.09.2022, 15:39. Показов 302. Ответов 0

Author24 — интернет-сервис помощи студентам
Здравствуйте, форумчане!

Я долгое время пытался сделать тени в игре с помощью карт теней. Но, тени упорно не хотят отображаться. Ниже привожу код:

Код создания текстуры под карту теней при инициализации:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
   //Создаю карту теней один раз
    int w, h;
    getWinWH(&w, &h);
 
    glGenTextures(1, &DepthTex);
    glBindTexture(GL_TEXTURE_2D, DepthTex);
 
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
 
    glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    glTexGeni( GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0,
                       GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
 
    glBindTexture(GL_TEXTURE_2D, 0);
Создаю карту теней:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  //Функция рендеринга сцены в карту теней с позиции источника
    int w, h;
    getWinWH(&w, &h);
 
    glColorMask ( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
    glDisable  ( GL_TEXTURE_2D );
    glEnable  ( GL_POLYGON_OFFSET_FILL );
    glPolygonOffset ( 4, 4 );
 
    glViewport( 0, 0, w, h );
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    glMatrixMode( GL_PROJECTION );
        glPushMatrix();
            glLoadIdentity();
            gluPerspective(45, 1.0f, 0.1, 100);
            //glTranslatef(0, 0, -10);
            gluLookAt(lightpos[0], lightpos[1], lightpos[2], 0, 0, 0, 0, 1, 0);
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity ();
 
    glGetFloatv( GL_MODELVIEW_MATRIX,  mv);
    glGetFloatv( GL_PROJECTION_MATRIX, pr);
 
      //Рендер сцены
    statObjRender();
 
    glBindTexture( GL_TEXTURE_2D, DepthTex);
    glCopyTexImage2D ( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, w,h, 0 );
 
    glDisable( GL_POLYGON_OFFSET_FILL );
    glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
    glEnable( GL_TEXTURE_2D );
 
    glMatrixMode( GL_PROJECTION );
        glPopMatrix();
    glMatrixMode( GL_MODELVIEW );
 
    Camera_RotateBack();
    Camera_MoveBack();
 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
и код окончательного рендера:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    int w, h;
    getWinWH(&w, &h);
    renderToShadowMap();
 
    glDisable(GL_LIGHT0);
 
    glMatrixMode   ( GL_MODELVIEW );
    glPushMatrix   ();
    glBindTexture ( GL_TEXTURE_2D, DepthTex );
    glEnable ( GL_TEXTURE_2D    );
    glEnable ( GL_TEXTURE_GEN_S );
    glEnable ( GL_TEXTURE_GEN_T );
    glEnable ( GL_TEXTURE_GEN_R );
    glEnable ( GL_TEXTURE_GEN_Q );
 
    glTexEnvi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
 
    glMatrixMode  ( GL_TEXTURE );
    glPushMatrix  ();
 
    glLoadIdentity ();
    glTranslatef   ( 0.5, 0.5, 0.5 );   
    glScalef       ( 0.5, 0.5, 0.5 );
    glMultMatrixf  ( pr );
    glMultMatrixf  ( mv );
   glMatrixMode (GL_MODELVIEW);
 
 
     float PS[] = { 1, 0, 0, 0 };
     float PT[] = { 0, 1, 0, 0 };
     float PR[] = { 0, 0, 1, 0 };
     float PQ[] = { 0, 0, 0, 1 };
 
      glTexGenfv ( GL_S, GL_EYE_PLANE, &PS);
      glTexGenfv ( GL_T, GL_EYE_PLANE, &PT);
      glTexGenfv ( GL_R, GL_EYE_PLANE, &PR);
      glTexGenfv ( GL_Q, GL_EYE_PLANE, &PQ);
 
    statObjRender();
 
    glMatrixMode  ( GL_TEXTURE );
        glLoadIdentity();
        glPopMatrix();
    glMatrixMode( GL_MODELVIEW );
 
    glEnable(GL_LIGHT0);
P.S. Да, этот метод устаревший, но нужно сделать именно вот таким способом. Делал по нескольким туториалам, в т.ч. и по Red book, но безуспешно. Буду очень благодарен вам за помощь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2022, 15:39
Ответы с готовыми решениями:

Карты теней - массивы текстур
Для источников света в гбуффер нужно передать массив текстур. Скиньте пож ссылку или напишите...

Создание теней для объектов в OpenGL
Прошу помочь или хотя бы подсказать. Во вложении программа, которая рисует комнату с зеркалом...

Некоторые проблемы с запеканием света и теней. Юнити 3д
Всем хай. Не понимаю в чем может быть проблема. --> Пытаюсь запечь свет и тени в текстуру с...

Проблемы с созданием сервиса
Добрый день Создаю сервисную службу вот так http://habrahabr.ru/post/102826/. Но потом не вижу...

Проблемы с созданием класса
class Source { Source(String login,String password,String other) { ...

0
07.09.2022, 15:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2022, 15:39
Помогаю со студенческими работами здесь

Проблемы с созданием объектов
Описан класс TPlanet: TPlanet = class (TObject) public name: string; ...

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

Проблемы с созданием вектора
#include <iostream> #include <vector> using namespace std; int main(){ vector <int> a =...

Проблемы с созданием формы
Здравствуйте, вот попытался создать свою первую форму, все получилось, но в WNDCLASSEX есть еще 1...

Проблемы с созданием Ln логарифма
Всем привет, прошу прощения что пишу вам с такой просьбой, помочь сделать программу для решения Ln...

Проблемы с созданием объекта
Есть два класса public class Tname { public string name_eng; public...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru