首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法正确使用纹理模型

无法正确使用纹理模型
EN

Stack Overflow用户
提问于 2014-08-31 05:21:12
回答 2查看 106关注 0票数 2

我的Blender 3D对象是用三角化面和UV写入导出的,不能正确地应用纹理。

它看起来是这样的:

我的渲染代码:

代码语言:javascript
运行
复制
    Color.white.bind();
    texture.bind();
    glBegin(GL_TRIANGLES);
    for(ObjFace face : model.faces){
        float[] vertex1 = model.vertices[face.indices[0]-1];
        float[] vertex2 = model.vertices[face.indices[1]-1];
        float[] vertex3 = model.vertices[face.indices[2]-1];
        float[] normal1 = model.normals[face.normals[0]-1];
        float[] normal2 = model.normals[face.normals[1]-1];
        float[] normal3 = model.normals[face.normals[2]-1];
        float[] tex1 = model.texCoords[face.texCoords[0]-1];
        float[] tex2 = model.texCoords[face.texCoords[1]-1];
        float[] tex3 = model.texCoords[face.texCoords[2]-1];
        glNormal3f(normal1[0], normal1[1], normal1[2]);
        glTexCoord2f(tex1[0], tex1[1]);
        glVertex3f(vertex1[0], vertex1[1], vertex1[2]);
        glNormal3f(normal2[0], normal2[1], normal2[2]);
        glTexCoord2f(tex2[0], tex2[1]);
        glVertex3f(vertex2[0], vertex2[1], vertex2[2]);
        glNormal3f(normal3[0], normal3[1], normal3[2]);
        glTexCoord2f(tex3[0], tex3[1]);
        glVertex3f(vertex3[0], vertex3[1], vertex3[2]);
    }
    glEnd();

解析代码:

代码语言:javascript
运行
复制
    for (int i = 0; i < lines.length; ++i) {
        String[] spaced = lines[i].split(" ");
        if (lines[i].startsWith("v ")) {
            float[] vertices = new float[3];
            vertices[0] = parseFloat(spaced[1]);
            vertices[1] = parseFloat(spaced[2]);
            vertices[2] = parseFloat(spaced[3]);
            verticesArray.add(vertices);
        } else if (lines[i].startsWith("vn ")) {
            float[] normals = new float[3];
            normals[0] = parseFloat(spaced[1]);
            normals[1] = parseFloat(spaced[2]);
            normals[2] = parseFloat(spaced[3]);
            normalsArray.add(normals);
        } else if (lines[i].startsWith("vt ")) {
            float[] texCoords = new float[2];
            texCoords[0] = parseFloat(spaced[1]);
            texCoords[1] = parseFloat(spaced[2]);
            texCoordsArray.add(texCoords);
        } else if (lines[i].startsWith("f ")) {
            int[] faceIndices = new int[3];
            int[] faceNormals = new int[3];
            int[] faceTextureCoords = new int[3];
            faceIndices[0] = parseInt(spaced[1].split("/")[0]);
            faceIndices[1] = parseInt(spaced[2].split("/")[0]);
            faceIndices[2] = parseInt(spaced[3].split("/")[0]);
            faceNormals[0] = parseInt(spaced[1].split("/")[2]);
            faceNormals[1] = parseInt(spaced[2].split("/")[2]);
            faceNormals[2] = parseInt(spaced[3].split("/")[2]);
            faceTextureCoords[0] = parseInt(spaced[1].split("/")[1]);
            faceTextureCoords[1] = parseInt(spaced[2].split("/")[1]);
            faceTextureCoords[2] = parseInt(spaced[3].split("/")[1]);
            faceArray.add(new ObjFace(faceIndices, faceNormals, faceTextureCoords));
        }
    }

虽然我不确定这是否可能是我的搅拌机出口的问题。

谢谢。

编辑:更新图片后,我做了纹理图像的宽度和高度的二次幂。

编辑2:我尝试了一个简单的方框,以确保不是模型搞砸了,并测试了面部剔除。在盒子上,剔除背面在一定程度上解决了这个问题,但在杯子上几乎没有什么不同。

编辑3:我添加了一段视频来演示我认为的问题所在。我认为三角形毛刺是由重叠的三角形引起的,比如手柄在实际的杯子前面。youtube vid

EN

回答 2

Stack Overflow用户

发布于 2014-08-31 08:49:35

这是“大小不是2的幂的纹理”问题的另一个例子吗?lwjgl将扩展你的纹理到2的幂大小,这意味着你的UV坐标是0 ... 1将是错误的,他们应该是0... 0.5783,因为其余的是lwjgl填充达到2的幂。

票数 1
EN

Stack Overflow用户

发布于 2014-08-31 22:01:18

IIRC,在GLES20中,三角形的法线由缠绕表示(按时钟或按逆时针)。我不确定如果你为每个顶点设置一个法线(这是为了照明)而不是为三角形设置一个法线,GL会理解什么。我不确定您是否可以为三角形设置一个,这意味着它将从顶点position+winding计算。让我觉得这是个问题的是,你所有的四边形都是半渲染的(两个三角形中有一个)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25586854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档