我正在用WebGL创建一个3D游戏,我使用波前物体作为基本模型格式。我最近发现了一些模型,它们的纹理坐标超出了典型的0,1范围,我真的不知道如何处理它们(在代码中)。
当然,我知道这是一个已知的问题,纹理坐标可以在0,1之外,解决方案是使用GL_REPEAT包装模式。
但这不是我的解决方案,因为我有很多非动力的2纹理,我需要使用CLAMP_TO_EDGE包装模式(非pow-2纹理的解决方案)。
我试图通过编写代码来绕过这个问题,因此将0-,1+范围转换为0,1,但没有取得多大的成功(尽管有些成功)。下面是我所做的:我循环了"vt“条目(来自我的解析器),我正在检查的情况如下(伪):
U,V = texture coordinates as they come from file
if (U<0) {
U = U + Math.abs( Math.floor(U) );
}
if (U>1) {
U = U - Math.floor(U);
}
if (V>=0) {
V = Math.ceil(V) - V;
}
if (V<0) {
V = Math.abs( Math.floor(V) - V );
}
上面的片段将取一个U,V的未知范围,并将其转换为0,1,同时考虑到WebGL纹理协调系统(0,0,但左转WebGL,0,1表示波前,第三种情况)。
这些数字是正确计算的,但结果并不是预期的,恐怕我这方面对GL_REPEAT模式是如何工作的有误解。
所以我的问题(S)
发布于 2014-03-16 11:04:53
我认为你最好把你的纹理调整到最近的二次幂。您不需要调整纹理坐标,因为它们相对于纹理图像的大小(尽管您可能需要设置v=1-v以考虑不同的来源)。
您自己包装纹理坐标的问题是,在“接缝”(值从1 -> 0突然下降)的“接缝”处,过滤将不能正常工作。
https://gamedev.stackexchange.com/questions/71985
复制相似问题