Lwjgl纹理边缘问题

时间:2016-07-25 17:07:31

标签: java opengl textures lwjgl

当我尝试将纹理绑定到OpenGL中的3D模型时,我遇到了一个问题(我没有使用blender这个问题)。除某些区域外,纹理正确放置在模型上。问题在模型的边缘可见: edges

在Blender中我可以看到模型被切割的问题很严重: 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);
    } 
}

因此,对于每个顶点(即使它们具有相同的坐标),我保持正确的纹理坐标。

0 个答案:

没有答案