【笔记】破解 64 Lightmaps限制
metahook吧
全部回复
仅看楼主
level 11
hzqst 楼主
地图lightmap超了直接导致的结果就是Alloc BLock: Full
而以下这些结构,也决定了lightmap不可能超过64块
int lightmap_textures[MAX_LIGHTMAPS];
glpoly_t *lightmap_polys[MAX_LIGHTMAPS];
qboolean lightmap_modified[MAX_LIGHTMAPS];
glRect_t lightmap_rectchange[MAX_LIGHTMAPS];
int allocated[MAX_LIGHTMAPS][BLOCK_WIDTH];
byte lightmaps[4 * MAX_LIGHTMAPS * BLOCK_WIDTH * BLOCK_HEIGHT];
那么初步的方法应该就是使用自己分配的内存了
2015年03月31日 01点03分 1
level 11
hzqst 楼主
lightmaps是储存贴图像素的关键,那么要修改lightmap的地址话很关键的一个地方就是
if (fa->dlightframe == r_framecount || fa->cached_dlight)
{
dynamic:
if (r_dynamic.value)
{
lightmap_modified[fa->lightmaptexturenum] = true;
base = lightmaps + fa->lightmaptexturenum * lightmap_bytes * BLOCK_WIDTH * BLOCK_HEIGHT;
base += fa->light_t * BLOCK_WIDTH * lightmap_bytes + fa->light_s * lightmap_bytes;
R_BuildLightMap(fa, base, BLOCK_WIDTH * lightmap_bytes);
}
}
这个R_BuildLightMap的base参数,是&lightmaps[fa->lightmaptexturenum * lightmap_bytes * 128 * 128 + ... ]
那么比较蠢的方法就是强行替换
text:01D48C03 add edx, offset lightmaps
.text:01D48C09 push edi ; stride
.text:01D48C0A push edx ; dest
.text:01D48C0B push ecx ; psurf
.text:01D48C0C call R_BuildLightMap
那个 offset lightmaps的地址,因为有六处这样写的,所以六处全部要替换
分别是
R_DrawSequentialPoly(在终绘制的地方判断是否需要上传,配合上传在R_RenderDynamicLightmaps中更新的lightmaps)
R_RenderDynamicLightmaps(负责根据dlight和elight构建动态lightmap,往lightmaps数组写入像素)
R_BlendLightmaps(不换也无所谓,支持多重纹理的机器上这个函数没有任何作用)
R_RenderBrushPoly(支持多重纹理的机器上这个函数没有任何作用,根本不会被调用)
GL_CreateSurfaceLightmap(负责加载完地图时构建静态lightmap,往lightmaps数组写入像素)
GL_BuildLightmaps(负责上传静态lightmaps)
那么最终要替换的就是四处地址,两处更新内容两处上传内容(静态+动态)。
2015年03月31日 02点03分 2
level 11
hzqst 楼主
gl_lightmap_format = GL_RGBA
这玩意其实默认就是GL_RGBA,不管在哪个版本引擎里默认就是这个值,也不会被引擎更改,可以当做是个常亮
2015年03月31日 02点03分 3
level 11
hzqst 楼主
lightmap_bytes = 4
这玩意只在GL_BuildLightMaps里赋值为4,其他地方都是使用,所以也可以当做常量
lightmap_used = 4;
if ( gl_monolights.value == 0.0 )
lightmap_used = 3;
这玩意只在GL_BuildLightMaps里出现过,直接当做废弃变量就行了
2015年03月31日 02点03分 4
level 11
hzqst 楼主
做完了,直接把R_RenderDynamicLightmaps和GL_BuildLightmaps自己实现了
2015年03月31日 06点03分 5
1