2D光线投射器中多纹理地板的水平渲染问题
水平渲染模式下光线投射的瓦片纹理映射问题解决方法
基于Lodev的光线投射教程,若要在水平渲染模式下为每个地图瓦片渲染不同纹理,需注意以下问题:
教程中垂直渲染模式可直接获取currentFloorX与currentFloorY,但水平渲染仅能得到纹理像素位置的tx和ty。若错误混用位运算与坐标计算,会导致数值异常、程序崩溃,甚至出现多种纹理混乱拼接的错误效果(比如不同瓦片纹理错位叠加、色块杂乱)。
错误代码示例
int currentFloorX = (int)((map->width & tx) * (floorX - cellX)) & (TEXTURE_SIZE -1); int currentFloorY = (int)((map->height & ty) * (floorY - cellY)) & (TEXTURE_SIZE - 1);
正确实现逻辑
- 首先确定当前像素对应的地图瓦片坐标
cellX、cellY,并获取该瓦片的纹理ID; - 计算当前像素在瓦片内的归一化相对坐标(范围0.0~1.0);
- 将归一化坐标乘以纹理尺寸,得到正确的纹理采样坐标。
正确代码示例
// 获取当前像素所在的地图瓦片ID int tileId = map->tiles[cellY][cellX]; // 计算瓦片内的归一化相对坐标 float tileU = floorX - cellX; float tileV = floorY - cellY; // 转换为纹理像素坐标,确保在纹理尺寸范围内 int currentFloorX = (int)(tileU * TEXTURE_SIZE) % TEXTURE_SIZE; int currentFloorY = (int)(tileV * TEXTURE_SIZE) % TEXTURE_SIZE; // 根据tileId选择对应纹理进行采样渲染
关键说明
- 错误代码中使用的
map->width & tx这类位运算完全不符合坐标映射逻辑,会导致数值失真; - 必须基于当前瓦片的归一化相对坐标计算纹理位置,才能保证每个瓦片的纹理正确独立渲染;
- 需根据瓦片ID匹配对应纹理,避免不同瓦片的纹理混乱叠加。
内容的提问来源于stack exchange,提问作者OrionExp
相关产品推荐
相关产品推荐

