티스토리 뷰


Header 파일


1
static bool GetPixelData(UTexture2D* InTexture, FVector2D InUV, FColor& OutPixelData);
cs




CPP 파일


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
bool GetPixelData(UTexture2D* InTexture, FVector2D InUV, FColor& OutPixelData)
 
{
 
    FTexture2DMipMap* MyMipMap = &InTexture->PlatformData->Mips[0];
 
    if (MyMipMap != nullptr)
 
    {
 
        FByteBulkData* RawImageData = &MyMipMap->BulkData;
 
        if (RawImageData != nullptr)
 
        {
 
            FColor* FormatedImageData = static_cast<FColor*>(RawImageData->Lock(LOCK_READ_ONLY));
 
            uint32 TextureWidth = MyMipMap->SizeX, TextureHeight = MyMipMap->SizeY;
 
            uint8 PixelX = InUV.X * TextureWidth, PixelY = InUV.Y * TextureHeight;
 
 
 
            if (PixelX >= 0 && PixelX < TextureWidth && PixelY >= 0 && PixelY < TextureHeight)
 
            {
 
                OutPixelData = FormatedImageData[PixelY * TextureWidth + PixelX];
 
            }
 
            RawImageData->Unlock();
 
 
 
            return true;
 
        }
 
    }
 
    return false;
 
}
cs



위 함수를 사용하기 전에 몇가지 설정해야 할 것이 있는데,


1. 밉맵을 사용하지 않을 것. ( 사용한다면 level0 을 로드하여야 함)

2. 메모리 상에 올라와 있을때, 압축되지 않고 변조되지 않은 텍스쳐야한다. 

3. Compression Settings 에 RGBA8 지원하는 세팅( 예 : VectorDisplacementmap )

4. sRGB 를 꺼야 한다.(선형 색공간으로 저장된 텍스쳐 사용)

5. 사이즈가 512 이상인 경우 제대로 가져오지 못하는 문제( 확인 필요 )



터치 부위에 따른 재질 구분을 하기 위해서 방법을 찾다가 위 방법으로 해결하였는데 사실 언리얼에서 피직스메터리얼을 지원해주어서 표면 재질값을 가져와서 처리해 주어도 되지만 그리하면 메시의 분리(콜리더의 분리)가 필요하였다. 이미 진행된 프로젝트에서 그래픽 디자이너의 작업 비용이 크다보니 쉬운 방법을 찾다가 마스크맵(부위별로 다른 색상의 텍스쳐)을 하나 추가 한 후 충돌시 Find Collision UV 함수(스켈레탈 메시에서는 안됨)를 이용하여 충돌 위치의 UV값으로 텍스쳐의 픽샐값으로 무슨 재질인지 판단 하여 처리 하였다.




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함