2016-10-09 5 views
1

texture1을 texture2에 복사하려고합니다.Android 용 OpenGL ES에서 하나의 텍스처를 다른 텍스처에 효율적으로 할당하는 방법

int[] textures = new int[15]; 
GLES20.glGenTextures(15, textures, 0); 
GlUtil.checkGlError("glGenTextures"); 

for(int i=0;i<15;i++) 
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[i]); 

그때 난 항상을 위해 textures[1]에 내가 textures[0]의 질감을 복사하려면, textures[0]에 카메라 미리보기를 전송 : 배경은 내가 15 빈 텍스처 ID를 생성하고 GLES11Ext.GL_TEXTURE_EXTERNAL_OES에 결합한다는 것입니다, 다음은 내 코드입니다 timestamp 1의 프레임 내용을 유지하고 textures[0]에서 textures[2]까지 텍스쳐를 복사하여 타임 스탬프 2의 프레임 내용을 유지하십시오 ... GPU에서 일부 텍스처 데이터를 버퍼링하고 미래에 그 중 일부를 렌더링하는 것처럼 보입니다. 그래서 나는 이것을 어떻게해서든지 알고 싶다. 그리고 textures[2]=textures[0]을 사용하여 텍스처 데이터를 복사 할 수 있습니까?

답변

1

ES 2.0에서 텍스처 데이터를 복사하는 직접적인 방법은 없습니다. 가장 쉬운 방법은 아마도 glCopyTexImage2D()을 사용하는 것입니다. 이를 사용하려면 FBO를 만들고 소스 텍스처를 첨부해야합니다. ,

말했다되고 그건
GLuint fboId = 0; 
glGenFramebuffers(1, &fboId); 
glBindFramebuffer(GL_FRAMEBUFFER, fboId); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexId, 0); 

glBindTexture(GL_TEXTURE_2D, dstTexId); 
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, width, height, 0); 

, 당신의 묘사에서, 나는 이것이 당신이 일을해야 정말 무엇이라고 생각하지 않습니다 srcTexId 대상 질감의 ID dstTexId 소스 텍스처의 ID이며, 말해봐 다음과 같은 이유 때문입니다.

  • 위와 같이 텍스처 데이터를 복사하면 사용중인 외부 텍스처에 사용할 수 없습니다.
  • 텍스처 데이터를 복사하는 것은 항상 비용이 많이 들고 문제를 해결하는 데 완전히 불필요하게 들립니다.

가장 최근의 카메라 이미지 15 개를 유지하려는 것 같습니다. 이렇게하려면 가장 최근 이미지가 포함 된 15 개의 텍스처를 추적하고 15 개의 텍스처 ID 목록을 순환 버퍼로 처리하면됩니다.

말은 처음에 당신은 당신의 질감 ID를 만들 :

int[] textures = new int[15]; 
GLES20.glGenTextures(15, textures, 0); 
int newestIdx = 0; 

그런 다음 새 프레임을받을 때마다, 당신은 15 주변에 포장, 텍스처 ID의 목록에있는 다음 항목에 기록 :

:
newestIdx = (newestIdx + 1) % 15; 
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[newestIdx]); 
// Capture new frame into currently bound texture. 

그런 다음, 때마다 당신이 등 그 전에 프레임에, 가장 최근에 1을 참조하여 0과 함께 i 번째 프레임을 사용하려면, 당신은 그것을 결합

텍스처가 복사되지 않습니다. 어떤 텍스처에 어떤 프레임이 들어 있는지 추적하고 그에 따라 액세스합니다.

+0

안녕하세요, 귀하의 제안에 감사합니다! – user6943953

+0

나는 당신의 제안에 따라 다른 문제가 발생, 나는 다음 답변에 넣어, 좀 봐 주실 래요? 고마워요! – user6943953

0

귀하의 제안에 감사드립니다. 나는 모든 것이 잘 작동, 나는 위의 코드를하려고 할 때이

newestIdx = (newestIdx + 1) % 80; 

mSurfaceTexture.attachToGLContext(mMultipleTextureId[newestIdx]); 

mSurfaceTexture.updateTexImage(); 

GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mMultipleTextureId[newestIdx]); 

drawFrame(mMultipleTextureId[newestIdx]);// here we draw the corresponding texture 

mSurfaceTexture.detachFromGLContext(); 

mDisplaySurface.swapBuffers(); 

같은 코드를 변경하려고하지만

if (newestIdx>60&&newestIdx<79) { 
    drawFrame(mMultipleTextureId[newestIdx-2]) 
    } 

를 실행하려고하면 나는 대응의 질감을 볼 수 없습니다 찾을 수 텍스처 ID. 텍스쳐가 GPU에 저장되지 않는 것처럼 보입니다. 그리고 texture ID를 프레임에 연결하고 attachToGLContext를 사용하여 프레임을 다른 텍스처 ID에 연결하는 데 스타일 "cameraPreview-surfaceTexture-Textureid"를 사용해야합니다. 하지만 GPU에 오래된 프레임을 저장하는 데는 효과가 없습니다.

무엇이 문제입니까?

게다가, 카메라 원시 데이터로부터 텍스처를 얻을 수 있기 때문에, 내가 GLES20.GL_TEXTURE_2D을 사용할 수 없습니다, 텍스처 타입 그러므로, 나는 다음과 같은 코드

것을 얻을

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexId, 0); 

glBindTexture(GL_TEXTURE_2D, dstTexId); 
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, width, height, 0); 
를 사용하지 않을 수 GLES11Ext.GL_TEXTURE_EXTERNAL_OES처럼 붙박이 : (