달력

09

« 2017/09 »

  •  
  •  
  •  
  •  
  •  
  • 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
도대체 GPU 메모리 상에 올린 텍스처에 값을 갱신하는데 왜 CPU Memory를 잡아 먹는지 모르겠다.
거기다가 같은 텍스처에 갱신해도 꾸준히 올라가는 cpu 메모리.. 32비트에서는 결국 스택 에러가 발생해서
64비트로 컴파일하는 임시 방편 수행; 
하지만 for 문안에서 수행이 많다 보니 결국엔 64비트에서도 뻗는 증상이 나타나 마지막 수단으로 
아예 디바이스 전체를 반복 수행시마다 새로 잡고 해제하고 하는 방식으로 해결했다.
map, unmap이 원래 이런건가... 뭔가 다른 방법으로 텍스처 내용을 갱신하는 방법을 찾아봐야겠다.


저작자 표시
신고
Posted by 에어림

dx10_1 부터 지원하는 Compute Shader. GPGPU를 지원하기 위해 MS가 야심차게 내세운 언어이다.
근데 문제는... texture sampling을 지원하지 않아서 프로그래머가 일일히 sampling 함수를 제작해서 써야 하는
단점이 있는 듯하다.. 어딘가 내가 모르는 함수가 있나해서 찾아보아도.. 구글신도 해답을 주지 않는 현재ㅠ
내가 구현해서 쓰고 있는데 영 결과가 안 좋다.. wiki의 식이 잘못됐단 말인가(그럴리가 없겠지만)

저작자 표시
신고
Posted by 에어림
의문이다. 기본적으로 병렬적이기 때문에 불가능한 것인가?
하다 못해 작업 중인 사항을  출력해주기라도 하면 프로그래밍이 1023123112배 편해질텐데
nVidia의 GPGPU 언어인 CUDA의 경우는 앞으로 Nexus라 불리우는 디버거를 출시할 예정이라고 하는데..
얼만큼 디버깅을 지원해줄지 의문이다. 내가 잘 몰라서 그렇겠지만 리눅스의  gdb처럼 써야한다면 큰일일텐데..

저작자 표시
신고
Posted by 에어림
glTexCoord3d(pVtTex->m_pt.x,pVtTex->m_pt.y,pVtTex->m_pt.z);
glVertex3d( -pVt->m_pt.x, pVt->m_pt.z, -pVt->m_pt.y  );

texture mapping 할 때, 이 두 함수의 순서가 중요합니다... 위와 같이 해야 정상인데
아래 처럼 했다가... 장장 2주간을 딴 방법을 파면서 삽질을 했습니다. ㅠㅠㅠㅠㅠㅠ

glVertex3d( -pVt->m_pt.x, pVt->m_pt.z, -pVt->m_pt.y  );
glTexCoord3d(pVtTex->m_pt.x,pVtTex->m_pt.y,pVtTex->m_pt.z);
저작자 표시
신고
Posted by 에어림


비어있는 32bit 3D Texture 생성
D3D10_TEXTURE3D_DESC desc;

 desc.Width = m_nWidth;
 desc.Height = m_nHeight;
 desc.Depth = m_nDepth;
 desc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
 desc.MipLevels = 1;
 desc.Format=DXGI_FORMAT_R8G8B8A8_UNORM;
 desc.Usage = D3D10_USAGE_DYNAMIC;
 desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
 desc.MiscFlags = 0;

 hr = m_pDevice->CreateTexture3D(&desc, NULL, &m_p3DSolidTexture);
 if (FAILED(hr))
  return FALSE;

 
 hr = m_pDevice->CreateShaderResourceView(m_p3DSolidTexture, NULL, &m_p3DSolidTextureRV);
 if (FAILED(hr))
  return FALSE;


3D texture에 내용 채우기

RGB32 * buffer;
 
  int nWidth = m_pVolume->GetWidth();
  int nHeight = m_pVolume->GetHeight();
  int nDepth = m_pVolume->GetDepth();
 
  buffer=new RGB32[nWidth*nHeight*nDepth];
 
  int z,x,y;
  for (z = 0 ; z < nDepth; z++)
  {
   for (y = 0 ; y < nHeight; y++)
   {
    for (x = 0; x < nWidth; x++)
    {
     buffer[z*nHeight*nWidth + y*nWidth + x].r = rand() % 255;
    buffer[z*nHeight*nWidth + y*nWidth + x].g = rand() % 255;
    buffer[z*nHeight*nWidth + y*nWidth + x].b = rand() % 255;
    buffer[z*nHeight*nWidth + y*nWidth + x].a = 1;

    }
   }
  }
 
 
  ID3D10Texture3D *solidVolume = m_pVolume->Get3DSolidTexture();
 
  D3D10_MAPPED_TEXTURE3D mapped;
  hr = solidVolume->Map(0, D3D10_MAP_WRITE_DISCARD, 0, &mapped);
  if (FAILED(hr))
   return FALSE;
 
  memcpy(reinterpret_cast<RGB32 * >(mapped.pData), buffer, nWidth*nHeight*nDepth*sizeof(RGB32));
  solidVolume->Unmap(0);
 
 
  free(buffer);

 

저작자 표시
신고
Posted by 에어림
c:\program files\microsoft visual studio 9.0\vc\include\stdlib.h(371) : error C2381: 'exit' : redefinition; __declspec(noreturn) differs

위와 같은 오류가 발생할 경우

#include<stdlib.h>를 #include <GL/glut.h>보다 이전에 선언에 주면 된다.


#include <stdlib.h>
#include <GL/glut.h>


저작자 표시
신고
TAG OpenGL
Posted by 에어림
2009.01.21 17:17

프로그래머와 개구리 2012 이전/참고자료2009.01.21 17:17

