336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이 글은 10년도 작성 된 글 백업임

--------------------------------------------------------------------



RGBA16 버퍼(unsigned 64bit)에 두 개의 값 밀어넣기 Game develop

최근 작업 중 짱나는 부분이 있어 여러분께 조언을 좀 여쭙고자 글을 씁니다.

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는 안되고 그러는지 답답하더군요. 제일 중요한 문제는 이 방법이 정상 작동 하는지의 판단 기준을 어떡해야 할지를 모르겠다는겁니다.(원인 파악이 되면 자연스레 해결 될 수도 있겠지만요::) 어떤 기능의 지원 여부에 따른 것이라면 쿼리를 날리던 캡스를 뒤지던 할 텐데... 

혹시 의심가는 부분이라던가 비슷한 문제 사례가 있으시면 한모금 던져주시면 로또맞으실겁니다 ㅎㅎ

덧글

  •  cagetu 2010/12/29 11:05 # 삭제 답글

    설마 텍스쳐 포멧을 지원하지 않는것은 아니겠죠?! ^^;;
  •  오즈라엘 2010/12/29 11:13 # 수정 삭제

    해당 포맷으로 랜더 타겟은 정상 생성 되고 PIX로 확인해보면 출력도 됩니다.ㅠㅠ
  •  냥냥양 2010/12/29 23:41 # 삭제 답글

    이게..

    직접적인 ( / 25535 ), ( * 255 ) 요런식으로 하는게 아니라. ceil(), floor(), 요런건로 써서 해보세요.

    기억이 맞다면 될거같아요..ㅡ_ㅡ;;;

    근데 frac() 요건 그래픽카드마다 결과값이 달라서..영...amd에 문의 해도 대답없고;;;

    그리고...64 unsigned int 이거 느리지않던가요??
  •  오즈라엘 2010/12/30 11:02 # 수정 삭제

    답변 감사합니다만 제가 이해가 안가서 자세히 풀어서 설명좀 부탁드릴게요 ㅠㅠ
    올림, 내림이 무슨 연관이 있는 것인지 ㅠㅠ
    ATi나 NVIDIA에 문의 메일은 의미가 없어요ㅋ 절대 대답 안해줌 ㅋ
    개발 가이드 문서의 틀린 내용도 바로 바로 수정 안하는 녀석들인데요 뭐 ㅋ
    uint 64bit은 아직 속도 체크는 아직 안해봤는데, RT를 낭비하지 않으려면 선택의 여지가 없어서요 ㅎㅎ
  •  냥냥양 2010/12/30 17:33 # 삭제 답글

    http://theinstructionlimit.com/?p=33 바로 밑에 이거 얘기 한거에요.

    렌더타겟줄이실라고 그런거죠?

    제가 방금 테스트해봤는데, amd계열은 속도가 훌륭하고, nvidia계열은 암울하네요...어흑
  •  오즈라엘 2010/12/31 01:28 # 수정 삭제

    감사합니다 ㅎ

    " there is no native integer math on GPUs before SM4.0"
    이 문장을 제대로 보질 못했었네요 ㅎ 이 문장 대로 제대로 처리를 못해서 7600에서는 결과가 이상하게 나오나봅니다. 
    아래에 링크된 글들을 보면 흐름과 컨셉은 알겠는데, 왜 frac()이 비트 쉬프트의 의미를 가지게 되는지 이해는 안가더라구요. 소수부의 숫자들이 어떻게 bitwise의 효과를 가지게 되는 건가요ㅜㅜ?

    nvidia 계열은 어떤 모델로 테스트해보신건지요? 저는 PF64랑 UINT64랑 별 속도 차이는 없어보이던데''
    아직 7600에서는 정상적으로 돌지 않아 비교를 안해봤고 8600이상에서 비교해봤습니다.
  •  냥냥양 2011/01/01 13:55 # 삭제 답글

    float Float2Encode( float2 vecEncode )
    {
    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를 하고있는 부분이 깨지네요..ㅠㅠ
  •  오즈라엘 2011/01/03 13:59 # 수정 삭제

    알파 블렌드로 하면 OTL ㅠㅠ G-buffer에서 사용하고 계시지 않으신가요? 데칼 등 알파 블렌드가 필요한 부분은 별도 패스로 덧그리셔야 할겁니다 ㅜㅜ
    그나저나 7600에선 여전히 비정상이네요 ㅠㅠ
  •  냥냥양 2011/01/04 01:04 # 삭제 답글

    걍 필요한 부분만해서 큰득은 봤네요.. 그나저나 7600구해서 저도 돌려봐야겠네요..
  •  오즈라엘 2011/01/04 11:30 # 수정 삭제

    지포스 7시리즈, 6시리즈 모두 그러더군요. 개네덜은 반정밀도로 계산을 하는건가;; D3DXSHADER_PARTIALPRECISION 옵션을 넣지도 않았는데 그러네요.. 쩝;;
    6,7 시리즈는 좀 까리까리한게 있는데, 개발 가이드 문서(http://developer.download.nvidia.com/GPU_Programming_Guide/GPU_Programming_Guide_Korean.pdf)에서는 A16B16G16R16 텍스쳐가 지원 되지 않는다고 나와 있습니다. 하지만 실제로 caps를 뒤져보면 지원을 하더군요. 애초에 지원을 하지를 말던가.. 원..
  •  오즈라엘 2011/01/07 00:48 # 수정 삭제

    7600에서 돌려보셨나요? 엔비댜에 문의하니 낮은 정밀도로 연산 된다거나 하는 것은 딱히 없다고 하네요. 문서에 UINT64 포맷 지원 안한다 나와있는 것은 실수지만 언제 고칠지는 모른다능 ㅋ
  •  냥냥양 2011/01/11 10:15 # 삭제 답글

    제 주위에 7시리즈가 없네요..ㅠㅠ 6600하나 있긴한데 그거 달아서 테스트하기는 귀찮아서..

    전 6&7은 버텍스단위에서 라이트계산하고 그림자도 빼고, 포워드로 렌더링하려구요.. 그런거 다 하기엔 

    넘힘드네요.. 것보다.. m330에서 돌려봤더니 좌절이라. 그쪽 최적화해야겠어요
  •  오즈라엘 2011/01/12 23:13 # 수정 삭제

    저 역시 6,7 시리즈는 답이 없어서 걍 bit-wise 하는 행위를 그냥 빼버렸습니다. ㅎ 
    테라처럼 쌩 디퓨즈만 지원하는 옵을 추가해서 커버하려구요
    해상도가 점점 커져가는데 6,7 이넘들은 이를 따라올 수가 없네요.
    mx330 말씀하시는 것인가요? 그넘도 지원하시나요 +ㅈ+?
  •  냥냥양 2011/01/15 09:39 # 삭제 답글

    m330은 그냥 노트북용이에요.. 요즘 노트북으로 게임하는 유저들이 많아져서..
  •  오즈라엘 2011/01/15 14:52 # 수정 삭제

    아.. 노트북용 ㅋㅋ 제가 무식한 소릴 했었네요 죄송함다 ㅋㅋ
    노트북용 하면 인텔 GMA가 대박이죠 ㅎ 
    인텔칩도 스펙상으로는 허용 범위라 신경써야될 밴더가 더 많아졌습니다
    OTL


Posted by ozlael
,