SlideShare a Scribd company logo
1 of 29
글꼴 렌더링 이야기
[DevRookie]꽝매니아
왜 글꼴 렌더링 인가?
너무 편하게 쓰려다가…
너무 이쁘게 쓰려다가…
도대체 어떻게 글씨를 그릴까?
글꼴이란?
글꼴의 타입
 비트맵 서체
 외곽선 서체
 화면용 서체
비트맵 서체
외곽선 서체
화면용 서체
몇가지 용어 정리
 글리프 ( Glyph ) : 자형(字形)
 글자 여백 ( side bearing ) : 글자간 공백 간격
 고정 너비, 비례 너비
 커닝 (Kerning ) : 글자별로 자간 간격 조정
 글자 너비 (character width ) : 자형 실제 너비
 이음자 : 2-3글자를 하나로 합쳐서 만든 글자.
최적화 이슈
 화면 상에서 글자가 어떻게 렌더링 되고 있을까요?
자형 당 정점버퍼 사용구조
 비트맵 글꼴의 일반적인 사용방식
 한 글자당 정점버퍼 정보를 저장해 두고 있다가 실행할때 갱
  신?
 글자마다 DrawCall 이 걸리게 되면 잠재적인 렌더링 병목현상
  을 초래
글꼴 텍스쳐 페이지 사용
 벡터 그래픽 글씨를 비트맵에 그려 놓는다.
 한글자가 들어갈 위치를 지정한 기하정보를 구성한다.
 UV 위치를 비트맵의 해당 글자 위치로 지정한다.
 이렇게 할 경우, 해상도가 서로 안맞을때는?
 가격대 성능비가 좋다.
글꼴 텍스쳐 페이지
여기에 추가적으로…
 해상도에 의한 글꼴 왜곡 문제를 막기 위한 기법들도 있다.
 왜곡되는 글자 외곽선을 번짐이나 안티 앨리어싱 하는 방법.
http://www.valvesoftware.com/publications/2007/
SIGGRAPH2007_AlphaTestedMagnification.pdf
왜 이렇게 했을까?
                          뒤는 맡겨 두라구!
- 글자 텍스쳐 변경을 리소스 변경없이
스크립트와 환경 변수값으로 깔끔하게 처리
- 물론, 비용이 없는건 아니다! (텍스쳐
한장 쓸꺼 두장 쓰는격?)
일괄적인 DrawCall 진행?
 글자 렌더링을 위한 기하구조의 일괄적인 처리
 매 프레임 마다 기하구조 갱신
 커스텀 쉐이더, 렌더 스테이트 등에 의해 개별적인 구성 필요
 고해상도 글꼴이나 자형 크기에 따른 텍스쳐 페이지 설정
D3DLOCK_DISCARD
 버텍스 버퍼 정보구조를 GPU에 올릴때 정점 버퍼의 Lock 비
  용
 자형별로 했다가는… 꽤나 병목현상이 발생할 수 있다.
 새로운 버퍼를 GPU로 부터 넘겨받아 바로 기록을 시작.
 정점 버퍼가 렌더링 되고 있는 동안에도 갱신을 할 수 있다.
 하지만, 폐기되는 버퍼량에 대한 문제가 제기될 수 있다.
정점 압축
 정점 정보 구조체 안의 양을 줄여보자.
 Shader X2 : ‘최소한의 정점 버퍼 잠금으로 입자들을 화면 정
  렬하기’ 참고
 Screen-safe 형식이 아닌 billboard 정렬 shading 구조
 정점하나에 rightFactor, upFactor 저장해서 쉐이더에 넘기고
 쉐이더에서 카메라 좌표축에 의해 빌보드 사각형을 정렬한다.
 정점 위치 이동계산을 GPU로 넘길 수 있다.
 정점 버퍼 Lock을 하면서 갱신하지 않아도 된다.