컴퓨터 회사에서 프로그래머로 일하는 사람이 길을 가다가 개구리를 만났다.

개구리가 입을 열었다.

"저는 마녀의 함정에 빠져서 개구리가 된 공주랍니다.
저에게 키스를 해 주시면 저는 다시 인간으로 돌아갈 수 있답니다."

프로그래머는 개구리를 자신의 외투주머니에 집어 넣었다.

점심시간이 되자 개구리가 계속 소리를 질러댔다.

"어서 키스를 해주세요. 제가 다시 아름다운 공주로 되돌아 가면
당신과 달콤한 사랑을 나눌 수도 있지 않겠어요."

프로그래머는 아무 대꾸도 없이 묵묵히 자기 일에만 몰두했다.

저녁 때가 되어 퇴근을 한 프로그래머는 술집에서 친구들과 술 한잔 하고 있었다.

프로그래머가 친구들에게 개구리를 보여 주었다.

친구들은 그에게 '왜, 개구리에게 키스를 해주지 않느냐?'고 물었다.

그러자 프로그래머가 말했다.

"내가 여자 사귈 시간이 어디 있어?
하지만, 말하는 개구리를 가지는 것은 근사한 일이잖아."
저작자 표시
신고
Posted by 에어림

개인적으로 한메일을 잘 안쓰지만, 스팸으로 쌓이는 메일함은 자주 정리하는 편입니다.
웹브라우저로 파폭을 쓰는 관계로 메일 정리시에 불편한 점이 있는데요. 다음이 웹 표준을 안 지키는 것인지 저렇게 메일을
삭제하려고 하면, 포커스가 제대로 안 맞아서 버튼 클릭이 안됩니다.
좀 오래된 버그라, 오늘 오랜만에 메일 정리하려고 들어갔는데 아직도 그대로네요.




저작자 표시
신고
TAG 한메일
Posted by 에어림
위의 질문은 한 대학원의 면접시 받았던 아주 색달랐던 유형이다.

과연 왜 0부터 시작하는 걸까?

나의 답변은 이랬다.

"포인터와 배열의 연관성을 생각할 때, 배열의 위치를 포인터로 참조시에는 *(ptr+0)이 해당 메모리의의 제일 처음 시작번지를 가르키게 됩니다. 만약 배열의 [1]이 애초에 시작 번지라고 가정하면, 포인터 연산시의 *(ptr+1)과 혼동의 가능성이 있기 떄문에(이럴 경우 배열은 *(ptr+0)의 메모리 위치를 참조하므로) 이런식으로 결정하게 된 것 같습니다."

라고 말했더니 교수님의 표정이 떨떠름 했다. 그리고 이어지는 첨언,
"아니 C언어 이전의 언어에도 배열의 시작 위치가 [0]이었는데 그게 연관성이 있나?"
라는 말에 KO.

"잘 모르겠습니다..ㅠ.ㅠ."
 
과연 진정한 답은 무엇인가요? 아시는 분?
저작자 표시
신고
Posted by 에어림
2008.11.29 01:05

프로그래머 되기. 2012 이전/참고자료2008.11.29 01:05


만약 정규과정의 대학을 나오는 준프로그래머들이 준수해야할 기본 과목들을 모두 빡세게 외운다면 어떨까? 이산수학, 자료구조, 알고리즘, 운영체제, 네트워크, ...

빡세게 가는 것이다. 의사나 변호사처럼. 개인적으로 응용도 응용이지만, 천재가 아닌 이상 응용을 위해서는 암기가 뒷받침 되야 한다고 생각한다.

나는 아직도 자료구조의 연결리스트나, 그래프 탐색등의 알고리즘을 구현하려면 쩔쩔 맨다.
책을 다시 뒤져야 하고, 구글링을 해야 한다. 그것도 매번.

개인적으로 의사나 변호사의 프라이드가 높은 것은 사회적으로 인정되는 측면도 있지만, 그들이 그런 직업을 갖기되기까진 엄청난 양의 공부와 암기를 해왔고, 그렇게 암기한 것에 대한 자부심 같은 것들이 있지 않을까 생각한다.

 "나는 진짜 공부 많이 했어. 이 분야에 대해선 정말 정말로 전문가야!"

과연 대학 4년을 공부하면서 자부심을 느낄만큼 공부를 해왔을까? 그냥 시험때만 반짝 공부하면서 학점을 따고, 잊고 만다. 대충대충 알아가면서 말만 앞서게 된다. 실제 구현하라고만 하면 main(void)부터는 딱 막히고 마는 것이다. 그러면서 어느새 성능에 대해서 왈가왈부 하게 된다. 전형적인 입코더..

이러면 안된다고 생각한다. 누가 그래프에 대해서 물으면 그래프의 정의부터 시작해서 형태, 특징등을 줄줄이 말할 수 있어야 하며, 탐색 기법, 최소거리등의 알고리즘에 대해서도 막힘없이 설명할 수 있을뿐만 아니라 실제 구현도, 생각 없이 바로 짤 수 있을 만큼 공부해야 한다고 생각한다.

 아직 현업에는 발도 담그지 못하고 있지만, 앞서간 많은 선배님들의 한탄을 많이 들으면서 이런저런 생각을 하게 된다. 프로그래머는 코더에 불과하다고, 3D업종에 미래도 없다고 말한다. 물론 이런 현실을 타파하기 위해서는 사회적인 지원도 필요하겠지만 역시 가장 중요한건 프로그래머들 자신의 실력을 극복해야 하지 않을까 생각한다.
 누구나 함부로 넘볼 수 없는 지식을 가지고 자부심을 가져야 한다. 아무나 이 일을 제대로! 할 수 있는게 아니라는 것을 보여줘야 하지 않을까.

 
 




저작자 표시
신고
Posted by 에어림