基本的OpenGL ES纹理问题/ Android

时间:2010-06-29 18:01:52

标签: android opengl-es textures

我很难在我的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上运行它。

任何人都可以了解为什么我的纹理会出现乱码吗?

下面是我的index / vertex / normal / 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

1 个答案:

答案 0 :(得分:1)

好的,无视我的问题,我找到了问题。

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