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 ) |
3 | msurface_t *surf, *newsurf = NULL; |
7 | if( r_fullbright->integer || !cl.worldmodel->lightdata ) |
10 | if( RI.currententity ) |
12 | // check for rendermode |
13 | switch( RI.currententity->curstate.rendermode ) |
15 | case kRenderTransTexture: |
16 | if( r_lighting_extended->integer == 2 ) |
18 | case kRenderTransColor: |
21 | return; // no lightmaps |
24 | if( RI.currententity->curstate.effects & EF_FULLBRIGHT ) |
25 | return; // disabled by user |
28 | if( !r_lightmap->integer ) |
30 | pglEnable( GL_BLEND ); |
32 | if( !glState.drawTrans ) |
34 | // lightmapped solid surfaces |
35 | pglDepthMask( GL_FALSE ); |
36 | pglDepthFunc( GL_EQUAL ); |
39 | pglDisable( GL_ALPHA_TEST ); |
40 | pglBlendFunc( GL_ZERO, GL_SRC_COLOR ); |
41 | pglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); |
44 | // render static lightmaps first |
45 | for( i = 0; i < MAX_LIGHTMAPS; i++ ) |
47 | if( gl_lms.lightmap_surfaces[i] ) |
49 | GL_MBind( tr.lightmapTextures[i] ); |
51 | for( surf = gl_lms.lightmap_surfaces[i]; surf != NULL; surf = surf->lightmapchain ) |
53 | if( surf->polys ) DrawGLPolyChain( surf->polys, 0.0f, 0.0f ); |
58 | // render dynamic lightmaps |
59 | if( r_dynamic->integer ) |
63 | GL_MBind( tr.dlightTexture ); |
65 | newsurf = gl_lms.dynamic_surfaces; |
67 | for( surf = gl_lms.dynamic_surfaces; surf != NULL; surf = surf->lightmapchain ) |
72 | smax = ( surf->extents[0] >> 4 ) + 1; |
73 | tmax = ( surf->extents[1] >> 4 ) + 1; |
74 | info = SURF_INFO( surf, RI.currentmodel ); |
76 | if( LM_AllocBlock( smax, tmax, &info->dlight_s, &info->dlight_t )) |
78 | base = gl_lms.lightmap_buffer; |
79 | base += ( info->dlight_t * BLOCK_WIDTH + info->dlight_s ) * 4; |
81 | R_BuildLightMap( surf, base, BLOCK_WIDTH * 4 ); |
87 | // upload what we have so far |
88 | LM_UploadBlock( true ); |
90 | // draw all surfaces that use this lightmap |
91 | for( drawsurf = newsurf; drawsurf != surf; drawsurf = drawsurf->lightmapchain ) |
95 | info = SURF_INFO( drawsurf, RI.currentmodel ); |
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 )); |
108 | info = SURF_INFO( surf, RI.currentmodel ); |
110 | // try uploading the block now |
111 | if( !LM_AllocBlock( smax, tmax, &info->dlight_s, &info->dlight_t )) |
112 | Host_Error( "AllocBlock: full\n" ); |
114 | base = gl_lms.lightmap_buffer; |
115 | base += ( info->dlight_t * BLOCK_WIDTH + info->dlight_s ) * 4; |
117 | R_BuildLightMap( surf, base, BLOCK_WIDTH * 4 ); |
121 | // draw remainder of dynamic lightmaps that haven't been uploaded yet |
122 | if( newsurf ) LM_UploadBlock( true ); |
124 | for( surf = newsurf; surf != NULL; surf = surf->lightmapchain ) |
128 | info = SURF_INFO( surf, RI.currentmodel ); |
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 )); |
137 | if( !r_lightmap->integer ) |
139 | pglDisable( GL_BLEND ); |
141 | if( !glState.drawTrans ) |
143 | // restore depth state |
144 | pglDepthMask( GL_TRUE ); |
145 | pglDepthFunc( GL_LEQUAL ); |
148 | pglDisable( GL_ALPHA_TEST ); |
149 | pglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE ); |
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 но они будут светиться в темноте.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!