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

类Doom引擎中使用glTexCoord4f实现三角形正确纹理映射的方案咨询

问题核心错误

你之前墙面实现可以正常工作的本质是:垂直墙面的边屏幕长度刚好和对应顶点的逆深度成正比,匹配了glTexCoord4f要求的纹理坐标预乘q、采样时自动除以q的逻辑。但地面/天花板代码中用三角形边的屏幕长度作为q值的逻辑完全错误,q是顶点级属性,和关联边的长度没有对应关系。

正确实现方案

对于你的2.5D类Doom引擎,每个地面/天花板顶点的q值直接使用你已经计算好的顶点相机空间深度值(即代码中的tza/tzb/tzc)即可,纹理坐标预乘该深度值,和墙面的实现逻辑保持一致。

修正后地面渲染代码

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture.at((*floor).texture));

glBegin(GL_TRIANGLE_STRIP); //渲染地面
glTexCoord4f(ua * tza, va * tza, 0, tza);
glVertex3f(fxa, fyaa + shearing, -tza * 0.001953);

glTexCoord4f(ub * tzb, vb * tzb, 0, tzb);
glVertex3f(fxb, fyba + shearing, -tzb * 0.001953);

glTexCoord4f(uc * tzc, vc * tzc, 0, tzc);
glVertex3f(fxc, fyca + shearing, -tzc * 0.001953);
glEnd();

修正后天花板渲染代码

glBegin(GL_TRIANGLE_STRIP); //渲染天花板
glTexCoord4f(uc * tzc, vc * tzc, 0, tzc);
glVertex3f(fxc, fycb + shearing, -tzc * 0.001953);

glTexCoord4f(ub * tzb, vb * tzb, 0, tzb);
glVertex3f(fxb, fybb + shearing, -tzb * 0.001953);

glTexCoord4f(ua * tza, va * tza, 0, tza);
glVertex3f(fxa, fyab + shearing, -tza * 0.001953);
glEnd();

glDisable(GL_TEXTURE_2D);

额外适配说明

如果需要调整纹理的平铺缩放比例,直接在计算ua/ub/uc/va/vb/vc的阶段乘上全局缩放系数即可,不需要修改q值的计算逻辑。本方案完全保留了你使用glTexCoord4f的实现要求,也符合你不采用标准透视投影的设计目标。

内容的提问来源于stack exchange,提问作者Dr. Ether

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:39:00