꽃미남 프로그래머 김포프가 창립한 탑 프로그래머 양성 교육 기관 POCU 아카데미 오픈!
절찬리에 수강생 모집 중!
프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 친절한티스

요즘 툴을 만든다 하면 많은 분들이 C#를 선호하고 있습니다. MFC에 비해 생산성이 높기 때문이죠. 저도 마찬가지입니다. 개인 프로젝트에서 툴을 C#의 윈폼을 사용해 만들고 있습니다. 최근에는 WPF에도 관심을 가지게 되었습니다. 작년에 있었던 KGC11의 엔진과 툴의 그렇고 그런 사이 발표 자료를 보고 많은 감명을 받았죠.


이런 것도 있구나!!


윈폼이 MFC에 비해 편하기는 하지만, 컨트롤 구성에 제약이 있는 것은 윈폼도 마찬가지였습니다. 그에 반해 WPF는 윈폼에 비해 확장성과 유연성이 굉장히 높아 거의 원하는대로의 컨트롤 구성을 만들어낼 수 있습니다. 조금만 노력하면 언리얼 에디터 만큼의 퀄리티도 만들어낼 수 있을 정도죠.


이렇게 카와이하게 만들 수 있어요

출처 : http://wpfpropertygrid.codeplex.com/


이렇게 좋은 도구가 있는데, 문제는 역시 이놈도 C#이라는 것 입니다. 보통 게임엔진을 만든다 하면 대부분 C++로 만듭니다. 하지만 C#과 C++은 전혀 다른 언어죠. 그렇기에 C#으로 만들어진 툴이 C++로 만들어진 엔진과 연계가 되려면 둘 사이에 중계자가 필요합니다. 그 것이 바로 C++/CLI이죠. 이 C++/CLI란 놈은 C++과 C#의 영역을 자유자재(?)로 접근할수 있는 힘을 가지고 있습니다. C++에서 작성된 클래스 객체에 접근 할수 있고, C#의 객체에도 접근을 할 수 있습니다.


네... 뭐 그런놈이 있습니다.


이 중계 기능을 만들때 흔히 랩핑이라는 기법을 씁니다. C++에서 만들어진 클래스를 C++/CLI에서 가져와 그 클래스의 기능을 감싸는 클래스를 하나 더 만듭니다. 이 C++/CLI에서 만들어진 클래스는 [ 관리 되는 ] 클래스로 이 클래스는 C#에서 사용이 가능해집니다. 즉, C++/CLI를 통해 간접적으로 C#에서 C++ 클래스를 사용하는 것이지요.


C++

class DLL_API CSceneManager
{
public:
	void DoSomething( void )
	{
		// Do~ Do~ Do~
	}
};


C++/CLI

public ref class CWrappedSceneManager
{
public:
	void DoSomething( void )
	{
		m_pNativeSceneManager->DoSomething();
	}

private:
	CSceneManager* m_pNativeSceneManager;
};


C#

public partial class MainForm : Form
{
    private CWrappedSceneManager m_WrrapedSceneManager;
    public void DoSomething()
    {
        m_WrrapedSceneManager = new CWrappedSceneManager();
        m_WrrapedSceneManager.DoSomething();
    }
}


이 짓을 기능 추가때 마다 하라고??


대략 이와 같은 구조를 갖게 되는 겁니다. 벌써부터 머리가 지끈거려 오죠? 기능이 많으면 많을 수록 랩핑할 것도 많고, 손도 많이 갑니다. 정말 귀찮죠. 하지만 이렇게 일일히 클래스와 함수를 랩핑을 하는 것이 아니라 명령 단위로 처리한다면 어떨가요? 예로 게임 오브젝트를 하나 생성하는데, 게임 오브젝트 생성 부터 데이터를 채워넣는 것 까지 전부다 C# 툴 레벨에서 처리하는 것이 아니라 단지 C# 툴에서는 게임 오브젝트를 생성해라~ 명령어만 전달하는 것이지요.


그렇게 하면 C++/CLI 레벨에서는 단지 명령어를 전달 해줄 기능만 있으면 됩니다. 나머지는 엔진쪽에서 해당 명령에 대한 수행 로직만 만들면 되는 것이지요. 여기서 좀더 나아가 보겠습니다. 만약 이 C++/CLI 조차 필요없이 바로 C++쪽에 명령을 전달할수 있다면 어떨까요? 불필요한 파일도 없어지고, 좀더 수월해지겠죠?


하지만 C++과 C#은 같이 쓸수 없다고 했잖아요? 어떻게 하면 될까요? 바로 DLL Interop을 통해서 할 수 있습니다. C#에서도 DLL Interop을 통해 외부 DLL의 함수를 불러와 사용할 수 있습니다. 일단 엔진을 DLL로 빌드 하고, C#에서 사용될 명령어 처리 함수를 만듭니다. 그리고 C#에서 이 DLL을 가져와 함수를 사용하는 것이지요.


C++

extern "C"
{
	DLL_API bool SendCommand( const wchar_t* szCommand );
}


C#

