Проблемы с созданием карты теней в opengl
07.09.2022, 15:39. Показов 302. Ответов 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
| //Создаю карту теней один раз
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
|