未使用 OpenGL ES 2.0 和 Android NDK 绘制纹理



我想使用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时调用本机"create"方法。它设置了清晰的颜色,构建了着色器,并使用glGenTextures为我提供了纹理 ID。"调整大小"方法设置当前视图大小。另一种方法设置纹理数据,如下所示:

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

我不相信那里有什么问题。重要的应该是"绘制"方法。在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将像素数据设置为"全白",只是为了确认问题与我的图像数据无关,但屏幕仍然保持黑色。我错过了什么?

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

最新更新