2008-10-08 4 views
1

텍스처에서 특정 좌표의 색상을 가져와야합니다. 원시 png 데이터를 얻거나 보거나 생성 된 OpenGL 텍스처를 샘플링하여이 작업을 수행 할 수있는 두 가지 방법이 있습니다. 주어진 UV 또는 XY 좌표에서 컬러 (RGBA)를 얻기 위해 OpenGL 텍스처를 샘플링 할 수 있습니까? 그렇다면 어떻게?Open GL에서 텍스처 샘플링

답변

2

을, 옵션은

  1. 이 glGetTexImage를 (사용하여 전체 텍스처를 가져 오기) 및 관심있는 텍셀을 확인할 수 있습니다
  2. 립니다. 관심있는 텍셀 (예 : GL_POINTS 프리미티브 렌더링). 그런 다음 glReadPixels을 사용하여 프레임 버퍼에서 렌더링 한 픽셀을 가져옵니다.
  3. 텍스처 이미지의 복사본을 편리하게 유지하고 OpenGL을 빠져 나오십시오.

옵션 1과 2는 (픽셀 버퍼 개체를 사용하고 비동기 적으로 복사하여 다소 속도를 높일 수 있지만) 비효율적입니다. 당신이 (. 즉, 당신이 맥이나 아이폰에있어)를 GL_APPLE_client_storage 확장이있는 경우 그 먼 길로 승자 옵션 4의 : 그래서 지금까지 내가 가장 좋아하는 옵션 3.

편집이다.

+0

외부를 사용하여 pixeldata 편리합니다 (그러나 폐기물 메모리)

  • 그것을 수행의 사본을 보관, 당신은 texcoords에 기반한 샘플링을위한 방법이 필요합니다. 이것은 어려운 부분입니다. 이것은 제 대답에 설명되어 있습니다. –

  • +0

    필자는 포스터가 예제의 'getTexel'부분을 구현하는 방법을 묻는 것이지 필터링을 복제하는 방법이 아니라 (어떤 식 으로든 복제하려는 어떤 종류의 필터링에 의존하는지) 묻는 것이 었습니다. –

    +0

    필자는 일종의 getTexel 파트에 대해 질문했지만, 그는 1과 2가 너무 느리고 esp는 모바일 장치로 작업하고 있다고 생각합니다. 감사합니다. : – DavidG

    2

    가장 효율적인 방법은 텍스처 데이터에 액세스하는 것입니다. 어쨌든 텍스처로 만들려면 PNG를 디코딩하고 텍셀간에 직접 삽입해야합니다. texcoord가 [0,1]이라고 가정하면, texwidth u와 texheight를 v에 곱한 다음이를 사용하여 텍스처의 위치를 ​​찾습니다. 숫자가 정수이면 픽셀을 직접 사용하고 그렇지 않으면 int 부분을 사용하여 경계 픽셀을 찾고 소수 부분을 기반으로 픽셀 사이를 보간합니다.

    여기에 몇 가지 HLSL 형식의 의사 코드가 있습니다. 상당히 명확해야한다 : 내 머리 위로 떨어져

    float3 sample(float2 coord, texture tex) { 
        float x = tex.w * coord.x; // Get X coord in texture 
        int ix = (int) x; // Get X coord as whole number 
        float y = tex.h * coord.y; 
        int iy = (int) y; 
    
        float3 x1 = getTexel(ix, iy); // Get top-left pixel 
        float3 x2 = getTexel(ix+1, iy); // Get top-right pixel 
        float3 y1 = getTexel(ix, iy+1); // Get bottom-left pixel 
        float3 y2 = getTexel(ix+1, iy+1); // Get bottom-right pixel 
    
        float3 top = interpolate(x1, x2, frac(x)); // Interpolate between top two pixels based on the fractional part of the X coord 
        float3 bottom = interpolate(y1, y2, frac(x)); // Interpolate between bottom two pixels 
    
        return interpolate(top, bottom, frac(y)); // Interpolate between top and bottom based on fractional Y coord 
    } 
    
    0

    다른 사람들처럼 VRAM에서 텍스처를 다시 읽는 것은 매우 비효율적이며 퍼포먼스에 원격으로 관심이있는 경우 전염병처럼 피해야합니다. 지금까지

    두 가지 가능한 솔루션은 내가 알고 :

    1. 옵션 2의 쉐이더를