public partial class MainWindow : Window
{
    [DllImport("Engine.dll", EntryPoint = "SendCommand", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
    [return: MarshalAs(UnmanagedType.I1)]
    private static extern bool SendCommand(string strCommand);

    public void DoSomething()
    {
        SendCommand("DoSomething");
    }
}


이 얼마나 아름답고 간결한 코드인가~


이전 C++/CLI 사용때 보다 훨씬 간단해졌죠? 아주 좋습니다. 이제 C#과 C++ 연동은 알겠어요. 그럼 WPF로 게임 엔진 툴을 만들어 봅니다. 뚝딱~ 뚝딱~ 카와이 하게 언리얼 에디터 같은 것을 만들어보죠. 그런데 문제가 생겼습니다. WPF로 멋지게 툴을 만들었다고 생각했는데, 화면이 렌더링 될 부분을 어떻게 만들어야 하죠?


윈폼에서는 ImageBox 같은 더미 컨트롤을 하나 만들어서 그 컨트롤의 핸들을 엔진쪽에 넘겨주면 엔진쪽에서 그 핸들을 받아 그 곳에 화면을 렌더링할 수 있었습니다. 그런데 WPF는 컨트롤의 핸들이 없습니다. 오로지 윈도우의 핸들만 존재합니다. 열심히 컨트롤 붙이고 툴을 만들었는데, 정작 화면을 렌더링 할수 없으면 아무 소용이 없습니다.


난 그동안 뭐한건가...


다행히 방법은 있습니다. WPF Win32 Content Hosting 이라는 요상한 기능이 하나 있습니다. 즉, WPF 상에 Win32에서 만든 컨텐츠를 표시할 수 있게 해주는 기능이죠. 이를 이용해 우리는 엔진쪽에서 만든 Render Window를 WPF에 갖다 붙일 수 있습니다. 일단 이 기능을 쓰기 위해서는 HwndHost 라는 클래스를 이용해야 합니다.


C#

public class RenderViewHwndHost : HwndHost
{
    // Win32 창 생성 함수
    [DllImport("Engine.dll", EntryPoint = "CreateRenderWindow", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
    private static extern IntPtr CreateRenderWindow(IntPtr applicationInstance, IntPtr hWndParent, int screenWidth, int screenHeight);

    // 소멸시 할 일
    [DllImport("Engine.dll", EntryPoint = "DestroyWindow", CallingConvention = CallingConvention.Cdecl)]
    private static extern void DestroyWindow();

    protected override HandleRef BuildWindowCore(HandleRef hwndParent)
    {
        IntPtr instanceHandle = System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]);
        IntPtr hwndHost = CreateRenderWindow(instanceHandle, hwndParent.Handle, 1024, 760);

        return new HandleRef(this, hwndHost);
    }

    protected override void DestroyWindowCore(HandleRef hwnd)
    {
        DestroyWindow();
    }
}


C++ 엔진쪽에서 WPF에 붙일 RenderWindow를 생성하는 함수 하나를 정의합니다. 그리고 C#에서 HwndHost 클래스를 재정의 하여, 이 함수를 호출해줍니다. HwndHost에서 재정의 해야될 멤버 함수가 BuildWindowCore와 DestroyWindowCore 두 가지가 있습니다. 전자는 창 생성, 후자는 창 소멸시 호출되는 HwndHost 멤버 함수입니다. 이 두 함수는 Hosting시에 자동으로 호출 되므로, 직접 호출해줄 일은 없습니다.


HwndHost를 만들었으면 이제 생성한 창을 붙일 일만 남았습니다. WPF에서 편집기를 통해 Border 컨트롤을 이곳에 렌더 화면을 띄어야지~~ 할 곳에 적당히 붙여둡니다. 이 Border 컨트롤은 더미 역할을 하게 됩니다. 그리고 재정의한 HwndHost를 생성해 이 Border의 Child에 찰싹~ 붙여주면, 이제 WPF에서도 렌더링 화면을 볼수 있게 됩니다.


C#

public partial class MainWindow : Window
{
    public void CreateRenderView()
    {
        RenderViewHwndHost renderViewHost = new RenderViewHwndHost();
        border1.Child = renderViewHost; // 찰싹~
    }
}



위 기능을 구현하기 위해 드플의 핵심 인재 끼로(@kgun86)님께서 많은 도움을 주셨습니다.

이 자리를 빌어 감사드립니다.


반응형
,
Posted by ozlael


들어가며

작년 KGC에서 "PC에서 3D 입체 영상 게임 개발하기"란 세션을 맡았었습니다. 그 발표 자료도 제 블로그에 그 자료도 올려두었습니다만 (http://ozlael.egloos.com/3767971) 잡스횽 따라하느라 자세한 설명을 적지 않고 설명의 보조자료로만 사용된 슬라이드였기에 그 뜻이 제대로 전달되지 않았다 생각합니다. 그래서 몇 차례에 걸쳐서 그 주제로 설명을 드려볼까 합니다. 글 쓰는게 힘들어서 우려먹는 심뽀는 절대 아닙니다. 대마왕J횽과 cagetu횽이 NDC 자료로 땜빵한거보고 감명받은 것도 절대 아닙니다.

전반부는 3D 입체영상을 다루기 위해서 알아야 하는 전반적인 개론을 다루고 있습니다. 입체영상에 대해 아무것도 모르는 분들도 무리 없이 보실 수 있도록 구성되어 있습니다. 프로그래머분들이 아니더라도 상관 없는 내용이라서 직렬 직군과 상관 없이 보실 수 있습니다. 하지만, 후반부에는 입체영상을 PC에 어떻게 적용하는가에 대해 본격적으로 다루기때문에 그래픽 프로그래머가 아니시면 난해할 수도 있는 내용들입니다. 프로그래머가 아니시더라도 "아~이런게 있구나"하고 대충 훑어보시고 프로그래머를 갈구기 위한 배경 지식으로 삼아도 되겠지요 :-)


입체 영상 & 게임의 전망

아마도 영화 아바타를 모르시는 분은 없을겁니다. 이 아바타는 전 세계적으로 27억달러라는 엄청난흥행을 거두었는데요, 국내에서도 천만명 이상이 관람했다고 합니다. 전체 인구의 1/4에 육박하는 엄청난 숫자인데요, 유소년 및 노년층을제외하고, 어둠의 경로로 보신분들 포함하면 뭐 그냥 안본사람이 없다고 볼 수 있을 것입니다. 아바타가 개봉된 2009년은 3D 원년으로 불리우며 3D 입체 영상에 대한 관심이 폭발적으로 증가하게됩니다.

게임업계도 이에 편승하여 입체 영상을 지원하는 게임들을 발매하고 있습니다. UBI 소프트는 2012년에는 절반 이상의 타이틀이 정식으로 입체 3D를 지원할 것이라고 발표하기도 하였습니다. 실제로도 스타크래프트 2, 크라이시스 2, 베틀필드 3, 디아블로 3 등 최근 출시작들은 거의 다 입체 3D를 지원하고 있지요. PC 뿐안 아니라 엑박,플스 등 콘솔 게임기도 3D 입체 영상을 지원하지요. 닌텐도는 3DTV 보급률이 20%를 넘었을 시 콘솔에서 입체 3D를 지원할 예정이라고 발표하였지만, 휴대기기에서는 닌텐도 3DS를 발표할 만큼 적극적인 관심을 보이고 있지요. 또한 게임기 뿐만 아니라 LG,HTC,샤프 등에서 입체 3D를 지원하는 스마트폰을 출시하며 각종 게임들과 연계하고 있지요. 노트북도 지원 모델들이 본격적으로 출시되기 시작했습니다. 이토록, 입체 3D 게임은 거실뿐만아니라 모바일까지 그 영역을 확대해 나가고 있습니다.

이토록 전 세계가 입체 3D 게임의 흐름에 편승하는 반면 국내 게임 시장에서는 미온적인 태로를 보이고 있습니다. 아이온, 아바 등 일부 타이틀들만이 정식으로 입체영상을 지원할 뿐이지요. 북미나 일본은 3DTV와 직접적으로 연관되는 콘솔 위주의 시장인 반면에 국내는 PC 온라인 게임 위주의 시장이기 때문인것으로 판단됩니다. 이 글이 국내 게임시장에도 입체영상에 대해 관심을 갖게되는 계기가 되었으면 하는 바람입니다.


왜 게임인가?

다른 컨텐츠 중에서도 특히 왜 하필이면 게임에서 입체 영상을 적용하여야 할까요? 게임이 입체영상을 적용하여 얻는 이득이 다른 컨텐츠에 비해 무엇이 다른 것일까요? 단연 몰입도가 가장 중요한 이유가 될 것입니다. 다른 컨텐츠도 마찬가지겠지만 특히 게임은 유저를 얼마나 게임에 몰입시키느냐가 중요한 관건이 되겠지요. 입체영상은 그 몰입도를 극대화 시켜줌으로써 유저가 더 게임을 재미있게 즐길 수 있도록 도와줍니다. 또한 깊이 정보 역시 그 중요한 역할을 한다고 볼 수 있겠습니다. 특히 FPS같이 거리 및 차폐 정보를 순간적으로 판단하고 즐여야 하는 게임에서는 깊이 정보를 더욱 직관적으로 받아들여 원활한 플레이를 할 수 있도록 도와줍니다. 

예를 들면 다음과 같이 케릭터가 화염방사기를 발사하고 있을 시 일반 이미지로만 보면 어디까지가 발사 범위인지 확 와닿지가 않습니다. 

하지만 입체 영상으로 보면 직관적으로 와닿기 때문에 즉각적인 판단이 가능해집니다.

이미지 출처 : 신나는 건즈 2

또한, 컨텐츠 제공자 입장에서는 물리적인 제작 비용의 부담이 없다는 장점이 있습니다. 영화같은 경우는 입체 영상으로 촬영을 하기 위해서는 입체 영상 카메라가 있어야 하고 이를 받쳐주기 위한 리깅 시스템도 마련해야 하는 등 어마어마한 금액의 촬영 장비가 필요합니다. 스테레오그래퍼, 리깅테크니션, 디지털이미지테크니션 등 추가적인 스태프로 인한 인건비도 추가적으로 발생하게 되지요. 예를 들면 영화 나탈리( 다들 국내 최초의 3D 영화를 7광구로 알고계시는데요, 사실 그 이전에 나탈리라는 비운의 에로 영화가 있었습니다. 세계 최초의 3D 에로가 옥보단이 아닌 국내 영화였지요.)의 감독 인터뷰에 의하면 3D로 촬영하기 위해서 1.5배의 촬영 비용이 들었다고 합니다. 촬영 씬을 줄여서 비용을 절감해도 그정도라는군요. 하지만, 게임은 애초에 3D 공간의 정보들로 이루어진 컨텐츠이기때문에 별 어려움 없이 입체 영상으로 변환할 수 있습니다. 예를 들면 스타크래프트2는 출시 당시에는 입체 영상을 지원하지 않았지만 추후 패치를 통해서 입체영상을 지원하였습니다. 그 입체영상을 지원하기 위한 작업 기간은 단 3주밖에 걸리지 않았다고 합니다. 스타크래프트2라는 엄청난 프로젝트 규모에 비해서 3주는 매우 짧은 시간에 불과하겠지요. 이토록 게임에서는 입체영상 지원이 큰 부담이 되지 않습니다.



이번은 첫 시간이니 여기까지 간단하게 마치구요, 다음 시간에는 입체 영상을 다루기 위해 그 원리를 알아보도록 하겠습니다. 요즘 일교차가 큰데 감기조심하시고 다음 시간에 뵈요 :-)


다음 글 : PC에서 3D 입체 영상 게임 개발하기 #2


반응형
,
Posted by 대마왕J

10강입니다!!! 이번 10강은 진짜 우여곡절이 ... ㅠㅠ

NDC 스피커파티까지 끝내고 나서 누적된 피로로 계속 몸이 안좋았는데, 주말에는 경조사가 겹치고 평일에는 회식과 외부 약속이 겹치더니 결국 저번주 목요일날 급체하는 바람에 만 하루동안 사경을 헤맷습니다. 급체와 함께 몸살이 겹쳐서 와서요.

결국 겨우 안정된 다음에 한약방 갔더니 너무 피로해 있다고 쉬라고 하는군요. 쉬라니 ㅠㅠ 20대 때의 1/4 정도, 30대때의 절반 정도 강도로 일하고 있는데 쉬라니요 ㅠㅠ (하긴 30대 때는 그러다가 디스크 걸려서 몇 년 고생했었지 ... )
여하간 덕분에 이제야 정신과 몸을 챙기고 10강을 쓰게 되었습니다. 크흑.

 

불쌍합니다.

 

뭐 각설하고...

이게 전체 예상된 일정의 절반쯤 되는 것 같아요. (아마도)
일단 빠르게 나가 보지요. 이번 시간에는... 드디어 알파가 들어간 불(파이야) 를 만들어 보겠습니다.

아마 이번으로 1부는 끝이 날 것 같아요!!! 1부가 뭐냐고요? 그건 '텍스쳐 컨트롤' 하는 쪽이예요 !

이후부터는 좀 어려운 얘기가 나옵니다. '알파 소팅' 에 대한 얘기가 나오구요. '라이팅 연산' 에 대한 얘기도 나올 거예요.

사실 이게 프로그래머들이 배우는 hlsl하고는 완전 반대되는 과정의 느낌이긴 합니다만... 말씀드렸듯 이 강의는 그래픽 디자이너를 위해 특화된 과정의 강의니까요. 다릅니다 달라요.

1. 셰이더로 이펙트를 어떻게 만드나요?

이펙트라는 것이 보통 '추상적인 무언가가 어떤 에니메이션을 보여주는 것' 이니까요. 그리고 주로 알파 블렌딩된 이미지들이고요. 이런 이펙트를 만드는 방법은 보통 아래 방법을 사용하지요.

가. 파티클을 이용한다

일반적인 방법이예요. 파티클을 이용하면 여러 효과를 리얼하게 낼 수 있지요.
그치만... 무거워요... 아주 많이...
가볍게 하려면 꽤 기술이 필요하고 말이죠. 엔진 특성에 따라 가볍고 무겁고도 다르고..
그래서 제한적으로 사용해야만 하지요. 

나. 텍스쳐 시퀀스를 이용한다

실무에서도 많이 쓰는 방법이지요. 텍스쳐 한 장에 에니메이션 되는 이펙트 그림을 나열해 놓고 차례로 보여주는 방식이예요. 시퀀스를 지원하지 않는 구식 엔진에는 IFL 파일이라는 것을 이용하기도 하지요.
옛날 2D 게임 만들때 흔히 사용했던 스프라이트 방식. 그거예요.
그치만 역시 텍스쳐를 너무 많이 사용한다는게 문제예요. 편하긴 해도 매우 큰 약점이지요.  

다. 오브젝트 에니메이션을 이용한다

오브젝트들 실제로 구기거나, 스케일링 하거나 등등 해서 이펙트를 에니메이션 시키는 방법이예요.         
불이나 폭파 이미지에서 직접적으로 이것만 이용해서 뭔가를 만들긴 좀 그렇고, 알파 에니메이션 등을 같이 사용하곤 하죠. 단점은 효과가 그렇게 좋지 못하다는 것. 아까 말했지만 혼자서 사용하기에는 무리가 있고 말이죠.

라. 텍스쳐 에니메이션을 이용한다

UV를 움직이거나 해서 애니메이션 시키는 방법이지요. 어찌보면 가장 많이 쓰이는 방법이고, 가벼우면서도 효과가 좋은 방법이긴 하지만, 표현할 수 있는 것이 한계가 있다는게 좀 단점이지요. 각종 꼼수를 동원하면 대부분 가능하긴 합니다만...

마. Shader 기술로 만든다

오늘 배울 겁니다. 불이나 폭파 에니메이션을 셰이더로 제어하게 되면, 가벼우면서도 효과가 좋은 이펙트를 만들 수 있어요. 물론 실무에서는 이것과 함께 복합적으로 사용하는 경우가 많지만, 어쨌거나 이 방법을 이용하면 텍스쳐 에니메이션의 장점을 그대로 흡수하면서 더 복잡한 응용이 가능하게 됩니다.

그리고 재미있게도, 오늘 얘기할, 셰이더를 이용해서 불을 만들기 위한 기술은 '이미 다 배우신 기술' 이라는 겁니다. 후후후후후후후후후후  (오늘을 위해서 미리 다 계획해 놓는 치밀함!!!)

 

2. 첫번째 불 이미지를 만들어 봅시다.

불을 만드려면 일단 불이 있어야 겠군요.

 

 

네 뭐 이런 불 그림이 있다고 칩시다 어설프지만.

이 불 그림을 입혀서 불을 만들어 봅시다.

... 불 그림을 입혔는데 말도 안되게 어설프지요. 우와 진짜 구려. ㅋ 망했다 ㅋ

... 이건 뭐 당연하게도 알파도 없는 불 그림을 입혀 놓았기 때문이지요.


불 모양을 만들기 위해서 일단 알파채널이 있는 이미지로 만들어 놓겠습니다.
아래처럼 말이지요.[각주:1]
알파 채널에 보면,  불 모양의 외각이 있는걸 볼 수 있습니다. 이걸 32bit TGA 파일이나 DDS DXT5 같은 파일로 만들어 놓으면 사용할 수 있게 되지요.

