HLFX.Ru Forum
Показать все 3 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Xash3D (https://hlfx.ru/forum/forumdisplay.php?forumid=14)
-- Лайтмапы на стёклах в Xash3D (https://hlfx.ru/forum/showthread.php?threadid=2964)


Отправлено Дядя Миша 24-08-2011 в 19:10:

Лайтмапы на стёклах в 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'


Отправлено Дядя Миша 27-08-2011 в 08:35:

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

__________________
My Projects: download page

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

Цитата:

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


Отправлено FiEctro 27-08-2011 в 11:34:

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

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

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

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


Временная зона GMT. Текущее время 00:57.
Показать все 3 сообщений этой темы на одной странице

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