类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
相关产品推荐
相关产品推荐

