Meshroom生成OBJ文件纹理坐标读取及OpenGL纹理加载问题求助
问题排查与解决方案
1. 纹理层索引计算错误
你当前使用std::round(x)计算纹理层索引的逻辑存在问题:
- 对于
0 ≤ x < 1范围内的坐标,四舍五入可能把接近1的x(比如0.99)判定为层1,导致采样到错误的纹理 - 正确的做法是使用
std::floor(x)取整数部分,确保区间[0,1)对应层0、[1,2)对应层1,以此类推
修改后的坐标处理代码:
fscanf_s(file, "%f %f\n", &x, &y); z = std::floor(x); // 替换round为floor x = x - z; // 可选:如果发现纹理上下颠倒可添加下面这行 // y = 1.0f - y; tex = glm::vec3(x, y, z);
2. 缺少纹理参数配置
你创建完2D纹理数组后没有显式设置环绕和过滤参数,默认的REPEAT环绕模式会导致边界处的UV因浮点精度误差采样到纹理另一端,产生明显边界。在纹理生成mipmap前添加如下配置:
// 纹理环绕设置:边界处截断,避免重复采样 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // 纹理过滤设置,可根据需求调整 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glGenerateMipmap(GL_TEXTURE_2D_ARRAY);
3. 纹理尺寸一致性检查
你调用glTexImage3D时使用了固定的size作为宽高,需要确认所有加载的纹理图片的实际分辨率w和h都等于这个size,否则glTexSubImage3D会出现拉伸、错位,导致边界显示异常。如果纹理尺寸不一致,需要先将所有纹理缩放到相同尺寸再传入,或者调整glTexImage3D的宽高参数为实际纹理尺寸。
内容的提问来源于stack exchange,提问作者Fedour Traktor
相关产品推荐
相关产品推荐

