KR101687520B1 - 그래픽 프로세싱에서의 타겟 독립적 스텐실링 - Google Patents

그래픽 프로세싱에서의 타겟 독립적 스텐실링 Download PDF

Info

Publication number
KR101687520B1
KR101687520B1 KR1020167006056A KR20167006056A KR101687520B1 KR 101687520 B1 KR101687520 B1 KR 101687520B1 KR 1020167006056 A KR1020167006056 A KR 1020167006056A KR 20167006056 A KR20167006056 A KR 20167006056A KR 101687520 B1 KR101687520 B1 KR 101687520B1
Authority
KR
South Korea
Prior art keywords
path
stencil
gpu
determining
rendering
Prior art date
Application number
KR1020167006056A
Other languages
English (en)
Other versions
KR20160052564A (ko
Inventor
비니트 고엘
우사메 세일란
Original Assignee
퀄컴 인코포레이티드
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 퀄컴 인코포레이티드 filed Critical 퀄컴 인코포레이티드
Publication of KR20160052564A publication Critical patent/KR20160052564A/ko
Application granted granted Critical
Publication of KR101687520B1 publication Critical patent/KR101687520B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T11/002D [Two Dimensional] image generation
    • G06T11/001Texturing; Colouring; Generation of texture or colour
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T11/002D [Two Dimensional] image generation
    • G06T11/20Drawing from basic elements, e.g. lines or circles
    • G06T11/203Drawing of straight lines or curves
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T11/002D [Two Dimensional] image generation
    • G06T11/40Filling a planar surface by adding surface attributes, e.g. colour or texture
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects
    • G06T15/80Shading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/04Texture mapping
    • GPHYSICS
    • G09EDUCATION; CRYPTOGRAPHY; DISPLAY; ADVERTISING; SEALS
    • G09GARRANGEMENTS OR CIRCUITS FOR CONTROL OF INDICATING DEVICES USING STATIC MEANS TO PRESENT VARIABLE INFORMATION
    • G09G5/00Control arrangements or circuits for visual indicators common to cathode-ray tube indicators and other visual indicators
    • G09G5/36Control arrangements or circuits for visual indicators common to cathode-ray tube indicators and other visual indicators characterised by the display of a graphic pattern, e.g. using an all-points-addressable [APA] memory
    • G09G5/363Graphics controllers

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Graphics (AREA)
  • Image Generation (AREA)
  • Controls And Circuits For Display Device (AREA)

Abstract

일 예에서, 그래픽 데이터를 렌더링하는 것은, 이미지의 경로의 각각의 안티에일리어싱된 픽셀 (antialiased pixel) 에 대한 커버리지 값 (coverage value) 을 결정하기 위한 샘플링 레이트를 표시하는 스텐실 파라미터를 결정하는 것, 스텐실 파라미터와는 별도로, 경로의 각각의 안티에일리어싱된 픽셀에 대한 메모리 할당을 표시하는 렌더 타겟 파라미터를 결정하는 것, 및 스텐실 파라미터 및 렌더 타겟 파라미터를 이용하여 경로를 렌더링하는 것을 포함한다.

Description

그래픽 프로세싱에서의 타겟 독립적 스텐실링{TARGET INDEPENDENT STENCILING IN GRAPHICS PROCESSING}
이 출원은 2013 년 8 월 28 일자로 출원된 미국 가출원 제 61/871,260 호의 이익을 주장하고, 그 전체 내용들은 참조에 의해 본원에 편입된다.
본 개시는 그래픽 프로세싱, 특히, 경로 렌더링 (path rendering) 을 위한 기법들에 관한 것이다.
경로 렌더링은 2 차원 (two-dimensional; 2D) 벡터 그래픽 경로들 (대안적으로, 본원에서 "경로들" 로서 지칭됨) 의 렌더링을 지칭할 수도 있고, 이 경로들의 각각은 하나 이상의 경로 세그먼트 (path segment) 들을 포함할 수도 있다. 경로가 2개 이상의 경로 세그먼트들을 포함할 때, 개별적인 경로 세그먼트들은 동일한 타입 또는 상이한 타입들일 수도 있다. 경로 세그먼트들의 타입들은 예를 들어, 라인 (line), 타원 아크 (elliptic arc), 2차 베지어 곡선 (quadratic
Figure 112016021858870-pct00001
curve), 및 3차 베지어 곡선 (cubic Bezier curve) 을 포함할 수도 있다. 일부의 예들에서, 경로 세그먼트 타입들은 예컨대, 개방 벡터 그래픽 (Open Vector Graphics; OpenVG) API 와 같은, 표준 벡터 그래픽 애플리케이션 프로그래밍 인터페이스 (application programming interface; API) 에 따라 정의될 수도 있다.
경로 렌더링은 중앙 프로세싱 유닛 (central processing unit; CPU) 에서 구현될 수도 있다. 그러나, 이러한 접근법은 CPU-집약적일 수도 있고, 그러므로, 다른 CPU 태스크들을 위해 이용가능한 CPU 프로세싱 사이클들의 양을 제한할 수도 있다. 또한, 일부의 경우들에는, 경로 세그먼트를 희망하는 레벨의 상세함으로 렌더링하기 위하여, 상대적으로 대량의 데이터가 그래픽 프로세싱 유닛 (graphics processing unit; GPU) 으로 전송될 필요가 있을 수도 있다. 상대적으로 대량의 데이터는 데이터를 저장할 때에 상당한 양의 메모리 저장 공간을 소비할 수도 있고, 데이터를 GPU 로 전송할 때에 상당한 양의 메모리 대역폭을 소비할 수도 있다.
본 개시는 경로 채우기 (filling) 및 대싱 (dashing) 으로 그래픽 데이터를 생성하기 위한 기법들을 포함한다. 예를 들어, 경로를 채울 때, 본 개시의 양태들에 따르면, GPU 는, 메모리가 렌더링된 데이터 (렌더 타겟으로서 지칭됨) 에 대해 할당되는 레이트와는 상이한 레이트에서 스텐실링 동작 (stenciling operation) 들을 수행할 수도 있다. 즉, 스텐실 동작들을 수행하기 위한 스텐실 파라미터는 렌더링된 데이터를 저장하기 위한 렌더 타겟 파라미터와 독립적으로 특정될 수도 있다.
게다가, 대싱에 대하여, 본 개시의 양태들에 따르면, GPU 는 대시 특성 (dash characteristic) 들을 결정할 수도 있고 단일 렌더링 패스 (rendering pass) 에서 대싱을 수행할 수도 있다. 예를 들어, GPU 는 세그먼트들이 결정될 때에 세그먼트들의 각각의 길이를 계산할 수도 있고, 각각의 대시 세그먼트에 대한 시작 로케이션 (예컨대, 텍스처 좌표) 을 결정하기 위하여 길이 정보를 적용할 수도 있다.
일 예에서, 그래픽 데이터를 렌더링하는 방법은, 이미지의 경로의 각각의 안티에일리어싱된 픽셀 (antialiased pixel) 에 대한 커버리지 값 (coverage value) 을 결정하기 위한 샘플링 레이트를 표시하는 스텐실 파라미터를 결정하는 단계, 스텐실 파라미터와는 별도로, 경로의 각각의 안티에일리어싱된 픽셀에 대한 메모리 할당을 표시하는 렌더 타겟 파라미터를 결정하는 단계, 및 스텐실 파라미터 및 렌더 타겟 파라미터를 이용하여 경로를 렌더링하는 단계를 포함한다.
또 다른 예에서, 그래픽을 렌더링하기 위한 장치는, 이미지의 경로의 각각의 안티에일리어싱된 픽셀에 대한 커버리지 값을 결정하기 위한 샘플링 레이트를 표시하는 스텐실 파라미터를 결정하고, 스텐실 파라미터와는 별도로, 경로의 각각의 안티에일리어싱된 픽셀에 대한 메모리 할당을 표시하는 렌더 타겟 파라미터를 결정하고, 그리고 스텐실 파라미터 및 렌더 타겟 파라미터를 이용하여 경로를 렌더링하도록 구성된 그래픽 프로세싱 유닛 (GPU) 을 포함한다.
또 다른 예에서, 그래픽 데이터를 렌더링하기 위한 장치는, 이미지의 경로의 각각의 안티에일리어싱된 픽셀에 대한 커버리지 값을 결정하기 위한 샘플링 레이트를 표시하는 스텐실 파라미터를 결정하기 위한 수단, 스텐실 파라미터와는 별도로, 경로의 각각의 안티에일리어싱된 픽셀에 대한 메모리 할당을 표시하는 렌더 타겟 파라미터를 결정하기 위한 수단, 및 스텐실 파라미터 및 렌더 타겟 파라미터를 이용하여 경로를 렌더링하기 위한 수단을 포함한다.
또 다른 예에서, 비일시적인 컴퓨터 판독가능 매체는 명령들을 저장하고 있고, 상기 명령들은, 실행될 경우, 그래픽 프로세싱 유닛 (GPU) 으로 하여금, 이미지의 경로의 각각의 안티에일리어싱된 픽셀에 대한 커버리지 값을 결정하기 위한 샘플링 레이트를 표시하는 스텐실 파라미터를 결정하게 하고, 스텐실 파라미터와는 별도로, 경로의 각각의 안티에일리어싱된 픽셀에 대한 메모리 할당을 표시하는 렌더 타겟 파라미터를 결정하게 하고, 그리고 스텐실 파라미터 및 렌더 타겟 파라미터를 이용하여 경로를 렌더링하게 한다.
또 다른 예에서, 그래픽 데이터를 렌더링하는 방법은, 그래픽 프로세싱 유닛 (GPU) 으로, 대시 라인 (dashed line) 의 복수의 순서화된 세그먼트들 중의 현재의 세그먼트에 대한 텍스처 오프셋을 결정하는 단계로서, 복수의 순서화된 세그먼트들 중의 현재의 세그먼트에 대한 텍스처 오프셋은 순서에 있어서 현재의 세그먼트에 선행하는 세그먼트들의 길이들의 누산 (accumulation) 에 기초하는, 상기 텍스처 오프셋을 결정하는 단계, 및 현재의 세그먼트의 로케이션을 결정하기 위하여 텍스처 오프셋을 적용하는 것을 포함하여 현재의 세그먼트를 픽셀 셰이딩 (pixel shading) 하는 단계를 포함한다.
또 다른 예에서, 그래픽 데이터를 렌더링하기 위한 장치는, 대시 라인의 복수의 순서화된 세그먼트들 중의 현재의 세그먼트에 대한 텍스처 오프셋을 결정하는 것으로서, 복수의 순서화된 세그먼트들 중의 현재의 세그먼트에 대한 텍스처 오프셋은 순서에 있어서 현재의 세그먼트에 선행하는 세그먼트들의 길이들의 누산에 기초하는, 상기 텍스처 오프셋을 결정하고, 그리고 현재의 세그먼트의 로케이션을 결정하기 위하여 텍스처 오프셋을 적용하는 것을 포함하여 현재의 세그먼트를 픽셀 셰이딩하도록 구성된 그래픽 프로세싱 유닛 (GPU) 을 포함한다.
또 다른 예에서, 그래픽 데이터를 렌더링하기 위한 장치는, 그래픽 프로세싱 유닛 (GPU) 으로, 대시 라인의 복수의 순서화된 세그먼트들 중의 현재의 세그먼트에 대한 텍스처 오프셋을 결정하기 위한 수단으로서, 복수의 순서화된 세그먼트들 중의 현재의 세그먼트에 대한 텍스처 오프셋은 순서에 있어서 현재의 세그먼트에 선행하는 세그먼트들의 길이들의 누산에 기초하는, 상기 텍스처 오프셋을 결정하기 위한 수단, 및 현재의 세그먼트의 로케이션을 결정하기 위하여 텍스처 오프셋을 적용하는 것을 포함하여 현재의 세그먼트를 픽셀 셰이딩하기 위한 수단을 포함한다.
또 다른 예에서, 비일시적인 컴퓨터 판독가능 매체는 명령들을 저장하고 있고, 상기 명령들은, 실행될 경우, 그래픽 프로세싱 유닛 (GPU) 으로 하여금, 대시 라인의 복수의 순서화된 세그먼트들 중의 현재의 세그먼트에 대한 텍스처 오프셋을 결정하게 하는 것으로서, 복수의 순서화된 세그먼트들 중의 현재의 세그먼트에 대한 텍스처 오프셋은 순서에 있어서 현재의 세그먼트에 선행하는 세그먼트들의 길이들의 누산에 기초하는, 상기 텍스처 오프셋을 결정하게 하고, 그리고 현재의 세그먼트의 로케이션을 결정하기 위하여 텍스처 오프셋을 적용하는 것을 포함하여 현재의 세그먼트를 픽셀 셰이딩하게 하도록 구성된다.
본 개시의 하나 이상의 예들의 세부사항들은 첨부한 도면들 및 이하의 설명에서 기재된다. 개시의 다른 특징들, 목적들, 및 장점들은 설명 및 도면들로부터, 그리고 청구항들로부터 명백할 것이다.
도 1 은 본 개시의 기법들을 구현하기 위하여 이용될 수도 있는 일 예의 컴퓨팅 디바이스를 예시하는 블록도이다.
도 2 는 도 1 에서의 컴퓨팅 디바이스의 CPU, GPU, 및 메모리를 더욱 상세하게 예시하는 블록도이다.
도 3 은 본 개시의 기법들을 수행하기 위하여 이용될 수도 있는 일 예의 그래픽 파이프라인을 예시하는 개념도이다.
도 4 는 렌더링되어야 할 일 예의 경로의 도면이다.
도 5a 내지 도 5c 는 도 4 에서 도시된 경로에 대한 채우기 동작들의 일 예의 시퀀스 (sequence) 를 예시하는 도면들이다.
도 6 은 스텐실링 동작을 예시하는 개념도이다.
도 7 은 본 개시의 양태들에 따라, 일 예의 채우기 동작을 예시하는 개념도이다.
도 8 은 본 개시의 양태들에 따라, 렌더링 동안의 대역폭을 예시하는 그래프이다.
도 9a 내지 도 9d 는 도 4 에서 도시된 경로에 대한 일 예의 대싱 동작을 예시하는 도면들의 시퀀스이다.
도 10 은 본 개시의 양태들에 따라, 그래픽 데이터를 렌더링하기 위한 일 예의 프로세스를 예시하는 흐름도이다.
도 11 은 본 개시의 양태들에 따라, 대싱하기 위한 일 예의 프로세스를 예시하는 흐름도이다.
본 개시는 GPU 기반 경로 렌더링을 수행하기 위한 기법들에 관한 것이다. 경로 렌더링은 2 차원 (2D) 벡터 그래픽 경로들 (대안적으로, 본원에서 "경로들" 로서 지칭됨) 의 렌더링을 지칭할 수도 있고, 이 경로들의 각각은 하나 이상의 경로 세그먼트들을 포함할 수도 있다. 경로가 2개 이상의 경로 세그먼트들을 포함할 때, 개별적인 경로 세그먼트들은 동일한 타입 또는 상이한 타입들일 수도 있다. 경로 세그먼트들의 타입들은 예를 들어, 라인, 타원 아크, 2차 베지어 곡선, 및 3차 베지어 곡선을 포함할 수도 있다. 일부의 예들에서, 경로 세그먼트 타입들은 예컨대, 개방 벡터 그래픽 (OpenVG) API 와 같은, 표준 벡터 그래픽 애플리케이션 프로그래밍 인터페이스 (API) 에 따라 정의될 수도 있다.
GPU 들은, 하나 이상의 3 차원 (3D) 그래픽 API 들과 호환하도록 설계되는 3D 그래픽 파이프라인을 전형적으로 구현한다. 오늘날 이용 중인 유력한 3D 그래픽 API 들은 호환 디바이스들이 경로 렌더링 커맨드들을 지원할 것을 요구하지 않으므로, 최신 GPU 들은 종종, 경로 렌더링 커맨드들에 대한 하드웨어 가속을 거의 제공하지 않거나 전혀 제공하지 않는다. 예를 들어, 최신 GPU 에서 구현된 전형적인 3D 그래픽 파이프라인은, (예컨대, 포인트 (point) 들, 라인들, 및 삼각형들과 같은) 낮은-순서, 비-곡선의, 3D 그래픽 프리미티브 (graphics primitive) 들을 래스터화 (rasterize) 하도록 설계되지만, (예컨대, 타원 아크들 및 베지어 곡선들과 같은) 곡선의 경로 렌더링 프리미티브들을 직접적으로 렌더링할 수 없는 래스터라이저 (rasterizer) 를 포함할 수도 있다.
경로 렌더링을 위한 하나의 접근법은 경로 렌더링 커맨드들의 실행을 위한 부분 GPU 하드웨어 가속을 제공하기 위하여 3D GPU 파이프라인을 이용하는 것을 수반할 수도 있다. 이 접근법은 경로 세그먼트를, GPU 에 의해 래스터화될 수 있는 하나 이상의 낮은-순서, 비-곡선의, 3D 그래픽 프리미티브들로 변환하기 위하여 경로 세그먼트를 중앙 프로세싱 유닛 (CPU) 으로 사전프로세싱 (preprocessing) 하는 것을 수반한다. 예를 들어, CPU 는 곡선의 경로 세그먼트 (예컨대, 타원 아크 또는 베지어 곡선) 를, 경로 세그먼트의 곡률을 근사화하는 상대적으로 작은 삼각형들의 세트로 테셀레이팅 (tessellating) 할 수도 있고, 삼각형들의 세트가 GPU 를 이용하여 렌더링되게 할 수도 있다. 그러나, 이러한 접근법은 CPU-집약적일 수도 있고, 그러므로, 다른 CPU 태스크들을 위해 이용가능한 CPU 프로세싱 사이클들의 양을 제한할 수도 있다. 또한, 일부의 경우들에는, 상대적으로 대량의 삼각형들이 경로 세그먼트를 희망하는 레벨의 상세함으로 렌더링하기 위하여 필요하게 될 수도 있다. 상대적으로 대량의 삼각형들은 데이터를 저장할 때에 상당한 양의 메모리 저장 공간을 소비할 수도 있고, 데이터를 GPU 로 전송할 때에 상당한 양의 메모리 대역폭을 소비할 수도 있다.
경로 렌더링 커맨드들의 실행을 위한 부분-대-전체 (partial-to-total) GPU 하드웨어 가속을 제공하기 위한 또 다른 접근법은 전용, 하드웨어-가속된, 경로 렌더링 파이프라인을 지원하기 위하여 GPU 의 아키텍처를 수정하는 것을 수반할 수도 있다. 그러나, 유력한 3D 그래픽 API 들 (예컨대, Microsoft? DirectX 11 (DX) API) 은 GPU 아키텍처가 전용 경로 렌더링 파이프라인을 포함할 것을 전형적으로 요구하지 않으므로, 이러한 접근법은 특정 3D 그래픽 API (예컨대, DX 11 API) 와 호환되는 모든 GPU 들에 의해 지원되도록 보장될 교차-플랫폼, 하드웨어-가속된, 경로 렌더링 솔루션으로 귀착되지 않는다.
일부의 예들에서는, GPU 가 수신된 경로 세그먼트를 복수의 라인 세그먼트들로 테셀레이팅하고 3D 그래픽 파이프라인을 이용하여 테셀레이팅된 라인 세그먼트들을 렌더링하도록 구성되는 GPU-기반 경로 렌더링 기법이 이용될 수도 있다. 경로 세그먼트를 라인 세그먼트들로 테셀레이팅하기 위하여 GPU 를 이용함으로써, 경로 세그먼트들을 사전프로세싱하는 부담은 CPU 로부터 덜어내어져서, 이것에 의해, 다른 CPU 태스크들을 위한 프로세싱 자원들을 해방시킨다. 또한, 일부의 예들에서, GPU 는, 일부의 예들에서 GPU 가 CPU 보다 더욱 효율적인 방식으로 경로 세그먼트를 렌더링하도록 할 수도 있는 테셀레이션 동작들을 수행하기 위하여 고속-병렬, 최신 GPU 테셀레이션 아키텍처를 사용할 수도 있다. 게다가, 테셀레이션은 CPU 에서가 아니라, GPU 에서 발생하기 때문에, 다수의 테셀레이팅된 프리미티브들은 시스템 메모리 내에 저장될 필요가 없고 CPU 로부터 GPU 로 전달될 필요가 없음으로써, 경로 렌더링을 위해 필요한 메모리 풋프린트 (memory footprint) 뿐만 아니라 경로 렌더링을 위해 필요한 메모리 대역폭도 감소시킨다.
일부의 예들에서, GPU 는 안티에일리어싱을 수행하기 위하여 멀티-샘플 안티-에일리어싱 (multi-sample anti-aliasing; MSAA) 기법을 이용할 수도 있다. 예를 들어, 픽셀들은 균일하게 컬러화되고 항상 동일한 형상이며, 이것은 렌더링된 이미지의 라인들이 외관에 있어서 들쭉날쭉하게 되는 것으로 귀착될 수도 있다. MSAA 에 의하여, 다수의 샘플들이 단일 픽셀에 대해 생성될 수도 있다. 다음으로, 샘플들은 최종 픽셀 값을 결정하기 위하여 결합 (예컨대, 평균화) 될 수도 있다.
따라서, 일부의 사례들에서, GPU 는 디스플레이되고 있는 해상도보다 더 높은 해상도에서 이미지를 렌더링할 수도 있다. 다음으로, GPU 는 디스플레이하기 이전에 이미지를 적절한 사이즈로 다운-샘플링할 수도 있다. 결과는 오브젝트 (object) 들의 에지들을 따라 픽셀들의 하나의 라인으로부터 또 다른 것으로의 더욱 평활한 천이 (transition) 들일 수도 있다. MSAA 는 4, 8, 16, 또는 다른 값들의 인자 (factor) 을 이용하여 수행될 수도 있다. MSAA 를 수행할 때, GPU 는 MSAA 레이트에서 심도 및 스텐실 동작들을 샘플링할 수도 있고, MSAA 레이트에서 메모리를 할당할 수도 있고, MSAA 레이트에서 픽셀들을 래스터화할 수도 있다 (예컨대, 16x MSAA 는 픽셀 당 16x 심도/스텐실 샘플들, 픽셀 당 16x 메모리 할당, 및 픽셀 당 16x 래스터화 샘플들을 포함함).
일반적으로, "타겟" 은 렌더링된 픽셀에 대해 할당된 메모리를 지칭할 수도 있다. 전형적으로, 안티에일리어싱 이미지들에 대하여, 래스터화와 같은 그래픽 동작들을 수행하기 위한 샘플링 레이트 및 렌더링된 타겟에 대한 메모리 할당은 서로, 예컨대, 1:1 로 대응한다. 이에 따라, 예시의 목적들을 위한 예에서, GPU 는 래스터화를 위하여 픽셀 당 16x 의 샘플링 레이트를 이용할 수도 있고, 픽셀 당 16 개의 샘플들을 저장하기 위하여 메모리를 할당할 수도 있다. 그러나, 타겟 독립적 래스터화 (target independent rasterization; TIR) 에서는, 래스터화 프로세스의 샘플링 레이트가 렌더링된 이미지에 대해 할당된 메모리와는 독립적으로 특정될 수도 있다. 예를 들어, 픽셀 당 4 개의 샘플들의 샘플링 레이트는 래스터화를 위해 이용될 수도 있는 반면, 이미지의 픽셀들의 컬러를 저장하기 위한 메모리 할당은 이미지에서 픽셀 당 하나의 컬러일 수도 있다.
TIR 은 래스터화 레이트가 타겟에 대해 할당된 메모리로부터 독립적으로 특정되도록 하지만, 다른 렌더링 동작들은 함께 연결된 상태로 유지될 수도 있다. 예를 들어, (이하에서 더욱 상세하게 설명된 바와 같은) 심도 및 스텐실링 동작들은 렌더 타겟과 전형적으로 연관될 수도 있다. 따라서, 단일 렌더 타겟은 픽셀 당 특정되고, 심도 및 스텐실 동작들은 또한, 동일한 레이트 (즉, 1x 샘플링 레이트) 에서 수행될 수도 있다.
본 개시의 양태들에 따르면, GPU 는 스텐실링 동작들에서 TIR 의 개념을 레버리지로 활용할 수도 있다. 예를 들어, GPU 는 특정 픽셀에 대해 할당되는 메모리의 양보다 더 높은 레이트에서 스텐실링을 수행할 수도 있다. 즉, 스텐실 동작들이 수퍼-샘플링 (super-sampling) 되는, 예컨대, 각각의 픽셀이 16 개의 샘플들을 가질 프로세스에서는, GPU 가 (수퍼 샘플링된 픽셀 중의) 픽셀의 어느 샘플이 스텐실 테스트를 통과하였는지, 예컨대, 특정 경로 내부에 있었는지에 기초하여 픽셀 당 커버리지 값을 연산함으로써 렌더링할 수도 있다. 성능 개선을 위하여, 렌더 타겟은 1x 샘플링될 수도 있는 반면, 스텐실은 16x 샘플링될 수도 있다. GPU 는 샘플 당 스텐실 테스트에 기초하여 각각의 픽셀에 커버리지 값을 배정할 수도 있다. 타겟 및 래스터화 레이트와는 독립적으로 스텐실링 샘플링 레이트를 특정하는 것은 본원에서 스텐실링된 TIR 로서 지칭될 수도 있다.
스텐실링된 TIR 프로세스는 경로 렌더링 동안에 적용될 수도 있다. 예를 들어, 경로 렌더링할 때, GPU 는 경로를 채우기 위하여 다음의 일 예의 기능들을 전형적으로 수행할 수도 있다: 경로를 라인 세그먼트들로 테셀레이팅하고, 삼각형들을 형성하기 위하여 라인 세그먼트들을 피봇 포인트 (pivot point) 에 연결하고, (일부의 사례들에서, 심도 테스트를 수행하는 것을 포함하여) 삼각형들을 스텐실 버퍼로 렌더링하고, 여기서, 스텐실 버퍼는 이미지에서 가시적 픽셀들을 표시한다. 채우기 프로세스의 다음의, 그리고 아마도 최종 단계들은 가능하게 된 스텐실 테스트로 바운딩 박스 (bounding box) 를 렌더링하고 스텐실 버퍼의 내용들을 프레임 버퍼로 복사하는 것이다. 이 접근법은 2 개의 렌더링 패스 (rendering pass) 들, 예컨대, 바운딩 박스를 렌더링하기 위한 하나의 패스 및 텍스처를 렌더링하기 위한 하나의 패스를 요구한다.
본 개시의 양태들에 따르면, GPU 는 바운딩 박스를 사전-프로세싱할 필요 없이, 단일 렌더링 패스에서 경로를 채울 수도 있다. 예를 들어, 일부의 예들에서, GPU 는, 래스터라이저 스테이지에서 이용되는 하드웨어를 포함할 수도 있는 바운딩 박스 유닛을 편입시킬 수도 있다. 예를 들어, 프리미티브들이 스텐실 버퍼로 렌더링될 때, 바운딩 박스 유닛은 주어진 경로의 가장 외부 좌표 포인트들 (예컨대, 상부, 하부, 좌측, 및 우측 극값들) 을 추적할 수도 있다. 가장 외부 좌표 포인트들은 또한, 이 포인트들이 경로의 가장 외부 경계를 표시한다는 의미에서, 최대 경계 포인트들로서 지칭될 수도 있다. 스텐실링이 완료된 후, 바운딩 박스 유닛은 가장 외부 좌표 포인트들에 기초하여 바운딩 직사각형 (bounding rectangle) 을 결정하였다.
상기 예에서, GPU 는 경로의 프리미티브들이 스텐실 버퍼로 렌더링될 때에 경로의 프리미티브들을 셰이딩하지 않는다 (프리미티브들은 스텐실에 영향을 주기만 함). 다음으로, GPU 는 컬러를 배정하기 위하여 스텐실 버퍼를 이용하여 바운딩 박스를 렌더링할 수도 있다. 본 개시의 양태들에 따르면, 스텐실링을 수행하고 바운딩 박스를 결정한 후에는, 또 다른 그리기 호출이 필요하지 않다. 오히려, GPU 는 단일 패스에서 스텐실링된 TIR 을 이용하여 바운딩 박스를 래스터화한다.
이러한 방법으로, 예를 들어, GPU 에서 프리미티브들을 결정하고, CPU 에서 바운딩 박스를 결정하고, GPU 상에서 컬러 동작들을 수행하는 것이 아니라, GPU 는 단일 패스에서 채울 수도 있다 (예컨대, 스텐실 및 컬러 동작들을 수행함). 즉, 본 개시의 기법들은, GPU 가 (예컨대, GPU 가 그 후에 래스터라이저로 푸시 (push) 할 수도 있는 테셀레이션 동안에) 바운딩 박스를 결정하도록 하여, 스텐실 및 컬러 양자가 단일 패스에서 수행될 수 있는 바운딩 박스 최적화를 포함한다.
본 개시의 다른 양태들은 (대시 라인과 같은) 대싱에 관련 있다. 예를 들어, 스트로킹된 경로 (stroked path) 를 대싱할 때, GPU 는 대시 세그먼트들을 (세그먼트 순서로서 지칭된) 순서대로 렌더링할 수도 있고, 이전의 세그먼트들이 멈춘 곳에서 하나의 세그먼트를 생성할 수도 있다. 즉, GPU 는 이전의 세그먼트를 셰이딩한 후에만 대시 패턴에서 각각의 세그먼트에 대한 시작 로케이션을 결정한다. 이러한 연산들은 그래픽 프로세싱의 병렬화를 감소시킬 수도 있고 수행하기 위한 하나를 초과하는 렌더링 패스를 요구할 수도 있는데, 이것은 대시의 각각의 선택에 대한 로케이션들이 올바른 시작 로케이션을 결정하기 위하여 순서대로 프로세싱될 필요가 있기 때문이다.
본 개시의 양태들에 따르면, GPU 는 대시 특성들을 결정할 수도 있고, 단일 패스, 예컨대, 단일 렌더링 패스에서 대싱을 수행할 수도 있다. 예를 들어, GPU 는 세그먼트들이 예컨대, 지오메트리 셰이딩 (geometry shading) 동안에 결정될 때에 세그먼트들의 각각의 길이를 계산할 수도 있다. 즉, GPU 는 현재의 세그먼트의 시작 로케이션을 결정하기 위하여, 세그먼트들, 예컨대, 세그먼트 순서에서 현재의 세그먼트에 선행하는 세그먼트들의 길이들을 누산시킬 수도 있다. 길이들의 이 누산은 본원에서 "프리픽스 길이 (prefix length)" 또는 "프리픽스 합산된 길이 (prefix summed length)" 로서 지칭될 수도 있다. GPU 는 또한, 라인의 전체 길이를 결정할 수도 있다.
예시의 목적들을 위한 예에서, GPU 는 대시 라인의 제 1 세그먼트를 결정할 수도 있다. GPU 는 또한, 대시 라인의 제 2 세그먼트를 결정할 수도 있다. GPU 는 이전의 세그먼트들의 프리픽스 합산된 길이에 기초하여 제 2 세그먼트에 대한 시작 로케이션을 결정할 수도 있다. 즉, GPU 는 이전의 세그먼트들, 즉, 제 1 세그먼트의 길이들의 누산에 기초하여 제 2 세그먼트에 대한 시작 로케이션을 결정할 수도 있다. GPU 는 또한, 대시 라인의 제 3 세그먼트를 결정할 수도 있다. 다시, GPU 는 이전의 세그먼트들의 프리픽스 합산된 길이에 기초하여 제 3 세그먼트에 대한 시작 로케이션을 결정할 수도 있다. 즉, GPU 는 이전의 세그먼트들, 즉, 제 1 세그먼트 및 제 2 세그먼트의 길이들의 누산에 기초하여 제 3 세그먼트에 대한 시작 로케이션을 결정할 수도 있다. GPU 는 라인의 세그먼트들의 각각의 시작 로케이션들이 결정되었을 때까지 이러한 방식으로 계속할 수도 있다.
일부의 예들에서, 대시 라인은 가시적 세그먼트들 및 비가시적 세그먼트들을 포함할 수도 있다. 예를 들어, GPU (12) 는 가시적인 세그먼트들 (예컨대, 라인의 대시들) 에 대한 컬러를 결정할 수도 있고, 비가시적인 세그먼트들 (예컨대, 컬러화된 대시들 사이의 대시 라인의 부분) 폐기할 수도 있다. GPU (12) 는 셰이딩되고 있는 세그먼트의 로케이션에 기초하여, (본원에서 예컨대, 픽셀 셰이딩 동안에 프래그먼트 (fragment) 로서 상호 교환가능하게 지칭될 수도 있는) 세그먼트를 보유할 것인지 여부를 결정할 수도 있다. 일 예로서 위에서 설명된 3 개의 세그먼트들에 대하여, 대시 라인의 제 1 및 제 3 세그먼트들과, 제 2 세그먼트는 컬러화되지 않은 제 1 및 제 3 세그먼트들을 분리시키는 비가시적 세그먼트인 것으로 가정한다. GPU (12) 는 세그먼트들의 로케이션들에 기초하여, 픽셀 셰이딩 동안에 세그먼트들을 보유 (예컨대, 컬러로 셰이딩) 할 것인지 또는 폐기할 것인지 여부를 결정할 수도 있다. 즉, GPU (12) 는 제 1 세그먼트의 로케이션에 기초하여 제 1 세그먼트가 보유되는 것으로 결정할 수도 있고, 제 2 세그먼트의 로케이션에 기초하여 제 2 세그먼트가 폐기되는 것으로 결정할 수도 있고, 제 3 세그먼트의 로케이션에 기초하여 제 3 세그먼트가 보유되는 것으로 결정할 수도 있다.
본 개시의 양태들에 따르면, GPU 는 렌더링 동안에 각각의 세그먼트에 대한 프리픽스 합산된 길이를 텍스처 오프셋으로서 적용할 수도 있다. 예를 들어, 세그먼트를 래스터화한 후, GPU 는 세그먼트에 대한 프리픽스 합산된 길이의 값을 텍스처 오프셋 값으로서 픽셀 셰이더 (pixel shader) 에 공급할 수도 있다. GPU 는 셰이딩되고 있는 세그먼트의 로케이션을 결정하기 위하여 텍스처 오프셋을 라인의 시작부의 텍스처 좌표들에 적용할 수도 있다.
도 1 은 본 개시의 기법들을 구현하기 위하여 이용될 수도 있는 일 예의 컴퓨팅 디바이스 (2) 를 예시하는 블록도이다. 컴퓨팅 디바이스 (2) 는 개인용 컴퓨터, 데스크톱 컴퓨터, 랩톱 컴퓨터, 컴퓨터 워크스테이션, 비디오 게임 플랫폼 또는 콘솔, (예컨대, 이동 전화, 셀룰러 전화, 위성 전화, 및/또는 이동 전화 핸드셋과 같은) 무선 통신 디바이스, 유선 전화, 인터넷 전화, 휴대용 비디오 게임 디바이스 또는 개인 정보 단말 (persoanl digital assistant; PDA) 과 같은 핸드헬드 디바이스, 개인용 음악 플레이어, 비디오 플레이어, 디스플레이 디바이스, 텔레비전, 텔레비전 셋톱 박스 (set-top box), 서버, 중간 네트워크 디바이스, 메인프레임 컴퓨터, 또는 그래픽 데이터를 프로세싱 및/또는 디스플레이하는 임의의 다른 타입의 디바이스를 포함할 수도 있다.
도 1 의 예에서 예시된 바와 같이, 컴퓨팅 디바이스 (2) 는 사용자 인터페이스 (4), CPU (6), 메모리 제어기 (8), 메모리 (10), 그래픽 프로세싱 유닛 (GPU) (12), GPU 캐시 (14), 디스플레이 인터페이스 (16), 디스플레이 (18), 및 버스 (20) 를 포함한다. 사용자 인터페이스 (4), CPU (6), 메모리 제어기 (8), GPU (12), 및 디스플레이 인터페이스 (16) 는 버스 (20) 를 이용하여 서로 통신할 수도 있다. 도 1 에서 도시된 상이한 컴포넌트들 사이의 버스들 및 통신 인터페이스들의 특정 구성은 단지 예시적이며, 컴퓨팅 디바이스들의 다른 구성들 및/또는 동일하거나 상이한 컴포넌트들을 갖는 다른 그래픽 프로세싱 시스템들은 본 개시의 기법들을 구현하기 위하여 이용될 수도 있다는 것에 주목해야 한다.
CPU (6) 는 컴퓨팅 디바이스 (2) 의 동작을 제어하는 범용 또는 특수-목적 프로세서를 포함할 수도 있다. 사용자는 CPU (6) 로 하여금 하나 이상의 소프트웨어 애플리케이션들을 실행하게 하기 위하여 입력을 컴퓨팅 디바이스 (2) 에 제공할 수도 있다. CPU (6) 상에서 실행되는 소프트웨어 애플리케이션들은 예를 들어, 오퍼레이팅 시스템, 워드 프로세서 애플리케이션, 이메일 애플리케이션, 스프레드 시트 애플리케이션, 미디어 플레이어 애플리케이션, 비디오 게임 애플리케이션, 그래픽 사용자 인터페이스 애플리케이션 또는 또 다른 프로그램을 포함할 수도 있다. 사용자는 키보드, 마우스, 마이크로폰, 터치 패드, 또는 사용자 인터페이스 (4) 를 통해 컴퓨팅 디바이스 (2) 에 커플링되는 또 다른 입력 디바이스와 같은 하나 이상의 입력 디바이스들 (도시되지 않음) 을 통해, 입력을 컴퓨팅 디바이스 (2) 에 제공할 수도 있다.
CPU (6) 상에서 실행되는 소프트웨어 애플리케이션들은 디스플레이 (18) 로의 그래픽 데이터의 렌더링을 야기시킬 것을 GPU (12) 에 명령하는 하나 이상의 그래픽 렌더링 명령들을 포함할 수도 있다. 일부의 예들에서, 소프트웨어 명령들은 예컨대, 개방 그래픽 라이브러리 (Open Graphics Library) (OpenGL?) API, 개방 그래픽 라이브러리 내장된 시스템들 (Open Graphics Library Embedded Systems; OpenGL ES) API, Direct3D API, DirectX API, RenderMan API, WebGL API, 또는 임의의 다른 공개 또는 독점 표준 그래픽 API 와 같은, 그래픽 애플리케이션 프로그래밍 인터페이스 (API) 에 따를 수도 있다. 그래픽 렌더링 명령들을 프로세싱하기 위하여, CPU (6) 는 GPU (12) 로 하여금 그래픽 데이터의 렌더링의 일부 또는 전부를 수행하게 하기 위하여, 하나 이상의 그래픽 렌더링 커맨드들을 GPU (12) 에 발행할 수도 있다. 일부의 예들에서, 렌더링되어야 할 그래픽 데이터는 그래픽 프리미티브들 예컨대, 포인트들, 라인들, 삼각형들, 사변형 (quadralateral) 들, 삼각형 스트립들, 패치들 등의 리스트를 포함할 수도 있다. 추가의 예들에서, 렌더링되어야 할 그래픽 데이터는 예컨대, 라인 세그먼트들, 타원 아크들, 2차 베지어 곡선들, 및 3차 베지어 곡선들과 같은, 하나 이상의 경로 렌더링 프리미티브들을 포함할 수도 있다.
메모리 제어기 (8) 는 메모리 (10) 로, 그리고 메모리 (10) 로부터의 데이터의 전송을 용이하게 한다. 예를 들어, 메모리 제어기 (8) 는 CPU (6) 및/또는 GPU (12) 로부터 메모리 판독 요청들 및 메모리 기록 요청들을 수신하고, 컴퓨팅 디바이스 (2) 내의 컴포넌트들에 대해 메모리 서비스들을 제공하기 위하여 메모리 (10) 에 대하여 이러한 요청들을 서비스할 수도 있다. 메모리 제어기 (8) 는 메모리 (10) 에 통신가능하게 커플링된다. 메모리 제어기 (8) 는 도 1 의 일 예의 컴퓨팅 디바이스 (2) 에서, CPU (6), GPU (12), 및 메모리 (10) 의 각각과는 별도인 프로세싱 모듈인 것으로서 예시되지만, 다른 예들에서는, 메모리 제어기 (8) 의 기능성 중의 일부 또는 전부가 CPU (6), GPU (12), 및 메모리 (10) 중의 하나 이상 상에서 구현될 수도 있다.
메모리 (10) 는 CPU (6) 에 의한 실행을 위하여 액세스가능한 프로그램 모듈들 및/또는 명령들, 및/또는 CPU (6) 상에서 실행되는 프로그램들에 의해 이용하기 위한 데이터를 저장할 수도 있다. 예를 들어, 메모리 (10) 는 사용자 애플리케이션들과, 애플리케이션들과 연관된 그래픽 데이터를 저장할 수도 있다. 메모리 (10) 는 또한, 컴퓨팅 디바이스 (2) 의 다른 컴포넌트들에 의한 이용을 위한 정보, 및/또는 컴퓨팅 디바이스 (2) 의 다른 컴포넌트들에 의해 생성된 정보를 저장할 수도 있다. 예를 들어, 메모리 (10) 는 GPU (12) 를 위한 디바이스 메모리로서 작동할 수도 있고, GPU (12) 에 의해 동작되어야 할 데이터 뿐만 아니라, GPU (12) 에 의해 수행된 동작들로부터 기인하는 데이터를 저장할 수도 있다. 예를 들어, 메모리 (10) 는 경로 데이터, 경로 세그먼트 데이터, 표면들, 텍스쳐 버퍼들, 심도 버퍼들, 스텐실 버퍼들, 정점 버퍼 (vertex buffer) 들, 프레임 버퍼들, 또는 기타 등등의 임의의 조합을 저장할 수도 있다. 게다가, 메모리 (10) 는 GPU (12) 에 의한 프로세싱을 위한 커맨드 스트림 (command stream) 들을 저장할 수도 있다. 예를 들어, 메모리 (10) 는 경로 렌더링 커맨드들, 3D 그래픽 렌더링 커맨드들, 및/또는 범용 GPU 컴퓨팅 커맨드들을 저장할 수도 있다. 메모리 (10) 는 예를 들어, 랜덤 액세스 메모리 (random access memory; RAM), 정적 RAM (static RAM; SRAM), 동적 RAM (dynamic RAM; DRAM), 동기식 동적 랜덤 액세스 메모리 (synchronous dynamic random access memory; SDRAM), 판독 전용 메모리 (read-only memory; ROM), 소거가능 프로그램가능 ROM (erasable programmable ROM; EPROM), 전기적 소거가능 프로그램가능 ROM (electrically erasable programmable ROM; EEPROM), 플래시 메모리, 자기 데이터 매체들 또는 광학 저장 매체들과 같은, 하나 이상의 휘발성 또는 비휘발성 메모리들 또는 저장 디바이스들을 포함할 수도 있다.
GPU (12) 는 CPU (6) 에 의해 GPU (12) 에 발행되는 커맨드들을 실행하도록 구성될 수도 있다. GPU (12) 에 의해 실행된 커맨드들은 그래픽 커맨드들, 그리기 호출 커맨드들, GPU 상태 프로그래밍 커맨드들, 메모리 전송 커맨드들, 범용 컴퓨팅 커맨드들, 커널 실행 커맨드들 등을 포함할 수도 있다.
일부의 예들에서, GPU (12) 는 하나 이상의 그래픽 프리미티브들을 디스플레이 (18) 로 렌더링하기 위한 그래픽 동작들을 수행하도록 구성될 수도 있다. 이러한 예들에서, CPU (6) 상에서 실행되는 소프트웨어 애플리케이션들 중의 하나가 그래픽 프로세싱을 요구할 때, CPU (6) 는 디스플레이 (18) 로의 렌더링을 위하여 그래픽 데이터를 GPU (12) 에 제공할 수도 있고, 하나 이상의 그래픽 커맨드들을 GPU (12) 에 발행할 수도 있다. 그래픽 커맨드들은 예컨대, 그리기 호출 커맨드들, GPU 상태 프로그래밍 커맨드들, 메모리 전송 커맨드들, 블리팅 커맨드 (blitting command) 들 등을 포함할 수도 있다. 그래픽 데이터는 정점 버퍼들, 텍스쳐 데이터, 표면 데이터 등을 포함할 수도 있다. 일부의 예들에서, CPU (6) 는 커맨드들 및 그래픽 데이터를, GPU (12) 에 의해 액세스될 수도 있는 메모리 (10) 에 기록함으로써, 커맨드들 및 그래픽 데이터를 GPU (12) 에 제공할 수도 있다.
추가의 예들에서, GPU (12) 는 CPU (6) 상에서 실행되는 애플리케이션들에 대한 범용 컴퓨팅을 수행하도록 구성될 수도 있다. 이러한 예들에서, CPU (6) 상에서 실행되는 소프트웨어 애플리케이션들 중의 하나가 GPU (12) 에 대한 연산 태스크를 오프-로드 (off-load) 하는 것으로 판단할 때, CPU (6) 는 범용 컴퓨팅 데이터를 GPU (12) 에 제공할 수도 있고, 하나 이상의 범용 컴퓨팅 커맨드들을 GPU (12) 에 발행할 수도 있다. 범용 컴퓨팅 커맨드들은 예컨대, 커널 실행 커맨드들, 메모리 전송 커맨드들 등을 포함할 수도 있다. 일부의 예들에서, CPU (6) 는 커맨드들 및 그래픽 데이터를, GPU (12) 에 의해 액세스될 수도 있는 메모리 (10) 에 기록함으로써, 커맨드들 및 범용 컴퓨팅 데이터를 GPU (12) 에 제공할 수도 있다.
일부의 사례들에서, GPU (12) 는 CPU (6) 보다 벡터 연산들의 더욱 효율적인 프로세싱을 제공하는 고속-병렬 구조로 구성될 수도 있다. 예를 들어, GPU (12) 는 다수의 정점들, 제어 포인트들, 픽셀들 및/또는 다른 데이터에 대해 병렬 방식으로 동작하도록 구성되는 복수의 프로세싱 엘리먼트들을 포함할 수도 있다. 일부의 사례들에서, GPU (12) 의 고속 병렬 특징은 GPU (12) 가 CPU (6) 를 이용하여 이미지들을 렌더링하는 것보다 더욱 신속하게 그래픽 이미지들 (예컨대, GUI 들 및 2 차원 (2D) 및/또는 3 차원 (3D) 그래픽 장면들) 을 디스플레이 (18) 상으로 렌더링가능하도록 할 수도 있다. 게다가, GPU (12) 의 고속 병렬 특징은 GPU (12) 가 CPU (6) 보다 더욱 신속하게 범용 컴퓨팅 애플리케이션들에 대한 어떤 타입들의 벡터 및 매트릭스 연산들을 프로세싱하도록 할 수도 있다.
일부의 예들에서, GPU (12) 는 컴퓨팅 디바이스 (2) 의 마더보더에 통합될 수도 있다. 다른 사례들에서, GPU (12) 는 컴퓨팅 디바이스 (2) 의 마더보더에서 포트 내에 설치되는 그래픽 카드 상에 존재할 수도 있거나, 이와 다르게, 컴퓨팅 디바이스 (2) 와 상호동작하도록 구성된 주변 디바이스 내에 편입될 수도 있다. 추가의 사례들에서, GPU (12) 는 시스템 온 칩 (system on a chip; SoC) 을 형성하는 CPU (6) 와 동일한 마이크로칩 상에 위치될 수도 있다. GPU (12) 는 하나 이상의 마이크로프로세서들, 주문형 집적 회로 (application specific integrated circuit; ASIC) 들, 필드 프로그램가능 게이트 어레이 (field programmable gate array; FPGA) 들, 디지털 신호 프로세서 (digital signal processor; DSP) 들, 또는 다른 등가의 집적 또는 개별 로직 회로부와 같은 하나 이상의 프로세서들을 포함할 수도 있다.
일부의 예들에서, GPU (12) 는 GPU 캐시 (14) 에 직접적으로 커플링될 수도 있다. 이에 따라, GPU (12) 는 버스 (20) 를 반드시 이용하지 않고도 GPU 캐시 (14) 로부터 데이터를 판독할 수도 있고 데이터를 GPU 캐시 (14) 에 기록할 수도 있다. 다시 말해서, GPU (12) 는 오프-칩 메모리 대신에, 로컬 저장장치를 이용하여 데이터를 로컬로 프로세싱할 수도 있다. 이것은 과중한 버스 트래픽을 경험할 수도 있는 버스 (20) 를 통해 GPU (12) 가 데이터를 판독하고 기록할 필요성을 제거함으로써, GPU (12) 가 더욱 효율적인 방식으로 동작하도록 한다. 그러나, 일부의 사례들에서, GPU (12) 는 별도의 캐시를 포함하지 않을 수도 있고 그 대신에, 버스 (20) 를 통해 메모리 (10) 를 사용할 수도 있다. GPU 캐시 (14) 는 예컨대, 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM), 소거가능 프로그램가능 ROM (EPROM), 전기적 소거가능 프로그램가능 ROM (EEPROM), 플래시 메모리, 자기 데이터 매체들 또는 광학 저장 매체들과 같은, 하나 이상의 휘발성 또는 비휘발성 메모리들 또는 저장 디바이스들을 포함할 수도 있다.
CPU (6) 및/또는 GPU (12) 는 렌더링된 이미지 데이터를, 메모리 (10) 내에서 할당되는 프레임 버퍼 내에 저장할 수도 있다. 벡터 그래픽에 대하여, 렌더링된 이미지 데이터는 렌더링되어야 할 경로 세그먼트에 대한 렌더링된 채움 영역 (fill area) 들 및 스트로크 영역 (stroke area) 들을 포함할 수도 있다. 디스플레이 인터페이스 (16) 는 프레임 버퍼로부터 데이터를 취출 (retrieve) 할 수도 있고, 렌더링된 이미지 데이터에 의해 표현된 이미지를 디스플레이하도록 디스플레이 (18) 를 구성할 수도 있다. 일부의 예들에서, 디스플레이 인터페이스 (16) 는, 프레임 버퍼로부터 취출된 디지털 값들을 디스플레이 (18) 에 의해 소비가능한 아날로그 신호로 변환하도록 구성되는 디지털-대-아날로그 변환기 (digital-to-analog converter; DAC) 를 포함할 수도 있다. 다른 예들에서, 디스플레이 인터페이스 (16) 는 프로세싱을 위하여 디지털 값들을 디스플레이 (18) 로 직접적으로 전달할 수도 있다.
디스플레이 (18) 는 모니터, 텔레비전, 프로젝션 디바이스, 액정 디스플레이 (liquid crystal display; LCD), 플라즈마 디스플레이 패널, 발광 다이오드 (light emitting diode; LED) 어레이, 음극선관 (cathode ray tube; CRT) 디스플레이, 전자 종이, 표면-전도 전자방출형 디스플레이 (surface-conduction electron-emitted display; SED), 레이저 텔레비전 디스플레이, 나노크리스탈 디스플레이 (nanocrystal display) 또는 또 다른 타입의 디스플레이 유닛을 포함할 수도 있다. 디스플레이 (18) 는 컴퓨팅 디바이스 (2) 내에 통합될 수도 있다. 예를 들어, 디스플레이 (18) 는 이동 전화 핸드셋 또는 태블릿 컴퓨터의 스크린일 수도 있다. 대안적으로, 디스플레이 (18) 는 유선 또는 무선 통신 링크를 통해 컴퓨터 디바이스 (2) 에 커플링된 독립형 디바이스일 수도 있다. 예를 들어, 디스플레이 (18) 는 케이블 또는 무선 링크를 통해 개인용 컴퓨터에 접속된 컴퓨터 모니터 또는 플랫 패널 디스플레이일 수도 있다.
버스 (20) 는 제 1, 제 2, 및 제 3 세대 버스 구조들 및 프로토콜들, 공유된 버스 구조들 및 프로토콜들, 포인트-대-포인트 버스 구조들 및 프로토콜들, 단방향 버스 구조들 및 프로토콜들, 및 양방향 버스 구조들 및 프로토콜들을 포함하는 버스 구조들 및 버스 프로토콜들의 임의의 조합을 이용하여 구현될 수도 있다. 버스 (20) 를 구현하기 위하여 이용될 수도 있는 상이한 버스 구조들 및 프로토콜들의 예들은 예컨대, HyperTransport 버스, InfiniBand 버스, AGP (Advanced Graphics Port) 버스, PCI (Peripheral Component Interconnect) 버스, PCI Express 버스, AMBA (Advanced Microcontroller Bus Architecture) AHB (Advanced High-performance Bus), AMBA APB (Advanced Peripheral Bus), 및 AMBA AXI (Advanced eXentisible Interface) 버스를 포함한다. 다른 타입들의 버스 구조들 및 프로토콜들이 또한 이용될 수도 있다.
일부의 사례들에서, GPU (12) 는 다양한 경로 렌더링 커맨드들의 실행에 기초하여 부분-대-전체 GPU 를 제공하도록 구성될 수도 있다. 예를 들어, CPU (6) 는 하나 이상의 경로 렌더링 커맨드들을 GPU (12) 에 발행할 수도 있고, GPU (12) 는 경로 렌더링 커맨드들을 실행할 수도 있다. 하나의 예로서, CPU (6) 는 경로 채우기 동작을 수행할 것을 GPU (12) 에 명령하는 하나 이상의 경로 채우기 커맨드들을 GPU (12) 에 발행할 수도 있고, GPU (12) 는 경로 채우기 커맨드들을 실행할 수도 있다. 또 다른 예로서, CPU (6) 는 경로 스트로킹 동작을 수행할 것을 GPU (12) 에 명령하는 하나 이상의 경로 스트로킹 커맨드들을 GPU (12) 에 발행할 수도 있고, GPU (12) 는 경로 스트로킹 커맨드들을 실행할 수도 있다.
일부의 예들에서, GPU (12) 는 렌더링되어야 할 경로의 경로 세그먼트를 표시하는 데이터를 수신하고, 경로 세그먼트를 복수의 프리미티브들로 테셀레이팅하고, 복수의 프리미티브들에 기초하여, 경로 세그먼트에 대한 채움 영역 및 스트로크 영역 중의 적어도 하나를 렌더링하도록 구성될 수도 있다. GPU 는 채우기 동작을 수행할 때에 경로 세그먼트에 대한 채움 영역을 렌더링할 수도 있고, 스트로크 동작을 수행할 때에 경로 세그먼트에 대한 스트로크 영역을 렌더링할 수도 있다. 일부의 예들에서, 복수의 프리미티브들은 복수의 라인 세그먼트들일 수도 있다.
일부의 예들에서, GPU (12) 는 경로 채우기 동작을 수행하기 위하여 2-패스 렌더링 접근법을 이용할 수도 있다. 예를 들어, 제 1 렌더링 패스의 일부로서, GPU (12) 는 렌더링되어야 할 경로의 경로 세그먼트를 표시하는 데이터를 수신할 수도 있고, 경로 세그먼트를 복수의 라인 세그먼트들로 테셀레이팅할 수도 있고, 복수의 라인 세그먼트들에 기초하여, 복수의 삼각형 프리미티브들을 생성할 수도 있다. GPU (12) 는 복수의 라인 세그먼트들의 각각의 하나에 기초하여 복수의 삼각형 프리미티브들의 각각을 생성할 수도 있다. GPU (12) 는 공통 스텐실 버퍼가 어느 픽셀들이 경로 세그먼트에 대한 채움 영역 내부에 있는지를 표시하는 데이터를 저장하도록, 복수의 삼각형 프리미티브들의 각각을 공통 스텐실 버퍼로 렌더링할 수도 있다. 프리미티브들을 공통 스텐실 버퍼로 렌더링한 후, GPU (12) 는 제 2 렌더링 패스를 수행할 수도 있다. 제 2 렌더링 패스 동안, GPU (12) 는 경로 세그먼트에 대한 채움 영역의 래스터화된 버전을 생성하기 위하여, 스텐실 버퍼 내에 저장된 데이터 및 채움 컬러 (fill color) 에 기초하여 경로 세그먼트에 대한 채움 영역 내부에 있는 픽셀들을 둘러싸는 하나 이상의 프리미티브들을 렌더링할 수도 있다.
경로 채우기 동작에 대한 복수의 삼각형 프리미티브들을 생성하기 위하여, 일부의 예들에서, GPU (12) 는 삼각형 프리미티브들의 각각이 경로 세그먼트에 대해 생성된 삼각형 프리미티브들의 전부에 대해 동일한 공통 정점을 가지도록, 복수의 삼각형 프리미티브들을 생성할 수도 있다. 이러한 예들에서, GPU (12) 는 삼각형 프리미티브들의 각각이 복수의 라인 세그먼트들의 각각의 하나의 종단포인트 (endpoint) 들에 대응하는 2개의 추가적인 정점들 (즉, 공통 정점에 추가한 2개의 정점들) 을 가지도록, 복수의 삼각형 프리미티브들을 생성할 수도 있다. 각각의 추가적인 정점은 대응하는 라인 세그먼트의 종단포인트들의 각각의 하나에 대응할 수도 있다.
이에 따라, 경로 렌더링을 수행할 때, GPU (12) 는 경로를 채우기 위하여 다음의 예의 기능들을 수행할 수도 있다: 경로를 라인 세그먼트들로 테셀레이팅하고, 삼각형 프리미티브들을 형성하기 위하여 라인 세그먼트들을 피봇 포인트에 연결하고, 삼각형들을 스텐실 버퍼로 렌더링함. 채우기 프로세스의 다음의, 그리고 아마도 최종 단계들은 가능하게 된 스텐실 테스트로 (예를 들어, 도 5c 에 대하여 더욱 상세하게 설명된 바와 같은) 경로를 둘러싸는 바운딩 박스를 렌더링하고, 스텐실 내용들을 프레임 버퍼에 복사하는 것이다. 일부의 사례들에서, 바운딩 박스는 CPU (6) 로부터 수신된 커맨드들에 기초하여 결정될 수도 있다. 위에서 언급된 바와 같이, 이 접근법은 바운딩 박스를 연산하기 위하여 2 개의 렌더링 패스들 및 경로의 사전-프로세싱을 요구한다.
게다가, MSAA 와 같은 안티에일리어싱을 수행할 때, GPU (12) 는 렌더 타겟과 동일한 레이트에서 스텐실 버퍼를 샘플링할 수도 있다. 예를 들어, 스텐실 버퍼 및 렌더 타겟이 양자 모두 MSAA 레이트에서 샘플링될 경우, 스텐실 버퍼를 프레임 버퍼에 복사할 때에 소비된 메모리 대역폭은 상대적으로 클 수도 있다. GPU (12) 가 TIR 을 수행하고 렌더 타겟에 대한 상대적으로 더 작은 할당을 이용할 경우, 스텐실 샘플링 레이트가 또한 영향을 받을 수도 있음으로써, 스텐실 버퍼의 정확도를 감소시킬 수도 있다.
본 개시의 양태들에 따르면, GPU (12) 는 스텐실링된 TIR 을 수행할 수도 있다. 예를 들어, GPU (12) 는, 이미지의 경로의 각각의 안티에일리어싱된 픽셀에 대한 커버리지 값을 결정하기 위한 샘플링 레이트를 표시하는 스텐실 파라미터를 결정할 수도 있다. GPU (12) 는 또한, 스텐실 파라미터와는 별도로, 경로의 각각의 안티에일리어싱된 픽셀에 대한 메모리 할당을 표시하는 렌더 타겟 파라미터를 결정할 수도 있다. GPU (12) 는 스텐실 파라미터 및 렌더 타겟 파라미터를 이용하여 경로를 렌더링할 수도 있다.
일부의 예들에서, GPU (12) 는 픽셀들에 대해 할당되는 메모리의 양보다 더 높은 레이트에서 스텐실링을 수행할 수도 있다. 예를 들어, 16x MSAA 에 대하여, GPU (12) 는 수퍼-샘플링되는, 예컨대, 각각의 픽셀이 16 개의 샘플들을 가지는 스텐실 동작들을 수행할 수도 있다. GPU (12) 는 스텐실 테스트를 통과한 (예컨대, 경로의 내부에 있는 것으로 결정된) 픽셀의 샘플들의 수에 기초하여 픽셀 당 커버리지 값을 연산함으로써 주어진 경로를 렌더링할 수도 있다. 본 개시의 양태들에 따르면, 스텐실이 16x 샘플링됨에도 불구하고, 픽셀들에 대한 GPU (12) 렌더 타겟은 1x 샘플링될 수도 있다.
게다가, 본 개시의 양태들에 따르면, GPU (12) 는 바운딩 박스를 사전-프로세싱할 필요 없이, 단일 렌더링 패스에서 경로를 채울 수도 있다. 예를 들어, GPU (12) 는 스텐실링 동작들 동안에 바운딩 박스를 결정할 수도 있다. 이 예에서, GPU (12) 가 (예컨대, 픽셀들을 셰이딩하지 않으면서) 스텐실링 동안에 프리미티브들을 렌더링할 때, GPU (12) 는 경로의 프리미티브들의 가장 외부 포인트들 (예컨대, 가장 외부 경계 포인트들) 을 결정할 수도 있다. 일부의 예들에서, GPU (12) 는 (경로의 상대적인 상부에서) 상부 포인트, (경로의 상대적인 하부에서) 하부 포인트, (경로의 가장-우측 포인트에서) 우측 포인트, 및 (경로의 가장-좌측 포인트에서) 좌측 포인트를 결정할 수도 있다. GPU (12) 는 스텐실링 동안에 결정된 가장 외부 포인트들을 이용하여 바운딩 박스를 결정할 수도 있다. 즉, GPU (12) 는 경로의 프리미티브들의 전부를 둘러싸는 바운딩 박스를 결정할 수도 있다. 일부의 예들에서, 바운딩 박스는 2 개의 삼각형들로 구성될 수도 있다.
바운딩 박스를 완성한 후, GPU (12) 는 바운딩 박스의 상부에서 스텐실링된 TIR 을 수행함으로써 바운딩 박스를 (예컨대, 동일한 렌더링 패스에서) 추가로 프로세싱할 수도 있다. 즉, 위에서 언급된 바와 같이, GPU (12) 는 각각의 픽셀에 대한 커버리지 값을 결정할 수도 있고, GPU (12) 가 스텐실 내에 위치되는 것으로 결정하는 픽셀들을 셰이딩할 수도 있다. 이 예에서, GPU (12) 는 픽셀들에 대해 별도의 심도 테스트를 수행할 필요가 없다.
스트로킹에 대하여, GPU (12) 는 일부의 사례들에서, 스트로킹된 경로를 대싱할 수도 있다. 즉, GPU (12) 는 렌더링된 경로가 대시 라인으로서 보이도록, 스트로킹된 경로에 대한 복수의 세그먼트들을 결정할 수도 있다. 전형적으로, GPU (12) 는 대시 경로의 세그먼트들을 순서대로 결정할 수도 있다. 예를 들어, GPU (12) 는 경로의 다음 세그먼트 상으로 이동시키기 전에 하나의 세그먼트를 렌더링하기 위하여 CPU (6) 로부터 커맨드들을 수신할 수도 있다. 이러한 프로세스는 병렬화 (예컨대, 특정 시간 인스턴스에서 하나를 초과하는 세그먼트를 래스터화 및/또는 셰이딩하는 것) 를 막을 수도 있고, GPU (12) 가 경로를 독립적으로 렌더링하는 것을 방지할 수도 있다.
본 개시의 양태들에 따르면, GPU (12) 는 경로의 각각의 세그먼트의 로케이션들 (뿐만 아니라 경로의 길이) 을 결정할 수도 있고, 렌더링 동안에 길이 정보를 적용할 수도 있다. 예를 들어, GPU (12) 는 대시 라인의 복수의 순서화된 세그먼트들의 각각의 세그먼트에 대한 텍스처 오프셋을 결정할 수도 있다. 일부의 사례들에서, 세그먼트 순서는 이하에서 더욱 상세하게 설명된 바와 같이, 지오메트리 셰이딩 동안에 결정될 수도 있다. 이 예에서, 복수의 순서화된 세그먼트들 중의 현재의 세그먼트에 대한 텍스처 오프셋은 순서에 있어서 현재의 세그먼트에 선행하는 세그먼트들의 길이들의 누산에 기초할 수도 있다. GPU (12) 는 또한, 세그먼트들의 로케이션들을 결정하기 위하여 텍스처 오프셋을 각각의 세그먼트에 적용하는 것을 포함하여, 세그먼트들을 픽셀 셰이딩할 수도 있다. 예를 들어, GPU (12) 는 세그먼트들의 로케이션에 기초하여 세그먼트들이 가시적 또는 비가시적인지 여부를 결정할 수도 있다. GPU (12) 는 가시적 세그먼트들에 대해 보유 (예컨대, 컬러를 결정함) 할 수도 있고, 가시적이지 않은 대시의 세그먼트들 (예컨대, 가시적 대시들 사이의 공간) 을 폐기할 수도 있다. 이러한 방법으로, GPU (12) 는 예컨대, CPU (6) 로부터 대싱 커맨드들을 수신하지 않으면서, 대시 라인의 경로 렌더링을 수행할 수도 있다.
경로 렌더링에 대하여 설명되었지만, 위에서 설명된 프리픽스 합산 (prefix sum) 동작들은 벡터 그래픽으로 제한되지는 않는다. 예를 들어, 프리픽스 합을 결정하기 위한 기법들은 GPU (12) 가 누산된 값을 추적하는 임의의 애플리케이션에서 이용될 수도 있다. 예시의 목적들을 위한 예에서, GPU (12) 는 그래디언트 (gradient) 들을 결정할 때에 위에서 설명된 프리픽스 합산 동작들을 수행할 수도 있다. 예를 들어, 이미지 프로세싱에서, 그래디언트들을 생성하는 것은 컬러들을 결정하기 위하여 일부의 길이 정보의 누산을 요구할 수도 있다. 이 예에서, GPU (12) 는 길이 정보를 결정하기 위하여 위에서 설명된 프리픽스 합산 동작들을 적용할 수도 있다.
본 개시에서 설명된 렌더링 기법들은 예컨대, CPU (6), GPU (12), 및 메모리 (10) 를 포함하는 도 1 에서 예시된 컴퓨팅 디바이스 (2) 의 컴포넌트들 중의 임의의 것에서 구현될 수도 있다. 일부의 예들에서, 경로 렌더링 기법들은 (예컨대, 도 3 에 대하여 설명된 바와 같은 GPU (12) 의 그래픽 파이프라인에서) GPU (12) 에 의해 완전하게 또는 거의 완전하게 구현될 수도 있다. 추가적인 예들에서, CPU (6) 는 본 개시의 경로 렌더링 기법들을 수행하는 GPU (12) 에서 경로 렌더링 파이프라인을 구현하기 위하여, 그래픽 파이프라인의 상태를 구성하고 셰이더 프로그램들을 그래픽 파이프라인에 바인딩하기 위한 기법들을 구현할 수도 있다. 추가의 예들에서, CPU (6) 는 하나 이상의 경로들을 렌더링하기 위하여, 렌더링되어야 할 경로를 표시하는 데이터를 GPU (12) 에 의해 액세스될 수도 있는 하나 이상의 버퍼들 (예컨대, 하나 이상의 정점 버퍼들) 내로 배치하도록 구성될 수도 있다.
도 2 는 도 1 에서의 컴퓨팅 디바이스 (2) 의 CPU (6), GPU (12), 및 메모리 (10) 를 더욱 상세하게 예시하는 블록도이다. 도 2 에서 도시된 바와 같이, CPU (6) 는 GPU (12) 및 메모리 (10) 에 통신가능하게 커플링되고, GPU (12) 는 CPU (6) 및 메모리 (10) 에 통신가능하게 커플링된다. 일부의 예들에서, GPU (12) 는 CPU (6) 를 갖는 마더보더 상에 통합될 수도 있다. 추가적인 예들에서, GPU (12) 는 CPU (6) 를 포함하는 마더보더의 포트 내에 설치되는 그래픽 카드 상에서 구현될 수도 있다. 추가의 예들에서, GPU (12) 는 CPU (6) 와 상호동작하도록 구성되는 주변 디바이스 내에 통합될 수도 있다. 추가적인 예들에서, GPU (12) 는 시스템 온 칩 (SoC) 을 형성하는 CPU (6) 와 동일한 마이크로칩 상에 위치될 수도 있다.
CPU (6) 는 소프트웨어 애플리케이션 (24), 그래픽 API (26), GPU 드라이버 (28), 및 오퍼레이팅 시스템 (30) 을 실행하도록 구성된다. 소프트웨어 애플리케이션 (24) 은 그래픽 이미지들이 디스플레이되게 하는 하나 이상의 명령들, 및/또는 비-그래픽 태스크 (예컨대, 범용 컴퓨팅 태스크) 가 GPU (12) 상에서 수행되게 하는 하나 이상의 명령들을 포함할 수도 있다. 소프트웨어 애플리케이션 (24) 은 명령들을 그래픽 API (26) 에 발행할 수도 있다. 그래픽 API (26) 는 소프트웨어 애플리케이션 (24) 으로부터 수신된 명령들을, GPU 드라이버 (28) 에 의해 소비가능한 포맷으로 변환하는 런타임 서비스 (runtime service) 일 수도 있다. GPU 드라이버 (28) 는 그래픽 API (26) 를 통해 소프트웨어 애플리케이션 (24) 으로부터 명령들을 수신하고, 명령들을 서비스하기 위하여 GPU (12) 의 동작을 제어한다. 예를 들어, GPU 드라이버 (28) 는 하나 이상의 커맨드들 (38) 을 공식화 (formulate) 할 수도 있고, 커맨드들 (38) 을 메모리 (10) 내로 배치할 수도 있고, 커맨드들 (38) 을 실행할 것을 GPU (12) 에 명령할 수도 있다. 일부의 예들에서, GPU 드라이버 (28) 는 커맨드들 (38) 을 메모리 (10) 내로 배치할 수도 있고, 오퍼레이팅 시스템 (30) 을 통해, 예컨대, 하나 이상의 시스템 호출들을 통해 GPU (12) 와 통신할 수도 있다.
GPU (12) 는 커맨드 엔진 (32) 및 하나 이상의 프로세싱 유닛들 (34) 을 포함한다. 일부의 예들에서, 하나 이상의 프로세싱 유닛들 (34) 은 3D 그래픽 렌더링 파이프라인, 예컨대, DX 11 그래픽 렌더링 파이프라인 (즉, DX 11 그래픽 API 와 호환되는 3D 그래픽 파이프라인) 을 형성 및/또는 구현할 수도 있다.
커맨드 엔진 (32) 은 (예컨대, 메모리 (10) 를 통해) CPU (6) 로부터 커맨드들을 수신하고 GPU (12) 로 하여금 커맨드들을 실행하게 하도록 구성된다. 상태 커맨드를 수신하는 것에 응답하여, 커맨드 엔진 (32) 은 상태 커맨드에 기초하여 GPU (12) 에서의 하나 이상의 상태 레지스터들을 특정 값들로 설정하고, 및/또는 상태 커맨드에 기초하여, 고정 함수 프로세싱 유닛들 (34) 중의 하나 이상을 구성하도록 구성될 수도 있다. 그리기 호출 커맨드를 수신하는 것에 응답하여, 커맨드 엔진 (32) 은 프로세싱 유닛들 (34) 로 하여금, 렌더링되어야 할 하나 이상의 경로 세그먼트들의 지오메트리 (geometry) 를 정의하는 데이터에 기초하여, 그리고 렌더링되어야 할 경로 세그먼트들의 각각에 대한 경로 세그먼트의 타입을 표시하는 데이터에 기초하여, 하나 이상의 경로 세그먼트들을 렌더링하게 하도록 구성될 수도 있다. 일부의 예들에서, 렌더링되어야 할 하나 이상의 경로 세그먼트들의 지오메트리를 정의하는 데이터와, 경로 세그먼트들의 각각에 대한 경로 세그먼트의 타입을 정의하는 데이터는 하나 이상의 정점 데이터 구조들로 메모리 (10) 내에 저장될 수도 있다. 커맨드 엔진 (32) 은 또한, 셰이더 프로그램 바인딩 커맨드들을 수신할 수도 있고, 셰이더 프로그램 바인딩 커맨드들에 기초하여 특정 셰이더 프로그램들을 프로그램가능 프로세싱 유닛들 (34) 중의 하나 이상으로 로딩할 수도 있다.
프로세싱 유닛들 (34) 은 하나 이상의 프로세싱 유닛들을 포함할 수도 있고, 이러한 프로세싱 유닛들의 각각은 프로그램가능 프로세싱 유닛 또는 고정 함수 프로세싱 유닛일 수도 있다. 프로그램가능 프로세싱 유닛은 예를 들어, CPU (6) 로부터 GPU (12) 상으로 다운로딩되는 하나 이상의 셰이더 프로그램들을 실행하도록 구성되는 프로그램가능 셰이더 유닛을 포함할 수도 있다. 일부의 예들에서, 셰이더 프로그램은 예컨대, OpenGL 셰이딩 언어 (OpenGL Shading Language; GLSL), 하이 레벨 셰이딩 언어 (High Level Shading Language; HLSL), 그래픽용 C (C for Graphics; Cg) 셰이딩 언어 등과 같은 하이-레벨 셰이딩 언어로 기록된 프로그램의 컴퍼일링된 버전일 수도 있다.
일부의 예들에서, 프로그램가능 셰이더 유닛은 병렬로, 예컨대, SIMD 파이프라인으로 동작하도록 구성되는 복수의 프로세싱 유닛들을 포함할 수도 있다. 프로그램가능 셰이더 유닛은, 셰이더 프로그램 명령들 및 실행 상태 레지스터, 예컨대, 실행되고 있는 프로그램 메모리에서의 현재의 명령 또는 페치 (fetch) 되어야 할 다음 명령을 표시하는 프로그램 카운터 레지스터를 저장하는 프로그램 메모리를 가질 수도 있다. 프로세싱 유닛들 (34) 에서의 프로그램가능 셰이더 유닛들은 예를 들어, 정점 셰이더 유닛들, 픽셀 셰이더 유닛들, 지오메트리 셰이더 유닛들, 헐 셰이더 (hull shader) 유닛들, 도메인 셰이더 (domain shader) 유닛들, 테셀레이션 제어 셰이더 (tessellation control shader) 유닛들, 테셀레이션 평가 셰이더 (tessellation evaluation shader) 유닛들, 연산 셰이더 (compute shader) 유닛들, 및/또는 통합된 셰이더 (unified shader) 유닛들을 포함할 수도 있다. 도 2 에서 도시된 바와 같이, 프로세싱 유닛들 (34) 은 또한, 바운딩 박스 유닛 (40) 및 프리픽스 합산 유닛을 포함할 수도 있다.
고정 함수 프로세싱 유닛은 어떤 기능들을 수행하도록 하드-와이어링되는 (hard-wired) 하드웨어를 포함할 수도 있다. 고정 함수 하드웨어가 상이한 기능들을 수행하기 위하여 예를 들어, 하나 이상의 제어 신호들을 통해 구성가능할 수도 있지만, 고정 함수 하드웨어는 사용자-컴파일링된 프로그램들을 수신할 수 있는 프로그램 메모리를 전형적으로 포함하지 않는다. 일부의 예들에서, 프로세싱 유닛들 (34) 에서의 고정 함수 프로세싱 유닛들은 예컨대, 심도 테스팅, 시저 테스팅 (scissors testing), 알파 블렌딩 (alpha blending) 등과 같은 래스터 동작들을 수행하는 예를 들어, 프로세싱 유닛들을 포함할 수도 있다.
메모리 (10) 는 경로 데이터 (36) 및 하나 이상의 커맨드들 (38) 을 저장할 수도 있다. 일부의 예들에서, 경로 데이터 (36) 는 메모리 (10) 내에 할당된 하나 이상의 정점 버퍼들에서 복수의 정점들 (또는 제어 포인트들) 로서 저장될 수도 있다. 일부의 예들에서, 경로 데이터는 패치 리스트 데이터 구조 (예컨대, 4개의 제어 포인트 패치 리스트) 로 저장될 수도 있다. 커맨드들 (38) 은 하나 이상의 커맨드 버퍼들 (예컨대, 링 버퍼) 내에 저장될 수도 있다. CPU (6) (예컨대, 오퍼레이팅 시스템 (30) 을 통한 GPU 드라이버 (28)) 는 GPU (12) 에 의한 소비를 위하여 경로 데이터 (36) 및 커맨드들 (38) 을 메모리 (10) 내로 배치할 수도 있다. GPU (12) (예컨대, 커맨드 엔진 (32)) 는 메모리 (10) 내에 저장된 커맨드들 (38) 을 취출하고 실행할 수도 있다.
경로 데이터 (36) 가 정점들 (예컨대, 제어 포인트들) 로서 저장되는 예들에서, 정점들은 렌더링되어야 할 경로 세그먼트를 기하학적으로 정의하는 하나 이상의 속성들을 포함할 수도 있다. 예를 들어, 라인에 대하여, 패치 제어 리스트에서의 정점들은 라인의 종단포인트들에 대한 좌표들 (예컨대, (x0, y0) 및 (x1, y1)) 을 표시하는 데이터를 포함할 수도 있다. 3차 베지어 곡선에 대하여, 패치 제어 리스트에서의 정점들은 곡선을 정의하는 4개의 제어 포인트들의 좌표들 (예컨대, (x0, y0), (x1, y1), (x2, y2), (x3, y3)) 을 표시하는 데이터를 포함할 수도 있다. 2차 베지어 곡선에 대하여, 패치 제어 리스트에서의 정점들은 4개의 제어 포인트들 대신에, 3개의 제어 포인트들에 대한 좌표들을 표시하는 데이터를 포함할 수도 있다. 타원 아크들에 대하여, 패치 제어 리스트에서의 정점들은 타원 아크의 종단포인트 파라미터화를 표시하는 데이터, 또는 타원 아크의 중심 파라미터화를 표시하는 데이터를 포함할 수도 있다.
일부의 경우들에는, 렌더링되어야 할 경로 세그먼트를 기하학적으로 정의하는 하나 이상의 속성들이 해상도-독립적일 수도 있다. 다시 말해서, 경로 세그먼트를 기하학적으로 정의하는 속성들은 경로 세그먼트를 렌더링할 때에 수행되어야 할 테셀레이션의 양에 독립적일 수도 있고, 및/또는 경로 세그먼트를 렌더링할 때에 생성되어야 할 정점들의 양에 독립적일 수도 있다.
CPU (6) 는 또한, 렌더링되어야 할 경로 세그먼트의 타입을 표시하는 데이터 (즉, "경로 세그먼트 타입 표시자") 를 정점 버퍼에서의 하나 이상의 이와 다르게 이용되지 않은 정점 속성들 내로 배치할 수도 있다. 일부의 예들에서, 상이한 경로 세그먼트 타입들은, 벡터 그래픽 API 에 의해 정의되며 소프트웨어 애플리케이션 (24) 에 의해 이용을 위하여 이용가능한 경로 세그먼트 타입들의 세트에 대응할 수도 있다. 일부의 예들에서, 상이한 경로 세그먼트 타입들은 OpenVG API 에 의해 정의되는 경로 세그먼트 타입들의 세트에 대응할 수도 있다.
커맨드들 (38) 은 하나 이상의 상태 커맨드들 및/또는 하나 이상의 그리기 호출 커맨드들을 포함할 수도 있다. 상태 커맨드는 예컨대, 그리기 컬러, 채움 컬러, 스트로크 컬러 등과 같은, GPU (12) 에서의 상태 변수들 중의 하나 이상을 변경할 것을 GPU (12) 에 명령할 수도 있다. 일부의 예들에서, 상태 커맨드들은, 경로를 렌더링하는 것과 연관된 하나 이상의 상태 변수들을 설정하도록 구성되는 경로 렌더링 상태 커맨드들을 포함할 수도 있다. 예를 들어, 상태 커맨드들은 렌더링되어야 할 경로가 채워져야 할 것인지, 스트로킹되어야 할 것인지, 또는 양자 모두 행해져야 할 것인지 여부를 표시하도록 구성되는 페인트 모드 커맨드 (paint mode command) 를 포함할 수도 있다. 또 다른 예로서, 상태 커맨드들은 채우기 동작들을 위해 이용되어야 할 컬러를 특정하는 채움 컬러 커맨드, 및/또는 스트로킹 동작들을 위해 이용되어야 할 컬러를 특정하는 스트로크 컬러 커맨드를 포함할 수도 있다. 추가의 예로서, 상태 커맨드들은 예컨대, 스트로크 폭, 단부 캡 스타일 (end cap style) (예컨대, 라운드, 정사각형), 라인 접합부 스타일 (예컨대, 연귀 (miter), 라운드, 사면 (bevel)), 연귀 한계 등과 같은, 스트로크 동작에 대한 하나 이상의 파라미터들을 특정할 수도 있다. 일부의 예들에서, 하나 이상의 상태 파라미터들을 설정하기 위하여 상태 커맨드를 이용하는 것에 추가하여 또는 이와 같이 이용하는 것 대신에, 상태 파라미터들 중의 하나 이상은 그리기 호출 커맨드를 이용함으로써, 또는 상태 표시자들을, 경로 데이터 (36) 를 포함하는 정점 버퍼 내로 배치함으로써 설정될 수도 있다.
그리기 호출 커맨드는 메모리 (10) 내에 저장된 (예컨대, 정점 버퍼에서 정의된) 하나 이상의 정점들의 그룹에 의해 정의된 지오메트리를 렌더링할 것을 GPU (12) 에 명령할 수도 있다. 일부의 예들에서, 그리기 호출 커맨드는 메모리 (10) 의 정의된 섹션 (예컨대, 정점 버퍼 또는 경로 데이터 (36)) 내에 저장된 정점들의 전부를 렌더링하기 위하여 GPU (12) 를 호출할 수도 있다. 다시 말해서, 일단 GPU (12) 가 그리기 호출 커맨드를 수신하면, 메모리 (10) 의 정의된 섹션 (예컨대, 정점 버퍼 또는 경로 데이터 (36)) 에서의 정점들에 의해 표현된 지오메트리 및 프리미티브들을 렌더링하기 위하여 제어가 GPU (12) 로 전달된다.
그리기 호출 커맨드들은 3D 그리기 호출 커맨드들 및 경로 렌더링 그리기 호출 커맨드들 중의 하나 또는 양자를 포함할 수도 있다. 3D 렌더링 그리기 호출 커맨드들에 대하여, 정점 버퍼에서 하나 이상의 정점들의 그룹에 의해 정의된 지오메트리는 렌더링되어야 할 하나 이상의 3D 그래픽 프리미티브들 (예컨대, 포인트들, 라인들, 삼각형들, 사변형, 삼각형 스트립들, 패치들 등) 에 대응할 수도 있고, 3D 렌더링 그리기 호출 커맨드는 하나 이상의 3D 그래픽 프리미티브들을 렌더링할 것을 GPU (12) 에 명령할 수도 있다. 경로 렌더링 그리기 호출 커맨드들에 대하여, 정점 버퍼에서 하나 이상의 정점들의 그룹에 의해 정의된 지오메트리는 렌더링되어야 할 하나 이상의 경로 프리미티브들 (예컨대, 라인 세그먼트들, 타원 아크들, 2차 베지어 곡선들, 및 3차 베지어 곡선들 등) 에 대응할 수도 있고, 경로 렌더링 그리기 호출 커맨드는 하나 이상의 경로 프리미티브들을 렌더링할 것을 GPU (12) 에 명령할 수도 있다. 일부의 예들에서, GPU (12) 에 의해 렌더링될 수 있는 경로 프리미티브들은 본 개시에서 설명되는 상이한 타입들의 경로 세그먼트들에 대응할 수도 있다.
일부의 예들에서, 본 개시에서 설명된 경로 렌더링 기법들은 예컨대, 그래픽 API (26), GPU 드라이버 (28), 커맨드 엔진 (32), 및 프로세싱 유닛들 (34) 을 포함하는 도 2 에서 도시된 컴포넌트들 중의 임의의 것에서 구현될 수도 있다. 추가의 예들에서, 경로 렌더링 기법들의 전부 또는 거의 전부는 프로세싱 유닛들 (34) 에 의해 형성된 GPU (12) 에서의 그래픽 파이프라인에서 구현될 수도 있다. 추가적인 예들에서, CPU (6) 의 소프트웨어 애플리케이션 (24), 그래픽 API (26), 및/또는 GPU 드라이버 (28) 는 본 개시에서 설명된 경로 렌더링 기법들을 수행하는 GPU (12) 에서의 경로 렌더링 파이프라인을 구현하기 위하여, 그래픽 파이프라인의 상태를 구성하고 셰이더 프로그램들을 그래픽 파이프라인에 바인딩하기 위한 기법들을 구현할 수도 있다. 추가의 예들에서, CPU (6) 의 소프트웨어 애플리케이션 (24), 그래픽 API (26), 및/또는 GPU 드라이버 (28) 는 하나 이상의 경로들을 렌더링하기 위하여, 렌더링되어야 할 경로를 표시하는 데이터를, GPU (12) 에 의해 액세스될 수도 있는 하나 이상의 버퍼들 (예컨대, 하나 이상의 정점 버퍼들) 내로 배치하도록 구성될 수도 있다.
본 개시의 양태들에 따르면, 프로세싱 유닛들 (34) 은 바운딩 박스 유닛 (40) 을 포함한다. 바운딩 박스 유닛 (40) 은 바운딩 박스를 결정하기 위한 하나 이상의 프로그램가능 및/또는 고정 함수 유닛들을 포함할 수도 있다. 예를 들어, 본 개시의 기법들은 (예를 들어, 이하의 도 3 에 대하여 더욱 상세하게 설명된 바와 같이) 단일 렌더링 패스에서 바운딩 박스를 결정하고 바운딩 박스를 렌더링하는 것을 포함한다. GPU (12) 가 경로 채우기 동작을 수행할 때, 바운딩 박스 유닛 (40) 은 경로의 경계들을 결정하는 것을 담당할 수도 있다.
본 개시의 양태들에 따르면, 바운딩 박스 유닛 (40) 은 API 호출을 이용하여 개시될 수도 있다. 예를 들어, 그래픽 API (26) 는 경로의 렌더링 동안에 바운딩 박스 유닛 (40) 의 이용을 트리거링하기 위한 하나 이상의 명령들을 포함할 수도 있다. API 호출은 바운딩 박스 유닛 (40) 이 바운딩 박스를 결정하였을 때까지 GPU (12) 가 프리미티브들의 셰이딩을 건너뛰도록 할 수도 있다. 다음으로, GPU (12) 는 위에서 언급된 바와 같이, 바운딩 박스의 상부에서 스텐실링된 TIR 을 수행할 수도 있다. 게다가, 바운딩 박스 유닛 (40) 을 편입함으로써, GPU (12) 는 심도 버퍼를 이용하지 않으면서 단일 패스에서 경로를 채울 수도 있다.
바운딩 박스 유닛 (40) 은 GPU (12) 가 바운딩 박스를 사전-프로세싱하지 않으면서 경로들을 채우도록 할 수도 있다. 예를 들어, 바운딩 박스 유닛 (40) 은 예컨대, CPU (6) 에서 제어 다각형 (control polygon) 들을 이용하여 바운딩 박스를 결정할 수도 있다. 즉, 바운딩 박스 유닛 (40) 은 생성된 프리미티브들의 전부의 경계들에 기초하여 바운딩 박스를 결정할 수도 있다.
본 개시의 양태들에 따르면, GPU (12) 는 바운딩 박스 유닛 (40) 이 바운딩 박스를 결정하였을 때까지 프리미티브들의 셰이딩을 건너뛰도록 구성될 수도 있다. 즉, 바운딩 박스의 생성 동안에, GPU (12) 는 프리미티브들을 셰이딩하지 않으면서, 경로의 프리미티브들을 GPU (12) 의 스텐실 버퍼에 기록할 수도 있다. 바운딩 박스 유닛 (40) 을 편입함으로써, GPU (12) 는 심도 버퍼를 이용하지 않으면서 단일 패스에서 경로를 채울 수도 있다. 예를 들어, GPU (12) 는 바운딩 박스의 상부에서 스텐실링된 TIR 을 수행할 수도 있다.
예시의 목적들을 위한 예에서, GPU (12) 가 바운딩 박스 유닛 (40) 에 의해 결정된 바운딩 박스를 래스터화한 후, GPU (12) 는 바운딩 박스에서 각각의 픽셀에 대한 커버리지 값을 결정할 수도 있다. 일부의 예들에서, GPU (12) 는 픽셀들의 쿼드 (quad) 들 (한 번에 4 개의 픽셀들) 에 대한 커버리지 값들을 결정할 수도 있다. 이러한 예들에서, 프로세싱하기 위한 픽셀 파 (pixel wave) 를 형성하기 전에, GPU (12) 는 쿼드의 각각의 픽셀의 샘플들에 대해 스텐실 테스트를 수행할 수도 있다. GPU (12) 는 테스트의 결과에 기초하여 각각의 픽셀에 대한 커버리지 마스크 (coverage mask) 를 업데이트할 수도 있다. 이 커버리지 값은, GPU (12) 가 그 후에 셰이딩 동안에 이용할 수도 있는 stenciled_TIR 속성으로서 지칭될 수도 있다. 예를 들어, 각각의 픽셀에 대한 InputCoverage 값은 stenciled_TIR 에 기초할 수도 있다. 예를 들어, GPU (12) 는 스텐실 테스트를 통과하는 각각의 픽셀 (예컨대, 여기서 픽셀은 가시적이지 않은 것보다 픽셀의 더 많은 샘플들이 가시적 (셰이딩됨) 일 때에 스텐실 테스트를 통과한다) 을 픽셀 셰이딩 (예컨대, 컬러화) 할 수도 있다. 즉, GPU (12) 는 분산된 프로세서 (DProc) 로부터 샘플러 (sampler) 까지의 (InputCoverage 에 대한) 스텐실 테스트 후에 (중심에 대한) 커버리지 마스크 및 샘플 마스크의 양자를 통과할 수도 있다.
본 개시의 일부의 양태들에 따르면, API 호출은 렌더링의 스텐실링된 TIR 모드를 지원하기 위하여 이용될 수도 있다. 예를 들어, 그래픽 API (26) 는 경로의 렌더링 동안에 스텐실링된 TIR 의 이용을 트리거링하기 위한 하나 이상의 명령들을 포함할 수도 있다. 스텐실링된 TIR 이 활성일 때, (GPU (12) 의 메모리 및/또는 메모리 (10) 에서 할당될 수도 있는) 컬러 버퍼 및 심도/스텐실 버퍼는 상이할 수도 있다. 예를 들어, MSAA 를 수행할 때, GPU (12) 는 1x MSAA 인 컬러 버퍼와, 16x MSAA 인 스텐실 버퍼로 렌더링할 수도 있다.
본 개시의 다른 양태들에 따르면, 프로세싱 유닛들 (34) 은 또한, 대시 세그먼트들을 렌더링하기 위한, 예컨대, 대시 경로를 스트로킹하기 위한 프리픽스 합산 유닛 (42) 을 포함한다. 프리픽스 합산 유닛 (42) 은 대시 라인의 복수의 순서화된 세그먼트들의 각각의 세그먼트에 대한 텍스처 오프셋을 결정할 수도 있다. 일부의 예들에서, 테셀레이션 또는 지오메트리 셰이더 스테이지는 세그먼트들을 생성할 때에 세그먼트 순서를 결정할 수도 있다. 복수의 순서화된 세그먼트들 중의 현재의 세그먼트에 대한 텍스처 오프셋은 순서에 있어서 현재의 세그먼트에 선행하는 세그먼트들의 길이들의 누산에 기초할 수도 있다. 프리픽스 합산 유닛 (42) 은 텍스처 오프셋을, 픽셀 셰이더 스테이지와 같은 셰이더 스테이지에 제공할 수도 있다. 셰이더 스테이지는 텍스처 오프셋을 적용할 수도 있고 적절한 로케이션에서 세그먼트를 렌더링할 수도 있다.
따라서, 프리픽스 합산 유닛 (42) 은, 대시 라인의 세그먼트들의 길이들을 누산시키는 하나 이상의 프로그램가능 또는 고정 함수 유닛들을 포함할 수도 있다. 일부의 예들에서, 프리픽스 합산 유닛 (42) 은 래스터라이저 스테이지에서 편입될 수도 있다. 예를 들어, GPU (12) 는 경로들을 테셀레이팅할 수도 있고, 지오메트리 셰이더 스테이지는 경로 길이를 결정할 수도 있다. 다른 예들에서, 길이는 하나 이상의 다른 셰이더 유닛들에 의해 결정될 수도 있다. 예를 들어, 본 개시의 양태들에 따르면, 프리픽스 합산 유닛 (42) 은 (포인트 프리미티브의 사이즈를 표시하는) 속성 포인트사이즈에 대한 시스템 해독된 값과 유사한 방식으로 라인길이 값 (linelength value) 을 계산할 수도 있다. 즉, 라인길이는 대시 패턴에서 (또한, 프래그먼트로서 지칭된) 세그먼트의 로케이션을 표시하는 시스템 해독된 값일 수도 있다.
GPU (12) 의 (예컨대, 이하의 도 3 에 대하여 설명된 바와 같은) 픽셀 셰이더가 프리픽스 합산된 라인길이 값을 수신할 때, 픽셀 셰이더는 대시 패턴에서 셰이딩되고 있는 프래그먼트의 로케이션을 결정할 수도 있다. 다음으로, 픽셀 셰이더는 결정된 로케이션에 기초하여 (그것이 가시적 대시의 일부를 형성할 경우에) 프래그먼트를 보유할 수도 있거나, 또는 (그것이 가시적 대시의 일부가 아닐 경우에) 프래그먼트를 폐기할 수도 있다. 어떤 경우에도, 프리픽스 합산 유닛 (42) 은 길이 정보를 프리픽스 합으로서 누산시킬 수도 있고, 텍스처 오프셋으로서의 프리픽스 합을, 픽셀 셰이더와 같은 다운스트림 셰이더 스테이지에 제공할 수도 있다.
렌더링 동안, GPU (12) 는 prefix_sum 파라미터를 재설정하기 위하여, 이벤트 presum_start 를 (이하의 도 3 에 대하여 더욱 상세하게 설명된 바와 같은 헐 셰이더, 테셀레이터, 및/또는 도메인 셰이더를 포함할 수도 있는) 테셀레이션 엔진 (tessellation engine; TSE) 으로 전송할 수도 있다. 각각의 프리미티브에 대하여, 프리픽스 합산 유닛 (42) 은 프리미티브의 스칼라 값 (예컨대, 포인트사이즈와 동일한 필드) 을 새로운 값으로서 prefix_sum 에 가산할 수도 있다. 프리픽스 합산 유닛 (42) 은 픽셀 당 과거의 프리픽스 합산 값을 텍스처 오프셋으로서 전달할 수도 있다.
일부의 예들에서, 테셀레이션 엔진은 prefix_sum 파라미터를 누산시키기 위하여 레지스터를 편입시킬 수도 있다. 프리픽스 합산 유닛 (42) 은 이벤트 presum_start 에 의해 레지스터를 재설정할 수도 있다. 테셀레이션 엔진은 (텍스처 오프셋을 전송하는 것과 유사할 수도 있는) 프리미티브 페이스니스 (primitive faceness) 와 유사한, 무게중심 평면 인터페이스에서 렌더 백엔드 (render backend; RB) 에 prefix_sum 을 프리미티브 당 속성으로서 전달한다. 이 예에서는, 이 프리미티브 당 속성을 표현하기 위해 인터페이스를 하이 레벨 시퀀서 (high level sequencer; HLSQ) 에 제공하기 위하여, 속성이 RB 에 가산될 수도 있다.
도 3 은 본 개시의 경로 렌더링 기법들을 수행할 수도 있는 일 예의 그래픽 파이프라인 (43) 을 예시하는 개념도이다. 일부의 예들에서, 그래픽 파이프라인은 Microsoft? DirectX (DX) 11 그래픽 파이프라인에 대응할 수도 있다. 도 3 에서 도시된 바와 같이, 그래픽 파이프라인 (43) 은, 입력 어셈블러 (input assembler; IA) (44), 정점 셰이더 (vertex shader; VS) (46), 헐 셰이더 (HS) (48), 테셀레이터 (50), 도메인 셰이더 (DS) (52), 지오메트리 셰이더 (GS) (54), 래스터라이저 (56), 픽셀 셰이더 (PS) (58), 및 출력 병합기 (60) 를 포함하는 복수의 프로세싱 스테이지들을 포함한다. 헐 셰이더 (48), 테셀레이터 (50), 및 도메인 셰이더 (52) 는 그래픽 파이프라인 (43) 의 테셀레이션 스테이지들 (62) 을 형성할 수도 있다. 게다가, 파이프라인 (43) 은 또한, 자원들 블록 (64) 을 포함한다. 일부의 예들에서, 파이프라인 (43) 은 이하에서 언급된 바와 같은 GPU (12) 에 의해 구현될 수도 있고, 및/또는 GPU (12) 내에 편입될 수도 있다.
자원들 블록 (64) 은 예컨대, 하나 이상의 텍스쳐들 및/또는 하나 이상의 버퍼들과 같은, 그래픽 파이프라인 (43) 에 의해 이용된 하나 이상의 메모리 자원들에 대응할 수도 있다. 자원들 블록 (64) 은 그래픽 파이프라인 (43) 에서 프로세싱 스테이지들 중의 하나 이상에 의해 프로세싱되어야 할 입력 데이터, 및/또는 그래픽 파이프라인 (43) 에서 프로세싱 스테이지들 중의 하나 이상으로부터의 출력 데이터를 저장할 수도 있다. 하나의 예로서, 자원들 블록 (64) 은 본 개시에서 설명된 바와 같이 경로 채우기 동작을 수행하기 위하여 이용된 스텐실 버퍼를 저장할 수도 있다. 또 다른 예로서, 자원들 블록 (64) 은 본 개시에서 설명된 바와 같은 경로 세그먼트에 대한 채움 영역의 래스터화된 버전 및/또는 경로 세그먼트에 대한 스트로크 영역의 래스터화된 버전을 유지하는 프레임 버퍼를 저장할 수도 있다. 일부의 예들에서, 자원들 블록 (64) 을 형성하는 메모리 자원들은 컴퓨팅 디바이스 (2) 의 메모리 (10) 및/또는 GPU 캐시 (14) 내에 상주할 수도 있다.
일직선 모서리들을 갖는 도 3 에서 도시된 프로세싱 스테이지들은 고정 함수 프로세싱 스테이지들을 나타내고, 둥근 모서리들을 갖는 도 3 에서 도시된 프로세싱 스테이지들은 프로그램가능 프로세싱 스테이지들을 나타낸다. 예를 들어, 도 3 에서 도시된 바와 같이, 입력 어셈블러 (44), 테셀레이터 (50), 래스터라이저 (56), 및 출력 병합기 (60) 는 고정 함수 프로세싱 스테이지들이고, 정점 셰이더 (46), 헐 셰이더 (48), 도메인 셰이더 (52), 지오메트리 셰이더 (54), 및 픽셀 셰이더 (58) 는 프로그램가능 프로세싱 스테이지들이다. 프로그램가능 스테이지들의 각각은 특정 타입의 셰이더 프로그램을 실행하도록 구성될 수도 있다. 예를 들어, 정점 셰이더 (46) 는 정점 셰이더 프로그램을 실행하도록 구성될 수도 있고, 헐 셰이더 (48) 는 헐 셰이더 프로그램을 실행하도록 구성될 수도 있는 등등과 같다. 상이한 타입들의 셰이더 프로그램들의 각각은 GPU (12) 의 공통 셰이더 유닛 상에서, 또는 하나 이상의 특정 타입들의 셰이더 프로그램들을 실행하는 것을 전담하는 하나 이상의 전용 셰이더 유닛들 상에서 중 어느 하나에서 실행될 수도 있다.
도 3 에서 도시된 바와 같이, 입력 어셈블러 (44), 정점 셰이더 (46), 헐 셰이더 (48), 도메인 셰이더 (52), 지오메트리 셰이더 (54), 픽셀 셰이더 (58), 및 출력 병합기 (60) 는 자원들 블록 (64) 에 통신가능하게 커플링된다. 입력 어셈블러 (44), 정점 셰이더 (46), 헐 셰이더 (48), 도메인 셰이더 (52), 지오메트리 셰이더 (54), 픽셀 셰이더 (58), 및 출력 병합기 (60) 는 자원들 블록 (64) 으로부터 입력 데이터를 취출 및/또는 수신하도록 구성된다. 지오메트리 셰이더 (54) 및 출력 병합기 (60) 는 출력 데이터를 자원들 블록 (64) 에 기록하도록 구성된다. 그래픽 파이프라인 (43) 에서의 프로세싱 스테이지들과 자원들 블록 (64) 사이의 통신의 위에서 설명된 구성은, 통신이 그래픽 파이프라인 (43) 의 프로세싱 스테이지들과 자원들 블록 (64) 사이에서 어떻게 구성될 수도 있는지에 대한 단지 하나의 예이다. 다른 예들에서는, 다소간의 단방향 및/또는 양방향 통신 채널들이 그래픽 파이프라인 (43) 의 프로세싱 스테이지들과 자원들 블록 (64) 사이에 제공될 수도 있다.
DirectX 11 그래픽 파이프라인의 일반적인 동작에 관한 추가적인 배경 정보는 http://msdn.microsoft.com/en-us/library/windows/desktop/ff476882%28v=vs.85%29.aspx 에서 발견될 수도 있다. DirectX 11 그래픽 파이프라인의 일반적인 동작에 관한 추가의 정보는 Zink 등, "Practical Rendering & Computation with Direct3D 11", CRC Press (2011) 에서 발견될 수도 있다.
2 개의 주요 경로 렌더링 동작들은 다음을 포함할 수도 있다: (1) 경로 세그먼트를 채우는 것; 및 (2) 경로 세그먼트를 스트로킹하는 것. 일부의 사례들에서, 채우기 동작은 다음의 단계들을 일반적으로 수반할 수도 있는 2-패스 접근법을 사용할 수도 있다:
패스 1
1. 경로 세그먼트를 복수의 라인 세그먼트들로 테셀레이팅한다.
2. 매 라인 세그먼트에 대해 삼각형 프리미티브를 생성한다.
3. 삼각형 프리미티브들의 전부를 스텐실 버퍼로 렌더링한다.
패스 2
4. 스텐실 버퍼를 이용하여 경로 세그먼트에 대한 바운딩 박스를 렌더링한다.
제 1 패스에 대하여, CPU (6) 는 렌더링되어야 할 경로 세그먼트를 표시하는 데이터를 정점 버퍼의 하나 이상의 정점들 내로 배치할 수도 있다. 일부의 예들에서, 정점 버퍼는 도 2 에서 도시된 경로 데이터 (36) 에 대응할 수도 있다. 정점 버퍼에서의 정점들에 대한 프리미티브 토폴로지 (primitive topology) 는 일부의 예들에서, 패치 제어 리스트 (patch control list) 일 수도 있다. 라인에 대하여, 패치 제어 리스트에서의 정점들은 라인의 종단포인트들에 대한 좌표들 (예컨대, (x0, y0) 및 (x1, y1)) 을 표시하는 데이터를 포함할 수도 있다. 3차 베지어 곡선에 대하여, 패치 제어 리스트에서의 정점들은 곡선을 정의하는 4개의 제어 포인트들의 좌표들 (예컨대, (x0, y0), (x1, y1), (x2, y2), (x3, y3)) 을 표시하는 데이터를 포함할 수도 있다. 2차 베지어 곡선에 대하여, 패치 제어 리스트에서의 정점들은 4개의 제어 포인트들 대신에, 곡선을 정의하는 3개의 제어 포인트들에 대한 좌표들을 표시하는 데이터를 포함할 수도 있다. 타원 아크들에 대하여, 패치 제어 리스트에서의 정점들은 타원 아크의 종단포인트 파라미터화를 표시하는 데이터, 또는 타원 아크의 중심 파라미터화를 표시하는 데이터를 포함할 수도 있다. CPU (6) 는 또한, 렌더링되어야 할 경로 세그먼트의 타입을 표시하는 데이터를 패치 제어 리스트의 이와 다르게 이용되지 않은 정점 속성 내로 배치할 수도 있다.
경로 렌더링을 수행하기 위하여 GPU (12) 에 의해 수신되고 이용된 경로 데이터 (36) 에 대한 하나의 예의 포맷이 지금부터 설명될 것이다. 이것은 렌더링되어야 할 경로 및/또는 렌더링되어야 할 경로 세그먼트를 표시하는 데이터가 CPU (6) 에 의해 GPU (12) 에 어떻게 제공될 수도 있는지에 대한 단지 하나의 예이고, 다른 예들이 가능하며 본 개시의 범위 내에 있다는 것을 이해해야 한다. 이 예에서, GPU (12) 는 각각의 경로 세그먼트를 4개 (4) 의 제어 포인트 패치 리스트 프리미티브로서 수신한다. 패치 리스트에서의 정점들 (예컨대, 제어 포인트들) 의 각각은 이 예에서, 각각의 정점 (예컨대, 제어 포인트) 에 대한 속성들을 정의하는 3개 (3) 의 플로트 속성 (float attribute) 들을 포함한다.
라인 경로 세그먼트에 대하여, 입력 경로 데이터는 다음 형태 또는 유사한 형태를 취할 수도 있다:
{ XMFLOAT3( X0, Y0, 2.0f ) },
{ XMFLOAT3( X1, Y1, 1.0f ) },
{ XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
{ XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
이 예에서, 각각의 행은 4개의 제어 포인트 패치 리스트의 정점 또는 제어 포인트를 나타내고, 괄호들에서의 각각의 파라미터는 각각의 정점 또는 제어 포인트의 속성을 나타낸다. 이 예에서, 제 1 제어 포인트의 최후 속성은 렌더링되어야 할 경로 세그먼트의 타입을 표시하는 데이터 (즉, "경로 세그먼트 타입 표시자") 를 저장한다. 구체적으로, 이 예에서의 경로 세그먼트 타입 표시자는 2.0f 이며, 이것은 경로 세그먼트가 라인 경로 세그먼트임을 의미한다. X0, Y0, X1, Y1 은 라인 경로 세그먼트의 종단포인트들에 대한 좌표들이며, 여기서, (X0, Y0) 은 제 1 종단포인트를 나타내고, (X1, Y1) 은 제 2 종단포인트를 나타낸다.
이 예에서의 나머지 정점들 및 속성들은 이용되지 않을 수도 있고, 및/또는 경로 세그먼트에 대한 다른 속성들을 표시하기 위하여 이용될 수도 있다. 경로 세그먼트에 대한 다른 속성들은 예컨대, 경로 세그먼트가 개방 경로의 시작부 또는 종반부인지 여부, 경로 세그먼트가 경로에 대해 디스플레이되어야 하는지 여부, 엔드캡 (endcap) 이 경로 세그먼트의 어느 하나의 단부 상에 배치되어야 하는지 여부, 존재할 경우에 어떤 타입의 엔드캡이 이용되어야 하는지, 접합부가 경로 세그먼트의 어느 하나의 단부 상에 배치되어야 하는지 여부, 및 존재할 경우에 어떤 타입의 접합부를 이용할 것인지를 포함할 수도 있다.
3차 베지어 (cubic
Figure 112016021858870-pct00002
) 경로 세그먼트에 대한 입력 경로 데이터는 다음의 형태 또는 유사한 형태를 취할 수도 있다:
{ XMFLOAT3( X0, Y0, 3.0f ) },
{ XMFLOAT3( X1, Y1, 1.0f ) },
{ XMFLOAT3( X2, Y2, 1.0f ) },
{ XMFLOAT3( X3, Y3, 1.0f ) },
이 예에서, 각각의 행은 4개의 제어 포인트 패치 리스트의 정점 또는 제어 포인트를 나타내고, 괄호들에서의 각각의 파라미터는 각각의 정점 또는 제어 포인트의 속성을 나타낸다. 이 예에서, 제 1 제어 포인트의 최후 속성은 렌더링되어야 할 경로 세그먼트의 타입을 표시하는 데이터 (즉, "경로 세그먼트 타입 표시자") 를 저장한다. 구체적으로, 이 예에서의 경로 세그먼트 타입 표시자는 3.0f 이며, 이것은 경로 세그먼트가 3차 베지어 경로 세그먼트임을 의미한다. X0 내지 X3 및 Y0 내지 Y3 은 3차 베지어 경로 세그먼트에 대한 제어 포인트들의 좌표들이며, 여기서, (X0, Y0) 은 제 1 제어 포인트를 나타내고, (X1, Y1) 은 제 2 제어 포인트를 나타내는 등등과 같다. 이 예에서의 나머지 정점들 및 속성들은 이용되지 않을 수도 있고, 및/또는 경로 세그먼트에 대한 다른 속성들을 표시하기 위하여 이용될 수도 있다. 일부의 예들에서, 경로 세그먼트에 대한 다른 속성들은 라인 경로 세그먼트에 대하여 위에서 설명된 것들과 유사한 속성들을 포함할 수도 있다.
3개의 제어 포인트들이 4개의 제어 포인트들 대신에 제공될 수도 있다는 점을 제외하고는, 유사한 입력이 2차 베지어 (quadratic
Figure 112016021858870-pct00003
) 경로 세그먼트에 대해 이용될 수도 있고, 경로 세그먼트 타입 표시자는 3차 베지어 경로 세그먼트와 프리미티브를 구별하기 위하여 상이할 수도 있다.
예를 들어, 2차 베지어 경로 세그먼트에 대한 입력 경로 데이터는 다음의 형태 또는 유사한 형태를 취할 수도 있다:
{ XMFLOAT3( X0, Y0, 1.0f ) },
{ XMFLOAT3( X1, Y1, 1.0f ) },
{ XMFLOAT3( X2, Y2, 1.0f ) },
{ XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
이 예에서, 각각의 행은 4개의 제어 포인트 패치 리스트의 정점 또는 제어 포인트를 나타내고, 괄호들에서의 각각의 파라미터는 각각의 정점 또는 제어 포인트의 속성을 나타낸다. 이 예에서, 제 1 제어 포인트의 최후 속성은 렌더링되어야 할 경로 세그먼트의 타입을 표시하는 데이터 (즉, "경로 세그먼트 타입 표시자") 를 저장한다. 구체적으로, 이 예에서의 경로 세그먼트 타입 표시자는 1.0f 이며, 이것은 경로 세그먼트가 2차 베지어 경로 세그먼트임을 의미한다. X0 내지 X2 및 Y0 내지 Y2 는 2차 베지어 경로 세그먼트에 대한 제어 포인트들의 좌표들이며, 여기서, (X0, Y0) 은 제 1 제어 포인트를 나타내고, (X1, Y1) 은 제 2 제어 포인트를 나타내는 등등과 같다. 이 예에서의 나머지 정점들 및 속성들은 이용되지 않을 수도 있고, 및/또는 경로 세그먼트에 대한 다른 속성들을 표시하기 위하여 이용될 수도 있다. 일부의 예들에서, 경로 세그먼트에 대한 다른 속성들은 라인 경로 세그먼트에 대하여 위에서 설명된 것들과 유사한 속성들을 포함할 수도 있다.
일부의 예들에서, 타원 아크 경로 세그먼트에 대한 입력 경로 데이터는 타원 아크 경로 세그먼트의 중심 파라미터화를 표시하는 데이터를 포함할 수도 있다. 예를 들어, 타원 아크 경로 세그먼트에 대한 입력 경로 데이터는 다음의 형태 또는 유사한 형태를 취할 수도 있다:
{ XMFLOAT3( X0, Y0, 4.0f ) },
{ XMFLOAT3( X1, Y1, 1.0f ) },
{ XMFLOAT3( c.x, c.y, 1.0f ) },
{ XMFLOAT3( theta0, theta1, angle ) },
이 예에서, 각각의 행은 4개의 제어 포인트 패치 리스트의 정점 또는 제어 포인트를 나타내고, 괄호들에서의 각각의 파라미터는 각각의 정점 또는 제어 포인트의 속성을 나타낸다. 이 예에서, 제 1 제어 포인트의 최후 속성은 렌더링되어야 할 경로 세그먼트의 타입을 표시하는 데이터 (즉, "경로 세그먼트 타입 표시자") 를 저장한다. 이 예에서, 경로 세그먼트 타입 표시자는 큰 시계 방향 (large clockwise; LCW) 타원 아크, 큰 반-시계 방향 (large counter-clockwise; LCCW) 타원 아크, 작은 시계 방향 (small clockwise; SCW) 타원 아크, 및 작은 반-시계 방향 (small counter-clockwise; SCCW) 타원 아크에 각각 대응하는 4.0, 4.1, 4.2, 또는 4.3 중의 임의의 것일 수도 있다. X0, X1 및 Y0, Y1 은 타원 아크 경로 세그먼트의 종단포인트 좌표들이며, 여기서, (X0, Y0) 은 아크의 초기 종단포인트를 나타내고, (X1, Y1) 은 아크의 최종 종단포인트를 나타낸다. 게다가, theta0 은 (스케일링되지 않은 원에 대해 측정된 바와 같은) 타원 아크의 초기 포인트의 각도를 나타내고, theta1 은 (스케일링되지 않은 원에 대해 측정된 바와 같은) 타원 아크의 최종 포인트의 각도를 나타낸다. 특히, 위에서 특정된 일 예의 입력 데이터 형태가 중심 파라미터화라고 하더라도, 입력 데이터 형태는 아크의 초기 및 최종 종단포인트들에 대한 좌표들 (즉, (X0, Y0), (X1, Y1)) 을 여전히 포함할 수도 있다. 일부의 예들에서, 이러한 좌표들은 결과적인 지오메트리의 수밀성 (water-tightness) 을 보장하기 위하여 이용될 수도 있다.
추가의 예들에서, 타원 아크 경로 세그먼트에 대한 입력 경로 데이터는 타원 아크 경로 세그먼트의 종단포인트 파라미터화를 표시하는 데이터를 포함할 수도 있다. 예를 들어, 타원 아크 경로 세그먼트에 대한 입력 경로 데이터는 다음의 형태 또는 유사한 형태를 취할 수도 있다:
{ XMFLOAT3( X0, Y0, 4.0f ) },
{ XMFLOAT3( X1, Y1, 1.0f ) },
{ XMFLOAT3( rH, rV, 1.0f ) },
{ XMFLOAT3( angle, 0.0f, 1.0f ) },
이 예에서, 각각의 행은 4개의 제어 포인트 패치 리스트의 정점 또는 제어 포인트를 나타내고, 괄호들에서의 각각의 파라미터는 각각의 정점 또는 제어 포인트의 속성을 나타낸다. 이 예에서, 제 1 제어 포인트의 최후 속성은 렌더링되어야 할 경로 세그먼트의 타입을 표시하는 데이터 (즉, "경로 세그먼트 타입 표시자") 를 저장한다. 이 예에서, 경로 세그먼트 타입 표시자는 큰 시계 방향 (LCW) 타원 아크, 큰 반-시계 방향 (LCCW) 타원 아크, 작은 시계 방향 (SCW) 타원 아크, 및 작은 반-시계 방향 (SCCW) 타원 아크에 각각 대응하는 4.0, 4.1, 4.2, 또는 4.3 중의 임의의 것일 수도 있다. X0, X1 및 Y0, Y1 은 타원 아크 경로 세그먼트의 종단포인트 좌표들이며, 여기서, (X0, Y0) 은 아크의 초기 종단포인트를 나타내고, (X1, Y1) 은 아크의 최종 종단포인트를 나타낸다. 게다가, angle 은 (rh, rv) 에 의한 스케일링 이전에 측정된, x 축에 대한 타원의 반-시계 방향 회전 각도를 나타낸다.
입력 경로 데이터가 종단포인트 파라메트릭 형태로 표현된 타원 아크를 포함하는 예들에서, CPU (6) 는 일부의 예들에서, 렌더링을 위하여 타원 아크를 표시하는 데이터를 GPU (12) 로 전송하기 이전에 타원 아크의 표현을 종단포인트 파라메트릭 형태로부터 중심 파라메트릭 형태로 변환할 수도 있다. 예를 들어, CPU (6) 는 타원 아크의 종단포인트 파라미터화에 기초하여 타원 아크의 중심 파라미터화를 생성할 수도 있고, 타원 아크의 중심 파라미터화를 GPU (12) 로 전송할 수도 있다. 타원 아크에 대한 중심 파라미터화는 위에서 특정된 일 예의 입력 데이터 형태에 따를 수도 있다. 중심 파라미터화는, GPU (12) 에 의한 렌더링을 위하여 접합부 프리미티브들을 생성하기 위하여 CPU (6) 에 의해 궁극적으로 이용될 수도 있는, 타원 아크에 대한 종단포인트 접선 (tangent) 들 및/또는 법선 (normal) 들을 구하기 위하여 CPU (6) 에 의해 이용될 수도 있다.
일부의 예들에서, 스트로킹 동작들은 엔드캡들, 접합부들, 및 개방 경로들을 처리하기 위하여 정점 경로 데이터 입력의 3개의 추가적인 필드들을 이용할 수도 있다. 예를 들어, 어떤 정점 좌표들은, 경로 세그먼트가 개방 경로의 시작부인지, 개방 경로의 종반부인지 여부, 그리고 경로 세그먼트가 누락될 수도 있는지 여부 (예컨대, 경로 세그먼트가 개방 경로의 폐쇄되는 경로 세그먼트임) 를 표시하는 데이터를 저장할 수도 있다. 다음은 위에서 설명된 정점 속성들을 포함하는 일 예의 템플릿 (template) 이다:
{ XMFLOAT3( X0, Y0, 2.0f ) },
{ XMFLOAT3( X1, Y1, 2.0f ) },
{ XMFLOAT3( 0.0f, 0.0f, 2.0f ) },
{ XMFLOAT3( 0.0f, 0.0f, 2.0f ) },
이 템플릿에서, 제 2 정점의 z 좌표 (즉, 제 3 좌표 또는 속성) 상의 2.0f 는, 경로 세그먼트가 개방 경로의 시작부이고 경로 세그먼트의 시작부에서 엔드캡 (즉, 시작캡 (startcap)) 을 넣을 것을 GPU (12) 로 시그널링할 수도 있다는 것을 표시한다. 제 3 정점의 z 좌표 상의 2.0f 는, 경로 세그먼트가 개방 경로의 종반부이고 경로 세그먼트의 종반부에서 엔드캡을 넣을 것을 GPU (12) 로 시그널링할 수도 있다는 것을 표시한다. 최후 정점의 z 좌표 상의 2.0f 는 현재의 프리미티브가 누락되어야 한다는 것 (예컨대, 그것이 개방 경로의 폐쇄되는 라인 또는 경로 세그먼트임) 표시한다.
경로 채우기 동작을 수행하기 위하여, 입력 어셈블러 (44) 는 메모리 (10) 로부터 경로 데이터 (36) 를 획득하고, 경로 데이터 (36) 에 의해 특정된 경로 세그먼트들 (예컨대, 경로 프리미티브들) 을 렌더링하기 위하여 경로 데이터를 그래픽 파이프라인 (43) 의 하나 이상의 후속 스테이지들 상으로 전달한다. 예를 들어, 입력 어셈블러 (44) 는 메모리 (10) 내에 저장된 정점 버퍼로부터 복수의 정점들을 획득할 수도 있고, 정점 셰이더 (46) 로 하여금 정점들을 프로세싱하게 할 수도 있다. 일부의 예들에서, 입력 어셈블러 (44) 는 프로세싱되어야 할 정점들을 정점 셰이더 (46) 로 직접적으로 전달할 수도 있다. 추가적인 예들에서, 입력 어셈블러 (44) 는 자원들 블록 (64) 에서의 정점 버퍼로부터 프로세싱하기 위한 특정 정점들을 취출할 것을 정점 셰이더 (46) 에 지시할 수도 있다.
정점 셰이더 (46) 는, 입력 어셈블러 (44) 및/또는 자원들 블록 (64) 으로부터 수신된 정점들을 프로세싱하고, 정점 셰이더 (46) 에 의해 프로세싱된 각각의 입력 정점에 대한 출력 정점을 생성하도록 구성된다. 예를 들어, 각각의 입력 정점에 대하여, 정점 셰이더 (46) 는 GPU (12) 의 셰이더 유닛 상에서 정점 셰이더 프로그램의 인스턴스 (instance) 를 실행할 수도 있다. 일부의 예들에서, 정점 셰이더 (46) 는 각각의 입력 정점에 대해 "패스-스루 (pass-through)" 정점 셰이더 프로그램을 실행할 수도 있다. "패스-스루" 정점 셰이더 프로그램은 정점 셰이더 (46) 로 하여금, 각각의 입력 정점에 대하여, 입력 정점에 대응하는 정점을 출력하게 할 수도 있다. 이 경우에 있어서, 출력 정점이 입력 정점과 동일한 속성들을 가질 경우, 출력 정점은 입력 정점에 대응할 수도 있다. "패스-스루" 정점 셰이더 프로그램을 구현하기 위하여, 일부의 예들에서, 정점 셰이더 (46) 는 동일한 속성들을 갖는 출력 정점을 생성하기 위하여 아이덴티티 변환 (identity transformation) 을 각각의 입력 정점에 적용할 수도 있다. 정점 셰이더 (46) 에 의해 수신된 입력 정점들과, 정점 셰이더 (46) 에 의해 생성된 출력 정점들은 대안적으로 입력 제어 포인트들 및 출력 제어 포인트들로서 각각 지칭될 수도 있다.
추가의 예들에서, 정점 셰이더 (46) 는 대응하는 입력 정점의 입력 속성들과 동일하지 않은 출력 정점에 대한 하나 이상의 출력 속성들을 생성할 수도 있다. 예를 들어, 정점 셰이더 (46) 는 출력 정점들의 하나 이상의 속성들을 생성하기 위하여, 입력 정점들의 속성들 중의 하나 이상에 대해 실질적인 프로세싱을 수행할 수도 있다. 하나의 예로서, 정점 셰이더 (46) 는 출력 정점들에 대해 하나 이상의 속성들을 생성하기 위하여, 입력 정점들의 위치적인 속성들에 대해 월드 변환 (world transformation), 뷰 변환, 투영 변환, 또는 그 임의의 조합 중 하나 이상을 수행할 수도 있다. 또 다른 예로서, 정점 셰이더 (46) 는 출력 정점에 대해 출력 속성들의 세트를 생성하기 위하여, 입력 속성들의 세트로부터 속성들을 추가 및/또는 삭제할 수도 있다.
테셀레이션 스테이지들 (62) (즉, 헐 셰이더 (48), 테셀레이터 (50), 및 도메인 셰이더 (52)) 은 테셀레이션 엔진을 형성할 수도 있고, 입력 경로 데이터에 의해 정의된 경로 세그먼트를 복수의 라인 세그먼트들로 테셀레이팅할 수도 있다. 복수의 라인 세그먼트들은 렌더링되어야 할 경로 세그먼트의 곡률을 근사화할 수도 있다. 일반적으로, 헐 셰이더 (48) 는 추가의 프로세싱을 위하여 정점 셰이더 (46) 로부터 수신된 제어 포인트들을 도메인 셰이더 (52) 로 전달할 수도 있고, 구성 데이터를 테셀레이터 (50) 에 제공할 수도 있다. 테셀레이터 (50) 는 경로 세그먼트의 특정 타입을 나타내는 하나 이상의 파라메트릭 수식들이 평가되어야 하는 값들을 결정할 수도 있다. 도메인 셰이더 (52) 는 테셀레이터 (50) 에 의해 결정된 값들에서 파라메트릭 수식들을 평가할 수도 있고, 각각의 평가에 대해 정점을 출력할 수도 있다. 일부의 예들에서, 도메인 셰이더 (52) 에 의해 출력된 정점들의 각각은 정점의 위치를 표시하는 하나 이상의 속성들을 포함할 수도 있다. 추가적인 예들에서, 도메인 셰이더 (52) 에 의해 출력된 정점들의 각각은 정점과 연관된 경로 렌더링 프리미티브의 타입을 표시하는 하나 이상의 속성들을 포함할 수도 있다.
일부의 예들에서, 헐 셰이더 (48) 는 정점 셰이더 (46) 및/또는 자원들 블록 (64) 으로부터 수신된 제어 포인트들을 프로세싱할 수도 있고, 헐 셰이더 (48) 에 의해 실행된 헐 셰이더 프로그램의 각각의 인스턴스에 대해 출력 제어 포인트를 생성할 수도 있다. 예를 들어, 헐 셰이더 (48) 에 의해 생성되어야 할 각각의 출력 제어 포인트에 대하여, 헐 셰이더 (48) 는 GPU (12) 의 셰이더 유닛 상에서 헐 셰이더 프로그램의 인스턴스를 실행할 수도 있다. 일부의 예들에서, 헐 셰이더 (48) 는 각각의 출력 제어 포인트에 대해 "패스-스루" 헐 셰이더 프로그램을 실행할 수도 있다. "패스-스루" 헐 셰이더 프로그램은 헐 셰이더 (48) 로 하여금, 각각의 출력 제어 포인트에 대하여, 입력 제어 포인트들의 각각의 하나에 대응하는 제어 포인트를 출력하게 할 수도 있다. 이 경우에 있어서, 출력 제어 포인트가 입력 제어 포인트와 동일한 속성들을 가질 경우, 출력 제어 포인트는 입력 제어 포인트에 대응할 수도 있다.
추가의 예들에서, 헐 셰이더 (48) 는 입력 제어 포인트들의 각각의 하나의 입력 속성들과 동일하지 않은 출력 제어 포인트에 대한 하나 이상의 출력 속성들을 생성할 수도 있다. 예를 들어, 헐 셰이더 (48) 는 출력 제어 포인트들에 대해 하나 이상의 속성들을 생성하기 위하여, 입력 제어 포인트들의 속성들 중의 하나 이상에 대해 실질적인 프로세싱을 수행할 수도 있다. 또 다른 예로서, 헐 셰이더 (48) 는 출력 제어 포인트에 대해 출력 속성들의 세트를 생성하기 위하여, 입력 속성들의 세트로부터 속성들을 추가 및/또는 삭제할 수도 있다. 일부의 예들에서, GPU (12) 가 종단포인트 파라미터화의 형태인 타원 아크에 대한 경로 데이터를 수신할 경우, 헐 셰이더 (48) 는 이하에서 더욱 상세하게 설명된 바와 같이, 타원 아크의 종단포인트 파라미터화를 타원 아크에 대한 중심 파라미터화로 변환할 수도 있다.
추가적인 예들에서, 헐 셰이더 (48) 는 특정 렌더링 동작을 위하여 렌더링되지 않아야 할 프리미티브들을 누락시킬 수도 있다. 프리미티브를 누락시키는 것은 프리미티브에 대응하는 데이터가 그래픽 파이프라인 (43) 의 추가의 스테이지들 상으로 전달되지 않게 함으로써, 이러한 프리미티브가 파이프라인의 나머지에 의해 효과적으로 렌더링되지 않게 하는 프로세스를 지칭할 수도 있다. 예를 들어, 그래픽 파이프라인 (43) 이 채우기 동작을 수행하고 있을 때, 헐 셰이더 (48) 는 접합부 프리미티브들 및 캡 프리미티브들을 누락시킬 수도 있다. 또 다른 예로서, 그래픽 파이프라인 (43) 이 스트로킹 동작을 수행하고 있을 때, 헐 셰이더 (48) 는 개방 경로들에 대한 폐쇄-경로 프리미티브 (close-path primitive) 들을 누락시킬 수도 있다. 폐쇄-경로 프리미티브는 루프를 폐쇄하는 라인 경로 세그먼트를 나타내는 프리미티브를 지칭할 수도 있다. 폐쇄-경로 프리미티브는 개방 경로들보다는 폐쇄된 경로들인 경로들에 대해 전형적으로 이용된다. 일부의 예들에서, 폐쇄-경로 프리미티브는 경로에서 다른 라인 경로 세그먼트들을 식별하기 위하여 이용된 프리미티브 타입 식별자와는 상이한 프리미티브 타입 식별자에 의해 식별될 수도 있다. 예를 들어, 폐쇄 경로 프리미티브는 2.0f 대신에, 2.1f 의 프리미티브 타입 식별자에 의해 식별될 수도 있다.
헐 셰이더 (48) 는 또한, 각각의 경로 세그먼트에 대해 패치 상수 함수 (patch constant function) 의 인스턴스를 실행할 수도 있다. 패치 상수 함수는 출력 값들을 생성할 때에 테셀레이터 (50) 에 의해 이용되도록 하기 위하여, 구성 파라미터들을 결정할 수도 있고 구성 파라미터들을 테셀레이터 (50) 에 제공할 수도 있다. 예를 들어, 패치 상수 함수는 헐 셰이더 (48) 로 하여금, 테셀레이션 인자들을 테셀레이터 (50) 에 제공하게 할 수도 있다. 테셀레이션 인자들은 테셀레이터 (50) 가 특정 테셀레이션 도메인에 적용하기 위한 테셀레이션의 정도 (예컨대, 도메인이 얼마나 미세하게 세분화되어야 하는지 및/또는 도메인이 세분화되어야 하는 더 작은 오브젝트들의 수) 를 특정할 수도 있다. 일부의 예들에서, 헐 셰이더 (48) 는 테셀레이터 (50) 로 하여금, 3차 베지어 곡선들에 대한 4x 테셀레이션, 라운드 접합부들 및 캡들에 대한 4x 테셀레이션, 그리고 라인 세그먼트들에 대한 1x 테셀레이션을 수행하게 할 수도 있다.
또 다른 예로서, 패치 상수 함수는 헐 셰이더 (48) 로 하여금, 테셀레이션 동안에 이용되어야 할 테셀레이션 도메인의 타입을 테셀레이터 (50) 에 제공하게 할 수도 있다. 테셀레이션 도메인은 도메인 셰이더 (52) 에 의한 이용을 위한 복수의 좌표들을 생성하기 위하여 테셀레이터 (50) 에 의해 이용되는 오브젝트를 지칭할 수도 있다. 개념적으로, 테셀레이션 도메인은 테셀레이터 (50) 에 의해 복수의 더 작은 오브젝트들로 세분화되는 오브젝트에 대응할 수도 있다. 그 다음으로, 더 작은 오브젝트들의 정점들의 위치 좌표들은 추가의 프로세싱을 위하여 도메인 셰이더 (52) 로 전송된다. 일부의 예들에서, 테셀레이션 도메인의 타입은 쿼드 (quad), 트리 (tri), 및 등치선 (isoline) 중의 하나인 것으로 선택될 수도 있다. 일부의 예들에서, 도메인이 세분화되는 더 작은 오브젝트들은 삼각형들, 라인 세그먼트들, 또는 포인트들에 대응할 수도 있다. 일부의 예들에서, 헐 셰이더 (48) 는 등치선 테셀레이션 도메인 타입을 특정할 수도 있고, 테셀레이터 (50) 가 등치선 도메인을 라인 세그먼트들로 세분화해야 하는 것으로 특정할 수도 있다.
테셀레이터 (50) 는 테셀레이션 스테이지들 (62) 에 의해 프로세싱된 각각의 경로 세그먼트에 대해 복수의 출력 값들을 생성할 수도 있다. 출력 값들은, 경로 세그먼트의 특정의 타입을 나타내는 하나 이상의 파라메트릭 수식들이 도메인 셰이더 (52) 에 의해 평가되어야 하는 값들을 결정할 수도 있다. 일부의 예들에서, 테셀레이터 (50) 는 하나 이상의 테셀레이션 인자들, 및/또는 헐 셰이더 (48) 에 의해 테셀레이터 (50) 에 제공된 테셀레이션 도메인 타입에 기초하여, 복수의 출력 값들을 생성할 수도 있다. 예를 들어, 테셀레이터 (50) 는 등치선을 복수의 라인 세그먼트들로 세분화할 수도 있고, 정규화된 좌표계 (normalized coordinate system) 에서 복수의 라인 세그먼트들의 각각의 종단포인트에 대해 출력 값을 생성할 수도 있다.
도메인 셰이더 (52) 는 테셀레이터 (50) 로부터 출력 값들을, 그리고 헐 셰이더 (48) 로부터 경로 세그먼트에 대한 제어 포인트들을 수신할 수도 있고, 경로 세그먼트의 곡률 및/또는 형상을 근사화하는 복수의 테셀레이팅된 라인 세그먼트들에 대응하는 출력 정점들을 생성할 수도 있다. 예를 들어, 테셀레이터 (50) 로부터 수신된 출력 값들의 각각에 대하여, 도메인 셰이더 (52) 는 GPU (12) 의 셰이더 유닛 상에서 도메인 셰이더 프로그램의 인스턴스를 실행할 수도 있다. 도메인 셰이더 프로그램은 도메인 셰이더 (52) 로 하여금, 테셀레이터 (50) 로부터 수신된 출력 값들의 각각에 대하여, 각각의 출력 값에 대응하는 출력 정점에 대한 위치 좌표들을 생성하기 위하여, 각각의 출력 값에 기초하여 결정되는 특정 값에서 하나 이상의 파라메트릭 수식들을 평가하게 할 수도 있다. 출력 정점 좌표들을 생성하기 위하여 이용된 파라메트릭 수식들의 계수들 중의 하나 이상은 헐 셰이더 (48) 로부터 수신된 제어 포인트들 중의 하나 이상에 기초하여 정의될 수도 있다. 각각의 출력 정점은 복수의 테셀레이팅된 라인 세그먼트들 중의 하나의 라인 세그먼트의 종단포인트에 대응할 수도 있다. 2개의 연속적인 출력 정점들은 단일 테셀레이팅된 라인 세그먼트의 종단포인트들에 대응할 수도 있다.
추가적인 예들에서, 도메인 셰이더 프로그램은 도메인 셰이더 (52) 로 하여금, 테셀레이터 (50) 로부터 수신된 출력 값들의 각각에 대응하는 출력 정점들에 대해 법선 좌표 (normal coordinate) 들을 생성하게 할 수도 있다. 예를 들어, 도메인 셰이더 프로그램은 도메인 셰이더 (52) 로 하여금, 테셀레이터 (50) 로부터 수신된 출력 값들의 각각에 대하여, 각각의 출력 값에 대응하는 출력 정점에 대한 접선 좌표 (tangent coordinate) 들을 생성하기 위하여, 각각의 출력 값에 기초하여 결정되는 특정 값에서 하나 이상의 추가적인 파라메트릭 수식들을 평가하게 할 수도 있다. 출력 정점에 대한 접선 좌표들은 출력 정점에서 경로 세그먼트와 교차하는 경로 세그먼트의 접선 라인의 방향을 표시할 수도 있다. 도메인 셰이더 (52) 는 각각의 출력 정점에 대응하는 접선 좌표들에 기초하여 출력 정점들의 각각에 대한 법선 좌표들을 생성할 수도 있다. 특정의 출력 정점에 대해 생성된 법선 좌표들은, 출력 정점에서 경로 세그먼트와 교차하는 경로 세그먼트의 접선에 수직인 방향을 표시하는 법선 벡터 (normal vector) 를 표시할 수도 있다.
일부의 예들에서, 그래픽 파이프라인 (43) 이 채우기 동작을 수행하고 있을 때, 도메인 셰이더 (52) 는 이러한 로케이션들에 대해 임의의 법선들을 생성하지 않으면서, 테셀레이팅된 라인 세그먼트들의 종단포인트들의 로케이션들에 대응하는 정점들을 생성할 수도 있다. 이러한 예들에서, 그래픽 파이프라인 (43) 이 스트로킹 동작을 수행하고 있을 때, 도메인 셰이더 (52) 는 일부의 예들에서, 테셀레이팅된 라인 세그먼트들의 종단포인트들의 로케이션들에 대응하는 정점들을 생성할 수도 있고, 이러한 로케이션들에 대응하는 법선들을 생성할 수도 있다.
도메인 셰이더 (52) 는 정점들을 순서화된 시퀀스로 출력할 수도 있으며, 여기서, 인접한 정점들의 각각의 세트는 테셀레이팅된 라인 세그먼트를 나타낸다. 라인 세그먼트들은 정점 버퍼에서 정의되었던 경로 세그먼트를 집합적으로 근사화할 수도 있다. 예를 들어, 도메인 셰이더 (52) 는 다음의 라인 세그먼트들: {0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 5} 를 정의하는 정점들의 다음의 세트 {0, 1, 2, 3, 4, 5} 를 출력할 수도 있다. 추가적인 예들에서, 도메인 셰이더 (52) 는 이전의 예에서 열거된 것과 동일한 라인 세그먼트들을 정의할 수도 있는 정점들의 다음의 세트 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5} 를 출력할 수도 있다.
일부의 예들에서, 테셀레이터 (50) 및 도메인 셰이더 (52) 는 다음의 기법에 따라 경로 세그먼트를 복수의 라인 세그먼트들로 균일하게 테셀레이팅하도록 구성될 수도 있다. 구체적으로, 테셀레이터 (50) 는 파라메트릭 평가를 위한 좌표들을 출력할 수도 있다 (예컨대, t= 0/T, 1/T, 2/T ... T/T, 여기서, T 는 테셀레이션 인자임). 프리미티브의 타입에 따라서는, 도메인 셰이더 (52) 가 테셀레이터 (50) 에 의해 출력되는 값들에서 하나 이상의 파라메트릭 수식들을 평가할 수도 있다.
지오메트리 셰이더 (54) 는 도메인 셰이더 (52) 로부터 테셀레이팅된 라인 세그먼트들을 수신할 수도 있고, 테셀레이팅된 라인 세그먼트들에 기초하여 복수의 프리미티브들을 생성할 수도 있다. 이러한 방식으로, 지오메트리 셰이더 (54) 는 라인 세그먼트들에 대한 세그먼트 순서를 결정할 수도 있다. 테셀레이팅된 라인 세그먼트들의 각각에 대하여, 지오메트리 셰이더 (54) 는 GPU (12) 의 셰이더 유닛 상에서 지오메트리 셰이더 프로그램의 인스턴스를 실행할 수도 있고, 각각의 테셀레이팅된 라인 세그먼트에 기초하여 테셀레이팅된 라인 세그먼트에 대해 삼각형 프리미티브를 생성할 수도 있다. 일부의 예들에서, 테셀레이팅된 라인 세그먼트들의 각각에 대하여, 지오메트리 셰이더 (54) 는 각각의 테셀레이팅된 라인 세그먼트에 대응하는 2 개의 정점들을 도메인 셰이더 (52) 로부터 수신할 수도 있고, 삼각형 프리미티브에 대응하는 3개의 정점들의 세트를 생성할 수도 있다.
일부의 예들에서, 삼각형 프리미티브의 정점들 중의 2개는 2개의 수신된 정점들과 동일한 정점들 (예컨대, 동일한 위치 좌표들을 가짐) 일 수도 있다. 이러한 예들에서, 지오메트리 셰이더 (54) 는 렌더링되어야 할 경로 세그먼트와 연관된 모든 테셀레이팅된 라인 세그먼트들에 공통인 공통 정점에 기초하여 제 3 정점을 생성할 수도 있다. 공통 정점은 테셀레이팅된 라인 세그먼트들의 종단포인트들 중의 하나에 대응할 수도 있거나 대응하지 않을 수도 있다. 일부의 예들에서, 공통 정점은 렌더링되어야 할 경로 세그먼트에 대한 테셀레이팅된 라인 세그먼트들에 대응하는 정점들의 세트에서 제 1 정점에 대응할 수도 있다.
지오메트리 셰이더 (54) 는 도메인 셰이더 (52) 에 의해 생성된 테셀레이팅된 라인 세그먼트들의 각각에 대해 한번 호출될 수도 있다. 테셀레이팅된 라인 세그먼트들의 각각에 대하여, 지오메트리 셰이더 (54) 는 공통 제어 포인트를 삼각형의 제 1 정점으로서 이용하여, 그리고 각각의 테셀레이팅된 라인 세그먼트의 2 개의 종단포인트들을 삼각형의 제 2 및 제 3 정점들로서 이용하여 삼각형 프리미티브를 생성할 수도 있다. 예를 들어, 도메인 셰이더 (52) 가 다음의 라인 세그먼트들: {0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 5} 를 정의하는 정점들의 다음의 세트 {0, 1, 2, 3, 4, 5} 를 생성한 예가 위에서 제공된다. 라인 세그먼트들의 위에서 열거된 시퀀스에 대하여, 지오메트리 셰이더 (54) 는 다음의 삼각형들: {C, 0, 1}, {C, 1, 2}, {C, 2, 3}, {C, 3, 4}, {C, 4, 5}, {C, 4, 5} 를 생성할 수도 있으며, 여기서, C 는 삼각형들의 전부에 공통인 임의의 단일 정점이다.
래스터라이저 (56) 는 복수의 3D 그래픽 프리미티브들 (예컨대, 포인트들, 라인들, 및 삼각형들) 을 3D 그래픽 프리미티브들에 대응하는 복수의 픽셀들로 변환하도록 구성될 수도 있다. 예를 들어, 래스터라이저 (56) 는 삼각형 프리미티브에 대응하는 3개의 정점들을 수신할 수도 있고, 3개의 정점들을, 삼각형 프리미티브에 의해 커버되는 스크린 픽셀 로케이션들에 대응하는 복수의 픽셀들로 변환할 수도 있다. 삼각형 프리미티브에 의해 커버되는 스크린 픽셀 로케이션들은, 삼각형의 정점들, 삼각형의 에지들, 및 삼각형의 내부에 대응하는 스크린 픽셀 로케이션들을 포함할 수도 있다.
픽셀 셰이더 (58) 는 래스터라이저 (56) 로부터 픽셀들을 수신할 수도 있고, 픽셀 셰이더 프로그램에 따라 수신된 픽셀들에 기초하여 셰이딩된 픽셀들을 생성할 수도 있다. 예를 들어, 래스터라이저 (56) 로부터 수신된 각각의 픽셀에 대하여, 픽셀 셰이더 (58) 는 GPU (12) 의 셰이더 유닛 상에서 픽셀 셰이더 프로그램의 인스턴스를 실행할 수도 있다. 일부의 예들에서, 픽셀 셰이더 (58) 는 각각의 픽셀에 대해 "패스-스루" 픽셀 셰이더 프로그램을 실행할 수도 있다. "패스-스루" 픽셀 셰이더 프로그램은 픽셀 셰이더 (58) 로 하여금, 각각의 픽셀에 대하여, 입력 픽셀의 각각의 하나에 대응하는 픽셀을 출력하게 할 수도 있다. 이 경우에 있어서, 출력 픽셀이 입력 픽셀과 동일한 속성들을 가질 경우, 출력 픽셀은 입력 픽셀에 대응할 수도 있다.
추가의 예들에서, 픽셀 셰이더 (58) 는 입력 픽셀들의 각각의 하나의 입력 속성들과 동일하지 않은 출력 픽셀에 대한 하나 이상의 출력 속성들을 생성할 수도 있다. 예를 들어, 픽셀 셰이더 (58) 는 출력 픽셀에 대해 하나 이상의 속성들을 생성하기 위하여 입력 픽셀의 속성들 중의 하나 이상에 대해 실질적인 프로세싱을 수행할 수도 있다. 또 다른 예로서, 픽셀 셰이더 (58) 는 출력 픽셀에 대해 출력 속성들의 세트를 생성하기 위하여, 입력 속성들의 세트로부터 속성들을 추가 및/또는 삭제할 수도 있다.
출력 병합기 (60) 는 픽셀 셰이더 (58) 로부터 수신된 픽셀 데이터를 렌더 타겟 (예컨대, 프레임 버퍼 또는 스텐실 버퍼) 내로 배치할 수도 있다. 일부의 예들에서, 출력 병합기 (60) 는 래스터 동작에 기초하여, 픽셀 셰이더 (58) 로부터 수신된 픽셀 데이터를, 렌더 타겟 내에 이미 저장된 픽셀 데이터와 병합할 수도 있다.
경로 채우기 동작을 수행하기 위하여, 래스터라이저 (56) 는 지오메트리 셰이더 (54) 에 의해 수신된 삼각형들의 각각을 공통 스텐실 버퍼 (예컨대, 자원들 블록 (64) 내에 저장된 버퍼) 로 래스터화할 수도 있다. 제 1 패스 동안, 픽셀 셰이더 (58) 는 입력 픽셀들을 출력 병합기 (60) 로 직접적으로 전달하기 위하여, 디스에이블 (disable) 될 수도 있거나 "패스-스루" 모드로 설정될 수도 있다. 출력 병합기 (60) 는, 하나 이상의 스텐실 버퍼 채우기 기법들에 따라, 스텐실 버퍼가 경로 세그먼트에 대한 채움 영역을 표시하는 값들을 저장하도록 스텐실 버퍼를 파퓰레이팅 (populating) 하도록 구성될 수도 있다.
본 개시의 양태들에 따르면, 위에서 언급된 바와 같이, GPU (12) 는 스텐실링된 TIR 과, 다음의 단계들을 수반하는 바운딩 박스를 이용하는 단일 패스 접근법을 이용하여 채우기 동작을 수행할 수도 있다:
1. 경로 세그먼트를 복수의 라인 세그먼트들로 테셀레이팅한다.
2. 매 라인 세그먼트에 대해 삼각형 프리미티브를 생성한다.
3. 삼각형 프리미티브들의 전부를 스텐실 버퍼로 렌더링한다.
4. 스텐실링 동안에 바운딩 박스를 결정한다.
5. 스텐실링된 TIR 로 바운딩 박스를 렌더링한다.
상기 예에서, GPU (12) 는 바운딩 박스 파라미터들 (예컨대, bb_box) 이 재설정되어야 한다는 것을 표시하는 이벤트 (예컨대, bb_start) 를 테셀레이션 스테이지들 (62) (또한, 본원에서 테셀레이션 엔진으로서 지칭됨) 로 전송할 수도 있다. 다음으로, GPU (12) 는 위에서 설명된 프로세스를 이용하여 스텐실 버퍼를 업데이트하면서 삼각형 프리미티브들을 생성할 수도 있다. 게다가, 테셀레이션 스테이지들 (62) 은 최소-최대 파라미터들을 정점들 데이터와 비교함으로써 바운딩 박스 파라미터들 (bb_box) 을 업데이트한다. 즉, 테셀레이션 스테이지들 (62) 은 예컨대, 데카르트 좌표 (Cartesian coordinate) 들을 이용하여, 정점이 임의의 이전에 결정된 정점들의 더욱 상부, 하부, 우측, 또는 좌측에 위치되는 로케이션을 가지는지 여부를 결정하기 위하여, 정점들의 각각을 검사할 수도 있다. 정점이 다른 정점들에 대하여 가장 외부 로케이션에서 위치될 경우, 테셀레이션 스테이지들 (62) 은 바운딩 박스 파라미터들 (bb_box) 을 업데이트할 수도 있다.
테셀레이션 스테이지들 (62) 이 바운딩 박스 종료 이벤트 (예컨대, bb_end) 를 수신할 때, 테셀레이션 스테이지들은 결정된 바운딩 박스 좌표들에 대응하는 rectlist 를 생성할 수도 있고, 예컨대, 경로의 삼각형 프리미티브들을 둘러싸는 바운딩 박스를 형성할 수도 있다. 다음으로, 래스터라이저 (56) 는 바운딩 박스를 래스터화할 수도 있다. 본 개시의 양태들에 따르면, 래스터라이저 (56) 는, 스텐실링된 픽셀들이 렌더 타겟에 대하여 수퍼-샘플링되고 픽셀 셰이더 (58) 는 스텐실링된 픽셀들을 셰이딩하기만 하는 스텐실링된 TIR 을 수행할 수도 있다. 픽셀 셰이더 (58) 가 픽셀들을 셰이딩하므로, 픽셀들에 대한 스텐실 값은 스텐실 버퍼로부터 소거될 수도 있다.
따라서, 위에서 설명된 예에서, 테셀레이션 스테이지들 (62) 은 바운딩 박스 시작 이벤트 (bb_start) 와 바운딩 박스 종료 이벤트 (bb_end) 사이의 바운딩 박스 파라미터들 (bb_box) 의 누산을 유지한다. (예컨대, 지오메트리 셰이더 (54), 래스터라이저 (56), 픽셀 셰이더 (58), 및/또는 출력 병합기 (60) 를 포함하는) 렌더 백엔드는 바운딩 박스 시작 이벤트 (bb_start) 와 바운딩 박스 종료 이벤트 (bb_end) 사이에서 고정된 동작들을 예상한다. 즉, 렌더 백엔드는, 자원들 블록 (64) 에서 할당될 수도 있는 렌더 백엔드 레지스터들을 프로그래밍하는 (GPU 드라이버 (28) (도 2) 와 같은) 드라이버 없이 바운딩 박스를 결정하는 것과 연관된 동작들을 수행할 수도 있다. 테셀레이션 스테이지들 (62) 에 대하여 설명되었지만, 상기 기법들은 그래픽 파이프라인의 하나 이상의 다른 스테이지들에 의해 수행될 수도 있다는 것을 이해해야 한다. 이러한 방법으로, GPU (12) 는 단일 패스에서, 그리고 별도의 패스 동안에 바운딩 박스를 렌더링할 필요 없이 경로를 채우기 위하여 그래픽 파이프라인 (43) 을 이용할 수도 있다.
본 개시의 다른 양태들에 따르면, 그래픽 파이프라인 (43) 은 스트로킹된 경로 세그먼트에 대해 대싱을 수행하도록 구성될 수도 있다. 예시의 목적들을 위한 예에서, 지오메트리 셰이더 (54) 는 도메인 셰이더 (52) 로부터 테셀레이팅된 라인 세그먼트들을 수신할 수도 있고, 테셀레이팅된 라인 세그먼트들에 기초하여 복수의 프리미티브들을 생성할 수도 있다. 복수의 프리미티브들은 셰이딩되어야 할 대시 세그먼트들을 포함할 수도 있고, 복수의 프리미티브들은 특정한 순서, 예컨대, 세그먼트 순서로 되어 있을 수도 있다. 지오메트리 셰이더 (54) (또는 그래픽 파이프라인 (43) 의 또 다른 컴포넌트) 는 또한, 대시들의 각각의 길이를 결정할 수도 있다.
게다가, 지오메트리 셰이더 (54) 는 각각의 대시가 생성될 때에 대시들의 길이를 누산시키고, 각각의 대시 세그먼트에 이전의 대시 세그먼트들, 예컨대, 세그먼트 순서에서 현재의 세그먼트에 선행하는 대시 세그먼트들의 길이들의 프리픽스 합을 배정한다. 예를 들어, 제 1 대시 세그먼트에는 제로의 프리픽스 합이 배정될 수도 있고, 제 2 대시 세그먼트에는 제 1 대시 세그먼트의 길이의 프리픽스 합이 배정될 수도 있고, 제 3 대시 세그먼트에는 제 1 및 제 2 대시 세그먼트들의 조합의 길이의 프리픽스 합이 배정될 수도 있는 등등과 같다.
래스터라이저 (56) 는 대시 세그먼트들을 전형적으로 수신하고, 래스터화 동안에 프리미티브 순서를 따르며, 여기서, 프리미티브 순서는 렌더링하기 위한 순서를 지칭한다. 래스터화 후에, 각각의 대시 세그먼트에 대한 프리픽스 합은 대시 세그먼트들을 셰이딩할 때에 이용하기 위하여 픽셀 셰이더 (58) 로 전송될 수도 있다. 예를 들어, 적절한 로케이션에서 대시 세그먼트들을 셰이딩하기 위하여, 픽셀 셰이더 (58) 는 각각의 대시 세그먼트에 대한 프리픽스 합을 텍스처 오프셋으로서 적용할 수도 있다. 텍스처 오프셋은 이전의 대시 세그먼트들의 로케이션을 표시함으로써, 픽셀 셰이더 (58) 가 이전의 세그먼트들에 대하여 적절한 로케이션에서 다음의 대시 세그먼트를 셰이딩하도록 한다.
도 4 는 렌더링되어야 할 일 예의 경로 (80) 의 도면이다. 예를 들어, 경로 (80) 는 둥근 상부 (rounded top) 및 세장형 하부 (elongated bottom) 를 갖는 "아이스크림 콘 (ice cream cone)" 형상을 나타낸다. 경로 (80) 는 2 개의 정육면체들로 이루어지는 폐쇄된 경로일 수도 있다. 세그먼트들은 패치4 프림 (patch4 prim) 들 (프리미티브들) 로 팩킹 (packing) 될 수도 있다. 예를 들어, 경로 (80) 에 대한 입력 경로 데이터는 다음의 형태 또는 유사한 형태를 취할 수도 있다:
{ XMFLOAT4(0.0f, 0.0f, CUBIC, 0.0f) },
{ XMFLOAT4(0.4f, 1.2f, 0.0f, 0.0f) },
{ XMFLOAT4(1.4f, 1.2f, 0.0f, 0.0f) },
{ XMFLOAT4(1.8f, 0.0f, 0.0f, 0.0f) },
{ XMFLOAT4(1.8f, 0.0f, CUBIC, 0.0f) },
{ XMFLOAT4(0.5f,-3.0f, 0.0f, 0.0f) },
{ XMFLOAT4(1.3f,-3.0f, 0.0f, 0.0f) },
{ XMFLOAT4(0.0f, 0.0f, 0.0f, 0.0f)
이 예에서, 각각의 행은 정점 또는 제어 포인트를 나타내고, 괄호들 내의 각각의 파라미터는 각각의 정점 또는 제어 포인트의 속성을 나타낸다. 이 예에서, 제 1 제어 포인트의 최후 속성은 렌더링되어야 할 경로 세그먼트의 타입을 표시하는 데이터 (즉, "경로 세그먼트 타입 표시자") 를 저장한다. 구체적으로, 이 예에서의 경로 세그먼트 타입 표시자는 0.0f 이며, 이것은 경로 세그먼트가 3차 베지어 경로 세그먼트임을 의미한다. 일부의 예들에서, 경로 세그먼트에 대한 다른 속성들은 라인 경로 세그먼트에 대하여 위에서 설명된 것들과 유사한 속성들을 포함할 수도 있다.
도 5a 내지 도 5c 는 도 4 에서 도시된 경로 (80) 에 대한 일 예의 채우기 동작을 예시하는 도면들의 시퀀스이다. 경로 (80) 는 예시의 목적들을 위한 도 5a 내지 도 5c 의 예에서 테셀레이팅되고 있는 중이다 (예컨대, 전형적인 것보다 더 적은 세그먼트들을 가짐). 게다가, 설명의 목적들을 위하여 GPU (12) 에 대하여 설명되었지만, 도 5a 내지 도 5c 에서 수행된 프로세스는 다양한 다른 프로세서들에 의해 수행될 수도 있다.
도 5a 에서 도시된 바와 같이, GPU (12) 는 라인스트립 (linestrip) 방식 (84) 으로 연결되는 다수의 정점들 (82) 을 포함하기 위하여 경로 (80) 를 테셀레이팅한다. 도 5b 에서 도시된 바와 같이, GPU (12) 는 다수의 삼각형 프리미티브들을 형성하기 위하여 피봇 포인트 (88) 에 연결되는 다수의 라인 세그먼트들 (86) 을 생성한다. 도 5b 의 예에서, 경로 (80) 의 상대적인 제 1 정점은 피봇 포인트 (88) 로서 이용된다. 삼각형들의 와인딩 순서 (winding order) 는 적절한 스텐실 동작을 결정할 것이다. 예를 들어, 매 생성된 라인 세그먼트는 피봇 포인트 (88) 에 연결된다. 삼각형의 결과적인 배향 (예컨대, 시계 방향 또는 반시계 방향) 은 삼각형 프리미티브들의 와인딩 순서를 결정할 수도 있다. 와인딩 순서는 상이한 방법들로 스텐실 값에 영향을 줄 수도 있다 (예컨대, 시계 방향 와인딩 순서에 대해 스텐실 값을 증분 (increment) 시키거나 반시계 방향 와인딩 순서에 대해 스텐실 값을 감분 (decrement) 시킴).
이 예에서, GPU (12) 는 스텐실링 동안에 도 5b 에서 도시된 삼각형 프리미티브들을 셰이딩하지 않는다. 오히려, 위에서 언급된 바와 같이, 스텐실링 동안에 렌더링되는 삼각형 프리미티브들은 스텐실 텍스처 (90) 에 영향을 주기만 한다. 즉, 스텐실 텍스처 (90) 는, 이미지에서 나타나는 예컨대, 렌더링되고 셰이딩되는 경로의 부분들을 표시한다.
도 5c 에서 도시된 바와 같이, GPU (12) 는 스텐실 텍스처 (90) 를 둘러싸는 바운딩 박스 (92) 를 결정한다. 즉, 바운딩 박스는 채워져야 하는 경로의 전체를 커버한다. 다음으로, GPU (12) 는 채워진 경로 (96) 를 생성하기 위하여 바운딩 박스 (92) 에 대해 스텐실링된 TIR 을 수행한다. 이러한 방법으로, GPU (12) 는 단일 렌더링 패스에서 바운딩 박스 (92) 를 결정하고 경로 (80) 를 채운다.
도 6 은 스텐실링 동작을 예시하는 개념도이다. 예를 들어, 예시의 목적들을 위하여, GPU (12) 가 16x MSAA 를 이용하여 프리미티브 (100) 를 렌더링하는 것으로 가정한다. 이 예에서, 각각의 정사각형은 픽셀 (102) 의 샘플을 나타낸다.
본 개시의 양태들에 따르면, GPU (12) 는 스텐실링된 TIR 을 수행할 수도 있다. 따라서, GPU (12) 는 렌더 타겟 파라미터 (예컨대, 렌더링된 픽셀에 대한 메모리 할당) 와는 독립적으로 스텐실 파라미터 (예컨대, 스텐실 샘플링 레이트) 를 결정할 수도 있다. 이 예에서, GPU (12) 는 픽셀이 샘플 당 스텐실 테스트를 통과하는지 여부에 기초하여 픽셀을 렌더링하기 위한 커버리지 값을 결정할 수도 있다.
일부의 예들에서, GPU (12) 는 샘플들이 비-제로 (non-zero) 값을 가지는지를 결정하기 위하여 스텐실 테스트를 수행할 수도 있다. 예를 들어, GPU (12) 는 비-제로 스텐실 값들을 가지는 샘플들이 렌더링되는 제로/비-제로 스텐실 테스트를 수행할 수도 있다. 또 다른 예에서, GPU (12) 는 홀수 (또는 짝수) 값을 가지는 샘플들이 렌더링되는 홀수/짝수 스텐실 테스트를 수행할 수도 있다. 따라서, 일부의 예들에서, GPU (12) 는 샘플들이 홀수 값을 가지는지를 결정하기 위하여 스텐실 테스트를 수행할 수도 있다. 또 다른 예들에서, GPU (12) 는 샘플들이 짝수 값을 가지는지를 결정하기 위하여 스텐실 테스트를 수행할 수도 있다.
어떤 경우에도, 도 6 에서 도시된 예에서, 픽셀 (102) 의 (다시, 박스들에 의해 표현된) 16 개의 샘플들 중의 10 개는 프리미티브 (100) 내에 위치된다. 따라서, 프리미티브 (100) 에 대한 커버리지 마스크는 픽셀 (102) 을 포함할 수도 있고, GPU (12) 는 렌더링 동안에 픽셀 (102) 을 셰이딩할 수도 있다.
도 7 은 본 개시의 양태들에 따라, 일 예의 채우기 동작을 예시하는 개념도이다. 예를 들어, 도 7 은 삼각형 프리미티브들을 결정하고 그 프리미티브들 (110) 의 배향에 기초하여 스텐실 버퍼를 업데이트하는 것, 프리미티브들의 가장 외부 포인트들에 기초하여 바운딩 박스 (112) 를 결정하는 것, 스텐실 버퍼 (114) 의 내용들, 및 그려진 바운딩 박스 및 스텐실링된 픽셀들 (116) 을 예시한다.
일부의 예들에 따르면, 스텐실링 동안에 바운딩 박스를 결정하고 스텐실 내에 포함된 프리미티브들을 렌더링하는 시퀀스는 다음의 API 호출을 이용하여 GPU (12) 에 의해 수행될 수도 있다:
Draw_BB(); // 그리기 호출 내의 프리미티브들의 바운딩 박스를 연산함
// 또는 그것은 BeginQuery()…EndQuery() 일 수 있음
// 픽셀 셰이더가 바운딩되지 않을 경우, 바운딩 박스만이
// 연산되고 프리미티브들은 렌더링되지 않음
Render_BB(); // 이전에 연산된 바운딩 박스를 렌더링하거나, 또는 그것은
// 프리미티브들이 전송되지 않는 것을 제외하고는 그리기 호출과 동일한
// DrawIndirect-유사 방법일 수 있지만, 픽셀 셰이더 및
// 다른 백-엔드 상태들이 특정됨
여기서, Draw_BB 는 (렌더링 픽셀들 없이) 스텐실링 동안에 바운딩 박스 (112) 를 결정할 것을 GPU (12) 에 명령하고, Render_BB 는 바운딩 박스 상부에서 스텐실링된 TIR 을 수행할 것을 GPU (12) 에 명령한다. 이러한 방법으로, GPU (12) 는 단일 렌더링 패스에서 바운딩 박스를 결정할 수도 있고 경로 채우기를 수행할 수도 있다.
도 8 은 본 개시의 양태들에 따라, 렌더링 동안의 메모리 대역폭을 예시하는 그래프이다. 예를 들어, 도 8 은 3 개의 상이한 안티에일리어싱 레이트들 (4x, 8x, 및 16x) 과, 3 개의 렌더링 방식들의 각각에 대한 레이트들과 연관된 연관 데이터 전송을 예시한다: 테셀레이션 및 지오메트리 셰이딩이 수행되는 MSAA 방식 (120), 스텐실링된 TIR 방식 (122), 및 보존적 래스터화 방식 (124) (예컨대, Loop-Blinn 프로세스). 도 8 에서 도시된 대역폭 요건들은 60 초 당 프레임 (frame per second; fps) 들에서 렌더링된 이미지들의 테스트 시퀀스와, 32 비트들의 컬러, 24 비트들의 심도, 및 8 비트들의 스텐실을 가지는 버퍼 포맷과 연관된다.
도 8 의 그래프에서 도시된 바와 같이, MSAA (120) 에 대한 메모리 대역폭 요건은 스텐실링된 TIR (122) 및 보존적 래스터화 (124) 에 대한 메모리 대역폭 요건보다 상당히 더 크다. 이하에서 도시된 표 1 은 MSAA (120), 보존적 래스터화 (124), 및 스텐실링된 TIR (122) 의 비교를 예시한다.
Figure 112016021858870-pct00004
이하에 도시된 표 2 는 MSAA (120), 스텐실링된 TIR (122), 및 보존적 래스터화 (124) 사이의 추가적인 비교를 예시한다.
Figure 112016021858870-pct00005
도 9a 내지 도 9d 는 도 4 에서 도시된 경로에 대한 일 예의 대싱 동작을 예시하는 도면들의 시퀀스이다. 다시, 경로 (80) 는 예시의 목적들을 위한 도 9a 내지 도 9d 의 예에서 테셀레이팅되고 있는 중이다. 게다가, 설명의 목적들을 위하여 GPU (12) 에 대하여 설명되었지만, 도 9a 내지 도 9d 에서 수행된 프로세스는 다양한 다른 프로세서들에 의해 수행될 수도 있다.
도 9a 에서 도시된 바와 같이, GPU (12) 는 라인스트립 (84) 으로 연결되는 다수의 정점들 (82) 을 포함하기 위하여 경로 (80) 를 테셀레이팅한다. 게다가, GPU (12) 는 (정점들로부터 연장되는 화살표들로서 도시된) 법선들 (130) 의 수를 결정한다. 도 9a 의 예에서, 이중 법선들 (130) 은 접합부 로케이션을 표시한다. 접합부들을 생성하는 것은 라인스트립에서 다음의 프리미티브의 종단포인트 접선들을 요구할 수도 있다. 도 9a 는 또한, 일 예의 세그먼트 (132) 를 포함한다.
도 9b 는 세그먼트 (132) 가 스트로크폭/2 에 의해 +/- 법선 방향들로 패트닝되는 (fatten) 세그먼트 (132) 에 대한 패트닝 동작 (fattening operation) 을 GPU (12) 가 수행하는 것을 예시한다. 여분의 두꺼운 스트로크는 예시의 목적들을 위한 도 9b 의 예에서 도시되어 있다. 도 9b 는 패트닝된 세그먼트 (134) 및 스트로킹된 패트닝된 세그먼트 (136) 를 예시한다.
도 9c 는 대싱 스트로킹된 패트닝된 세그먼트 (136) 를 예시한다. 예를 들어, GPU (12) 는 제 1 대시 세그먼트 (138), 제 2 대시 세그먼트 (140), 및 제 3 대시 세그먼트 (142) 를 결정할 수도 있다. 이 예에서, 제 1 대시 세그먼트 (138) 및 제 3 대시 세그먼트 (142) 는 가시적 세그먼트들인 반면, 제 2 대시 세그먼트 (140) 는 비가시적 대시 세그먼트이다. 대싱을 위하여, GPU (12) 는 각각의 대시 세그먼트 (라인) (138, 140, 및 142) 에 대한 시작 로케이션을 결정한다. 위에서 언급된 바와 같이, 일부의 예들에서, 프리픽스 합산 유닛 (42) 은 지오메트리 셰이딩 동안에 대시 세그먼트들 (138 내지 142) 의 길이를 누산시킬 수도 있다.
GPU (12) 는 길이들을 0 으로부터 라인 길이 L 까지의 텍스처 좌표들에 대한 텍스처 오프셋으로서 적용할 수도 있다. 예를 들어, 본 개시의 양태들에 따르면, 프리픽스 합산 유닛 (42) 은 세그먼트들 (138 내지 142) 의 각각의 로케이션을 표시하는 라인길이 값을 계산할 수도 있다. 프리픽스 합산 유닛 (42) 은 프리픽스 합산된 라인길이 값을, 픽셀 셰이딩 동안에 세그먼트들 (138 내지 142) 의 각각의 로케이션들을 결정하는 픽셀 셰이더 스테이지로 전송할 수도 있다. GPU (12) 는 가시적 대시 패턴의 일부를 형성할 때에 가시적 세그먼트들 (138 및 142) 을 (셰이딩된 프래그먼트들로서) 보유하고, 대시 패턴에서 비가시적일 때에 (셰이딩하지 않으면서) 세그먼트 (140) 를 폐기한다.
일부의 예들에서, 포인트사이즈 (pointsize) 와 같은 프리미티브 당 스칼라 값들을 결정하는 것을 지원하는 그래픽 API 는 스칼라 길이들을 결정할 것을 GPU (12) 에 명령하기 위하여 이용될 수도 있다. 본 개시의 양태들에 따르면, 그래픽 API 는 라인길이 값을 지원할 수도 있다. 라인길이 값은 프리미티브의 동일한 플랫 속성일 수도 있지만, 속성은 픽셀 셰이더 스테이지에 제공될 수도 있다. 예를 들어, GPU (12) 는 픽셀 셰이딩 동안에 오프셋 좌표들을 결정하기 위하여 테셀레이팅된 프리미티브 당 프리픽스 합산 경로를 적용할 수도 있다. 게다가, (query_start/end 와 유사한) API 호출들 prsum_start, prsum_end 는 대시 라인의 상대적인 시작 및 종료를 표시하기 위하여 하나 이상의 그리기 호출들을 브라켓화 (bracketize) 할 수도 있다.
도 9d 는 채워지고 대시 경로 (146) 를 생성하기 위하여 대시 스트로크 (142) 의 채워진 경로 (144) 에의 추가를 예시한다.
도 10 은 본 개시에 따라 채우기 동작을 수행하기 위한 일 예의 기법을 예시하는 흐름도이다. 예시의 목적들을 위하여 GPU (12) 에 의해 수행되는 것으로서 설명되었지만, 도 10 에서 도시된 기법은 다양한 다른 프로세서들에 의해 수행될 수도 있다는 것을 이해해야 한다. 게다가, 도시된 것들보다 더 적거나, 추가적이거나, 상이한 단계들이 기법을 수행하기 위하여 이용될 수도 있다.
도 10 의 예에서, GPU (12) 는 경로 데이터를 수신한다 (160). 경로 데이터는 렌더링되어야 할 경로의 하나 이상의 경로 세그먼트들을 표시할 수도 있다. GPU (12) 는 또한, 스텐실 파라미터를 결정한다 (162). 일부의 예들에서, 스텐실 파라미터는 경로의 각각의 안티에일리어싱된 픽셀에 대한 커버리지 값을 결정하기 위한 샘플링 레이트를 표시할 수도 있다. GPU (12) 는 또한, 스텐실 파라미터와는 별도로, 렌더 타겟 파라미터를 결정한다 (164). 렌더 타겟 파라미터는 경로의 각각의 안티에일리어싱된 픽셀에 대한 메모리 할당을 표시할 수도 있다.
GPU (12) 는 경로 데이터에 의해 정의된 경로 세그먼트를 복수의 라인 세그먼트들로 테셀레이팅한다 (166). 예를 들어, GPU (12) 는 경로 데이터를, 도 5a 에서 도시된 라인스트립과 같은 라인스트립으로 테셀레이팅할 수도 있다. 다음으로, GPU (12) 는 복수의 라인 세그먼트들에 기초하여 복수의 삼각형 프리미티브들을 생성한다 (168). 복수의 삼각형 프리미티브들의 각각은 복수의 라인 세그먼트들의 각각의 하나에 기초하여 생성될 수도 있다. 주어진 경로 세그먼트에 대한 복수의 삼각형 프리미티브들의 각각은 공통 정점을 공유할 수도 있다. 삼각형 프리미티브들의 각각에 대한 다른 2 개의 정점들은 복수의 라인 세그먼트들의 각각의 하나의 종단포인트들에 대응할 수도 있다.
GPU (12) 는 스텐실 파라미터를 이용하여 복수의 삼각형 프리미티브들의 각각을 공통 스텐실 버퍼로 렌더링하고, 바운딩 박스를 결정한다 (170). 예를 들어, 위에서 언급된 바와 같이, GPU (12) 는 스텐실링 동안에 삼각형 프리미티브들을 셰이딩하지 않는다. 그러나, GPU (12) 는 프리미티브들에 대한 바운딩 박스를 결정하기 위하여 삼각형 프리미티브들의 가장 외부 포인트들을 결정할 수도 있다. 일부의 예들에서, GPU (12) 는 각각의 삼각형 프리미티브에 대한 좌표들을 결정할 수도 있고, 프리미티브가 이전의 삼각형 프리미티브의 가장 외부 포인트를 초월하여 연장될 때마다 상부 경계 포인트, 하부 경계 포인트, 우측 경계 포인트, 및/또는 좌측 경계 포인트를 겹쳐쓰기할 수도 있다.
삼각형 프리미티브들의 전부를 스텐실 버퍼로 렌더링한 후, 스텐실 버퍼는 픽셀들이 경로 세그먼트에 대한 채움 영역의 내부에 있는지를 표시하는 데이터를 저장할 수도 있다. 게다가, 바운딩 박스는 삼각형 프리미티브들의 각각을 둘러싼다.
다음으로, GPU (12) 는 렌더 타겟 파라미터 및 스텐실 버퍼를 이용하여 바운딩 박스를 래스터화한다 (172). 예를 들어, 본 개시의 양태들에 따르면, GPU (12) 는 경로 데이터의 각각의 픽셀에 대한 컬러 값들을 결정하기 위하여 바운딩 박스에 대해 스텐실링된 TIR 을 수행한다. 스텐실 버퍼에서의 데이터는 채움 영역의 내부의 픽셀들이 채움 컬러로 셰이딩되게 할 수도 있고, 채움 영역의 외부에 있는 픽셀들이 셰이딩되지 않은 상태로 유지되게 할 수도 있다. 일단 바운딩 박스의 렌더링이 완료되었으면, 렌더 타겟 (예컨대, 프레임 버퍼) 은 렌더 타겟 파라미터를 이용하여 경로 세그먼트에 대한 채움 영역의 래스터화된 버전을 저장할 수도 있다.
도 11 은 본 개시에 따라 스트로킹 동작을 수행하기 위한 일 예의 기법을 예시하는 흐름도이다. 다시, 예시의 목적들을 위하여 GPU (12) 에 의해 수행되는 것으로서 설명되었지만, 도 11 에서 도시된 기법은 다양한 다른 프로세서들에 의해 수행될 수도 있다는 것을 이해해야 한다. 게다가, 도시된 것들보다 더 적거나, 추가적이거나, 상이한 단계들이 기법을 수행하기 위하여 이용될 수도 있다.
GPU (12) 는 경로 데이터를 수신한다 (180). 경로 데이터는 렌더링되어야 할 경로의 하나 이상의 경로 세그먼트들을 표시할 수도 있다. GPU (12) 는 경로 데이터에 의해 정의된 경로 세그먼트를 복수의 라인 세그먼트들로 테셀레이팅한다 (182). 예를 들어, GPU (12) 는 경로 데이터를 도 9a 에서 도시된 라인스트립과 같은 라인스트립으로 테셀레이팅할 수도 있다.
GPU (12) 는 경로 세그먼트에 대한 스트로크 영역에 공간적으로 대응하는 복수의 프리미티브들을 생성한다 (184). 예를 들어, 복수의 테셀레이팅된 라인 세그먼트들의 각각에 대하여, GPU (12) 는 각각의 라인 세그먼트에 대한 스트로크 영역에 공간적으로 대응하는 하나 이상의 프리미티브들을 생성할 수도 있다. GPU (12) 는 라인 세그먼트의 지오메트리 셰이딩 동안에 라인 세그먼트 당 테셀레이팅된 프리미티브들의 수를 결정할 수도 있다. 즉, 지오메트리 셰이딩 동안, GPU (12) 는 "대싱하지 않으면서" (예컨대, 스트로크의 특정 세그먼트들을 셰이딩하지 않으면서) 스트로크를 생성할 수도 있다.
대싱할 때, GPU (12) 는 테셀레이팅된 프리미티브 당 경로 길이를 결정한다 (186). 예를 들어, GPU (12) 는 지오메트리 셰이딩 동안에 생성된 각각의 대시 세그먼트 (프리미티브) 에 대한 길이들의 누산을 결정할 수도 있다. 즉, 대시 세그먼트들은 특정 순서 (예컨대, 테셀레이션 및/또는 지오메트리 셰이딩 동안에 결정된 순서) 로 순서화될 수도 있다. 각각의 프리미티브에 대하여, GPU (12) 는 순서에 있어서 그것에 선행하는 프리미티브들의 길이들을 누산시킬 수도 있다.
GPU (12) 는 길이들의 누산에 기초하여 렌더링되고 있는 각각의 프리미티브의 텍스처 좌표들에 대한 텍스처 오프셋을 결정할 수도 있다 (188). 예를 들어, 위에서 언급된 바와 같이, GPU (12) 는 프리미티브들의 각각의 시작부에 대한 텍스처 좌표를 결정하기 위하여 길이 정보를 이용할 수도 있다. GPU (12) 는 픽셀 셰이딩 동안에 텍스처 오프셋을 적용할 수도 있다 (190). 예를 들어, GPU (12) 는 텍스처 오프셋을 적용하고, 스트로킹된 경로 데이터에 대한 적절한 컬러를 이용하여 대시의 세그먼트들의 각각을 셰이딩한다.
일부의 예들에서, 본 개시의 기법들은 DirectX 11 하드웨어의 사용자들이 DirectX 11 하드웨어를 이용하거나, 유사한 성능 특성들을 가지는 하드웨어로 경로 렌더링을 수행하도록 할 수도 있다. 추가의 예들에서, 본 개시의 기법들은 올-GPU 렌더링 (all-GPU rendering) 솔루션을 경로 렌더링에 제공할 수도 있다.
본 개시의 기법들은 DX 11 그래픽 API 에 의해 정의되는 하드웨어 아키텍처에 대하여 주로 설명되었지만, 본 개시의 기법들은 또한, 예컨대, OpenGL 그래픽 API (예컨대, OpenGL 버전들 4.0, 4.1, 4.2, 4.3 및 더 이후의 버전들) 과 같은, 다른 온-칩, 테셀레이션-인에이블 그래픽 API 들에 따라 정의된 하드웨어 아키텍쳐들에서 수행될 수도 있다. 본 개시의 기법들이 OpenGL 그래픽 API 에 따라 정의된 하드웨어 아키텍처에서 구현되는 예들에서, 본 개시에서의 헐 셰이더 (48) 에 기인하는 기능들 중의 하나 이상은 테셀레이션 제어 셰이더에 의해 수행될 수도 있고, 및/또는 본 개시에서의 도메인 셰이더 (52) 에 기인하는 기능들 중의 하나 이상은 테셀레이션 평가 셰이더에 의해 수행될 수도 있다.
본 개시에서 설명된 기법들은 적어도 부분적으로 하드웨어, 소프트웨어, 펌웨어, 또는 그 임의의 조합으로 구현될 수도 있다. 예를 들어, 설명된 기법들의 다양한 양태들은 하나 이상의 마이크로프로세서들, 디지털 신호 프로세서 (digital signal processor; DSP) 들, 주문형 집적 회로 (application specific integrated circuit; ASIC) 들, 필드 프로그램가능 게이트 어레이 (field programmable gate array; FPGA) 들, 또는 임의의 다른 등가의 집적 또는 개별 논리 회로부 뿐만 아니라 이러한 컴포넌트들의 임의의 조합들을 포함하는 하나 이상의 프로세서들 내에서 구현될 수도 있다. 용어 "프로세서" 또는 "프로세싱 회로부" 는 단독으로 또는 다른 논리 회로부와 조합하는 상기한 논리 회로부, 또는 프로세싱을 수행하는 개별 하드웨어와 같은 임의의 다른 등가의 회로부 중의 임의의 것을 일반적으로 지칭할 수도 있다.
이러한 하드웨어, 소프트웨어, 및 펌웨어는 본 개시에서 설명된 다양한 동작들 및 기능들을 지원하기 위하여 동일한 디바이스 내에서 또는 별도의 디바이스들 내에서 구현될 수도 있다. 게다가, 설명된 유닛들, 모듈들, 또는 컴포넌트들 중의 임의의 것은 개별적이지만 상호 동작가능한 논리 디바이스들로서 함께 또는 별도로 구현될 수도 있다. 모듈들 또는 유닛들로서의 상이한 특징들의 묘사는 상이한 기능적 양태들을 강조하도록 의도된 것이고, 이러한 모듈들 또는 유닛들이 별도의 하드웨어 또는 소프트웨어 컴포넌트들에 의해 실현되어야 하는 것을 반드시 암시하지는 않는다. 오히려, 하나 이상의 모듈들 또는 유닛들과 연관된 기능성은 별도의 하드웨어, 펌웨어, 및/또는 소프트웨어 컴포넌트들에 의해 수행될 수도 있거나, 공통적인 또는 별도의 하드웨어 또는 소프트웨어 컴포넌트들 내에서 통합될 수도 있다.
본 개시에서 설명된 기법들은 또한, 명령들을 저장하는 컴퓨터 판독가능 저장 매체와 같은 컴퓨터 판독가능 매체에서 저장되거나, 구체화되거나, 또는 인코딩될 수도 있다. 컴퓨터 판독가능 매체에서 내장되거나 인코딩된 명령들은 하나 이상의 프로세서들로 하여금, 예컨대, 명령들이 하나 이상의 프로세서들에 의해 실행될 때, 본원에서 설명된 기법들을 수행하게 할 수도 있다. 컴퓨터 판독가능 저장 매체들은 랜덤 액세스 메모리 (RAM), 판독전용 메모리 (ROM), 프로그램가능 판독전용 메모리 (PROM), 소거가능 프로그램가능 판독전용 메모리 (EPROM), 전자적 소거가능 프로그램가능 판독전용 메모리 (EEPROM), 플래시 메모리, 하드 디스크, CD-ROM, 플로피 디스크, 카세트, 자기 매체들, 광학 매체들, 또는 유형인 (tangible) 다른 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다.
컴퓨터 판독가능 매체들은 위에서 열거된 것들과 같은, 유형의 저장 매체에 대응하는 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다. 컴퓨터 판독가능 매체들은 또한, 예컨대, 통신 프로토콜에 따라 하나의 장소로부터 또 다른 장소로 컴퓨터 프로그램의 전송을 용이하게 하는 임의의 매체를 포함하는 통신 매체들을 포함할 수도 있다. 이러한 방식으로, 어구 "컴퓨터 판독가능 매체들" 은 (1) 비일시적 (non-transitory) 인 유형의 컴퓨터 판독가능 저장 매체들, 및 (2) 일시적 신호 또는 반송파와 같은 비유형의 컴퓨터 판독가능 통신 매체에 일반적으로 대응할 수도 있다.
다양한 양태들 및 예들이 설명되었다. 그러나, 다음의 청구항들의 범위로부터 이탈하지 않으면서, 본 개시의 구조 또는 기법들에 대해 수정들이 행해질 수 있다.

Claims (30)

  1. 그래픽 데이터를 렌더링하는 방법으로서,
    이미지의 경로의 각각의 안티에일리어싱된 픽셀에 대한 커버리지 값을 결정하기 위한 스텐실 샘플링 레이트를 결정하는 단계로서, 상기 스텐실 샘플링 레이트는, 각각의 안티에일리어싱된 픽셀에 대하여, 상기 스텐실 샘플링 레이트에서 샘플링된 각각의 안티에일리어싱된 픽셀의 샘플들을 저장하기 위한 스텐실 버퍼에서의 메모리 할당을 표시하는, 상기 스텐실 샘플링 레이트를 결정하는 단계;
    상기 스텐실 샘플링 레이트와는 별도로, 상기 스텐실 샘플링 레이트보다 더 작은 렌더 타겟 파라미터를 결정하는 단계로서, 상기 렌더 타겟 파라미터는, 각각의 안티에일리어싱된 픽셀에 대하여, 상기 경로의 각각의 렌더링된 안티에일리어싱된 픽셀을 저장하기 위한 프레임 버퍼에서의 메모리 할당을 표시하는, 상기 렌더 타겟 파라미터를 결정하는 단계;
    상기 스텐실 샘플링 레이트 및 상기 렌더 타겟 파라미터를 이용하여 상기 경로를 렌더링하는 단계
    를 포함하는, 그래픽 데이터를 렌더링하는 방법.
  2. 제 1 항에 있어서,
    상기 스텐실 샘플링 레이트를 결정하는 단계는 상기 스텐실 샘플링 레이트와는 상이한 값인 심도 파라미터를 결정하는 단계를 더 포함하는, 그래픽 데이터를 렌더링하는 방법.
  3. 제 2 항에 있어서,
    상기 심도 파라미터를 결정하는 단계는 상기 렌더 타겟 파라미터와 동일한 심도 파라미터를 결정하는 단계를 포함하고, 상기 심도 파라미터는 하나 이상의 다른 픽셀들에 대한 상기 경로의 각각의 픽셀의 심도를 표시하는, 그래픽 데이터를 렌더링하는 방법.
  4. 제 1 항에 있어서,
    상기 렌더 타겟 파라미터를 결정하는 단계는 상기 렌더 타겟 파라미터와는 상이한 값인 래스터화 파라미터를 결정하는 단계로서, 상기 래스터화 파라미터는 상기 경로의 각각의 안티에일리어싱된 픽셀에 대한 래스터화 샘플링 레이트를 표시하는, 상기 래스터화 파라미터를 결정하는 단계를 더 포함하는, 그래픽 데이터를 렌더링하는 방법.
  5. 제 1 항에 있어서,
    상기 경로를 렌더링하는 단계는,
    상기 스텐실 샘플링 레이트를 이용하여 상기 경로를 상기 스텐실 버퍼로 렌더링하는 단계로서, 상기 스텐실 버퍼는 셰이딩되어야 할 상기 경로의 픽셀들을 표시하는, 상기 경로를 상기 스텐실 버퍼로 렌더링하는 단계;
    상기 렌더 타겟 파라미터 및 상기 스텐실 버퍼를 이용하여 상기 경로를 래스터화하는 단계
    를 포함하는, 그래픽 데이터를 렌더링하는 방법.
  6. 제 5 항에 있어서,
    상기 경로를 상기 스텐실 버퍼로 렌더링하면서, 상기 경로에 대한 바운딩 박스를 결정하는 단계로서, 상기 바운딩 박스를 결정하는 단계는 상기 경로의 복수의 최대 경계 포인트들을 결정하는 단계를 포함하는, 상기 경로에 대한 바운딩 박스를 결정하는 단계를 더 포함하고; 그리고
    상기 경로를 래스터화하는 단계는, 상기 경로에 대한 바운딩 박스를 결정하는 단계 및 상기 경로를 래스터화하는 단계가 하나의 렌더링 패스에서 수행되도록 상기 렌더 타겟 파라미터 및 상기 스텐실 버퍼를 이용하여 상기 바운딩 박스를 래스터화하는 단계를 포함하는, 그래픽 데이터를 렌더링하는 방법.
  7. 제 6 항에 있어서,
    상기 경로의 복수의 최대 경계 포인트들을 결정하는 단계는, 상부 경계 포인트, 하부 경계 포인트, 우측 경계 포인트, 및 좌측 경계 포인트를 결정하는 단계를 포함하는, 그래픽 데이터를 렌더링하는 방법.
  8. 그래픽을 렌더링하기 위한 장치로서,
    스텐실 샘플링 레이트에서 샘플링된 안티에일리어싱된 픽셀들의 샘플들을 저장하기 위한 스텐실 버퍼로서, 상기 안티에일리어싱된 픽셀들은 이미지의 경로의 적어도 일 부분을 형성하는, 상기 스텐실 버퍼;
    렌더링된 안티에일리어싱된 픽셀들을 저장하기 위한 프레임 버퍼; 및
    그래픽 프로세싱 유닛 (graphics processing unit; GPU) 을 포함하며,
    상기 그래픽 프로세싱 유닛 (GPU) 은,
    상기 이미지의 상기 경로의 각각의 안티에일리어싱된 픽셀에 대한 커버리지 값을 결정하기 위한 스텐실 샘플링 레이트를 결정하는 것으로서, 상기 스텐실 샘플링 레이트는, 각각의 안티에일리어싱된 픽셀에 대하여, 상기 스텐실 샘플링 레이트에서 샘플링된 각각의 안티에일리어싱된 픽셀의 샘플들을 저장하기 위한 상기 스텐실 버퍼에서의 메모리 할당을 표시하는, 상기 스텐실 샘플링 레이트를 결정하고;
    상기 스텐실 샘플링 레이트와는 별도로, 상기 스텐실 샘플링 레이트보다 더 작은 렌더 타겟 파라미터를 결정하는 것으로서, 상기 렌더 타겟 파라미터는, 각각의 안티에일리어싱된 픽셀에 대하여, 상기 경로의 각각의 렌더링된 안티에일리어싱된 픽셀을 저장하기 위한 상기 프레임 버퍼에서의 메모리 할당을 표시하는, 상기 렌더 타겟 파라미터를 결정하고; 그리고
    상기 스텐실 샘플링 레이트 및 상기 렌더 타겟 파라미터를 이용하여 상기 경로를 렌더링하도록
    구성되는, 그래픽을 렌더링하기 위한 장치.
  9. 제 8 항에 있어서,
    상기 GPU 는 또한, 상기 스텐실 샘플링 레이트와는 상이한 값인 심도 파라미터를 결정하도록 구성되는, 그래픽을 렌더링하기 위한 장치.
  10. 제 9 항에 있어서,
    상기 심도 파라미터를 결정하기 위하여, 상기 GPU 는 상기 렌더 타겟 파라미터와 동일한 심도 파라미터를 결정하도록 구성되고, 상기 심도 파라미터는 하나 이상의 다른 픽셀들에 대한 상기 경로의 각각의 픽셀의 심도를 표시하는, 그래픽을 렌더링하기 위한 장치.
  11. 제 8 항에 있어서,
    상기 GPU 는 또한, 상기 렌더 타겟 파라미터와는 상이한 값인 래스터화 파라미터를 결정하도록 구성되고, 상기 래스터화 파라미터는 상기 경로의 각각의 안티에일리어싱된 픽셀에 대한 래스터화 샘플링 레이트를 표시하는, 그래픽을 렌더링하기 위한 장치.
  12. 제 8 항에 있어서,
    상기 경로를 렌더링하기 위하여, 상기 GPU 는,
    상기 스텐실 샘플링 레이트를 이용하여 상기 경로를 상기 스텐실 버퍼로 렌더링하는 것으로서, 상기 스텐실 버퍼는 셰이딩되어야 할 상기 경로의 픽셀들을 표시하는, 상기 경로를 상기 스텐실 버퍼로 렌더링하고;
    상기 렌더 타겟 파라미터 및 상기 스텐실 버퍼를 이용하여 상기 경로를 래스터화도록
    구성되는, 그래픽을 렌더링하기 위한 장치.
  13. 제 12 항에 있어서,
    상기 GPU 는 또한,
    상기 경로를 상기 스텐실 버퍼로 렌더링하면서, 상기 경로에 대한 바운딩 박스를 결정하는 것으로서, 상기 바운딩 박스를 결정하는 것은 상기 경로의 복수의 최대 경계 포인트들을 결정하는 것을 포함하는, 상기 경로에 대한 바운딩 박스를 결정하도록 구성되고; 그리고
    상기 경로를 래스터화하기 위하여, 상기 GPU 는, 상기 경로에 대한 바운딩 박스를 결정하는 것 및 상기 경로를 래스터화하는 것이 하나의 렌더링 패스에서 수행되도록 상기 렌더 타겟 파라미터 및 상기 스텐실 버퍼를 이용하여 상기 바운딩 박스를 래스터화하도록 구성되는, 그래픽을 렌더링하기 위한 장치.
  14. 제 13 항에 있어서,
    상기 경로의 상기 복수의 최대 경계 포인트들을 결정하기 위하여, 상기 GPU 는 상부 경계 포인트, 하부 경계 포인트, 우측 경계 포인트, 및 좌측 경계 포인트를 결정하도록 구성되는, 그래픽을 렌더링하기 위한 장치.
  15. 그래픽 데이터를 렌더링하기 위한 장치로서,
    이미지의 경로의 각각의 안티에일리어싱된 픽셀에 대한 커버리지 값을 결정하기 위한 스텐실 샘플링 레이트를 결정하기 위한 수단으로서, 상기 스텐실 샘플링 레이트는, 각각의 안티에일리어싱된 픽셀에 대하여, 상기 스텐실 샘플링 레이트에서 샘플링된 각각의 안티에일리어싱된 픽셀의 샘플들을 저장하기 위한 스텐실 버퍼에서의 메모리 할당을 표시하는, 상기 스텐실 샘플링 레이트를 결정하기 위한 수단;
    상기 스텐실 샘플링 레이트와는 별도로, 상기 스텐실 샘플링 레이트보다 더 작은 렌더 타겟 파라미터를 결정하기 위한 수단으로서, 상기 렌더 타겟 파라미터는, 각각의 안티에일리어싱된 픽셀에 대하여, 상기 경로의 각각의 렌더링된 안티에일리어싱된 픽셀을 저장하기 위한 프레임 버퍼에서의 메모리 할당을 표시하는, 상기 렌더 타겟 파라미터를 결정하기 위한 수단;
    상기 스텐실 샘플링 레이트 및 상기 렌더 타겟 파라미터를 이용하여 상기 경로를 렌더링하기 위한 수단
    을 포함하는, 그래픽 데이터를 렌더링하기 위한 장치.
  16. 제 15 항에 있어서,
    상기 스텐실 샘플링 레이트를 결정하기 위한 수단은 상기 스텐실 샘플링 레이트와는 상이한 값인 심도 파라미터를 결정하기 위한 수단을 더 포함하는, 그래픽 데이터를 렌더링하기 위한 장치.
  17. 제 16 항에 있어서,
    상기 심도 파라미터를 결정하기 위한 수단은 상기 렌더 타겟 파라미터와 동일한 심도 파라미터를 결정하기 위한 수단을 포함하고, 상기 심도 파라미터는 하나 이상의 다른 픽셀들에 대한 상기 경로의 각각의 픽셀의 심도를 표시하는, 그래픽 데이터를 렌더링하기 위한 장치.
  18. 제 15 항에 있어서,
    상기 렌더 타겟 파라미터를 결정하기 위한 수단은 상기 렌더 타겟 파라미터와는 상이한 값인 래스터화 파라미터를 결정하기 위한 수단으로서, 상기 래스터화 파라미터는 상기 경로의 각각의 안티에일리어싱된 픽셀에 대한 래스터화 샘플링 레이트를 표시하는, 상기 래스터화 파라미터를 결정하기 위한 수단을 더 포함하는, 그래픽 데이터를 렌더링하기 위한 장치.
  19. 제 15 항에 있어서,
    상기 경로를 렌더링하기 위한 수단은,
    상기 스텐실 샘플링 레이트를 이용하여 상기 경로를 상기 스텐실 버퍼로 렌더링하기 위한 수단으로서, 상기 스텐실 버퍼는 셰이딩되어야 할 상기 경로의 픽셀들을 표시하는, 상기 경로를 상기 스텐실 버퍼로 렌더링하기 위한 수단;
    상기 렌더 타겟 파라미터 및 상기 스텐실 버퍼를 이용하여 상기 경로를 래스터화하기 위한 수단
    을 포함하는, 그래픽 데이터를 렌더링하기 위한 장치.
  20. 제 19 항에 있어서,
    상기 경로를 상기 스텐실 버퍼로 렌더링하면서, 상기 경로에 대한 바운딩 박스를 결정하기 위한 수단으로서, 상기 바운딩 박스를 결정하는 것은 상기 경로의 복수의 최대 경계 포인트들을 결정하는 것을 포함하는, 상기 경로에 대한 바운딩 박스를 결정하기 위한 수단을 더 포함하고; 그리고
    상기 경로를 래스터화하기 위한 수단은, 상기 경로에 대한 바운딩 박스를 결정하는 것 및 상기 경로를 래스터화하는 것이 하나의 렌더링 패스에서 수행되도록 상기 렌더 타겟 파라미터 및 상기 스텐실 버퍼를 이용하여 상기 바운딩 박스를 래스터화하기 위한 수단을 포함하는, 그래픽 데이터를 렌더링하기 위한 장치.
  21. 명령들을 저장한 비일시적인 컴퓨터 판독가능 매체로서,
    상기 명령들은, 실행될 경우, 그래픽 프로세싱 유닛 (graphics processing unit; GPU) 으로 하여금,
    이미지의 경로의 각각의 안티에일리어싱된 픽셀에 대한 커버리지 값을 결정하기 위한 스텐실 샘플링 레이트를 결정하게 하는 것으로서, 상기 스텐실 샘플링 레이트는, 각각의 안티에일리어싱된 픽셀에 대하여, 상기 스텐실 샘플링 레이트에서 샘플링된 각각의 안티에일리어싱된 픽셀의 샘플들을 저장하기 위한 스텐실 버퍼에서의 메모리 할당을 표시하는, 상기 스텐실 샘플링 레이트를 결정하게 하고;
    상기 스텐실 샘플링 레이트와는 별도로, 상기 스텐실 샘플링 레이트보다 더 작은 렌더 타겟 파라미터를 결정하게 하는 것으로서, 상기 렌더 타겟 파라미터는, 각각의 안티에일리어싱된 픽셀에 대하여, 상기 경로의 각각의 렌더링된 안티에일리어싱된 픽셀을 저장하기 위한 프레임 버퍼에서의 메모리 할당을 표시하는, 상기 렌더 타겟 파라미터를 결정하게 하고; 그리고
    상기 스텐실 샘플링 레이트 및 상기 렌더 타겟 파라미터를 이용하여 상기 경로를 렌더링하게 하는, 비일시적인 컴퓨터 판독가능 매체.
  22. 제 21 항에 있어서,
    상기 명령들은 또한, 상기 GPU 로 하여금, 상기 스텐실 샘플링 레이트와는 상이한 값인 심도 파라미터를 결정하게 하는, 비일시적인 컴퓨터 판독가능 매체.
  23. 제 22 항에 있어서,
    상기 심도 파라미터를 결정하기 위하여, 상기 명령들은, 상기 GPU 로 하여금, 상기 렌더 타겟 파라미터와 동일한 심도 파라미터를 결정하게 하고, 상기 심도 파라미터는 하나 이상의 다른 픽셀들에 대한 상기 경로의 각각의 픽셀의 심도를 표시하는, 비일시적인 컴퓨터 판독가능 매체.
  24. 제 21 항에 있어서,
    상기 명령들은 또한, 상기 GPU 로 하여금, 상기 렌더 타겟 파라미터와는 상이한 값인 래스터화 파라미터를 결정하게 하고, 상기 래스터화 파라미터는 상기 경로의 각각의 안티에일리어싱된 픽셀에 대한 래스터화 샘플링 레이트를 표시하는, 비일시적인 컴퓨터 판독가능 매체.
  25. 제 21 항에 있어서,
    상기 경로를 렌더링하기 위하여, 상기 명령들은, 상기 GPU 로 하여금,
    상기 스텐실 샘플링 레이트를 이용하여 상기 경로를 상기 스텐실 버퍼로 렌더링하게 하는 것으로서, 상기 스텐실 버퍼는 셰이딩되어야 할 상기 경로의 픽셀들을 표시하는, 상기 경로를 상기 스텐실 버퍼로 렌더링하게 하고;
    상기 렌더 타겟 파라미터 및 상기 스텐실 버퍼를 이용하여 상기 경로를 래스터화게 하는, 비일시적인 컴퓨터 판독가능 매체.
  26. 제 25 항에 있어서,
    상기 명령들은, 상기 GPU 로 하여금,
    상기 경로를 상기 스텐실 버퍼로 렌더링하면서, 상기 경로에 대한 바운딩 박스를 결정하게 하는 것으로서, 상기 바운딩 박스를 결정하는 것은 상기 경로의 복수의 최대 경계 포인트들을 결정하는 것을 포함하는, 상기 경로에 대한 바운딩 박스를 결정하게 하고; 그리고
    상기 경로를 래스터화하기 위하여, 상기 GPU 는, 상기 경로에 대한 바운딩 박스를 결정하는 것 및 상기 경로를 래스터화하는 것이 하나의 렌더링 패스에서 수행되도록 상기 렌더 타겟 파라미터 및 상기 스텐실 버퍼를 이용하여 상기 바운딩 박스를 래스터화하도록 구성되는, 비일시적인 컴퓨터 판독가능 매체.
  27. 삭제
  28. 삭제
  29. 삭제
  30. 삭제
KR1020167006056A 2013-08-28 2014-07-02 그래픽 프로세싱에서의 타겟 독립적 스텐실링 KR101687520B1 (ko)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US201361871260P 2013-08-28 2013-08-28
US61/871,260 2013-08-28
US14/321,309 2014-07-01
US14/321,309 US9299181B2 (en) 2013-08-28 2014-07-01 Target independent stenciling in graphics processing
PCT/US2014/045299 WO2015030932A1 (en) 2013-08-28 2014-07-02 Target independent stenciling in graphics processing

Publications (2)

Publication Number Publication Date
KR20160052564A KR20160052564A (ko) 2016-05-12
KR101687520B1 true KR101687520B1 (ko) 2016-12-19

Family

ID=52582552

Family Applications (2)

Application Number Title Priority Date Filing Date
KR1020167006080A KR20160048098A (ko) 2013-08-28 2014-07-02 그래픽 프로세싱에서의 프리픽스된 합산된 길이
KR1020167006056A KR101687520B1 (ko) 2013-08-28 2014-07-02 그래픽 프로세싱에서의 타겟 독립적 스텐실링

Family Applications Before (1)

Application Number Title Priority Date Filing Date
KR1020167006080A KR20160048098A (ko) 2013-08-28 2014-07-02 그래픽 프로세싱에서의 프리픽스된 합산된 길이

Country Status (6)

Country Link
US (2) US9779534B2 (ko)
EP (2) EP3039651B1 (ko)
JP (2) JP6419827B2 (ko)
KR (2) KR20160048098A (ko)
CN (2) CN105493151B (ko)
WO (2) WO2015030933A1 (ko)

Families Citing this family (46)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9779534B2 (en) 2013-08-28 2017-10-03 Qualcomm Incorporated Prefixed summed length in graphics processing
US9772852B2 (en) 2015-04-23 2017-09-26 Google Inc. Energy efficient processor core architecture for image processor
US9922449B2 (en) 2015-06-01 2018-03-20 Intel Corporation Apparatus and method for dynamic polygon or primitive sorting for improved culling
KR102426669B1 (ko) * 2015-08-03 2022-07-28 삼성전자주식회사 경로 렌더링을 수행하는 방법 및 장치.
KR20170025099A (ko) * 2015-08-27 2017-03-08 삼성전자주식회사 렌더링 방법 및 장치
KR102443697B1 (ko) 2015-09-11 2022-09-15 삼성전자주식회사 경로 스트로크를 수행하는 방법 및 장치
US10269143B2 (en) * 2016-03-25 2019-04-23 Microsoft Technology Licensing, Llc Multiple texture variable opacity stroke rendering and blending
CN107369194B (zh) * 2016-05-11 2022-04-15 龙芯中科技术股份有限公司 填充图形的方法和装置
US10147227B2 (en) * 2017-02-17 2018-12-04 Microsoft Technology Licensing, Llc Variable rate shading
US10572966B2 (en) * 2017-04-01 2020-02-25 Intel Corporation Write out stage generated bounding volumes
US10109078B1 (en) * 2017-04-10 2018-10-23 Intel Corporation Controlling coarse pixel size from a stencil buffer
US10319064B2 (en) * 2017-04-10 2019-06-11 Intel Corporation Graphics anti-aliasing resolve with stencil mask
US10580151B2 (en) * 2017-12-05 2020-03-03 Qualcomm Incorporated Tile-based low-resolution depth storage
CN108399654B (zh) * 2018-02-06 2021-10-22 北京市商汤科技开发有限公司 描边特效程序文件包的生成及描边特效生成方法与装置
KR102053158B1 (ko) * 2018-04-10 2019-12-06 네이버 주식회사 WebGL을 이용한 렌더링 환경에서 FPS에 따라 퍼포먼스를 제어하는 방법 및 시스템
US11069280B2 (en) 2018-10-25 2021-07-20 Baylor University System and method for a multi-primary wide gamut color system
US11475819B2 (en) * 2018-10-25 2022-10-18 Baylor University System and method for a multi-primary wide gamut color system
US11373575B2 (en) 2018-10-25 2022-06-28 Baylor University System and method for a multi-primary wide gamut color system
US11030934B2 (en) 2018-10-25 2021-06-08 Baylor University System and method for a multi-primary wide gamut color system
US10950162B2 (en) 2018-10-25 2021-03-16 Baylor University System and method for a six-primary wide gamut color system
US11532261B1 (en) 2018-10-25 2022-12-20 Baylor University System and method for a multi-primary wide gamut color system
US11043157B2 (en) 2018-10-25 2021-06-22 Baylor University System and method for a six-primary wide gamut color system
US11289000B2 (en) 2018-10-25 2022-03-29 Baylor University System and method for a multi-primary wide gamut color system
US11189210B2 (en) 2018-10-25 2021-11-30 Baylor University System and method for a multi-primary wide gamut color system
US11403987B2 (en) 2018-10-25 2022-08-02 Baylor University System and method for a multi-primary wide gamut color system
US10607527B1 (en) 2018-10-25 2020-03-31 Baylor University System and method for a six-primary wide gamut color system
US10997896B2 (en) 2018-10-25 2021-05-04 Baylor University System and method for a six-primary wide gamut color system
US11587491B1 (en) 2018-10-25 2023-02-21 Baylor University System and method for a multi-primary wide gamut color system
US11488510B2 (en) 2018-10-25 2022-11-01 Baylor University System and method for a multi-primary wide gamut color system
US11410593B2 (en) 2018-10-25 2022-08-09 Baylor University System and method for a multi-primary wide gamut color system
US11289003B2 (en) 2018-10-25 2022-03-29 Baylor University System and method for a multi-primary wide gamut color system
US11037481B1 (en) 2018-10-25 2021-06-15 Baylor University System and method for a multi-primary wide gamut color system
CN109658476A (zh) * 2018-12-12 2019-04-19 中国航空工业集团公司西安航空计算技术研究所 一种GPU的LineStipple方法
CN109697743A (zh) * 2018-12-12 2019-04-30 中国航空工业集团公司西安航空计算技术研究所 一种面向GPU硬件LineStipple算法的TLM微结构
FR3100913B1 (fr) * 2019-09-16 2022-02-11 Thales Sa Processeur graphique et procédé associé d'affichage d'un ensemble de pixel(s), plateforme et système avionique associés
DE102020130293A1 (de) 2019-12-10 2021-06-10 Nvidia Corporation Polar stroking für vektorgrafiken
US11257253B2 (en) 2019-12-10 2022-02-22 Nvidia Corporation Method and system for unified encoding of path segments, caps, and joins for path stroking
US11164372B2 (en) * 2019-12-10 2021-11-02 Nvidia Corporation Polar stroking for vector graphics
US11049216B1 (en) * 2020-01-21 2021-06-29 Arm Limited Graphics processing systems
US11030783B1 (en) 2020-01-21 2021-06-08 Arm Limited Hidden surface removal in graphics processing systems
CN113947519A (zh) * 2020-07-17 2022-01-18 芯原微电子(上海)股份有限公司 细分曲线数据处理方法、系统、介质及矢量图形处理装置
CN113947516A (zh) * 2020-07-17 2022-01-18 芯原微电子(上海)股份有限公司 矢量图形数据处理方法、系统、介质及矢量图形处理装置
US11217005B1 (en) * 2020-08-10 2022-01-04 Adobe Inc. Techniques for rendering 2D vector graphics on mobile devices
CN113284215B (zh) * 2021-06-09 2023-08-29 智道网联科技(北京)有限公司 高精地图的虚线处理方法、装置及电子设备
US20230377265A1 (en) * 2022-05-17 2023-11-23 Adobe Inc. Systems for Efficiently Rendering Vector Objects
WO2024112961A1 (en) * 2022-11-23 2024-05-30 Rive Inc. Interactive computer graphics system and methods for single-pass path rendering and batching of strokes and fills

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080198168A1 (en) 2007-02-16 2008-08-21 Guofang Jiao Efficient 2-d and 3-d graphics processing
US20110285724A1 (en) 2010-05-21 2011-11-24 Kilgard Mark J Conversion of dashed strokes into quadratic bèzier segment sequences

Family Cites Families (32)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6292192B1 (en) * 1998-01-09 2001-09-18 Silicon Graphics, Inc. System and method for the direct rendering of curve bounded objects
JP2002074377A (ja) * 2000-08-28 2002-03-15 Toshiba Corp 線分表示処理装置、線分表示処理方法及び記憶媒体
US7589730B1 (en) * 2005-05-20 2009-09-15 Adobe Systems Incorporated System and method for drawing a dashed path
US8295475B2 (en) * 2006-01-13 2012-10-23 Microsoft Corporation Selective glitch detection, clock drift compensation, and anti-clipping in audio echo cancellation
JP4693660B2 (ja) 2006-03-10 2011-06-01 株式会社東芝 描画装置、描画方法及び描画プログラム
JP4719603B2 (ja) * 2006-03-28 2011-07-06 富士通セミコンダクター株式会社 描画装置及び破線描画方法
JP4157569B2 (ja) * 2006-05-11 2008-10-01 株式会社東芝 描画装置、描画方法及び描画プログラム
TWI343020B (en) * 2006-05-12 2011-06-01 Nvidia Corp Antialiasing using multiple display heads of a graphics processor
US20080061309A1 (en) 2006-07-21 2008-03-13 Young Sir Chung Semiconductor device with under-filled heat extractor
US7808512B1 (en) 2006-12-19 2010-10-05 Nvidia Corporation Bounding region accumulation for graphics rendering
US7630982B2 (en) * 2007-02-24 2009-12-08 Trend Micro Incorporated Fast identification of complex strings in a data stream
US8094157B1 (en) * 2007-08-09 2012-01-10 Nvidia Corporation Performing an occurence count of radices
US8044955B1 (en) * 2007-08-31 2011-10-25 Adobe Systems Incorporated Dynamic tessellation spreading for resolution-independent GPU anti-aliasing and rendering
US8325184B2 (en) * 2007-09-14 2012-12-04 Qualcomm Incorporated Fragment shader bypass in a graphics processing unit, and apparatus and method thereof
US8243071B2 (en) * 2008-02-29 2012-08-14 Microsoft Corporation Modeling and rendering of heterogeneous translucent materials using the diffusion equation
US8120608B2 (en) 2008-04-04 2012-02-21 Via Technologies, Inc. Constant buffering for a computational core of a programmable graphics processing unit
US20100013854A1 (en) * 2008-07-18 2010-01-21 Microsoft Corporation Gpu bezier path rasterization
JP2010134347A (ja) 2008-12-08 2010-06-17 Fujinon Corp 撮像レンズ、および撮像装置
CN102099834A (zh) * 2009-05-21 2011-06-15 松下电器产业株式会社 图形描绘装置、图形描绘方法、图形描绘程序、记录了图形描绘程序的记录介质、图形描绘用集成电路
CN103003839B (zh) 2010-07-19 2017-02-08 超威半导体公司 反锯齿样本的拆分存储
US9183651B2 (en) 2010-10-06 2015-11-10 Microsoft Technology Licensing, Llc Target independent rasterization
JP5259756B2 (ja) * 2011-03-02 2013-08-07 富士フイルム株式会社 ページ記述データ処理装置、方法及びプログラム並びに印刷物生産方法
JP5653277B2 (ja) 2011-03-31 2015-01-14 株式会社東芝 描画装置、描画方法、及び描画プログラム
US8400453B2 (en) * 2011-06-30 2013-03-19 Google Inc. Rendering a text image following a line
US9412197B2 (en) 2012-04-04 2016-08-09 Qualcomm Incorporated Patched shading in graphics processing
AU2012202651A1 (en) * 2012-05-04 2013-11-21 Canon Kabushiki Kaisha A method for stroking paths
US9330495B2 (en) 2012-08-09 2016-05-03 Qualcomm Incorporated Extending DX11 GPU for programmable vector graphics
US9275498B2 (en) 2012-08-09 2016-03-01 Qualcomm Incorporated GPU-accelerated path rendering
US9619853B2 (en) 2012-08-09 2017-04-11 Qualcomm Incorporated GPU-accelerated path rendering
KR101556819B1 (ko) 2012-10-24 2015-10-01 주식회사 두산 에틸렌 고리가 형성된 인돌로카바졸계 유기 화합물 및 이를 포함하는 유기 전계 발광 소자
US9626789B2 (en) * 2013-05-07 2017-04-18 Advanced Micro Devices, Inc. Implicit texture map parameterization for GPU rendering
US9779534B2 (en) 2013-08-28 2017-10-03 Qualcomm Incorporated Prefixed summed length in graphics processing

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080198168A1 (en) 2007-02-16 2008-08-21 Guofang Jiao Efficient 2-d and 3-d graphics processing
US20110285724A1 (en) 2010-05-21 2011-11-24 Kilgard Mark J Conversion of dashed strokes into quadratic bèzier segment sequences

Also Published As

Publication number Publication date
JP2016535350A (ja) 2016-11-10
US20150062142A1 (en) 2015-03-05
JP6419827B2 (ja) 2018-11-07
KR20160052564A (ko) 2016-05-12
EP3039652A1 (en) 2016-07-06
JP6013661B1 (ja) 2016-10-25
CN105493150A (zh) 2016-04-13
EP3039651A1 (en) 2016-07-06
CN105493150B (zh) 2018-01-16
EP3039651B1 (en) 2018-11-14
CN105493151B (zh) 2018-09-25
US9299181B2 (en) 2016-03-29
KR20160048098A (ko) 2016-05-03
US9779534B2 (en) 2017-10-03
WO2015030932A8 (en) 2015-10-15
US20150062124A1 (en) 2015-03-05
WO2015030932A1 (en) 2015-03-05
WO2015030933A1 (en) 2015-03-05
EP3039652B1 (en) 2017-08-23
CN105493151A (zh) 2016-04-13
JP2016532215A (ja) 2016-10-13

Similar Documents

Publication Publication Date Title
KR101687520B1 (ko) 그래픽 프로세싱에서의 타겟 독립적 스텐실링
US9747718B2 (en) System, method, and computer program product for performing object-space shading
US9754407B2 (en) System, method, and computer program product for shading using a dynamic object-space grid
US9613451B2 (en) Jittered coverage accumulation path rendering
US9275498B2 (en) GPU-accelerated path rendering
US9633469B2 (en) Conservative rasterization of primitives using an error term
KR101776547B1 (ko) Gpu-가속된 패스 렌더링
US20140043342A1 (en) Extending dx11 gpu for programmable vector graphics
US20150178961A1 (en) System, method, and computer program product for angular subdivision of quadratic bezier curves
US10332290B2 (en) Fast, coverage-optimized, resolution-independent and anti-aliased graphics processing
US20240169620A1 (en) System and Method for Single-pass Path Rendering Using Coverage Counting

Legal Events

Date Code Title Description
A201 Request for examination
A302 Request for accelerated examination
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20190924

Year of fee payment: 4