android - 基本的OpenGL ES纹理问题/Android

标签 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 之上运行它。

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

下面是我的索引/顶点/法线/纹理坐标数据。我已经看过十几次了,但也许我错过了什么。

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

最佳答案

好的,请忽略我的问题,我发现了问题所在。

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

关于android - 基本的OpenGL ES纹理问题/Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3143440/

相关文章:

Android auto 应用程序未在物理设备中显示(未在 Android Auto 应用程序列表中列出),但在 DHU 中运行良好

android - 在android opengl es中检测面向相机的立方体的一侧

java - 带有 openGL 1.0 的 Poser Mesh,50% 的三角形似乎丢失

javascript - WebGL中GLMAT_ARRAY_TYPE()的作用是什么?

尝试呈现 SDL_Texture : Invalid texture 时出现 C++ SDL2 错误

android - 仅针对文件接收 FileObserver CREATE 或 DELETE

android - eclipse 未检测到它一天前检测到的设备

android - Intent 在我的 RecyclerView 中不起作用

c# - 对 NPOT 纹理使用 OpenGL GL.TexSubImage2D 会导致伪影

c++ - 将 Freetype 字形渲染到 OpenGL (3.3+) 纹理会导致重复纹理和伪影