2014-10-06 1 views
2

3D 개체 위에 마우스로 그림을 그립니다.OpenGL에서 텍스처의 페인트 속도를 높이려면 어떻게해야합니까? (3.3 +/4.1)

in highp vec2 UV; 
out vec4 fragColor; 
void main() 
{ 
    fragColor.r = UV.x; 
    fragColor.g = UV.y; 
} 

내가 끄기 -에 그 렌더링 :

Teapot with stack overflow written on it

내가 지금 그것을하고 있어요 방법은 내가 UV가 같은 RG 픽셀에 조각 쉐이더를 통해 좌표 팩이다 화면 FBO를 누른 다음 마우스 아래에있는 readPixel을 사용하여 CPU 측에서 UV 좌표를 가져옵니다.

float pixel_array[4]; 

CALL_GL(glReadBuffer(GL_COLOR_ATTACHMENT0)); 
CALL_GL(glReadPixels(normMouseX*WINDOW_WIDTH,normMouseY*WINDOW_HEIGHT,1,1,GL_RGBA,GL_FLOAT,pixel_array)); 

float u = pixel_array[0]; 
float v = pixel_array[1]; 

그런 다음 UV 좌표를 사용하여 올바른 위치에서 텍스처를 "페인트"합니다.

CALL_GL(glBindTexture(GL_TEXTURE_2D, mesh.diffuseTexture)); 
CALL_GL(glTexSubImage2D(GL_TEXTURE_2D, 
     0, 
     u*diffuseTextureWidth, 
     v*diffuseTextureHeight, 
     5, 
     5, 
     GL_RGBA, 
     GL_UNSIGNED_BYTE, 
     brush_pixels)); 

텍스처의 해상도에 따라이 프로세스가 매우 느립니다. 이 속도를 높이는 방법이 있습니까?

답변

4

나는 그들을 오프 스크린 FBO로 렌더링 한 다음 마우스로 readPixel을 렌더링하여 CPU 측에서 UV 좌표를 얻습니다.

정말로 필요할 때만 해당 텍스처의 리드 백을 확인하십시오. 또한 리드 백을 터뜨려보십시오. 단일 픽셀을 읽는 것은 매우 비효율적입니다. 뷰를 변경 한 후에는 전체 텍스처를 한 번 읽는 것이 효율적입니다.

glTexSubImage2D 대신 텍스처에 그리기 속도를 높이려면 FBO에 색상으로 첨부하고 일반 OpenGL 그리기 작업을 사용하여 그리기 만하면됩니다.

+0

허, 나는 항상 GPU 쪽에서의 읽기가 매우 느린 것이라고 생각했습니다. 당신의 대답은 나의 것보다 훨씬 낫지 만, OpenGL 작업을 사용하여 (아이러니 한 아이러니) 생각하지 않았습니다. – BWG

+1

@BWG : GPU와 CPU 간의 연결이 AGP의 비대칭 대역폭을 통과 할 때 속도가 느려지 곤했습니다. 오늘날 우리는> 10GiB/s의 대칭 대역폭을 가진 PCI-E 3을 가지고 있습니다. PBO와 잘 정렬 된 액세스를 사용하고 읽기 버퍼의 기본 픽셀 형식과 레이아웃을 선택하면 GPU가 비동기 DMA 전송을 수행 할 수 있습니다. 그러나 기술적으로 Shader Model 3 GPU에서 * 모든 것을 * 할 수 있습니다. 여기에는 브러시를 대상 텍스처에 놓는 것도 포함됩니다. 버텍스 쉐이더에서 지오메트리 버퍼 텍스처를 읽고 다시 읽은 UV 좌표에 따라 "브러시"그리드를 왜곡하여 그립니다. – datenwolf

+0

죄송합니다. 기하학 버퍼 란 무엇입니까? Google 검색 결과 좋은 결과를 얻지 못했습니까? – BWG

관련 문제