2009-12-19 3 views
1

성능 문제로 인해 Java에서 내 안드로이드 OpenGL 코드를 C로 전송해야했습니다. OpenGL 코드를 모두 전송했다고 생각하지만 지금은 내 섹션의 많은 오류가 있습니다. 비트 맵을 텍스처로 화면에 그려주는 코드.Android NDK에서 OpenGL ES 드로잉 문제

에뮬레이터에서 프로젝트를 실행할 때 현재 코드가 아무 것도 표시하지 않고 천천히 모든 메모리를 차지하고 다른 응용 프로그램을 강제 종료하기 때문에 메모리 누수가있는 것으로 보입니다. 헤더 파일에서

:는 C 파일에서

extern unsigned char colors[1024*512*3]; // 3 bytes per pixel 

: 어떤 도움을 크게 감상 할 수

void appRender(int width, int height, unsigned char colors) 
{ 
    unsigned int textureID; 
    float vertices[] = 
    { 
     0.0f, 0.0f, 
     512.0f, 0.0f, 
     0.0f, 1024.0f, 
     512.0f, 1024.0f 
    }; 

    float texture[] = 
    { 
     0.0f, 0.0f, 
     1.0f, 0.0f, 
     0.0f, 1.0f, 
     1.0f, 1.0f 
    }; 

    unsigned char indices[] = 
    { 
     0, 1, 3, 
     0, 3, 2 
    }; 

    UpdateView(); 


    //onDraw 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glOrthof(0.0f, 320.0f, 430.0f, 0.0f, 1.0f, -1.0f); 

    //texture stuff 
    glGenTextures(1,&textureID); 
    glBindTexture(GL_TEXTURE_2D, textureID); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    //Different possible texture parameters, e.g 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 1024, 0, GL_RGB ,GL_UNSIGNED_BYTE, colors); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glVertexPointer(2, GL_FLOAT, 0, vertices); 
    glTexCoordPointer(2, GL_FLOAT, 0, texture); 

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
} 

여기

는이 부분을 제어하는 ​​코드입니다.

+0

할 수 그릴 때 주셔서 감사합니다 예! – torger

+0

@ 그 코드는 실제로 어떤 것도 표시하지 않습니다. 어떤 식 으로든 손상되었습니다. 나는 그것을 고정시키는 방법을 잊어 버린다. "thelements"에 대한 구글 코드 페이지를 살펴볼 수있다. 우리는 꽤 간단한 드로잉을 그곳에서한다. – RyanCheu

+0

나는 그것을 작동하게했다 haha ​​- 나도 그것을했다 어떻게하지 않는다 :) - 말해야한다 - 그 하얀 정방형을 처음 보는 것보다 기분이 없다 – torger

답변

3

예제에서 질감을 사용하려면 glEnable(GL_TEXTURE_2D)에 대한 호출이없는 것 같습니다.

glGetError()으로 전화하여 수행중인 작업이 잘못된 것인지 확인할 수 있습니다. 이것은 내가 과거에 문제를 디버깅하는 데 도움이되었습니다.

또한 appRender() 메소드에서 텍스처를 생성하는 것처럼 보입니다. 이것을 프레임마다 호출하면 반복적으로 동일한 텍스처를 재생하므로 메모리 누수의 원인이 될 수 있습니다.

일반적으로 초기화하는 동안 텍스처를 생성하고 정의해야합니다.

그래서 다음을 렌더링하기 전에 한 번 수행해야합니다. 이상 2 시간 동안 화면에 뭔가를 얻으려고 내 머리를 찢어하고 - - 그럼

glGenTextures(1,&textureID); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

//Different possible texture parameters, e.g 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 1024, 0, GL_RGB ,GL_UNSIGNED_BYTE, colors); 

당신은 내가 :) 지금 너무 많은 당신을 사랑

glEnable(GL_TEXTURE_2D) 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glBindTexture(GL_TEXTURE_2D, textureID); 

glVertexPointer(2, GL_FLOAT, 0, vertices); 
glTexCoordPointer(2, GL_FLOAT, 0, texture); 

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D) 
+0

나는 그것을 시험해 보았다. 그리고 그것은 나의 기억 누출을 제거했다 , 그러나 나는 여전히 그릴 것이 아무것도 없다. 화면에 아무 것도 나타나지 않습니다. – RyanCheu

+0

편집 : 초기화를 실행할 때마다 물건을 볼 수있었습니다. 내가 두 번째 부분의 첫 번째 부분에서 뭔가를 놓친 것 같은데? – RyanCheu

관련 문제