当我尝试将纹理绑定到OpenGL中的3D模型时,我遇到了一个问题(我没有使用blender这个问题)。除某些区域外,纹理正确放置在模型上。问题在模型的边缘可见:
我确认我正确读取了.obj文件中的vt字段,然后从面线将每个顶点链接到适当的纹理坐标。
我用来绑定纹理的代码是:
glBindTexture(GL_TEXTURE_2D, _texture.getTextureID());
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
GL11.glColor3d(0, 0, 0);
GL11.glMaterial(GL_FRONT_AND_BACK, GL_AMBIENT, _ambiant.getFloatBuffer());
GL11.glMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE, _diffuse.getFloatBuffer());
GL11.glMaterial(GL_FRONT_AND_BACK, GL_SPECULAR, _specular.getFloatBuffer());
GL11.glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, _shininess);
我不知道我必须更改参数或进行其他更改。任何帮助将不胜感激。
----更新----
我写了我自己的obj读者,我检查每一行是否是顶点,vt,vn或f:
line = next();
String[] arr = line.split("\\s+");
if (arr[0].equals("o")) {
_name = arr[1];
continue;
}
if (arr[0].equals("v"))
_v.add(new Vec3(Double.parseDouble(arr[1]), Double
.parseDouble(arr[2]), Double.parseDouble(arr[3])));
if (arr[0].equals("vt")) {
Vec3 tex_coord = new Vec3(Double.parseDouble(arr[1]), 0, 0);
if (arr.length > 2) {
if (_flip)
tex_coord.setY(1 - Double.parseDouble(arr[2]));
else
tex_coord.setY(Double.parseDouble(arr[2]));
if (arr.length > 3)
tex_coord.setZ(Double.parseDouble(arr[3]));
}
_vt.add(tex_coord);
}
if (arr[0].equals("vn"))
_vn.add(new Vec3(Double.parseDouble(arr[1]), Double
.parseDouble(arr[2]), Double.parseDouble(arr[3])));
if (arr[0].equals("f")){
parseFace(arr);
}
使用:
private void parseFace(final String[] arr) {
int[][] face = new int[arr.length - 1][];
for (int i = 0; i < face.length; i++) {
String[] arrf = arr[i + 1].trim().split("/");
face[i] = new int[arrf.length];
face[i][0] = Integer.parseInt(arrf[0]) - 1;
if (arrf.length > 1) {
face[i][1] = Integer.parseInt(arrf[1]) - 1;
if (arrf.length > 2)
face[i][2] = Integer.parseInt(arrf[2]) - 1;
}
_f.add(face);
}
然后我用顶点坐标链接顶点:
private void computeSimplifiedArrays() {
for (int i = 0; i < _v.size(); i++) {
_normals.add(null);
_texture_coordinates.add(null);
}
for (int[][] f : _f) {
int[] face = new int[f.length];
for (int i = 0; i < f.length; i++) {
int index = f[i][0];
face[i] = f[i][0];
if (f[i].length > 1) {
_texture_coordinates.set(index, _vt.get(f[i][1]));
if (f[0].length > 2)
_normals.set(index, _vn.get(f[i][2]));
else
_normals.set(index, new Vec3());
}
}
_faces.add(face);
}
}
因此,对于每个顶点(即使它们具有相同的坐标),我保持正确的纹理坐标。