gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:09:47 25 4
gpt4 key购买 nike

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

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

#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 时调用 native “创建”方法。它设置清晰的颜色,构建着色器并使用 glGenTextures 为我获取纹理 ID。 “调整大小”方法设置当前 View 大小。另一种方法是这样设置纹理数据:

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 自己的评论是正确的,我遇到了同样的问题,我使用 NDK 在 C++ 中使用 OpenGL ES 2.0 开发了一个 android 应用程序。加载纹理的函数原本在C++部分。出于某种原因,那没有用。只有在我将加载纹理代码移动到java部分之后,它才正常工作。 我在 java 部分加载纹理,正常绑定(bind)它,然后将纹理 ID 传递给 C++ JNI 代码。我不知道为什么会出现这样的问题。我可以提供 a link ,其中有一个使用 OpenGL ES 1.0 和 NDK 显示立方体的示例。虽然是中文,但是代码可以自己解释。请注意纹理是如何生成的,纹理id是如何在Java和C++之间传递的。

关于android - 未使用 OpenGL ES 2.0 和 Android NDK 绘制纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21170495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com