You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

正确实现逻辑

  1. 首先确定当前像素对应的地图瓦片坐标cellX、cellY,并获取该瓦片的纹理ID;
  2. 计算当前像素在瓦片内的归一化相对坐标(范围0.0~1.0);
  3. 将归一化坐标乘以纹理尺寸,得到正确的纹理采样坐标。

正确代码示例

// 获取当前像素所在的地图瓦片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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:14:54