 이렇게 해서 알파 채널도 연결했습니다. 불이 제대로 나옵니다.

야호 불이 만들어졌다 이걸로 끝 !@

야호 끝났다

 

 

 

... 이젠 오래 써먹은 개그니 아무도 안 속으시겠죠. 쳇.

 

 

 

넹 끝났으면 좋겠습니다만, 전혀 안끝났습니다. 지금은 그냥 '불 모양 그림' 일 뿐이지요. 아무리 긍정적으로 봐라봐도 불이라 보기엔 무리가 좀 있습니다. [각주:2]  

 

3. 두 번째 불 이미지를 만들어 봅시다.

넹 그럼 이번에는 두 번째 불 이미지입니다.
그리기 상당히 귀찮아서 (... 나 그래픽 디자이너 맞나...) 파티클 일루젼에서 소스를 만들어서 대충 닦았습니다.

 
이 이미지의 특징은, 세로로 타일링 되는 이미지라는 것입니다. 세로로 주욱 이어져요.

 

 

 

 

세로로 붙여보면.. 요렇게요. 이어지죠. 주우우우ㅇ우우우우우우웅우우ㅜ우ㅜㅇ욱.


만드는 법이요? 그래픽 디자이너라면 이정도는 다 해요.
프로그래머분들이 클래스 만드는 수준.

 

그렇다면 그런 줄 아세요.

 

자 이거 가지고, 아래처럼 만들어 봤습니다.
응? 어디서 많이 보던거 아니예요??? 

 

뭔지 모르시겠는 분은 7강 http://www.gamedevforever.com/120 을 복습하세요.
UV가 세로로 흐르는 거잖아요!!!

이렇게요!!!

다시 말씀드리지만
전 이미 다 알려드린 기술만 사용해요 후후후
왜냐면 쉬워야 하니까요. 쉽게 쓰기로 작정한 거니까요.
제가 여기에서  WVP(World View Projection) Matrix 라던가 dot / cross 공식따위를 증명하고 앉았으면 다들 도망가실 거잖아요 ...  (어차피 설명할 수 있을지도 잘 모르겠지만)

아마 이러시겠죠. 저도 그랬었었었어요.

 

아차! 이것도 알파를 안 만들었군요.
여기의 알파는 좀 특이한 모양으로 만들어 보았습니다. 물론 위 아래 타일링 되는 것은 동일.

 

 

이걸 연결하면 이렇게 되지요.
마치 용암이 구불구불하게 흘러가는 듯한 이미지가 되었습니다.

흠? 두 이미지를 가지고 뭘 하려는 걸까요? 후후후후후후후후

이제 다음 단원에서 그 비밀이 드러납니다.

후후후후후후후 기대돼라

 

4. 간단하게 불을 합성해 봅시다.

두 이미지를 만들어 봤습니다. 이제 이걸 합성해 보도록 하지요.
지금 만든 두 셰이더를 동시에 나열하면 이런 모양이겠죠.

 

1번과 2번 텍스쳐가 있고, 2번 텍스쳐는 UV 조작을 통해 위로 흘러가고 있었습니다.[각주:3]

자.. 일단 1번 텍스쳐를 최종 출력에 연결을 해 보지요. 