쉬어 갑시다.
인스턴싱(Instancing)은 어떨
까?
 Shader Model 3.0 기준
 Geometry Instancing 을 사용해 보는 방법
 하지만, 일괄 단위 처리를 하는 상황에서의 추가부담이 크다.
 일부 하드웨어에 따라 성능차이가 많이 나는 단점.
 하위 버전 호환을 위한 인스턴싱 작업 추가. (성능 장담은…)
 동일한 글자를 여러 번 렌더링 할때 효과적일 수 있다.
 따라서, 한글 등의 특수한 글자들에 한해 효과가 그리 크지 못
  하다.
쉐이더 상수 배열을 이용한 인스턴
싱
 Constant Array 에 개별 자형 특성 정보를 만든다.
 위치/크기, 텍스쳐 좌표위치/크기, 색상
 정점 당 네 개의 버퍼 크기가 크게 줄어든다.
 하지만, 앞에서 말한 문제점을 다 해결하기에는 역부족
상수 배열 인스턴싱
추가적인 고려사항 - 정렬
 복수개의 텍스트가 화면상에 겹치게 될때 렌더링 순서
 1) 텍스트를 사용하는 오브젝트의 렌더링 순서에 따라 정렬
 예 – 아이템/케릭터 이름 표시
 2) 텍스트가 입력된 순서에 의한 정렬 자료구조 구성
 예 – 게임 화면상에서의 채팅문구 표시
 3) 겹치지 않게 재정렬
 예 – 디아블로 아이템 이름 표시
추가적인 고려사항 – 절단 위치
 렌더링 할 글꼴이 화면을 넘어갈때
 아예 그리지 않게 선처리. (깔끔해!)
 화면 공간 좌표에 변환해서 화면안으로 정렬되게 처리
 추가적인 재정렬 연산 이 발생
 텍스트가 잘려 보이는 건 UI 입장에서
불편해 보인다.
Q/A
Thanks & References
 GPG 8권 : ‘인스턴싱을 이용한 빠른 글꼴 렌더링’
 http://www.valvesoftware.com/publications/2007/
SIGGRAPH2007_AlphaTestedMagnification.pdf
 Shader X2 Tip&Tricks : ‘최소한의 정점 버퍼 잠금으로 입자들
  을 화면 정렬하기’

More Related Content

What's hot

Shaderstudy Motion Blur
Shaderstudy Motion BlurShaderstudy Motion Blur
Shaderstudy Motion Bluryong gyun im
 
1.c term project report
1.c term project report1.c term project report
1.c term project report호상 장
 
NDC2015 광개토태왕 테크니컬 아트
NDC2015 광개토태왕 테크니컬 아트NDC2015 광개토태왕 테크니컬 아트
NDC2015 광개토태왕 테크니컬 아트재철 황
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술henjeon
 
MMORPG게임엔진의 현재와미래 by 장언일
MMORPG게임엔진의 현재와미래 by 장언일MMORPG게임엔진의 현재와미래 by 장언일
MMORPG게임엔진의 현재와미래 by 장언일drandom
 
191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering191019 Forward / Deferred Rendering
191019 Forward / Deferred RenderingKWANGIL KIM
 
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략[박민근] 3 d렌더링 옵티마이징_5 최적화 전략
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략MinGeun Park
 
니시카와젠지의 3 d 게임 팬을 위한 ps4
니시카와젠지의 3 d 게임 팬을 위한 ps4니시카와젠지의 3 d 게임 팬을 위한 ps4
니시카와젠지의 3 d 게임 팬을 위한 ps4민웅 이
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술Ki Hyunwoo
 
Voxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseVoxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseYEONG-CHEON YOU
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shadingMinGeun Park
 
Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기JP Jung
 
multi plaform Full3D MMO 만들기 "삼국지를 품다"의 테크니컬 아트
multi plaform Full3D MMO 만들기 "삼국지를 품다"의 테크니컬 아트multi plaform Full3D MMO 만들기 "삼국지를 품다"의 테크니컬 아트
multi plaform Full3D MMO 만들기 "삼국지를 품다"의 테크니컬 아트JP Jung
 
