3D 개체 위에 마우스로 그림을 그립니다.OpenGL에서 텍스처의 페인트 속도를 높이려면 어떻게해야합니까? (3.3 +/4.1)
in highp vec2 UV;
out vec4 fragColor;
void main()
{
fragColor.r = UV.x;
fragColor.g = UV.y;
}
내가 끄기 -에 그 렌더링 :
내가 지금 그것을하고 있어요 방법은 내가 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));
텍스처의 해상도에 따라이 프로세스가 매우 느립니다. 이 속도를 높이는 방법이 있습니까?
허, 나는 항상 GPU 쪽에서의 읽기가 매우 느린 것이라고 생각했습니다. 당신의 대답은 나의 것보다 훨씬 낫지 만, OpenGL 작업을 사용하여 (아이러니 한 아이러니) 생각하지 않았습니다. – BWG
@BWG : GPU와 CPU 간의 연결이 AGP의 비대칭 대역폭을 통과 할 때 속도가 느려지 곤했습니다. 오늘날 우리는> 10GiB/s의 대칭 대역폭을 가진 PCI-E 3을 가지고 있습니다. PBO와 잘 정렬 된 액세스를 사용하고 읽기 버퍼의 기본 픽셀 형식과 레이아웃을 선택하면 GPU가 비동기 DMA 전송을 수행 할 수 있습니다. 그러나 기술적으로 Shader Model 3 GPU에서 * 모든 것을 * 할 수 있습니다. 여기에는 브러시를 대상 텍스처에 놓는 것도 포함됩니다. 버텍스 쉐이더에서 지오메트리 버퍼 텍스처를 읽고 다시 읽은 UV 좌표에 따라 "브러시"그리드를 왜곡하여 그립니다. – datenwolf
죄송합니다. 기하학 버퍼 란 무엇입니까? Google 검색 결과 좋은 결과를 얻지 못했습니까? – BWG