2013-07-25 1 views
0

XNA에서 코드를 작성하고 셰이더 모델 3에만 액세스 할 수 있으므로 비트 시프트 연산자가 필요하지 않습니다. 두 개의 8 비트 변수에 2 개의 랜덤 16 비트 부동 소수점 변수 (범위 [0,1]가 아닌 임의의 부동 소수점 변수)를 팩해야합니다. 그들을 정상화 할 방법이 없습니다.16 비트 부동 소수점 변수를 두 개의 8 비트 변수로 패킹 (반으로 2 바이트로)

수동으로 비트 시프트하는 방법을 생각했지만 임의의 10 진수 부동 소수점 형 [0,1]을 이진수로 변환하는 방법에 대한 좋은 기사를 찾을 수 없습니다. 감사합니다

답변

0

이것은 실제로 좋은 생각이 아닙니다. 16 비트 부동 소수점에는 이미 매우 제한된 범위와 정밀도가 있습니다. 8 비트는 단지 256 개의 가능한 값으로 남겨 둡니다!

셰이더에 8 비트 값을 가져 오는 것은 간단합니다. 색깔은 한 가지 방법입니다. 각 채널을 0에서 1까지의 정규화 된 범위로 사용할 수 있습니다.

물론 정상화하지 않으려는 경우가 있습니다. 그래서 더 정밀도가 0에 가까운 넓은 범위의 좋은 부동 소수점 속성을 유지하기를 원한다고 가정합니다.

(지금 floating-point에 대한 몇 가지 배경 정보를 읽을 수있는 좋은 시간이 될 것입니다. 특히 대한 half-precision floating-pointminifloatsand microfloats.) 당신의 가치는 logarithm and an exponent (인코딩 및 디코딩을 사용하여 인코딩하는 것이라고 할

한 가지 방법 , respectivly). 이것은 기본적으로 정확히 부동 소수점 형식 자체가하는 것입니다. 정확한 수학은 당신이 원하는 정밀도와 범위 (256 개의 값을 나타낼 것입니까?)에 달려 있습니다. 그래서 나는 이것을 운동으로 남겨 둘 것입니다.

+0

솔직히 말해서 나는 거의 나눗셈과 모듈로 (%) 만들었습니다. 상위 바이트는 값/256이고 하위 바이트는 값 % 256입니다. 디코딩은 단순히 High * 256 + Low입니다. 그것은 mah Excel 시트에서 작동하지만 프로그램에서 작동하지 않습니다 :). 나는 그것이 두 가지 중 하나라고 생각합니다 : a) 반값 대신 float으로 값을 얻고 b) 내 값이 음수가 될 수 있기 때문에 a) – cubrman

관련 문제