我正在使用OpenGL ES 3.0并使用Eclipse NDK通过Google Nexus呈现卷数据。 我正在使用AssetManager将体积数据加载到真实设备,这是一个16 MB的原始文件,但它无法正常工作。我将资源存储在Asset文件夹中,但是我仍然在logcat __load_uniform_float中收到相同的错误:802>:GL_INVALID_OPERATION 我尝试了谷歌的一些相关示例,但找不到任何。
这是我的代码:
int LoadVolume()
{
GLubyte *pdata;
const unsigned int BUFFER_SIZE = XDIM*YDIM*ZDIM;
GLubyte buffer[BUFFER_SIZE];
AAssetManager*mgr;
AAsset* asset=AAssetManager_open(mgr,"Engine256.raw",AASSET_MODE_BUFFER);
if(!asset)
{
__android_log_print(ANDROID_LOG_ERROR, "TAG", "_ASSET_NOT_FOUND_");
return 0;
}
pdata=(GLubyte*)AAsset_read(asset,buffer,BUFFER_SIZE);
AAsset_close(asset);
glGenTextures ( 1,&textureId );
glBindTexture ( GL_TEXTURE_3D,textureId );
glTexImage3D ( GL_TEXTURE_3D, 0, GL_RED,XDIM, YDIM, ZDIM, 0,
GL_RED, GL_UNSIGNED_BYTE,pdata);
glTexParameteri ( GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri ( GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri ( GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_3D, GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glBindTexture ( GL_TEXTURE_3D, 0 );
return 1;
}
答案 0 :(得分:4)
如果你看这两行:
AAssetManager*mgr;
AAsset* asset=AAssetManager_open(mgr,"Engine256.raw",AASSET_MODE_BUFFER);
您将mgr
声明为指针变量,但您没有为其指定值。然后你在下一行使用它,而它是未初始化的。
您需要通过JNI接口将Java代码中的AssetManager
对象传递给本机代码,然后使用此调用获取AAssetManager
,其中assetManager
是Java传入的对象,它作为jobject
类型参数进入本机代码。
AAssetManager *mgr = AAssetManager_fromJava(env, assetManager);
这个问题/答案更详细地展示了如何将Java对象传递给本机代码: Can't access AAssetManager in native code passed from Java in WallpaperService