게임 개발을 위한 렌더링 기법 한성환
게임 개발을 위한 렌더링 기법   한성환게임 개발을 위한 렌더링 기법   한성환
게임 개발을 위한 렌더링 기법 한성환Yggdrasil610
 
모바일 엔진 개발기
모바일 엔진 개발기모바일 엔진 개발기
모바일 엔진 개발기changehee lee
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희changehee lee
 
셰이더가 뭐에요?
셰이더가 뭐에요?셰이더가 뭐에요?
셰이더가 뭐에요?Jungsoo Park
 

What's hot (19)

Shaderstudy Motion Blur
Shaderstudy Motion BlurShaderstudy Motion Blur
Shaderstudy Motion Blur
 
1.c term project report
1.c term project report1.c term project report
1.c term project report
 
NDC2015 광개토태왕 테크니컬 아트
NDC2015 광개토태왕 테크니컬 아트NDC2015 광개토태왕 테크니컬 아트
NDC2015 광개토태왕 테크니컬 아트
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
 
MMORPG게임엔진의 현재와미래 by 장언일
MMORPG게임엔진의 현재와미래 by 장언일MMORPG게임엔진의 현재와미래 by 장언일
MMORPG게임엔진의 현재와미래 by 장언일
 
191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering
 
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략[박민근] 3 d렌더링 옵티마이징_5 최적화 전략
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략
 
니시카와젠지의 3 d 게임 팬을 위한 ps4
니시카와젠지의 3 d 게임 팬을 위한 ps4니시카와젠지의 3 d 게임 팬을 위한 ps4
니시카와젠지의 3 d 게임 팬을 위한 ps4
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
 
Voxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseVoxel based game_optimazation_relelase
Voxel based game_optimazation_relelase
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 
Shader compilation
Shader compilationShader compilation
Shader compilation
 
Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기
 
gv006 ver0.1
gv006 ver0.1gv006 ver0.1
gv006 ver0.1
 
multi plaform Full3D MMO 만들기 "삼국지를 품다"의 테크니컬 아트
multi plaform Full3D MMO 만들기 "삼국지를 품다"의 테크니컬 아트multi plaform Full3D MMO 만들기 "삼국지를 품다"의 테크니컬 아트
multi plaform Full3D MMO 만들기 "삼국지를 품다"의 테크니컬 아트
 
게임 개발을 위한 렌더링 기법 한성환
게임 개발을 위한 렌더링 기법   한성환게임 개발을 위한 렌더링 기법   한성환
게임 개발을 위한 렌더링 기법 한성환
 
모바일 엔진 개발기
모바일 엔진 개발기모바일 엔진 개발기
모바일 엔진 개발기
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희
 
셰이더가 뭐에요?
셰이더가 뭐에요?셰이더가 뭐에요?
셰이더가 뭐에요?
 

Similar to 글꼴 렌더링 이야기

NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집noerror
 
Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례
Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례
Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례SangYun Yi
 
Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Minsu Park
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법YEONG-CHEON YOU
 
모바일 게임 최적화
모바일 게임 최적화 모바일 게임 최적화
모바일 게임 최적화 tartist
 
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기Chang W. Doh
 
웹 기반 하이퍼포먼스 그래픽 처리 - 문경두
웹 기반 하이퍼포먼스 그래픽 처리 - 문경두웹 기반 하이퍼포먼스 그래픽 처리 - 문경두
웹 기반 하이퍼포먼스 그래픽 처리 - 문경두jscamp_kr
 
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템강 민우
 
실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬현찬 양
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D흥배 최
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012devCAT Studio, NEXON
 
노동진 Mega splatting
노동진 Mega splatting노동진 Mega splatting
노동진 Mega splattingdrandom
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기Chang W. Doh
 
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트강 민우
 
프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer ModelHan Lee
 