 그럼 이렇게, 단원 2에서 봤던 것과 같은 이미지가 나옵니다.
다음은 어떻게 해야 할까요?

이제는 충분히 익숙해지셨을, Math/MathOperator 를 이용해서 두 이미지를 곱했더니, 좀 더 그럴듯한 불 이미지가 되었습니다.

 

           얘네 둘을 곱하는것은, 포토샵에서 두 레이어를 Multiply 하는 것과 같으니까요.

포토샵에서 보면 이런 거겠죠. 레이어 두 개를 Multiply로 섞는다는...
두 이미지가 잘 섞였군요. 그럼 플레이하고 동영상을 볼까요.

 

동영상 압축 특성상 외각이 좀 지저분하게 나오는데요. 저정도까지는 아닙니다.

불 그림이 흘러가는데, 아래쪽은 첫 번째 텍스쳐의 노랑때문에 좀 밝아 보이고, 윗쪽은 좀 어두줘집니다. 이런 느낌은 그림만 좀 더  잘 만들면 괜찮습니다.


그래도 음.. .뭐 일단 좀 속도만 느려지면 불이 올라가는 것 처럼 보일 것 같긴 한데.. 뭔가 좀 이상합니다.
뭐가 이상할까요? 아니 이상하다 못해 너무 구립니다.

 

 

외각 말이죠 외각. 외각이 이상하잖아요 
불이 ... 그림만 올라가고 출렁출렁 움직이는 느낌이 없잖아요?!?

그래서 만든게 두 번째 텍스쳐의 알파 채널입니다.

 

 이번엔, 이렇게 두 알파 채널도 같이 곱해 줘서 출력해 줘 봅시다.

포토샵에서는 '알파채널을 Multiply하기' 같은 레이어 옵션이 없기 때문에 그냥 알파 채널을 이미지처럼 만들어서 설명해 봤습니다. 두 알파 채널이 이렇게 섞인다는 거지요.

두 알파 채널이 곱셈(Multiply) 로 섞이기 때문에,
검은색(0) 이 있는 부분은 흰색(1) 과 곱해지더라도 검은 색이 ( 0 * 1 = 0 ) 나오게 됩니다.[각주:4]

대충 짐작하시겠지요? 알파 채널도 어차피 RGB와 같은 채널 중 하나인 A 채널이기 때문에,
곱하면 그냥 같이 곱해집니다.

그럼 최종 결과물을 볼까요? [각주:5]

(역시 동영상의 압축에 의한 잔상때문에 외각이 지저분하게 나오네요... 제길)

* 주의 : 맥스 2009 버전에서는 플레이 버튼을 누르면, 외각의 알파가 저렇게 갱신되지 않고 계속 누적이 되어서 쌓이는 모습을 발견했습니다. 맥스 자체가 이런거 하려고 만들어 놓은게 아니라서 그런건 이해하겠습니다만... 맥스 2010 을 사용하시면 아무 문제없이 잘 됩니다.
맥스 2009에서는 플레이 버튼으로 보시지 마시고, 타임 컨트롤 바를 수동으로 조금씩 움직여서 보시는 것을 추천합니다.

네 좀 지저분하게 찍혔지만, 불이 이제 정형적인 모습을 가지지 않고 '일렁이듯이' 움직인다는 것을
볼 수 있습니다.

이제 불의 소스가 하나 완성된거지요. 텍스쳐 UV 에니메이션으로는 하기 힘든 모양을, 이렇게 간단한 셰이더를 이용해서 만들 수 있습니다. 물론 이게 끝이 아니지요. 여기에 더 추가되는 작업을 해야 그럴듯한 불 이펙트가 나오게 될 겁니다.
예를 들면, 파티클을 살짝 써서 불똥을 표현해 준다던가, 굴절 셰이더를 쓰는 평면을 하나 더 만들어서 뒤 배경이 굴절되게 한다던가, 아주 밝은 부분 레이어와 위로 올라가는 연기 레이어를 추가로 제작해서 배열한다던가 하는 식으로 말이지요.

어쨌건, 가장 중요한 부분을 끝냈으니 나머지는 좀 더 쉬울 겁니다

 

자 .... 이렇게 해서 이미지 컨트롤 파트를 마치겠습니다!!! 다음 시간에는...

....

....

라이트를 할 것인가 알파 소팅을 할 것인가 고민좀 하고 돌아오겠습니다!!!

 

따라해 보실 분을 위한 이미지 소스는 여깄습니당

 

A.tga

 

B.tga

  1. 그래픽 하시는 분들은 다 아시는 얘기 : RGB 이미지는 알파 채널 이미지랑 다르게 전체가 불 이미지 스러운 칼라로 되어 있지요? 만약 위에 나온 예제처럼, 외각을 검은색으로 채웠다면 나오는 이미지에도 검은 색이 어느정도 묻어 버리기 때문에 저렇게 만듭니다. [본문으로]
  2. 못그려서 그런거라고 하지 마세요. [본문으로]
  3. 흐르는 속도를 바꾸시려면 Time에다가 일정 숫자를 곱해서 출력하시면 되겠지요 대략 경험상 여기에서는 0.25 정도를 곱하는게 좋겠더군요 [본문으로]
  4. 곱셈은 둘중 하나가 0이면 0이 되고, 덧셈은 둘 중하나가 1이면 1이 된다라고 생각하시면 편합니다. (덧셈은 좀 더 깊은 세계가 있지만 일단 여기까지..) [본문으로]
  5. 불이 흐르는 속도를 1/4 로 줄였습니다. 어떻게 하시는지 다 알지요? [본문으로]
반응형
,
Posted by 알 수 없는 사용자

안녕하세요 낄님입니다. 전쟁터에서 살아돌아왔습니다. 

마감지옥을 매번 경험하지만, 익숙해진 만큼 더 많은 업무를 처리해야하다 보니, 상황이 항상 그렇습니다. ...

어쨋든 핑계; 늦어져서 죄송합니다.  ( _ _)


지난 1,2차에서 전체적인 협업구도를 간략하게 적어봤는데, 잘 와닿지 않으셨으리라 생각됩니다.

너무 수박 겉핥는 식이였다고 생각이 들어서, 이번엔 좀더 자세히 써볼려고 합니다.


전체 흐름은 이렇습니다.

(모든 업무 스텝과의 협업 쓰나미)


사운드디렉터와 오디오 프로그래머와의 사례.

1. 들려야 하는것과 들리지 말아야 하는것 

(UI 사운드가 모든 이들에게 들려요. 이건 실패작...--)

2. 우선순위에 따라 꼭 필요한 순간에 해당 소리가 재생되어야 할 것

3. 스마트한 사운드 환경을 위해 필요한 작업들(자동화,단순화,사운드 엔진 튜닝)

사운드 디렉터와 PD와의 사례

1.  유저 이탈을 방지 하도록 하기위한 대책중, 사운드에서 취해야 할 것

2. 연출에 필요한 요소들과 구현이 필요한 것들, 효과분석.

3. 해외 서비스를 위해선 최적화가 필수인데

4. 게임 몰입도를 높일 방법 


사운드 디렉터와 PM과의 사례

1. 개발 기간과 비용을 합리적으로 꾸려 나갈 수 있는 로드맵 제시.

2. 다른 파트와의 협업에서 얻을 수 있는 장점을 최대한 살리기

3. 고무줄 처럼 밀리고 땡겨지는 일정에서 사운드 및 음악 제작시간을 최대한 효율적으로 사용하는 방법

사운드 디렉터와 기획팀과의 사례

1. 정책, 이슈 통합 보고시스템 활용

2. 시나리오, 동선 흐름, 레벨디자인과 협업

3. 음악이 필요한 상황과 필요하지 않은 상황 구분

