2017-02-26 7 views
0

픽셀 쉐이더의 기능처럼 깊이 스텐실을 구현하려고합니다. HLSL에서 float를 unorm으로 변환

나는 정규화 된 깊이 값을 가지고 있고, 그래서처럼 SM5 InterlockedMin() 작업을 사용하기 위해 정수로 변환 할 : dnorm는 깊이 값이다

uint d_uint = (uint)(dnorm * 4294967295); 
uint d_uint_original = 0; 

InterlockedMin(depthmask[c], d_uint, d_uint_original); 

if (d_uint < d_uint_original) { //if true, we will have written a new depth into the mask, so write the element to the field 
    field[c].x = d; 
    field[c].yzw = i.n; 
} 

. 내가 RenderDoc에서 버퍼를 확인하고 쉐이더 만 나는 또한, 상수를 줄일 수 229,496,729 말을하고는 것이다 0을 기록 볼 수 있기 때문에

그러나, uint d_uint = (uint)(dnorm * 4294967295);은 오직 내가 이것을 알고 0

에 evaulates 올바르게 쓰십시오. 그러나 2294967295로 설정하면 그렇지 않습니다.

나는 부동 소수점 양자화 문제를 극복하려고 노력하고 있지만 어떻게해야할지 모르겠다.

정수 배열에서 정규화 된 값을 인코딩하는 올바른 방법은 무엇입니까?

DX의 UNORM/SNORM에 대해 알고 있는데, 어쩌면 중단이 필요하지만 그 문서에서 어떻게 사용해야하는지, 특히 연동 기능과 함께 사용하려면 UINT로 변환해야합니다. 귀하의 경우에는

답변

0

, 나는 그 dnorm> 0을 가정하기 때문에 긍정적 인 부동 소수점 숫자, 이진 표현은 비교 연산자를 만족하기 때문에, 당신은 또한 단순히

uint depthAsUint = asuint(dnorm); 

를 사용할 수 있습니다. 예 :

asuint(0.1f) < asuint(0.5f) = true