브라우저 렌더링 - Reflow와 Repaint 애니메이션 성능 비교
브라우저 렌더링 - Reflow와 Repaint 애니메이션 성능 비교브라우저 렌더링 - Reflow와 Repaint 애니메이션 성능 비교
브라우저 렌더링 - Reflow와 Repaint 애니메이션 성능 비교Wonjun Hwang
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blogozlael ozlael
 

Similar to 글꼴 렌더링 이야기 (20)

NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집
 
Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례
Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례
Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례
 
Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
 
Devtree illu
Devtree illuDevtree illu
Devtree illu
 
모바일 게임 최적화
모바일 게임 최적화 모바일 게임 최적화
모바일 게임 최적화
 
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
 
웹 기반 하이퍼포먼스 그래픽 처리 - 문경두
웹 기반 하이퍼포먼스 그래픽 처리 - 문경두웹 기반 하이퍼포먼스 그래픽 처리 - 문경두
웹 기반 하이퍼포먼스 그래픽 처리 - 문경두
 
Gametech2015
Gametech2015Gametech2015
Gametech2015
 
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
 
실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
 
노동진 Mega splatting
노동진 Mega splatting노동진 Mega splatting
노동진 Mega splatting
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
 
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
 
프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model
 
브라우저 렌더링 - Reflow와 Repaint 애니메이션 성능 비교
브라우저 렌더링 - Reflow와 Repaint 애니메이션 성능 비교브라우저 렌더링 - Reflow와 Repaint 애니메이션 성능 비교
브라우저 렌더링 - Reflow와 Repaint 애니메이션 성능 비교
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blog
 
Modern gpu optimize
Modern gpu optimizeModern gpu optimize
Modern gpu optimize
 

More from Young-jun Jeong

Gpg2권]4 9 하늘상자
Gpg2권]4 9 하늘상자Gpg2권]4 9 하늘상자
Gpg2권]4 9 하늘상자Young-jun Jeong
 
Udk]static mesh & material
Udk]static mesh & materialUdk]static mesh & material
Udk]static mesh & materialYoung-jun Jeong
 
Gpg2 2 1_10_드롭인디버그메모리관리자
Gpg2 2 1_10_드롭인디버그메모리관리자Gpg2 2 1_10_드롭인디버그메모리관리자
Gpg2 2 1_10_드롭인디버그메모리관리자Young-jun Jeong
 
Gpg2 dll로부터 c++_클래스_내보내기
Gpg2 dll로부터 c++_클래스_내보내기Gpg2 dll로부터 c++_클래스_내보내기
Gpg2 dll로부터 c++_클래스_내보내기Young-jun Jeong
 
[추천] 색인기법 김성현
[추천] 색인기법 김성현[추천] 색인기법 김성현
[추천] 색인기법 김성현Young-jun Jeong
 
정렬 알고리즘의 성능 분석
정렬 알고리즘의 성능 분석정렬 알고리즘의 성능 분석
정렬 알고리즘의 성능 분석Young-jun Jeong
 
점근적 복잡도 분석
점근적 복잡도 분석점근적 복잡도 분석
점근적 복잡도 분석Young-jun Jeong
 
알고리즘 기초사항
알고리즘 기초사항알고리즘 기초사항
알고리즘 기초사항Young-jun Jeong
 
기초 알고리즘 스터디 소개
기초 알고리즘 스터디 소개기초 알고리즘 스터디 소개
기초 알고리즘 스터디 소개Young-jun Jeong
 
Gpg1권] 4 5 3 d 충돌 검출
Gpg1권] 4 5 3 d 충돌 검출Gpg1권] 4 5 3 d 충돌 검출
Gpg1권] 4 5 3 d 충돌 검출Young-jun Jeong
 

More from Young-jun Jeong (20)

Gpg2권]4 9 하늘상자
Gpg2권]4 9 하늘상자Gpg2권]4 9 하늘상자
Gpg2권]4 9 하늘상자
 
점, 선, 면
점, 선, 면점, 선, 면
점, 선, 면
 
Kinect sdk사용하기
Kinect sdk사용하기Kinect sdk사용하기
Kinect sdk사용하기
 