  4. 리스트업을 하기전에 확정해야 할 것들

사운드 디렉터와 음악팀과의 사례

1. 음악이 들어가는 위치, 상황, 분위기등을 전달

2. 전체적인 사운드가 흘러갈 방향성 제시

3. 사용할 악기, 편곡, 세션의 사용여부 결정

사운드 디렉터와 사운드팀과의 사례

1. 음악과 조화되어야 할 분위기 공유

2. context, abstract 연출 방식 결정

3. 기준이 될 사운드 확정

4. 고증이나 세계관에 따른 방향 결정.


이중에서 가장 먼저 해볼려는건, 역시 오디오 프로그래머 분들과의 협업이 가장 우선순위가 높네요.

단짝 친구입니다. 서로 고마운 존재....

스마트한 오디오 프로그래머가 있는 프로젝트는 사운드에 날개를 달아줍니다.. 레드불 처럼요.. (파닥파닥)


(아. 왠지 올려놓고 보니, 오디오 프로그래머 분들이 굉장히 안쓰럽군요;; )


사운드디렉터와 오디오 프로그래머와의 사례를 더 파보겠습니다.

FMOD를 활용한 사례이며, 게임 타이틀은 MMORPG급을 전제로 말씀드립니다.


1. 들려야 하는것과 들리지 말아야 하는것 

UI 사운드가 모든 이들에게 들려요. 

- 자신에게만 들려야 하도록 사운드 유형을 변경 (properties에서 조정)

나 이외의 다른 사운드가 너무 잘 들려서 벨런스 잡기 어려워요 

- 역시 properties유형에서 자신 이외의 캐릭터나 NPC가 내는 사운드는 모두 50%수준으로 볼륨을 낮춰서 재생


2. 우선순위에 따라 꼭 필요한 순간에 해당 소리가 재생되어야 할 것

PC가 사용하는 스킬 사운드의 우선순위를 최 우선으로 설정(1~256등급까지라면, 약 10~50사이에서 배정)

PC가 사용하는 사운드의 우선순위마저도 밀리는 상황이라면,

- 보다 디테일한 분류를 하고, 메모리 절약을 위해 동시채널을 너무 많이 줄인게 아닌지. 메모리 점유를 확인하고, 조정


3. 스마트한 사운드 환경을 위해 필요한 작업들

자동화 시스템 

- 사운드가 자동으로 입혀지고, 테이블 값에 따라 해당 재질별, 강약, 방향, 무기 종류에 따른 모든 처리가 한방에 해결

- 사운드 이벤트에 3차원 배열을 가지는 것으로 부족한 것들은,  추가 이벤트 생성

- 속성에 따른 사운드 재생방식은 properties에서 추가로 조정가능.

- 템플릿을 적극적으로 활용

- 사운드 빌드시, 자동으로 게임 빌드데이터에 등록 처리.

- 인게임 사운드 콘솔처리와, 사운드 리로딩 기능의 적용


사운드 엔진 퍼포먼스 최적화   

- 구역에 따른 사운드 메모리 로딩

-  공용으로 사용되는 소리와, 각 지역별 특징 사운드들 분류작업

-  공유할 수 있는 몬스터와 환경 사운드의 효율적인 사용방법(엔진에서 지원하는 VST 오디오 플러그인들의 활용)

-  퀄리티를 해치지 않으면서 메모리도 효과적으로 활용할 수 있는 개별 뱅크 옵티마이징.


이외 별도의 시스템 추가

- 캐릭터 상황에 따른 효과 (위태로움, 죽음, 유령상태, 스테미너 하락, 저주받은 상태 등등)

- 게임 흐름에 따른 인터렉티브 사운드 연출 시스템 구축( 멀티채널 bgm과 멀티레이어 사운드 그룹)

- 리얼타임 사운드 믹싱 (현재 구현중인 기술 - 아직 발표되기 전 -2분기에 발표예정인  fmod 스튜디오에서 가능)


반응형
,
Posted by 알 수 없는 사용자

지난 두번에 걸쳐 다루었던 PGP 방식의 프로토콜은 거의 모든 상황에서 사용이 가능한 완전체에 한없이 수렴하는 프로토콜 이다. 그렇기 때문에 대부분의 환경에서 안전하게 데이터를 주고받는 용도로 사용할 수 있는 좋은 방식이기도 하다. 왜 좋은지에 대해서는 아래의 링크에서 확인해 보시라.

 

http://www.gamedevforever.com/141


위의 포스팅에서 i5 2.5GHz 급의 CPU라면 하나의 코어로 대략 초당 282,489,299 바이트, 17,655,581번의 128비트 AES 암호화 연산이 가능하다는 것에 대해 이야기 했었다. 계산해 보면 개발중인 게임에서 PGP, GPG 혹은 SSL을 사용할 수 있을지 여부에 대해 확인 해 볼 수 있을 것이다. 틀림없이 어떤 환경에서는 그정도의 연산 조차 아끼고 싶은 경우가 있을 수 있다. 특히 휴대용 게임기나 스마트 폰 등의 제한적인 환경이라면 더더욱 암/복호화 연산이 부담스러울 가능성이 있다.

이번 글을 통해 전달하고자 하는 내용은 두 가지 이다. 첫번째는 XOR이 암호화 하는데 사용되는 특징이 있기는 하지만, 그 자체는 암호화하는 효과가 전혀 없으므로 XOR 만 가지고는 해결되지 않는다는 것을 보이는 것 이고, 두번째는 암호화를 할 때 사용하는 몇가지 기법을 이야기 하고자 한다.


1. XOR를 이용한 데이터 숨기기

XOR은 CPU에서 제공하는 연산이므로 128비트를 암 복호화 하는데 만여 사이클이 소요되는 AES 암/복호화와 달리 많아야 100 사이클 정도면 128비트를 암호화 할 수 있다. 물론, 구현하는 방법에 따라, CPU의 종류에 따라 달라질 수 는 있겠지만, 근본적인 차이는 발생할 수 없다. XOR를 이용하여 암호화 한다면, 대충 다음과 같은 방법으로 암호화가 진행 될 수 있을 것 이다.



오! 그럴듯 해 보인다. 뭔가 알 수 없는 형태로 데이터가 변환되어서 전송되었다. 훔쳐보고 싶어 하거나, 조작하고 싶어하는 공격자는 원래 데이터가 뭔지 상상할 수 도 없을 것이다. 그러니 이걸로 대 만족이다! 그럼 이걸로 글을 마치겠다... 일리가 없잖습니까?

 

위에 언급한 XOR 방식의 가장 치명적인 단점은 쉽게 키의 크기를 알아낼 수 있고, 키 자체도 알아내기 어렵지 않다는 것 이다. 물론 어떤 방식으로 XOR를 했는지 알아내기 위해서 시간을 투자해야 하겠지만 결국 알아내는 건 많이 어렵지 않다. 그럼 위의 방식을 한번 공격해 보겠다. 먼저 공격을 위해서 한가지 전제를 해야 한다. 위의 방식을 이용해서 모든 데이터를 암호화 한다 - 채팅 내용까지 위의 방식을 사용한다는 전제를 해두겠다. 물론, 채팅을 암호화 하지 않는다고 해서 공격하는게 불가능 하지는 않지만, 가장 간단한 방법으로 공격하기 위해서 채팅의 내용까지 암호화 한다고 전제 하는 것 이다.

 

공격 방법은 아주 단순하다. 채팅창에 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[각주:1]"를 입력하는 것 이다. 그리고 전송되는 패킷을 관찰하면 다음과 같은 내용을 포함한 패킷이 날아가는걸 볼 수 있을 것 이다.

 

6E2AE83 6E2AE83 6E2AE83 6E2AE83 .... 6E2AE83 6E2AE83 6E2AE83 6E2AE83

 

보기 좋으라고 네 바이트 단위로 잘라 놓기는 했지만, 어찌 되었든 XOR를 이용해서 숨겼다는 사실만 알면, 반복되는 주기만 관찰을 하면 쉽게 키의 크기를 알 수 있다. 위의 경우에는 숨길 때 사용한 키의 크기가 네 바이트 라는 것을 알 수 있다. 그리고, 운영체제에서 기본적으로 제공하는 계산기를 실행시킨 후 다음을 계산해 보면 된다.

 

6E2AE83 XOR 41414141 (AAAA의 아스키 코드 값)

 

그러면, 짜잔! 계산기에 다음과 같은 값이 나올 것 이다.

 

47A3EFC2

 

뭐... 뭐냐?

 

프로그램 코드를 분석해 볼 필요도 없다. 그냥 시도해 보면 된다. 해봐서 아니면 그냥 다른 방법을 사용했을 가능 성이 높으니 사용된 다른 방법이 무엇이 있을지 고민하면 된다. 위의 암호문을 포함한 패킷이 날아가고, XOR을 이용한 게 아니라면 답은 하나 뿐이다. 128 비트 블럭 암호를 ECB 모드로 암호화 한 것 이다. 원하는 평문에 대한 암호문을 알아낼 수 있으니 이전에 이야기 했던 차분 공격법을 이용하면 오래 걸리지 않아 키를 알아 낼 수 있을 것이다. 또 다른 문제는, 궂이 키를 알아내지 않더라도 전달되는 데이터의 일부를 변경할 수 있다는 문제점도 있다. 단순히 특정 비트-바이트의 값을 수정하는 것 만으로도 원하는 데이터를 변형 할 수 있다. 그렇기 때문에 XOR로 데이터를 숨기는건 그다지 효용성이 높지 못하다.



2. 기존의 암호화 방식을 끌어다 써보자 - CBC의 Chaining 을 가져다 써보자

 

그러면 어떻게 해결을 해야 할 것 인가? 위에서 잠시 말했듯 이 암호화된 문자열이 6E2AE83 6E2AE83 6E2AE83 ... 와 같이 주기를 가지고 반복된다면 해당길이의 키를 사용한 XOR 이거나 ECB 모드를 사용한 블록암호중 하나로 볼 수 있는 것 이다. 이전 게시물 에서 ECB 모드의 문제점에 대해 이야기 하면서 다른 모드를 사용하면 문제가 해결 된다는 것에 대해 언급한 것을 혹시 기억할지 모르겠다. 다시 말해서 위의 경우에도 CBC, PCBC, CFB, OFB 등등의 방식을 흉내내서 문제를 해결 할 가능성이 있다는 걸 생각해 볼 수 있을 것 이다. 


1에서 언급된 문제를 해결하기 위해, 다음과 같이 CBC를 변형해서 XOR를 이용해서 전송방식 - 프로토콜을 변형해 보도록 하겠다.


XOR를 이용하여 원래 데이터를 숨길때 Chaining을 해보았습니다!


오! 이전 보다 조금 더 그럴듯 해 보인다. 이전 암호화 단위의 암호문을 그 다음 단위의 평문을 암호화하는 키로 사용했다. 복호화 할 때에는 첫 번째 값을 그 다음 번 값을 복호화하는 키로 사용해 주면 된다. 게다가 이 방법을 사용하면 공격자가 임의의 위치에 있는 데이터를 바꾸게 되면 그 이후의 데이터들도 영향을 받게 되기 때문에 전달되는 데이터는 복호화 하기 전엔 변경할 수 없다. 이렇게 하면 같은 키를 사용하더라도 처음부터 끝까지 완전히 같은 데이터가 아닌 다음에는 만들어진 암호문이 다르게 보일 것 이다. 이렇게 해주면 공격자는 키를 예측하기 위해 더 많은 고민을 할 수 밖에 없다. 똑같이 단순하게 XOR를 사용한 것 이지만 앞서 사용했던 방법 보다는 조금더 공격자를 고민하게 만들 수 있다. 그러나, 같은 평문은 같은 암호문을 만들기 때문에, 공격자는 어떤 규칙이 있다는 것을 쉽게 발견해 낼 수 있고, 공격 방법을 찾아내기 위해 그 규칙을 이용 하려고 시도 할 것 이다. 그러면, 어떻게 문제를 해결 할 수 있을까?



3. 그럼, 암호화 할 때 마다 다른 결과를 얻도록 해보자


문제를 해결하기 위해서 암호화 하는 것의 가장 기본적인 정의를 끌어들여 보겠다. 가장 안전한 암호화 방식은 공격자가 암호문과 랜덤 값 간에 구별을 하지 못하는 방식이다. 즉, 평문을 암호화 해서 만든 데이터 100 바이트와, 랜덤 함수를 이용해서 만든 데이터 100 바이트를 구별하지 못하면 - 암호화 해서 만들어진 암호문이 랜덤 값 100 바이트로 보인다면 공격자는 공격할 방법을 찾지 못하게 된다. 이 내용을 단순하게 문자 그대로 받아들여 보자. 다시 말해서 평문의 첫 네 바이트를 랜덤값으로 채워 넣는 것이다. 이 방식은 블록암호의 모드에서 사용되는 IV와 유사한 역할을 하는 것이다. 오히려 블록 암호의 모드에서는 IV 값을 알아야 하지만, 이 경우에는 최초의 랜덤 값을 몰라도 복호화가 되기 때문에 IV를 전달하지 않아도 된다. 이 아이디어를 적용한 방식을 그림으로 그리면 다음과 같이 될 것 이다. 


랜덤 값을 초기 값으로 하여 Chaining을 해보았습니다. 매우 그럴듯해 보입니다.


굉장히 그럴 듯 해 보이는 결과물을 얻었다. 랜덤 값을 특정 값과 XOR을 하면, XOR의 특성상 그 결과 값은 랜덤 값 일 수 밖에 없다. 그러므로, 랜덤 값과 키를 XOR를 하면 랜덤 값이 되고, 암호화 하고자 하는 평문 값과 앞서 얻은 키가 포함된 랜덤 값을 XOR를 해주면 랜덤 값이된다. 출력 결과물인 암호문은 말 그대로 랜덤 값 열이기 때문에 공격자는 전송되는 데이터가 암호문인지 아니면 그냥 랜덤값을 보내는 것 인지 구별이 불가능하다. 암호학에서 말하는 가장 이상적인 암호문 인 것이다! ... 이게 사실 이라면, 그동안 암호학을 연구하던 수학자와 암호 연구자들은 전 부 다 Bing신이 되는 거다. 그러나, 필자같은 반푼이도 아는 것을 두번째로 똑똑하다고 하면 암살이라도 할 똑똑한 분들께서 발견하지 못하고 복잡한 수학적 계산을 필요로 하는 블록암호를 만들었을리는 없는 것 이다.


위의 그럴듯해 보이는 방법의 문제점은, 키가 없어도 암호문을 복호화 할 수 있다는 것 이다. 일단 다음 그림을 보자.


슬프게도, 키나 첫 번재 랜덤값은 몰라도 암호는 깨진다.


위 그림을 보면 알겠지만, 전송되는 암호열의 첫번째 암호문을 그 다음 암호블록과 XOR 해주면 평문을 얻을 수 있다. 그러므로 애시당초 키는 필요도 없었다. 공격자가 암호화 방식을 모른다면 혹시 속아넘어가 줄 수... 조차 없다. XOR의 특성상 Chaining 방식은 사용이 불가능 하기 때문이다. 2에서 언급된 방법을 이용해서 암호화를 하는 경우 그 앞에서 사용했던 "A" 잔뜩 입력하기 기법을 사용하면 다음과 같은 결과물을 얻게 된다.


6E2AE83 47A3EFC2 6E2AE83 47A3EFC2 6E2AE83 47A3EFC2 6E2AE83 47A3EFC2


그리고, 여기에서 언급된 방법 이라면 다음과 같은 결과를 얻게 될 것 이다.


RANDOM RANDOM 47A3EFC2 RANDOM 47A3EFC2 RANDOM 47A3EFC2 RANDOM 47A3EFC2


...

(다시 한 번 수고해 주신 L 군에게 감사한다.)


패턴이 반복 될 뿐 아니라, 전송되는 데이터열에 비밀 키 까지 예쁘게 포함되어 있다. 이... 이건 아니잖아...


4. 결론


기본적으로 XOR 연산은 두 값을 섞어서 제 삼의 값을 만들어 내기 때문에 암호화에 사용할 수 있을 것 처럼 보인다. 그러나 XOR 연산은 '복원'의 특성을 가지고 있기 때문에 XOR 만을 이용하여 암호를 만든다면 알려져 있는 그 어떤 방식을 사용한다 할 지라도 약간의 노동 만으로도 원문을 얻어낼 수 있다. 게다가 XOR 은 사칙연산과 마찬가지로 아주 단순하기 때문에 그 자체만 가지고는 응용할 수 있는 영역에 한계가 있다. 그러므로 아무리 연산시간이 부족하다 할 지라도 XOR 만 가지고 전송하는 데이터를 암호화 하려는 시도는 원하는 목적을 달성 할 수 없을 것 이다.


겨우 그딴 소리를 하려고 이 글을 읽게 만들었단 말이냐! 죽고 시프냐!


자... 잠시만, 돌은 내려 놓으시고! !!! !!!! !!!! 아악!


그러나 XOR은 제일 처음에 말씀 드렸던 것과 같이 암호하는데 사용됩니다... 되... 되옵니다. 그렇기 때문에 XOR를 사용하는데 있어 한계를 알고 계시옵는 것은 이 후에 다른 방법을 사용하시어 전송하는 데이터를 암호화 하시옵는데 도움이 되실 것 이옵니다. 다음 번에는 XOR과 의사난수 발생장치(PRNG)와 해시 함수(HASH FUNCTIONS)를 이용하여 빠르고 깨지기 힘든 암호문을 만들어 전달하는 방법에 대하여 설명해 올리도록 하겠사옵나이다. 그리고, 그 다음에는 실제 사용할 수 있을 법 한 프로토콜을 만들어 올리겠나이다... 그... 그러니... 쇠구슬은...


아악!!!!!


*     *     *


'발행' 버튼을 누르면 예약일과 상관없이 바로 포스트가 열린다는 걸 몰랐습니다. 그래서 어제 밤에 쓰다만, 아니 타이핑 하다 만 글이 올라가 버리고 말았네요. 오늘 내일 여유있게 쓰려고 했는데... 일단 트윗에 포스트가 날아갔기에 부랴부랴 타이핑 작업을 마쳤습니다. 혹시 미리 보시고 '이쉐키 뭐얏'이라고 생각하신 분이 계시다면 용서하시길 부탁드립니다. (__)


우좌지 당간에, 그런 이유로  원래 스케쥴 보다 이틀 일찍 포스트 했습니다.


