纹理不是使用OpenGL ES 2.0和Android NDK绘制的

时间:2014-01-16 18:58:20

标签: android opengl-es android-ndk textures opengl-es-2.0

我想使用Android NDK在OpenGL ES 2.0的四边形上显示图像作为纹理。

我有以下简单的顶点和片段着色器:

#define DISP_SHADER_V_SRC "\
attribute vec4 aPos;\
attribute vec2 aTexCoord;\
varying vec2 vTexCoord;\
void main() {\
    gl_Position = aPos;\
    vTexCoord = aTexCoord;\
 }"

#define DISP_SHADER_F_SRC "\
precision mediump float;\n\
varying vec2 vTexCoord;\n\
uniform sampler2D sTexture;\n\
void main() {\n\
    gl_FragColor = texture2D(sTexture, vTexCoord);\n\
}"

起初,本地人"创造"创建GLSurfaceView时调用方法。它设置了清晰的颜色,构建着色器并使用glGenTextures获取纹理ID。 A"调整大小"方法设置当前视图大小。另一种方法设置纹理数据如下:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

我不相信那里有什么不对劲。重要的是" draw"方法。在glClear,glViewport和glUseProgram之后我执行以下操作:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texId);

glEnableVertexAttribArray(shAPos);
glVertexAttribPointer(shAPos, 3, GL_FLOAT, false, 0, quadVertices);

glVertexAttribPointer(shATexCoord, 2, GL_FLOAT, false, 0, quadTexCoordsStd);
glEnableVertexAttribArray(shATexCoord);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
// now glDisableVertex...

我可以确认着色器基本上有效,因为gl_FragColor=vec4(1.0);会导致白屏。加载纹理时它不起作用。我尝试将像素数据设置为"所有白色"使用memset只是为了确认问题与我的图片数据无关,但屏幕仍保持黑色。我错过了什么?

1 个答案:

答案 0 :(得分:1)

IsaacKleiner自己的评论是正确的,我遇到了同样的问题,我用C ++开发了一个使用NDK的OpenGL ES 2.0的Android应用程序。加载纹理的功能最初是在C ++部分。出于某种原因,这不起作用。只有在我将加载纹理代码移动到java部分之后,才能正常工作。 我在java部分加载纹理,正常绑定它,然后将纹理ID传递给C ++ JNI代码。我不知道为什么会出现这样的问题。我可以提供a link,其中有一个使用OpenGL ES 1.0和NDK来显示多维数据集的示例。虽然它是中文的,但代码可以解释自己。请注意纹理的生成方式以及如何在Java和C ++之间传递纹理ID。