Udk]static mesh & material
Udk]static mesh & materialUdk]static mesh & material
Udk]static mesh & material
 
Udk] sound (sound cue)
Udk] sound (sound cue)Udk] sound (sound cue)
Udk] sound (sound cue)
 
Udk] sound (sound cue)
Udk] sound (sound cue)Udk] sound (sound cue)
Udk] sound (sound cue)
 
삼각 함수
삼각 함수삼각 함수
삼각 함수
 
Gpg2 2 1_10_드롭인디버그메모리관리자
Gpg2 2 1_10_드롭인디버그메모리관리자Gpg2 2 1_10_드롭인디버그메모리관리자
Gpg2 2 1_10_드롭인디버그메모리관리자
 
Gpg2 dll로부터 c++_클래스_내보내기
Gpg2 dll로부터 c++_클래스_내보내기Gpg2 dll로부터 c++_클래스_내보내기
Gpg2 dll로부터 c++_클래스_내보내기
 
[추천] 색인기법 김성현
[추천] 색인기법 김성현[추천] 색인기법 김성현
[추천] 색인기법 김성현
 
문자열 검색 (1)
문자열 검색 (1)문자열 검색 (1)
문자열 검색 (1)
 
[Gpg1권]skinning
[Gpg1권]skinning[Gpg1권]skinning
[Gpg1권]skinning
 
2010 독후감
2010 독후감2010 독후감
2010 독후감
 
Kinect pc
Kinect   pcKinect   pc
Kinect pc
 
Kinect pc
Kinect   pcKinect   pc
Kinect pc
 
정렬 알고리즘의 성능 분석
정렬 알고리즘의 성능 분석정렬 알고리즘의 성능 분석
정렬 알고리즘의 성능 분석
 
점근적 복잡도 분석
점근적 복잡도 분석점근적 복잡도 분석
점근적 복잡도 분석
 
알고리즘 기초사항
알고리즘 기초사항알고리즘 기초사항
알고리즘 기초사항
 
기초 알고리즘 스터디 소개
기초 알고리즘 스터디 소개기초 알고리즘 스터디 소개
기초 알고리즘 스터디 소개
 
Gpg1권] 4 5 3 d 충돌 검출
Gpg1권] 4 5 3 d 충돌 검출Gpg1권] 4 5 3 d 충돌 검출
Gpg1권] 4 5 3 d 충돌 검출
 