  1. A의 갯수를 세지는 말아 주세요. 그냥 충분히 많은 갯수의 A인 겁니다. 한 백개정도? [본문으로]
반응형
,
Posted by 알 수 없는 사용자

안녕하세요 시니어배경아티스트/TA Silverchime입니다.
지난 시간에는 로마문명과 건축에 대하여 알아보았었지요.

이번에 고딕건축을 하기전에 그 중간 형태인 로마네스크 건축을 알아보도록 하겠습니다.
중간에 돔건축의 진수를 보여준 비잔틴은 넘어가겠습니다 (분량상...어디까지나 분량상...)


로마네스크 건축 (8C~ )


교세가 커진 카톨릭의  신자들이 늘어나 수많은 성당으로 신도들이 밀려들기 시작합니다. 
볼트와 아치를 사용하던 로마건축은 바실리카라는 멋진 건축물을 만들었으나, 
시대적 요구에 의해 더 높고 넓은 공간을 사람들은 원했고,  바실리카는 대 변혁을 거칩니다. 


그 유명한 피사의 사탑도 이 로마네스크 시대의 일부입니다.


로마네스크 시대의 건축적 특징


1. 아치의 사용은 더욱더 교묘해 졌습니다. 

반원아치의 사용이 극대화된 시기가 바로 이 로마네스크 시대입니다. 

내부 지붕은 교차볼트 또는 배럴볼트로 이루어집니다. 


2. 로마네스크 시대부터  바실리카의 평면은 라틴 크로스 형태로 설계됩니다. 

비잔틴 건축은 그릭  크로스 형태지요. 

일단 기존과 크게 다른점은 트란셉트Transept 라는 신랑 Nave를 가로지르는 공간이 생겼다는 점이지요.

이 부분은 성가대 좌석으로서의 역할을 하게 됩니다. 


3. 네이브와 트란셉트의 교차점에는 돔이 올라오게 되고

슈파이어 성당의 크로스돔



4. 앱스 맞은편 신도들 출입구에 타워가 들어서기 시작합니다. 

이 타워는 점점 앞으로 옮겨가 고딕성당에서는 아예 전면부의 2/3을 차지하게 됩니다.

점점 전면부로 당겨붙어 파사드(전면)의 일부가 됩니다. 


5. 로마네스크 성당에는 타워가 중요한 요소로서 존재하였습니다. 

사각, 원형, 팔각 등 여러가지 형태로 지어졌지만 

특징은 많은 층수에 비해 위로 좁아지지 않는 형태라는 것입니다. 

보통은 교회건물에 붙어서 지어진 것이 많았지만, 지역에 따라  독립적으로 세워지는 경우도 있었는데 

그중 유명한 것이 바로 피사의 사탑입니다.  

여기서 나중에 참 중요한 실험이 있었다고 전해 졌지요

