HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Разработка игр > Наши проекты > Xash3D > Лайтмапы на стёклах в Xash3D
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32297
Нанёс повреждений: 392 ед.

Рейтинг



Лайтмапы на стёклах в Xash3D

Меня тут некоторые товарищи (не буду показывать пальцем) несколько достали со своими уверенями, что у меня лайтмапы на стёкла накладываются неправильно и вообще не по законам оптики.
Всем заинтерисованным товарищам предлагаю самостоятельно помучать блендинг лайтмап, дабы сделать правильно, с их точки зрения.
1. берем сорцы любой версии ксаша, желательно поновее.
2. открываем engine\client\gl_rsurf.c, находим функцию R_BlendLightmaps
3. меняем функцию вот на эту

C++ Source Code:
1
void R_BlendLightmaps( void )
2
{
3
  msurface_t	*surf, *newsurf = NULL;
4
  mextrasurf_t	*info;
5
  int		i;
6
 
7
  if( r_fullbright->integer || !cl.worldmodel->lightdata )
8
    return;
9
 
10
  if( RI.currententity )
11
  {
12
    // check for rendermode
13
    switch( RI.currententity->curstate.rendermode )
14
    {
15
    case kRenderTransTexture:
16
        if( r_lighting_extended->integer == 2 )
17
          break;
18
      case kRenderTransColor:
19
        case kRenderTransAdd:
20
          case kRenderGlow:
21
              return; // no lightmaps
22
          }
23
 
24
    if( RI.currententity->curstate.effects & EF_FULLBRIGHT )
25
      return;	// disabled by user
26
  }
27
 
28
  if( !r_lightmap->integer )
29
  {
30
    pglEnable( GL_BLEND );
31
 
32
    if( !glState.drawTrans )
33
    {
34
      // lightmapped solid surfaces
35
      pglDepthMask( GL_FALSE );
36
      pglDepthFunc( GL_EQUAL );
37
    }
38
 
39
    pglDisable( GL_ALPHA_TEST );
40
    pglBlendFunc( GL_ZERO, GL_SRC_COLOR );
41
    pglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
42
  }
43
 
44
  // render static lightmaps first
45
  for( i = 0; i < MAX_LIGHTMAPS; i++ )
46
  {
47
    if( gl_lms.lightmap_surfaces[i] )
48
    {
49
      GL_MBind( tr.lightmapTextures[i] );
50
 
51
      for( surf = gl_lms.lightmap_surfaces[i]; surf != NULL; surf = surf->lightmapchain )
52
      {
53
        if( surf->polys ) DrawGLPolyChain( surf->polys, 0.0f, 0.0f );
54
      }
55
    }
56
  }
57
 
58
  // render dynamic lightmaps
59
  if( r_dynamic->integer )
60
  {
61
    LM_InitBlock();
62
 
63
    GL_MBind( tr.dlightTexture );
64
 
65
    newsurf = gl_lms.dynamic_surfaces;
66
 
67
    for( surf = gl_lms.dynamic_surfaces; surf != NULL; surf = surf->lightmapchain )
68
    {
69
      int	smax, tmax;
70
      byte	*base;
71
 
72
      smax = ( surf->extents[0] >> 4 ) + 1;
73
      tmax = ( surf->extents[1] >> 4 ) + 1;
74
      info = SURF_INFO( surf, RI.currentmodel );
75
 
76
      if( LM_AllocBlock( smax, tmax, &info->dlight_s, &info->dlight_t ))
77
      {
78
        base = gl_lms.lightmap_buffer;
79
        base += ( info->dlight_t * BLOCK_WIDTH + info->dlight_s ) * 4;
80
 
81
        R_BuildLightMap( surf, base, BLOCK_WIDTH * 4 );
82
      }
83
      else
84
      {
85
        msurface_t	*drawsurf;
86
 
87
        // upload what we have so far
88
        LM_UploadBlock( true );
89
 
90
        // draw all surfaces that use this lightmap
91
        for( drawsurf = newsurf; drawsurf != surf; drawsurf = drawsurf->lightmapchain )
92
        {
93
          if( drawsurf->polys )
94
          {
95
            info = SURF_INFO( drawsurf, RI.currentmodel );
96
 
97
            DrawGLPolyChain( drawsurf->polys,
98
            ( drawsurf->light_s - info->dlight_s ) * ( 1.0f / 128.0f ),
99
            ( drawsurf->light_t - info->dlight_t ) * ( 1.0f / 128.0f ));
100
          }
101
        }
102
 
103
        newsurf = drawsurf;
104
 
105
        // clear the block
106
        LM_InitBlock();
107
 
108
        info = SURF_INFO( surf, RI.currentmodel );
109
 
110
        // try uploading the block now
111
        if( !LM_AllocBlock( smax, tmax, &info->dlight_s, &info->dlight_t ))
112
          Host_Error( "AllocBlock: full\n" );
113
 
114
        base = gl_lms.lightmap_buffer;
115
        base += ( info->dlight_t * BLOCK_WIDTH + info->dlight_s ) * 4;
116
 
117
        R_BuildLightMap( surf, base, BLOCK_WIDTH * 4 );
118
      }
119
    }
120
 
121
    // draw remainder of dynamic lightmaps that haven't been uploaded yet
122
    if( newsurf ) LM_UploadBlock( true );
123
 
124
    for( surf = newsurf; surf != NULL; surf = surf->lightmapchain )
125
    {
126
      if( surf->polys )
127
      {
128
        info = SURF_INFO( surf, RI.currentmodel );
129
 
130
        DrawGLPolyChain( surf->polys,
131
        ( surf->light_s - info->dlight_s ) * ( 1.0f / 128.0f ),
132
        ( surf->light_t - info->dlight_t ) * ( 1.0f / 128.0f ));
133
      }
134
    }
135
  }
136
 
137
  if( !r_lightmap->integer )
138
  {
139
    pglDisable( GL_BLEND );
140
 
141
    if( !glState.drawTrans )
142
    {
143
      // restore depth state
144
      pglDepthMask( GL_TRUE );
145
      pglDepthFunc( GL_LEQUAL );
146
    }
147
 
148
    pglDisable( GL_ALPHA_TEST );
149
    pglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
150
  }
151
}

