gpt4 book ai didi

java - OpenGL 纹理未正确映射

转载 作者:行者123 更新时间:2023-11-30 11:11:00 26 4
gpt4 key购买 nike

我正在修复以下项目:objLoader

它运行良好,加载了我找到的 OBJ。

但是,该项目缺少处理将纹理映射到对象的代码,所以我一直在添加它。

我现在可以加载我的 OBJ(一根香蕉),实际上我可以看到它上面的纹理!

但是,纹理没有正确映射。它看起来是平铺和扭曲的(见下文)

image

下面是我的代码:

TDModel.java

public void draw(GL10 gl) {
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); // bind texture

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

for(int i=0; i<parts.size(); i++){
TDModelPart t=parts.get(i);
Material m=t.getMaterial();
if(m!=null){
FloatBuffer a=m.getAmbientColorBuffer();
FloatBuffer d=m.getDiffuseColorBuffer();
FloatBuffer s=m.getSpecularColorBuffer();
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,a);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_SPECULAR,s);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,d);
}
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer());
gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

}

public void loadGLTexture(GL10 gl, Context context) {
// loading texture
InputStream is = null;
Bitmap bitmap = null;
try {
is = context.getAssets().open("banana.jpg");

bitmap = BitmapFactory.decodeStream(is);
} catch (IOException e) {
e.printStackTrace();
}

gl.glGenTextures(1, textures, 0);
// ...and bind it to our array
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

// create nearest filtered texture
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);

// Use Android GLUtils to specify a two-dimensional texture image from our bitmap
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

// Clean up
bitmap.recycle();
}

我的渲染器.java

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

model.loadGLTexture(gl, getContext()); // load texture

gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbientBuffer);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuseBuffer);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositionBuffer);
gl.glEnable(GL10.GL_LIGHT0);

gl.glEnable(GL10.GL_TEXTURE_2D); // Enable texture
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
}

知道为什么它没有正确包装吗?

这是纹理

enter image description here

最佳答案

真正的问题在于您的 OBJ 文件中的索引。

每个属性:pos、normal、texcoord 使用单独的索引。

因此,您的面孔指定应在其 3 个顶点中的每个顶点上分别为每个属性使用哪个索引。

您需要重新排列法线和纹理坐标,以便它们的索引与顶点位置索引匹配。

最简单的解决方案是分配新数组(未使用顶点数 = 3 * 面数进行索引)并手动填充它,从索引数据中查找属性。

然后您可以使用 DrawArrays(而不是 DrawElements)绘制它

int faces, vertices, normals, texcoords;
int indexes[faces][3][3]; // currently your indices [face][vertex][attrib_index]
float vertex[vertices][3]; // your vertex positions
float normal[normals][3]; // your normals
float texcoord[texcoords][3]; // your texcoords

您需要转换为:

int vertices = 3*faces;
float vertex2[vertices][3]; // your vertex positions
float normal2[vertices][3]; // your normals
float texcoord2[vertices][2]; // your texcoords

通过以下方式:

int v=0;
for (int f=0; f<faces; f++)
{

for (int fv=0; fv<3; fv++,v++)
{
vertex2[v][0] = vertex[ indexes[f][fv][0] ][0];
vertex2[v][1] = vertex[ indexes[f][fv][0] ][1];
vertex2[v][2] = vertex[ indexes[f][fv][0] ][2];

normal2[v][0] = normal[ indexes[f][fv][1] ][0];
normal2[v][1] = normal[ indexes[f][fv][1] ][1];
normal2[v][2] = normal[ indexes[f][fv][1] ][2];

texcoord2[v][0] = texcoord[ indexes[f][fv][2] ][0];
texcoord2[v][1] = texcoord[ indexes[f][fv][2] ][1];
}
}

关于java - OpenGL 纹理未正确映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27568695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com