 그 유명한 갈릴레오의 ‘중력 실험’입니다.

실제로는 역사적 사실은 아니라고 하네요. 

실제는 매끄러운 경사면에서 다른 무게의 공들을 굴렸다고 합니다
(저도 속았다는!)

설마 호킹느님이 거짓말을 하진 않겠지. 


6. 스테인드글래스 Stained Glass

최초로 사용하기 시작되었다고 추정되는 시기는 10세기 정도입니다. 

스테인드글래스란 유리를 제조할때  각종 금속산화물질 Metalic salts를 첨가한 색유리로서 

각종 도료와 달리 시간이 지나도 그 색이 바래지 않는 것이 특징입니다. 

스테인드 글래스를 통해 교회 안으로 들어오는 각종 형형색색의 빛들은 

당시 녹색이나 보라색 빛 등 그때까지 알기 힘들었던 컬러 조명의 신기원이었을 것입니다. 


7. Murals 벽화들

바실리카의 내부 벽들과 돔은 온갖 종류의 신성한 그림들로 가득차게 됩니다. 

글을 모르는 자들도 그림은 볼 수 있었거든요. 내부는 거대한 성서가 됩니다.

당최 알아먹지를 못하면 이렇게라도...
그시대에 모에화라는게 없어서 참 다행입니다.


자 로마네스크에서 일단 몸은 풀었습니다
다음 고딕으로 진행해 볼까요. 


Gothic 12C ~ 

요즘 화려한 배경으로 많이들 사용하는 시대이기도 하고, 

신성과 경외감을 연출하는데 고딕양식만한 수사구도 드물지요. 

보는순간 딱 느껴지는 화려함과 고양감. 고딕아니겠습니까. 


고딕건축이라고 하는 그 기원은, 1530년조르지오 바사리라는 사람이 

전통에 따르지 않고 무례하며, 야만적이라고 비하하면서 

Gothic이라고 언급한 것이 시초였습니다. 거의 Vandal과 동급으로 지적하는 말이었지요. 


Goths + ic이었던 걸까. 

뭐지? Goths고트족이랑 혹시 상관이 있는걸까요? 

아닙니다 Gothic이란 사실 역사적으로 존재했던 Goths고트족과는 하등 상관이 없습니다. 

고트족은 그 용맹과 특히 중기병으로 유명한데, 

유럽에 가장 먼저 등자Stirriups를 보급한 사람들이 바로 고트족이었습니다. 

상당한 무게를 안정적으로 버틸수 있게 해 주었고, 재갈에서 손을 떼고 동시에 양손으로 무기를 다룰 수 있었으며, 무기를 가지고 격돌해도 등자가 있는 쪽이 훨씬 버티면서 적을 떨어뜨리는데 우세하였습니다. 


또한 이전에는 말에서 떨어지지 않고 잘 버티는 스킬이 훠어얼씬 중요하였다면, 이제는 적당한 승마기술을 가지고, 힘쎄고 전투기술이 능한 사람들이면 충분히 중장기병으로 나설 수 있게 된 거죠.  

좀 과장해서 이야기 하자면, 이 등자의 등장으로 중기병, 즉 기사계급이 등장하는 발판이 됩니다. 


생각해보면 야만적이라는 거니 아예 상관없지는 않군요.

=====================================================================


1710년, 잘나가는 프랑스 왕립 건축 아카데미Académie d'Architecture 회의록에서, 끝이 뾰족한 아치Pointed Arch가 유행처럼 퍼져나가는것에 대하여 언급했습니다. 대부분’고딕’에 속하는 이런 새로운 양식에 사람들은 부정적이었다.-라는 기록이 남아 있습니다.  

자 여기서도 고딕이라는 말이 언급이 됩니다. 
한마디로 비주류를 일컫는 말이었던 거죠. 


12세기말의 유럽은 도시국가와 여러 왕국으로 이루어져 있었습니다. 현재의 독일, 네덜란드, 벨기에, 룩셈부르크, 스위스, 오스트리아, 동부 프랑스와 베니스를 제외한 대부분의 북부 이탈리아는 신성로마제국령이라고 불렸으나 지방영주는 각자 자치를 누리고 있었습니다. 프랑스, 포르투갈, 스코틀랜드, 캐스틸, 아라곤, 나바르, 시실리 그리고 사이프러스는 독립된 왕국이었습니다. 엔지빈(앙쥬) 제국은 영국과 프랑스일부를 점령했습니다. 이 앙쥬 왕이 고딕 문화를 프랑스에서 남부 이탈리로 전했으며, 뤼지냥 왕때 Lusignan 프랑스 고딕건축이 사이프러스로 전해지게 됩니다. 

이 시기에 유럽은 마을/도시의 성장에 따라 급속하게 발전합니다. 독일부근은 한자동맹Hanseatic League을 통해 상대적으로 평화로운 시기를 타고 많은 발전이 이루어집니다. 도시가 성장함에 따라 민간건축의 중요도가 부각되고, 부와 권세를 표현하는 수단이 됩니다. 영국과 프랑스는 봉건주의로 남아있었고 지방의 대규모 건축은 그들의 영주를 위한 건축이 주 목표가 되었습니다. 

스페인령은 이미 산산조각~ 


재료(Materials)

각 지방마다 구할 수 있던 재료에 따라 특색이 있는데

프랑스에서는 깽Caen 지방에서 고품질의 석회암을 확보할 수 있었으며, 조각장식이 선호되었습니다. 

장식이에요 장식.


영국은 거친 석회암과 붉은 사암, 퍼벡 대리석을 장식으로 사용하였습니다. 


위: Purbeck 대리석. 우리는 칼라로 승부한다.


고딕 건축평면의 변화 

고딕건축에서 라틴 크로스의 머리부분에 해당하는  Apse 부분이 크게 확장됩니다. 

주로 제단이 있는 곳으로서 신성시되는 부분의 장식과 규모가 엄청나게 확장됩니다.

좌측 로마네스크 성당의 형태와 비교해 보세요. 

이 앱스부분은 그야말로 스테인드 글라스의 향연으로서 내부의 신성한 분위기를 극대화했습니다. 

안보여서 그렇지 어두운 부분 장식 하나 하나 보면 이렇습니다. 
디테일 하면 고딕이죠


첨두아치 Pointed Arch의 사용

첨두아치 Pointed Arch는 이슬람(페르시안)에서 영향을 받은것이라고도 합니다. 


이슬람 아치.


반원을 교차반복하며 우연적으로 얻었다는 설도 있습니다. 

여튼, 반원만 거의 존재했던 로마네스크에서 진일보한 수식어로서 

일단 기능적으로 기존의 라운드 아치보다 

첨두아치는 하중을 더 수직에 가까운 쪽으로 분산할 수 있었습니다.  



측벽으로 벌어지려는 힘 P는 대폭 줄어들었으며, 그나마도 부벽 Flying Buttress로 상당 부분 해소할 수 있어 

더욱더 높고 넓은 공간을 시도할 수 있게 되었습니다. 


지붕을 이루는 교차 볼트에 대각선으로 리브(보강재)를 댐으로서 

더더욱 얇은 돌로 천정을 덮을 수 있게되어 경량화 할 수 있었고, 이는 더욱 높은 천정을 가능케 하였습니다. 


포인티드 아치는 장식적이며, 구조적으로도 완성도가 높아 거의 모든 개구부와 장식에 사용되게 됩니다. 

중첩된  첨두아치는 창의 크기와 문의 크기도 더더욱 넓힐 수 있는 계기가 되었습니다. 



포인티드 아치 자체로서 내포하는 수직상승에의 특징과 더불어 

고딕건축의 내부 천정의 높이는 상승가도를 달리게 됩니다. 

성서의 내용이 곳곳이 그려지고 새겨진 천정은 그야말로 천국의 동음이의어였으며 

국가나 신앙, 때론 자존심까지 건 높이를 경쟁하기 시작했고 보베는 측랑이 무너지고 

Amien아미앵 성당에서는 천정이 무너지는 등 사고까지 속출했습니다.

(독일의 보베 성당과 프랑스의 아미앵 성당은 서로 대놓고 경쟁관계에 있었습니다.) 


48m의 세계 최고 내부 천정 높이를 자랑하는 프랑스의 보베Beauvais 성당.

'하단' 아일 Aisles  높이만 해도 아득합니다. 


Flying Buttress

건물상부의 하중을 아치로 받아내게 되면 무게 벡터는 비스듬하게 횡력으로 나타납니다.

즉, 벽이 바깥으로 쓰러지려고 하게 되죠. 이를 낮은 높이에서는 버트레스Buttress로 받아낼 수 있었습니다.

그러나 높이가 점점 높아지면서 도저히 하부를 지지하는 것만으로는 이를 감당할 수 없게 되자, 외부에 높은 탑을 세워 부벽을 이 탑과 연결하게 됩니다. 이를 부벽 Flying Buttress라고 부릅니다.

빛을 받아들이는 창은 클리어스토리와 트리포리움에 집중되어 있습니다. 

안쪽에서 바라본 클리어스토리와 트리포리움.

플라잉 버트레스와 부속된 각종 장식들은 

고딕의 정수를 느끼게 해 줍니다. 


피나클 상세도


플라잉 버트레스의 상부 뾰족한 작은 탑을 

피나클 Pinnacle 이라고 부릅니다.

왜 정점이라는 의미를 담고 있는지 알 수 있는 부분이지요. 

보베성당의 버트레스는 그림자와 어울려 무서운 실루엣을 만들어 내는군요. 


정면부 타워의 발전


로마네스크에서 추가되기 시작한 타워는 점점 더 규모를 더해가고 

앞으로 전진해 파사드의 대부분을 채우기 시작합니다. 

독일 쾰른 대성당의 전면부. 타워가 거의 80%를 차지하고 있습니다. 
1248년부터 짓기 시작하여 1880년에 완공되었습니다. (600년)
가우디 성당 얼른지으라고 보채지 마세요 성당건축이 원래 그렇습니다(응?)

기계문명이 없었다면(증기기관) 도저히 완성될 수 없었지요.
정말로 이쯤되면 감성적으로 경건함을 넘어 외경심과 두려움이 느껴질 정도네요.

프랑스 노틀담 성당의 전면부. 
이 성당도 타워가 정면의 일부가 되었습니다. 


결론

로마 건축에서 완성된 아치와 볼트의 개념은 

카톨릭의 발전과 그 성소에 대한 요구로 로마네스크 건축에서 더욱 아름답게 발전되었으며, 

12C부터 등장한 포인티드 아치, 리브드 볼트, 플라잉 버트레스 등의 다양한 구조적 발견에 힘입어 고딕건축이 시작됩니다.

기존은 괴이하다고 그 건축양식을 비하하였으나, 그를 압도할 만한 장점은 모든 비난을 털어내고 더 넒고 높은 공간을 추구해 나갑니다.

중세 다크에이지. 전쟁과 전염병이 온 유럽을 휩쓸고 비참하고 모두가 살아가는게 힘들었던 시절,

종교에 대한 구원과 열망은 곧 거대한 권력과 권세로 이어지고 이 자존심과

신성한 공간에 대한 추구와 결합하여 곧 높이에의 경쟁으로 이어집니다. 

도시의, 주교의, 국가의 자존심이었으며 

온갖 화려한 치장과 장식, 금박, 최고의 예술가들이 도시에 지역마다 수많은 예술품을 만들어 냈습니다.



그리스 사원부터 바실리카, 고딕성당까지.
서로 전혀 다른 것 같지만, 사실 구조적인 몇 장치만 빼면, 기본은 거의 같습니다. 
이 높이를 이루기 위해 무려 인류는 몇 천년을 고민했지요. 
하늘에, 높게 다가가는 것, 그 공간을 만들기 위한- 중력과의 투쟁의 역사.
이는 역사와, 정치, 사회, 기술, 재료등을 총동원한 큰 일이었습니다.
역대 어떠한 왕정도 그 스스로를 위해 이렇게 높은 내부 천장을 구현한 역사가 없습니다.
이러한 성당건축은 바로 '종교'적인 무언가를 베이스로 설정하지 않는다면 나오기 힘든 건축물 이지요.

이러한 역사적 건축풍 그 나라, 그 지역에 살던 사람들에게는 자연스럽게 녹아 있는 생활입니다. 

비록 화려하지 않더라도 이러한 역사와, 구조발전을 기반으로 창조해 나간다면 오히려 신기하고 새로운 경험이라 받아들일 수도 있지만
화려하더라도 단지 겉 장식만 따라서 모방하고, 발전 순서가 뒤집혔으며 그 안의 이야기를 읽지 못한다면 그것은 바로 Fake가 됩니다.


오오 고딕 고딕...


자 동굴부터 고딕까지 마쳤습니다. 지금까지 참 오랜 시간을 함께 걸었군요! 지루하진 않으셨나요?

다음으로는 이제 이런 전통적인 석조나 성당건축과는 궤를 달리하는 

새로운 충격NEW ERA을 맞이하게 됩니다. 

바로 철큰콘크리트와 철골을 기초로 한 마천루 Skyscrapers의 시대

그리고 그를 가능하게 했던 도미노 시스템, 유니버설 스페이스등을 마지막 편으로 소개하려고 했지만

현재 저의 신변적인 일로 인하여 부득이하게 연재를 잠시 중단하게 될 것 같습니다. 


뭔가 정해지는 대로 다시 돌아 오겠습니다. 

주변을 따뜻하게 바라보는 마음만 있으면, 색색의 빛, 그리고 사람들을 관찰하시면

생각보다 더 많은 즐거운 이야기들이 우리 주변에 있다고 생각합니다. 

언제나 행복하시고, 즐거운 하루 되십시요. 

독자여러분 사랑해요~

I'll be back




반응형
,