반응형

Direct3D에는 surface라는 용어가 나온다. MSDN에서는 그 뒤에 (Direct3D 9)이라고 표기 되어 있는 것으로 봐서는 DX9때부터 쭉 사용되어 오던 개념인것 같다.

Surface는 디스플레이 메모리의 선형 공간으로 보여주고 보통 디스플레이 카드의 디스플레이 메모리에 상주한다. 하지만 surface는 시스템 메모리에도 존재할 수 있다.

Surface는 IDirect3DSurface9 인터페이스에 의해서 관리된다.

  • Front buffer. 그래픽 어댑터에 의해 해석되고 모니터에 표시된 메모리 상의 직사각형 영역. Direct3D 응용 프로그램에서는 front buffer에 직접적으로 쓰기 작업을 하지 않아야 한다.
  • Back buffer. 응용 프로그램에서 직접적으로 쓰기 작업을 하는 메모리 상의 직사각형 영역. 이 back buffer는 모니터 상에 직접적으로 표시되지 않아야 한다.
  • Surface 뒤집기(교환). Back buffer에서 front buffer로 이동하는 절차.
  • Swap chain. Front buffer에 연속적으로 보여질 수 있는 하나 이상의 back buffer의  집단.

 

Surface 얻어오기

아래의 메서드 중 하나를 호출하여 surface 생성한다.

  • CreateDepthStencilSurface
  • CreateOffscreenPlainSurface
  • CreateRenderTarget

Surface format은 surface memory 내의 각 필셀의 데이터를 어떻게 해석할지를 결정한다. Direct3D는 surface format를 설명하는 D3DSURFACE_DESC 구조체의 D3DFORMAT을 사용한다. GetDesc() 메서드를 호출하는 것으로 현재 사용되는 surface의 format을 찾아올 수 있다.

Surface가 생성되었을 때 , 아래의 메서드 중 하나를 호출하여 포인터를 얻어올 수 있다.

  • GetCubeMapSurface
  • GetBackBuffer
  • GetDepthStencilBuffer
  • GetFrontBuffer
  • GetRenderTarget
  • GetBackBuffer
  • GetSurfaceLevel

IDirect3DSurface9 인터페이스는 UpdateSurface() 메서드를 통해서 간접적으로 메모리에 접근할 수 있다. 이 메서드는 한 IDirect3DSurface9 인터페이스로 부터 다른 IDirect3DSurface9 인터페이스에 픽셀의 사각형 영역을 복사할 수 있도록 허용한다. 이 surface 인터페이스도 직접적으로 디스플레이 메모리에 접근할 수 있는 메서드를 가지고 있다. 예를 들어 LockRect 메서드를 이용하여 디스플레이 메모리의 사각형 영역을 잠글 수 있다. surface의 잠긴 사각형 영역에 대한 작업이 완료된 이우에는 UnlockRect를 호출해주는 것이 중요하다.

 

위의 내용은 DX9 버전에서 정의되어 있는 Surface에 대한 내용이고 포프님의 간단하고 명료하신 설명에 따르면

"그냥 텍스처인데 텍스처에는 밉맵이 있어서 여러장의 크기가 다른 이미지들이 한 텍스처에 포함되므로 각각의 크기가 다른 이미지들을 서피스(표면) 이라 합니다."

"즉 서피스 = 이미지 한장. 이미지들 여러개가 모인것(밉맵, 큐브맵, 3디 이미지) = 텍스처"

유영천 님께서는

"Surface 개념 자체는 모든 DX버전에 다 해당됩니다. 그냥 이미지를 담을 수 있는 버퍼는 몽땅 다 Surface입니다. DDraw시절에도 Surface가 있었고 DX12에 와서도 Surface가 있습니다. 포프님 설명이 가장 정확합니다."

라고 설명해주셨다.


반응형

'Direct3D > Direct3D 용어' 카테고리의 다른 글

[Direct3D 용어] Direct3D Surface  (0) 2016.11.01

+ Recent posts