최근 작업 중 짱나는 부분이 있어 여러분께 조언을 좀 여쭙고자 글을 씁니다.
64bit unsigned 랜더 타겟에 두 개의 값(디퓨즈,일루미네이션)을 끼워넣는 시도를 하였습니다.
각 채널 당 unsigned 16bit이므로 각각 8비트씩 할당하여 한 채널에 두 개의 값을 저장하는 것입니다.
Write 부의 절차는 대강 이러합니다:
1. 디퓨즈, 일루미네이션 각각의 0~1의 float값에 255를 곱하여 0~255의 int로 변환
2. 1의 디퓨즈에 256을 곱하여 8bit shift 효과(DX9의 PS에서 bit shift 연산 사용 불가)
3. 2의 쉬프트된 값과 1의 일루미네이션 값을 더함(앞8bit:디퓨즈 뒤8bit:일루미네이션)
4. 3의 값을 25535로 나누어 타겟으로 출력
Read 부의 절차는 대강 이러합니다:
1. 읽은 0~1의 float값에 25535를 곱하여 int로 변환
2. 1의 값을 256으로 나누어 8bit 쉬프트 효과
3. 디퓨즈 값 = 2의 값 / 255
4. 2의 값에 256을 곱하여 앞8bit:디퓨즈 뒤8bit:0 으로 만듦
5. 일루미네이션 값 = (1의 값 - 4의 값) / 255
일단은 의도대로 성공 했습니다...만, 지포스 7600에서는 비 정상 작동하더군요.
다른 카드도 더 검증을 해봐야겠습니다.
왜 어떤 VGA는 되고 어떤 VGA는 안되고 그러는지 답답하더군요. 제일 중요한 문제는 이 방법이 정상 작동 하는지의 판단 기준을 어떡해야 할지를 모르겠다는겁니다.(원인 파악이 되면 자연스레 해결 될 수도 있겠지만요::) 어떤 기능의 지원 여부에 따른 것이라면 쿼리를 날리던 캡스를 뒤지던 할 텐데...
혹시 의심가는 부분이라던가 비슷한 문제 사례가 있으시면 한모금 던져주시면 로또맞으실겁니다 ㅎㅎ
64bit unsigned 랜더 타겟에 두 개의 값(디퓨즈,일루미네이션)을 끼워넣는 시도를 하였습니다.
각 채널 당 unsigned 16bit이므로 각각 8비트씩 할당하여 한 채널에 두 개의 값을 저장하는 것입니다.
Write 부의 절차는 대강 이러합니다:
1. 디퓨즈, 일루미네이션 각각의 0~1의 float값에 255를 곱하여 0~255의 int로 변환
2. 1의 디퓨즈에 256을 곱하여 8bit shift 효과(DX9의 PS에서 bit shift 연산 사용 불가)
3. 2의 쉬프트된 값과 1의 일루미네이션 값을 더함(앞8bit:디퓨즈 뒤8bit:일루미네이션)
4. 3의 값을 25535로 나누어 타겟으로 출력
Read 부의 절차는 대강 이러합니다:
1. 읽은 0~1의 float값에 25535를 곱하여 int로 변환
2. 1의 값을 256으로 나누어 8bit 쉬프트 효과
3. 디퓨즈 값 = 2의 값 / 255
4. 2의 값에 256을 곱하여 앞8bit:디퓨즈 뒤8bit:0 으로 만듦
5. 일루미네이션 값 = (1의 값 - 4의 값) / 255
일단은 의도대로 성공 했습니다...만, 지포스 7600에서는 비 정상 작동하더군요.
다른 카드도 더 검증을 해봐야겠습니다.
왜 어떤 VGA는 되고 어떤 VGA는 안되고 그러는지 답답하더군요. 제일 중요한 문제는 이 방법이 정상 작동 하는지의 판단 기준을 어떡해야 할지를 모르겠다는겁니다.(원인 파악이 되면 자연스레 해결 될 수도 있겠지만요::) 어떤 기능의 지원 여부에 따른 것이라면 쿼리를 날리던 캡스를 뒤지던 할 텐데...
혹시 의심가는 부분이라던가 비슷한 문제 사례가 있으시면 한모금 던져주시면 로또맞으실겁니다 ㅎㅎ
덧글
직접적인 ( / 25535 ), ( * 255 ) 요런식으로 하는게 아니라. ceil(), floor(), 요런건로 써서 해보세요.
기억이 맞다면 될거같아요..ㅡ_ㅡ;;;
근데 frac() 요건 그래픽카드마다 결과값이 달라서..영...amd에 문의 해도 대답없고;;;
그리고...64 unsigned int 이거 느리지않던가요??
올림, 내림이 무슨 연관이 있는 것인지 ㅠㅠ
ATi나 NVIDIA에 문의 메일은 의미가 없어요ㅋ 절대 대답 안해줌 ㅋ
개발 가이드 문서의 틀린 내용도 바로 바로 수정 안하는 녀석들인데요 뭐 ㅋ
uint 64bit은 아직 속도 체크는 아직 안해봤는데, RT를 낭비하지 않으려면 선택의 여지가 없어서요 ㅎㅎ
렌더타겟줄이실라고 그런거죠?
제가 방금 테스트해봤는데, amd계열은 속도가 훌륭하고, nvidia계열은 암울하네요...어흑
" there is no native integer math on GPUs before SM4.0"
이 문장을 제대로 보질 못했었네요 ㅎ 이 문장 대로 제대로 처리를 못해서 7600에서는 결과가 이상하게 나오나봅니다.
아래에 링크된 글들을 보면 흐름과 컨셉은 알겠는데, 왜 frac()이 비트 쉬프트의 의미를 가지게 되는지 이해는 안가더라구요. 소수부의 숫자들이 어떻게 bitwise의 효과를 가지게 되는 건가요ㅜㅜ?
nvidia 계열은 어떤 모델로 테스트해보신건지요? 저는 PF64랑 UINT64랑 별 속도 차이는 없어보이던데''
아직 7600에서는 정상적으로 돌지 않아 비교를 안해봤고 8600이상에서 비교해봤습니다.
{
vecEncode = floor( float2( vecEncode.x * 255.0f, vecEncode.y * 255.0f ) );
float fResult = floor( floor( vecEncode.x * 255.0f ) + vecEncode.y ) / 65535.0f;
return fResult;
}
float2 Float2Decode( float fDecode )
{
fDecode = floor( fDecode * 65535.0f );
float2 vecResult;
vecResult.x = floor( fDecode / 255.0f );
vecResult.x /= 255.0f;
vecResult.y = frac( fDecode / 255.0f );
return vecResult;
}
이렇게 대충 코딩해 봤는데 문제는 Decal때문에 AlphaBlend를 하고있는 부분이 깨지네요..ㅠㅠ
그나저나 7600에선 여전히 비정상이네요 ㅠㅠ
6,7 시리즈는 좀 까리까리한게 있는데, 개발 가이드 문서(http://developer.download.nvidia.com/GPU_Programming_Guide/GPU_Programming_Guide_Korean.pdf)에서는 A16B16G16R16 텍스쳐가 지원 되지 않는다고 나와 있습니다. 하지만 실제로 caps를 뒤져보면 지원을 하더군요. 애초에 지원을 하지를 말던가.. 원..
전 6&7은 버텍스단위에서 라이트계산하고 그림자도 빼고, 포워드로 렌더링하려구요.. 그런거 다 하기엔
넘힘드네요.. 것보다.. m330에서 돌려봤더니 좌절이라. 그쪽 최적화해야겠어요
테라처럼 쌩 디퓨즈만 지원하는 옵을 추가해서 커버하려구요
해상도가 점점 커져가는데 6,7 이넘들은 이를 따라올 수가 없네요.
mx330 말씀하시는 것인가요? 그넘도 지원하시나요 +ㅈ+?
노트북용 하면 인텔 GMA가 대박이죠 ㅎ
인텔칩도 스펙상으로는 허용 범위라 신경써야될 밴더가 더 많아졌습니다
OTL