4. крутим до одури гл-команды, в тайной надежде правильно наложить лайтмапу на стекло.
Сразу оговорюсь, что стекла с альфа-каналом и шойдеры юзать нельзя.
Только стандартные гл-набор версии 1.1 + обычные текстуры из вада.
Как только накрутите - выкладывайте код + скриншот, посмотрим.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 82042

Старое сообщение 24-08-2011 19:10
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32297
Нанёс повреждений: 392 ед.

Рейтинг



Очень показательно. Как рассказывать про законы оптики и капч0ные стёкла - толпа желающих. Как поэкспериментировать самостоятельно - никого нету. Я эту темку сохраню для истории. Буду таких вот "активных" товарищей в нее носом тыкать.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 82239

Старое сообщение 27-08-2011 08:35
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12941
Возраст: 32

Рейтинг



Дядя Миша
Это напоминает задачку сложите 2+2, ответ 4 не предлагать. Одним блендингом тут не обойтись. Без альфы и видимо как ты говорил шейдеров увы никак. Можно и без них, но тогда стёкла будут светиться в темноте.

Как видно из таблицы, базовая текстура везде непрозрачна.

Как вариант можно использовать GL_ONE и GL_DST_COLOR но они будут светиться в темноте.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Отредактировано FiEctro 27-08-2011 в 08:53

Сообщить модератору | | IP: Записан
Сообщение: 82240

Старое сообщение 27-08-2011 11:34
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 02:09. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Разработка игр > Наши проекты > Xash3D > Лайтмапы на стёклах в Xash3D
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024