[EDIT1]
在我的Android应用程序中,我只在我自己的GLSurfaceView.Renderer中使用了本机(C ++)GL函数。我使用了原生GL函数,glUniform4f()/ glEnableVertexAttribArray()/ glBindBuffer()...就像我发布的第二个代码块一样,在SCRendere类的本机函数中
现在,我需要在GLSurfaceView.Renderer中使用(本机)GL函数。
这是GLSurfaceView.Renderer的java代码
class SCRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
nativeInit();
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
nativeResize(w, h);
}
public void onDrawFrame(GL10 gl) {
nativeRender(mSurfaceViewID);
}
private static native void nativeInit();
private static native void nativeResize(int w, int h);
private static native void nativeRender(int rendererID);
public int mSurfaceViewID;
}
这是本机GL函数的用例,没有任何问题
JNIEXPORT void
Java_com_samsung_smartcampus_SCRenderer_nativeRender(JNIEnv* env, jobject thiz, jint surfaceViewID )
{
appRender(sWindowWidth, sWindowHeight, surfaceViewID);
}
void appRender(int width, int height, int rendererID)
{
....
for (int iIdx = 0; iIdx < pRENDER_PARAMS[0].numObjects; ++iIdx) {
glUniform4f(colorLoc,
pMeshContext[iIdx].vColor.x,
pMeshContext[iIdx].vColor.y,
pMeshContext[iIdx].vColor.z,
1.0f);
glEnableVertexAttribArray((GLuint)positionLoc);
glBindBuffer(GL_ARRAY_BUFFER, pMeshContext[iIdx].vertexID);
glVertexAttribPointer((GLuint)positionLoc, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 0);
glEnableVertexAttribArray((GLuint)normalLoc);
glBindBuffer(GL_ARRAY_BUFFER, pMeshContext[iIdx].normalID);
glVertexAttribPointer((GLuint)normalLoc, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 0);
glDrawArrays(GL_TRIANGLES, 0 , (GLsizei)pMeshContext[iIdx].numVertices);
glDisableVertexAttribArray((GLuint)positionLoc);
glDisableVertexAttribArray((GLuint)normalLoc);
}
....
我想要实现的是当我在java中的其他类中打开文件时,我需要在类中使用本机GL。目前我卡住了,因为我认为其他类(文件打开类)可能没有GL上下文。
这是打开java类的文件。
class FileLoader{
...
private void loadSTL(String paths){
nativeloadSTL(paths);
}
...
private static native void nativeloadSTL(String paths);
...
}
这是本机C ++部分。
void SCFileLoader::loadSTL(const char* path){
...
loader->changeFileSTLtoMeshData(iCnt);
glGenBuffers(1, &pMeshContext[iCnt].vertexID);
glGenBuffers(1, &pMeshContext[iCnt].normalID);
glBindBuffer(GL_ARRAY_BUFFER, pMeshContext[iCnt].vertexID);
glBufferData(GL_ARRAY_BUFFER, pMeshContext[iCnt].numVertices*3*sizeof(GLfloat),
pMeshContext[iCnt].vertexCoords, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, pMeshContext[iCnt].normalID);
glBufferData(GL_ARRAY_BUFFER, pMeshContext[iCnt].numVertices*3*sizeof(GLfloat),
pMeshContext[iCnt].vertexNormals, GL_STATIC_DRAW);
...
}
正如我在代码块上方所做的那样,GL函数不起作用。我想这是因为没有GL上下文。
有没有解决方法可以解决这个问题?