半条命2 BSP光照图


10

我正在为大学项目编写BSP查看器。到目前为止,我已经正确加载了主要几何图形,并且PVS正常工作。

现在,我正在尝试应用光照贴图,但似乎无法正确计算光照贴图的纹理坐标。

根据这里:http : //developer.valvesoftware.com/wiki/The_Source_Engine_BSP_File_Format

struct texinfo_t
{
    float textureVecs[2][4];  // [s/t][xyz offset]
    float lightmapVecs[2][4]; // [s/t][xyz offset] - length is in units of texels/area
    int flags;                // miptex flags overrides
    int texdata;               // Pointer to texture name, size, etc.
}

浮点数的第一个数组本质上是两个向量,代表在世界几何体上渲染时纹理的定向和缩放比例。s和t这两个向量是纹理像素坐标空间中从左到右和从上到下的方向到世界的映射。每个向量都有一个x,y和z分量,以及一个偏移量,该偏移量是纹理在该方向上相对于世界的“偏移”。向量的长度表示每个方向上纹理的缩放比例。

通过以下方式将纹理像素(或纹理像素)的2D坐标(u,v)映射到面部上某点的世界坐标(x,y,z):

u = tv0,0 * x + tv0,1 * y + tv0,2 * z + tv0,3

v = tv1,0 * x + tv1,1 * y + tv1,2 * z + tv1,3

(即,向量与顶点的点积加上该方向上的偏移。其中tvA,B是textureVecs [A] [B]。

此外,在计算(u,v)之后,要将其转换为要发送到图形卡的纹理坐标,请分别将u和v除以纹理的宽度和高度。

所以我做的计算如下。取顶点和光照贴图矢量的点积(lightmapVecs [0] [0],lightmapVecs 0,lightmapVecs [0] [2])加上偏移量(lightmapVecs [0] [3]),减去最小值并除以宽度/高度的结果。

float s = Vector3f.dot(v, new Vector3f(lightmapVecs[0][0], lightmapVecs[0][1], lightmapVecs[0][2])) + lightmapVecs[0][3] - f.LightmapTextureMinsInLuxels[0];
float t = Vector3f.dot(v, new Vector3f(lightmapVecs[1][0], lightmapVecs[1][1], lightmapVecs[1][2])) + lightmapVecs[1][3] - f.LightmapTextureMinsInLuxels[1];
s /= (f.LightmapTextureSizeInLuxels[0] + 1);
t /= (f.LightmapTextureSizeInLuxels[1] + 1);

但是最终看起来像这样: 光照贴图

这是一个顶点的纹理坐标“ t”的示例计算。

vertex = 352.0, -144.00027, -224.0
lightmap vector = -4, 0, 0
lightmap offset = 0
lightmap mins = 9
lightmap height = 14

所以点积是-1408

(-1408 + 0 - 9) / 14

t = -101.21

这似乎很遥远。


如果您可以在评论中发布图片链接,则可以有人为您编辑它。
共产党鸭子

谢谢。我得到了一些投票支持,所以我现在可以发布图片。:)
terryhau 2011年

你为什么要除以14?光照贴图的大小真的是“ 14”吗?大多数光照贴图是2的幂...
PatrickB

Answers:


0

我最终发现,我在读取错误的数据。上面的所有代码都是正确的。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.