글꼴 렌더링 이야기

  • 7. 글꼴의 타입  비트맵 서체  외곽선 서체  화면용 서체
  • 11. 몇가지 용어 정리  글리프 ( Glyph ) : 자형(字形)  글자 여백 ( side bearing ) : 글자간 공백 간격  고정 너비, 비례 너비  커닝 (Kerning ) : 글자별로 자간 간격 조정  글자 너비 (character width ) : 자형 실제 너비  이음자 : 2-3글자를 하나로 합쳐서 만든 글자.
  • 12. 최적화 이슈  화면 상에서 글자가 어떻게 렌더링 되고 있을까요?
  • 13. 자형 당 정점버퍼 사용구조  비트맵 글꼴의 일반적인 사용방식  한 글자당 정점버퍼 정보를 저장해 두고 있다가 실행할때 갱 신?  글자마다 DrawCall 이 걸리게 되면 잠재적인 렌더링 병목현상 을 초래
  • 14. 글꼴 텍스쳐 페이지 사용  벡터 그래픽 글씨를 비트맵에 그려 놓는다.  한글자가 들어갈 위치를 지정한 기하정보를 구성한다.  UV 위치를 비트맵의 해당 글자 위치로 지정한다.  이렇게 할 경우, 해상도가 서로 안맞을때는?  가격대 성능비가 좋다.
  • 16. 여기에 추가적으로…  해상도에 의한 글꼴 왜곡 문제를 막기 위한 기법들도 있다.  왜곡되는 글자 외곽선을 번짐이나 안티 앨리어싱 하는 방법.
  • 18. 왜 이렇게 했을까? 뒤는 맡겨 두라구! - 글자 텍스쳐 변경을 리소스 변경없이 스크립트와 환경 변수값으로 깔끔하게 처리 - 물론, 비용이 없는건 아니다! (텍스쳐 한장 쓸꺼 두장 쓰는격?)
  • 19. 일괄적인 DrawCall 진행?  글자 렌더링을 위한 기하구조의 일괄적인 처리  매 프레임 마다 기하구조 갱신  커스텀 쉐이더, 렌더 스테이트 등에 의해 개별적인 구성 필요  고해상도 글꼴이나 자형 크기에 따른 텍스쳐 페이지 설정
  • 20. D3DLOCK_DISCARD  버텍스 버퍼 정보구조를 GPU에 올릴때 정점 버퍼의 Lock 비 용  자형별로 했다가는… 꽤나 병목현상이 발생할 수 있다.  새로운 버퍼를 GPU로 부터 넘겨받아 바로 기록을 시작.  정점 버퍼가 렌더링 되고 있는 동안에도 갱신을 할 수 있다.  하지만, 폐기되는 버퍼량에 대한 문제가 제기될 수 있다.
  • 21. 정점 압축  정점 정보 구조체 안의 양을 줄여보자.  Shader X2 : ‘최소한의 정점 버퍼 잠금으로 입자들을 화면 정 렬하기’ 참고  Screen-safe 형식이 아닌 billboard 정렬 shading 구조  정점하나에 rightFactor, upFactor 저장해서 쉐이더에 넘기고  쉐이더에서 카메라 좌표축에 의해 빌보드 사각형을 정렬한다.  정점 위치 이동계산을 GPU로 넘길 수 있다.  정점 버퍼 Lock을 하면서 갱신하지 않아도 된다.
  • 23. 인스턴싱(Instancing)은 어떨 까?  Shader Model 3.0 기준  Geometry Instancing 을 사용해 보는 방법  하지만, 일괄 단위 처리를 하는 상황에서의 추가부담이 크다.  일부 하드웨어에 따라 성능차이가 많이 나는 단점.  하위 버전 호환을 위한 인스턴싱 작업 추가. (성능 장담은…)  동일한 글자를 여러 번 렌더링 할때 효과적일 수 있다.  따라서, 한글 등의 특수한 글자들에 한해 효과가 그리 크지 못 하다.
  • 24. 쉐이더 상수 배열을 이용한 인스턴 싱  Constant Array 에 개별 자형 특성 정보를 만든다.  위치/크기, 텍스쳐 좌표위치/크기, 색상  정점 당 네 개의 버퍼 크기가 크게 줄어든다.  하지만, 앞에서 말한 문제점을 다 해결하기에는 역부족
  • 26. 추가적인 고려사항 - 정렬  복수개의 텍스트가 화면상에 겹치게 될때 렌더링 순서  1) 텍스트를 사용하는 오브젝트의 렌더링 순서에 따라 정렬  예 – 아이템/케릭터 이름 표시  2) 텍스트가 입력된 순서에 의한 정렬 자료구조 구성  예 – 게임 화면상에서의 채팅문구 표시  3) 겹치지 않게 재정렬  예 – 디아블로 아이템 이름 표시
  • 27. 추가적인 고려사항 – 절단 위치  렌더링 할 글꼴이 화면을 넘어갈때  아예 그리지 않게 선처리. (깔끔해!)  화면 공간 좌표에 변환해서 화면안으로 정렬되게 처리  추가적인 재정렬 연산 이 발생  텍스트가 잘려 보이는 건 UI 입장에서 불편해 보인다.
  • 28. Q/A
  • 29. Thanks & References  GPG 8권 : ‘인스턴싱을 이용한 빠른 글꼴 렌더링’  http://www.valvesoftware.com/publications/2007/ SIGGRAPH2007_AlphaTestedMagnification.pdf  Shader X2 Tip&Tricks : ‘최소한의 정점 버퍼 잠금으로 입자들 을 화면 정렬하기’