【问题标题】:Basic OpenGL ES Texture problem / Android基本 OpenGL ES 纹理问题 / Android
【发布时间】:2010-06-29 18:01:51
【问题描述】:

我很难让基本纹理在我的 Droid (2.1-update1) 上的 OpenGL ES 应用程序中工作。我试图渲染一个简单的纹理四边形 - 四个顶点,两个面,具有法线和纹理坐标。渲染时,纹理乱码,充满静态,类似于电视噪点。

这是一张显示原始纹理贴图图像的图片,然后是我的渲染纹理四边形机器人的屏幕截图:http://img686.imageshack.us/img686/6342/texturedquad.png

基本颜色已经存在,但显然没有正确读取或应用纹理。

我的纹理加载顺序很简单:

int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
Bitmap bmp = BitmapFactory.decodeResource(cx.getResources(), R.drawable.img);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);

我尝试在纹理加载时为 glTexParameterf 设置各种参数,但无济于事:

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_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

我的渲染顺序也很简单:

(设置)

gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glDisable(GL10.GL_DITHER);
gl.glDisable(GL10.GL_FOG);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glDisable(GL10.GL_COLOR_MATERIAL);
gl.glShadeModel(GL10.GL_SMOOTH);

(渲染)

gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertices);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, textureCoords);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);
gl.glDrawElements(GL10.GL_TRIANGLES, numIndices, GL10.GL_UNSIGNED_SHORT, indices);

...

我尝试了各种纹理图像文件格式,大小均为 ^2,位于 drawable-nodpi 文件夹下。 PNG、BMP、GIF、JPEG 都给了我相同的结果。我也尝试过 8 位和 16 位颜色深度。我使用默认的 EGL 配置在 GLSurfaceView 之上运行它。

谁能解释为什么我的纹理会出现乱码?

下面是我的索引/顶点/法线/texcoord 数据。我已经经历了十几次,但也许我错过了一些东西。

Adding vertex (vIndex 1) Vector3F(77.0492, 0.0, 0)
Adding vertex (vIndex 2) Vector3F(478.1715, 0.0, 0)
Adding vertex (vIndex 3) Vector3F(478.1715, 227.0969, 0)
Adding vertex (vIndex 4) Vector3F(77.0492, 227.0969, 0)
Adding normal Vector3F(0.0, 0.0, 1.0)
Adding normal Vector3F(0.0, 0.0, 1.0)
Adding normal Vector3F(0.0, 0.0, 1.0)
Adding normal Vector3F(0.0, 0.0, 1.0)
Adding textureCoords Vector3F(0.0, 0.0)
Adding textureCoords Vector3F(1.0, 0.0)
Adding textureCoords Vector3F(1.0, 1.0)
Adding textureCoords Vector3F(0.0, 1.0)
Adding face indexes 1,2,3
Adding face indexes 3,4,1

【问题讨论】:

  • 模拟器能用吗?

标签: android opengl-es textures


【解决方案1】:

好吧,忽略我的问题,我发现了问题。

原来我的纹理坐标被存储为 32 位无符号整数,我将 GL_SHORT 传递给 glTexCoordPointer 调用(我需要使用 GL_FIXED)。这解释了您可以在渲染结果中看到的随机静态纹理映射。

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多