KR101776547B1 - Gpu-가속된 패스 렌더링 - Google Patents
Gpu-가속된 패스 렌더링 Download PDFInfo
- Publication number
- KR101776547B1 KR101776547B1 KR1020167017671A KR20167017671A KR101776547B1 KR 101776547 B1 KR101776547 B1 KR 101776547B1 KR 1020167017671 A KR1020167017671 A KR 1020167017671A KR 20167017671 A KR20167017671 A KR 20167017671A KR 101776547 B1 KR101776547 B1 KR 101776547B1
- Authority
- KR
- South Korea
- Prior art keywords
- primitive type
- vertex
- vertices
- gpu
- primitive
- Prior art date
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/005—General purpose rendering architectures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/20—Processor architectures; Processor configuration, e.g. pipelining
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T11/00—2D [Two Dimensional] image generation
- G06T11/20—Drawing from basic elements, e.g. lines or circles
- G06T11/203—Drawing of straight lines or curves
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T2200/00—Indexing scheme for image data processing or generation, in general
- G06T2200/28—Indexing scheme for image data processing or generation, in general involving image processing hardware
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Computer Graphics (AREA)
- Image Generation (AREA)
Abstract
그래픽 프로세싱 유닛 (GPU) 은 메모리, 및 적어도 하나의 프로세서를 포함하며, 상기 적어도 하나의 프로세서는 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 수신하는 것으로서, GPU 의 정점 버퍼의 복수의 정점들의 각각은 복수의 프리미티브 유형 엔트리들 중 하나 이상과 연관되는, 상기 수신하고, 복수의 정점들 및 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 결정하고, 그리고 GPU 에 의해, 복수의 정점들, 및 프리미티브 유형 버퍼의 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 렌더링하도록 구성된다.
Description
본 개시물은 그래픽스 프로세싱에 관한 것으로, 좀더 구체적으로는, 패스 렌더링을 위한 기법들에 관한 것이다.
패스 렌더링은 2차원 (2D) 벡터 그래픽스 패스들 (대안적으로는, 본원에서 "패스들" 로서 지칭됨) 의 렌더링을 지칭할 수도 있으며, 그 패스들의 각각은 하나 이상의 패스 세그먼트들을 포함할 수도 있다. 패스가 2개 이상의 패스 세그먼트들을 포함할 때, 개개의 패스 세그먼트들은 상이한 유형들 또는 동일한 유형의 패스 세그먼트들일 수도 있다. 패스 세그먼트들의 유형들은 예를 들어, 라인, 타원 아크, 2차 베지어 (bezier) 곡선, 및 3차 베지어 곡선을 포함할 수도 있다. 일부 예들에서, 패스 세그먼트 유형들은 예컨대, 개방된 벡터 그래픽스 (OpenVG) API 와 같은, 표준 벡터 그래픽스 애플리케이션 프로그래밍 인터페이스 (API) 에 따라서 정의될 수도 있다.
그래픽 프로세싱 유닛들 (GPU들) 은 일반적으로 하나 이상의 3D 그래픽스 API들을 준수하도록 설계되는 3차원 (3D) 그래픽스 파이프라인을 구현한다. 오늘날 사용중인 널리 알려진 3D 그래픽스 API들이 규격 디바이스들이 패스 렌더링 커맨드들을 지원하는 것을 필요로 하지 않기 때문에, 현대의 GPU들은 종종 패스 렌더링 커맨드들에 대해 거의 없거나 전혀 없는 하드웨어 가속을 제공한다. 예를 들어, 현대의 GPU 에서 구현되는 전형적인 3D 그래픽스 파이프라인은 (예컨대, 지점들, 라인들 및 삼각형들과 같은) 저-차수 (low-order), 비-곡선, 3D 그래픽스 프리미티브들을 래스터화하도록 설계되지만 (예컨대, 타원 아크들 및 베지어 곡선들과 같은) 곡선 프리미티브들을 직접 렌더링할 수 없는 래스터라이저를 포함할 수도 있다.
일부 예들에서, 본 개시물은 3D 그래픽스 파이프라인에서 하드웨어-가속된 패스 렌더링의 성능을 향상시키는 하드웨어를 포함하는 그래픽 프로세싱 유닛 (GPU) 을 기술한다. 다른 예들에서, 본 개시물의 기법들은 GPU 로 하여금 복수의 상이한 패스 렌더링 프리미티브 유형들을 가지는 정점 버퍼들을 프로세싱가능하게 하는 그래픽스 애플리케이션 프로그래밍 인터페이스 (API) 기능들을 구현하는 하드웨어 및 방법들을 포함한다. 본 개시물은 또한 단일 버퍼 내에 복수의 상이한 패스 렌더링 프리미티브 유형들을 저장하는 것이 가능한 정점 버퍼들 뿐만 아니라, 정점 버퍼의 대응하는 정점들의 프리미티브 유형들을 나타내는 값들을 저장하는 것이 가능한 추가적인 프리미티브 유형 버퍼을 지원하는 3D 그래픽스 렌더링 파이프라인 하드웨어를 기술한다. 프리미티브들의 상이한 유형을 단일 정점 버퍼 내에 지원함으로써, 본 개시물의 기법들, 방법들, 하드웨어, 및 디바이스들은 GPU-가속된 패스-기반의 렌더링의 성능을 향상시킬 수도 있다.
본 개시물의 하나의 예시적인 방법 (예컨대, API 기능 호출) 은 그리기 호출의 새로운 유형을 포함할 수도 있다. 그리기 호출은 복수의 상이한 패스-렌더링 프리미티브 유형들의 정점들을 포함할 수도 있는 정점 버퍼를 입력으로서 수신한다. 그리기 호출은 또한 정점 버퍼의 정점들에 대응하는 프리미티브 유형들을 나타내는 다른 버퍼를 입력으로서 수신할 수도 있다. GPU 파이프라인은 정점 버퍼로부터의 상이한 패스-렌더링 프리미티브 유형들을 프로세싱하는 것을 지원하기 위해, 입력 어셈블러, 헐 셰이더, 및 도메인 셰이더와 같은, 파이프라인의 여러 스테이지들에 대한 변경들을 포함할 수도 있다.
일 예에서, 본 개시물은 GPU 에 의해, 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 수신하는 단계로서, 상기 GPU 의 정점 버퍼의 복수의 정점들의 각각은 복수의 프리미티브 유형 엔트리들 중 하나 이상과 연관되는, 상기 수신하는 단계; GPU 에 의해, 복수의 정점들 및 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 결정하는 단계; 및 GPU 에 의해, 복수의 정점들, 및 프리미티브 유형 버퍼의 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 렌더링하는 단계를 포함하는, 그래픽 프로세싱 유닛 (GPU) 에 의해 수행되는 방법을 기술한다.
다른 예에서, 본 개시물은 메모리, 및 적어도 하나의 프로세서를 포함하는 그래픽 프로세싱 유닛 (GPU) 을 기술한다. 적어도 하나의 프로세서는 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 수신하도록 구성되며, GPU 의 정점 버퍼의 복수의 정점들의 각각은 복수의 프리미티브 유형 엔트리들 중 하나 이상과 연관된다. 적어도 하나의 프로세서는 복수의 정점들 및 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 결정하고, 그리고 복수의 정점들, 및 프리미티브 유형 버퍼의 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 렌더링하도록 더 구성된다.
다른 예에서, 본 개시물은 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 수신하는 수단을 포함하는 그래픽 프로세싱 유닛 (GPU) 을 기술하며, GPU 의 정점 버퍼의 복수의 정점들의 각각은 복수의 프리미티브 유형 엔트리들 중 하나 이상과 연관된다. GPU 는 복수의 정점들 및 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 결정하는 수단; 및 복수의 정점들, 및 프리미티브 유형 버퍼의 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 렌더링하는 수단을 더 포함한다.
다른 예들에서, 본 개시물은 안에 저장된 명령들을 포함하는 비일시적 컴퓨터-판독가능 저장 매체를 기술하며, 상기 명령들은, 실행될 때, 적어도 하나의 프로세서로 하여금, 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 수신하도록 하며, GPU 의 정점 버퍼의 복수의 정점들의 각각은 복수의 프리미티브 유형 엔트리들 중 하나 이상과 연관된다. 비일시적 컴퓨터-판독가능 저장 매체는 실행될 때, 적어도 하나의 프로세서로 하여금, 복수의 정점들 및 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 결정하고, 그리고 복수의 정점들, 및 프리미티브 유형 버퍼의 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 렌더링하도록 하는 명령들을 더 포함한다.
본 개시물의 하나 이상의 예들의 세부 사항들은 첨부도면 및 아래의 설명에서 개시된다. 본 개시물의 다른 특징들, 목적들, 및 이점들은 설명 및 도면들로부터, 그리고 청구범위로부터 명백히 알 수 있을 것이다.
도 1 은 본 개시물의 GPU-가속 패스 렌더링 기법들을 구현하는데 이용될 수도 있는 예시적인 컴퓨팅 디바이스를 예시하는 블록도이다.
도 2 는 도 1 에서의 컴퓨팅 디바이스의 중앙 처리 유닛 (CPU), 그래픽 프로세싱 유닛 (GPU) 및 메모리를 좀더 상세히 예시하는 블록도이다.
도 3 은 본 개시물의 GPU-가속 패스 렌더링 기법들을 수행할 수도 있는 예시적인 그래픽스 파이프라인을 예시하는 개념도이다.
도 4 는 본 개시물의 GPU-가속된 패스 렌더링 기법들에 따른, GPU 의 버퍼들을 예시하는 개념도이다.
도 5 는 본 개시물의 하나 이상의 예들에 따른, GPU 의 스테이지들을 통과하는 상태 정보의 패스를 예시하는 개념도이다.
도 6 은 실행될 때, GPU 로 하여금 본 개시물의 기법들 중 하나 이상을 실행가능하게 할 수 있는 그래픽스 API 의 코드를 예시하는 다이어그램이다.
도 7 은 본 개시물에 따른 GPU-가속 패스 렌더링을 수행하는 예시적인 기법을 예시하는 흐름도이다.
도 2 는 도 1 에서의 컴퓨팅 디바이스의 중앙 처리 유닛 (CPU), 그래픽 프로세싱 유닛 (GPU) 및 메모리를 좀더 상세히 예시하는 블록도이다.
도 3 은 본 개시물의 GPU-가속 패스 렌더링 기법들을 수행할 수도 있는 예시적인 그래픽스 파이프라인을 예시하는 개념도이다.
도 4 는 본 개시물의 GPU-가속된 패스 렌더링 기법들에 따른, GPU 의 버퍼들을 예시하는 개념도이다.
도 5 는 본 개시물의 하나 이상의 예들에 따른, GPU 의 스테이지들을 통과하는 상태 정보의 패스를 예시하는 개념도이다.
도 6 은 실행될 때, GPU 로 하여금 본 개시물의 기법들 중 하나 이상을 실행가능하게 할 수 있는 그래픽스 API 의 코드를 예시하는 다이어그램이다.
도 7 은 본 개시물에 따른 GPU-가속 패스 렌더링을 수행하는 예시적인 기법을 예시하는 흐름도이다.
본 개시물은 GPU-가속 패스 렌더링을 수행하는 기법들에 관한 것이다. 패스 렌더링은 2차원 (2D) 벡터 그래픽스 패스들 (대안적으로는, 본원에서 "패스들" 로서 지칭됨) 의 렌더링을 지칭할 수도 있으며, 그 패스들의 각각은 하나 이상의 패스 세그먼트들을 포함할 수도 있다. 패스가 2개 이상의 패스 세그먼트들을 포함할 때, 개개의 패스 세그먼트들은 "프리미티브 유형들" 으로서 또한 지칭되는, 상이한 유형들 또는 동일한 유형의 패스 세그먼트들일 수도 있다. 패스 세그먼트들의 프리미티브 유형들은 예를 들어, 라인, 타원 아크, 2차 베지어 곡선, 및 3차 베지어 곡선 등을 포함할 수도 있다. 일부 예들에서, 패스 세그먼트 유형들은 예컨대, 개방된 벡터 그래픽스 (OpenVG) API 와 같은, 표준 벡터 그래픽스 애플리케이션 프로그래밍 인터페이스 (API) 에 따라서 정의될 수도 있다.
그래픽 프로세싱 유닛들 (GPU들) 은 하나 이상의 3D 그래픽스 API들을 준수하도록 설계되는 3차원 (3D) 그래픽스 파이프라인을 구현하도록 구성될 수도 있다. 오늘날 사용중인 널리 알려진 3D 그래픽스 API들이 규격 디바이스들 (예컨대, GPU들) 이 패스 렌더링 커맨드들을 지원하는 것을 필요로 하지 않기 때문에, 현대의 GPU들은 종종 패스 렌더링 커맨드들에 대해 거의 없거나 전혀 없는 하드웨어 가속을 제공한다. 예를 들어, 현대의 GPU 에서 구현되는 전형적인 3D 그래픽스 파이프라인은 (예컨대, 지점들, 라인들 및 삼각형들과 같은) 저-차수, 비-곡선, 3D 그래픽스 프리미티브들을 래스터화하도록 설계되는 래스터라이저를 포함할 수도 있지만 (예컨대, 타원 아크들 및 베지어 곡선들과 같은) 곡선 패스 렌더링 프리미티브들을 직접 렌더링하는 것이 불가능할 수도 있다.
패스 렌더링을 위한 하나의 접근법은 패스 렌더링 커맨드들의 실행을 위해 부분 GPU 하드웨어 가속을 제공하기 위해 3D GPU 파이프라인을 이용하는 것을 수반할 수도 있다. 이 접근법은 패스 세그먼트를 GPU 에 의해 래스터화될 수 있는 하나 이상의 저-차수, 비-곡선, 그래픽스 프리미티브들로 변환하기 위해 패스 세그먼트를 또 다른 프로세서들 (예컨대, 중앙 처리 유닛 (CPU)) 로 사전 프로세싱하는 것을 수반한다. 그래픽스 프리미티브들을 규정하기 위해, 애플리케이션은 "그리기 호출들" 로서 지칭되는, 그래픽스 API 의 하나 이상의 기능들을 호출할 수도 있다.
그리기 호출은 정점 버퍼를 인수 (argument) 로서 포함할 수도 있다. 정점 버퍼는 하나 이상의 정점들을 포함한다. 그리기 호출에 규정된 정점 버퍼의 정점들은 일반적으로 단일 프리미티브 유형에 제한되며, 상이한 프리미티브 유형들과 연관된 정점들은 추가적인, 후속 그리기 호출들에서 규정되어야 한다. 그리기 호출들이 전통적으로 동일한 프리미티브 유형인 정점 버퍼 정점들을 필요로 하기 때문에, GPU 는 정점들의 각각이 어느 프리미티브에 속하는지를 좀더 용이하게 결정할 수도 있다. 예를 들어, 각각의 2차 베지어 곡선 ("quad") 이 3개의 정점들을 가지고 그리고 그리기 호출에 의해 규정된 특정의 정점 버퍼의 정점들의 각각이 쿼드에 속한다고 GPU 가 결정하면, GPU 는 모든 제 3 정점이 새로운 쿼드 프리미티브의 시작들을 마크한다고 추론할 수도 있다.
그러나, 예를 들어, 패스 렌더링을 수행할 때 렌더링될 프리미티브 유형들의 각각에 대응하는 상이한 그리기 호출을 실행하는 것과 연관된 상당한 오버헤드가 존재한다. 각각의 그리기 호출은 할당할 프로세싱 시간 및 메모리를 필요로 하는 별개의 정점 버퍼의 할당을 필요로 한다. 그리고 일부 예들에서, CPU 는 정점 버퍼를 위한 메모리를 할당하고 정점 버퍼 데이터를 GPU 로 전송할 수도 있다. 각각의 CPU-대-GPU 전송은 복수의 상이한 패스 렌더링 유형들의 각각에 대응하는 그리기 호출들을 실행할 때 패스-기반의 렌더링을 수행하는 성능을 감소시킬 수도 있는 대량의 레이턴시를 초래할 수도 있다.
일부 예들에서, GPU 는 예컨대, 마이크로소프트의 DirectX 11 API 와 같은, 특정의 3D 그래픽스 API 에 의해 규정되는 그래픽스 아키텍처를 이용하여, 패스 세그먼트를 테셀레이트하고 렌더링가능할 수도 있다. 아래에서 좀더 자세하게 설명하는 바와 같이, 본 개시물에서 설명된 기법들은 패스 렌더링을 수행하기 위해, 그래픽스 하드웨어, 특히 입력 어셈블러, 헐 셰이더, 도메인 셰이더, 및 지오메트리 셰이더 스테이지들에 대한 가능한 변경들을 기술한다. 이와 같이, 본 개시물에서 설명된 기법들은 DirectX 11 아키텍처의 그래픽스 하드웨어가 다수의 상이한 프리미티브 유형들과 연관된 정점들을 포함하는 정점 버퍼를 이용하여 패스 렌더링을 수행가능하게 한다.
본 개시물에 따른 기법들은 GPU 가 복수의 상이한 프리미티브 유형들에 대응하는 정점들의 정점 버퍼를 수신가능하게 한다. 그래픽스 렌더링을 수행하는 애플리케이션을 실행할 때, CPU 또는 다른 프로세싱 유닛은 정점 데이터 (즉, 정점들) 을 저장하기 위해 시스템 메모리 내 버퍼를 할당할 수도 있다. CPU 는 애플리케이션을 실행하는 명령들에 기초하여 정점들 데이터를 발생시키고 정점들을 정점 버퍼에 할당된 메모리에 저장할 수도 있다. 일단 다수의 정점들이 CPU 에 의해 정점 버퍼에 저장되었으면, CPU 는 시스템 메모리에 저장된 정점 버퍼를 GPU 로 전송할 수도 있다. GPU 는 그후 정점 버퍼의 정점들을 수신하여, 예컨대 GPU 의 메모리에 저장한다.
상이한 프리미티브 유형들에 대응하는 정점들을 가지는 단일 정점 버퍼를 지원하기 위해, 본 개시물의 기법들은 새로운 그리기 호출을 포함한다. 새로운 그리기 호출은 다수의 프리미티브 유형들과 연관되는 것이 가능한 정점들을 가지는 정점 버퍼를, 그 호출에 대한 인수로서, 포함한다. 새로운 그리기는 또한 인수로서, 추가적인 프리미티브 유형 버퍼 ("primtype 버퍼") 를 포함한다. primtype 버퍼의 값들은 정점 버퍼의 하나 이상의 정점들이 연관되는 프리미티브 유형들을 나타내는 하나 이상의 프리미티브 유형 엔트리들을 포함할 수도 있다. primtype 버퍼에 저장된 값들에 기초하여, GPU 는 정점 버퍼 정점들의 각각과 연관된 프리미티브 유형을 결정하고, 각각의 프리미티브과 연관된 정점들을 포함하는 각각의 프리미티브의 표현을 저장할 수도 있다.
본 개시물의 예시적인 기법들은 또한 다수의 상이한 프리미티브 유형들의 정점 버퍼 정점들을 지원하기 위해 그래픽스 파이프라인에 대한 변경들을 포함한다. 본 개시물의 기법들은 정점 버퍼 및 primtype 버퍼 값들을 해석하는 것이 가능한 입력 어셈블러, 및 입력 어셈블러 스테이지로부터 수신된 프리미티브 유형 상태 값들에 부분적으로 기초하여 다수의 프리미티브들에 대한 제어 지점들을 발생시킬 수도 있는 헐 셰이더 스테이지를 포함한다. 본 개시물의 그래픽스 파이프라인은 또한 헐 셰이더에 의해 발생된 제어 지점들에 기초하여 도메인 좌표들을 발생하는 테셀레이터 스테이지, 및 테셀레이터에 의해 발생된 도메인 좌표들 및 입력 어셈블러로부터 수신된 프리미티브 유형 상태 값들에 기초하여 정점 데이터를 발생시키는 도메인 셰이더를 포함한다. 본 개시물의 기법들은 입력 어셈블러에 의해 발생된 프리미티브 상태에 기초하여 3D 정점 좌표들을 출력하도록 구성되는 지오메트리 셰이더 스테이지를 더 포함한다.
패스 렌더링은 2개의 주요 동작들, 즉, (1) 패스 세그먼트를 채우는 동작; 및 (2) 패스 세그먼트를 스트로킹하는 동작으로 분할될 수도 있다. 일부 예들에서, 채우기 및 스트로킹 동작들 중 하나 또는 양자는 패스를 완전히 렌더링하도록 수행될 수도 있다. 개념적으로, 채우기 동작은 규정된 채우기 칼라 (fill color) 로 패스 세그먼트의 내부 영역을 채우는 것에 대응할 수도 있다.
스트로킹 동작은 패스에 수직으로 유지된 일직선-라인 펜을 이용하여 패스 세그먼트의 에지들을 "확장하는 것 (widening)"에 개념적으로 대응할 수도 있다. 메인 동작들에 더해서, 패스 렌더링은 또한 여러 유형들의 대싱 (dashing), 단부 캡들을 패스의 단부들에 적용하는 것, 패스의 내부 패스 세그먼트들의 종점들 사이에 여러 유형들의 접합부들을 적용하는 것, 및 재-테셀레이션을 이용하여 커스프들 (cusps) 을 처리하는 것을 수반할 수도 있다.
GPU 는 "테셀레이션 유닛" 또는 테셀레이터로서 또한 지칭되는, 테셀레이션 스테이지를 이용하여 프리미티브 또는 패스 세그먼트를 테셀레이트할 (예컨대, 분할할) 수도 있다. GPU 가 패스 세그먼트를 테셀레이트한 후, GPU 는 테셀레이터 스테이지가 결정하여 GPU 그래픽스 렌더링 파이프라인에서의 후속 스테이지들로 출력하는 도메인 좌표들에 기초하여, 3D 기하학적 구조를 발생시키도록 구성될 수도 있다. 그래픽스 파이프라인의 후속 스테이지들은 테셀레이터 스테이지의 출력에 기초하여, 정점 좌표들을 발생시킬 수도 있다.
도 1 은 본 개시물의 GPU-가속 패스 렌더링 기법들을 구현하는데 이용될 수도 있는 예시적인 컴퓨팅 디바이스 (2) 를 예시하는 블록도이다. 컴퓨팅 디바이스 (2) 는 개인용 컴퓨터, 데스크탑 컴퓨터, 랩탑 컴퓨터, 컴퓨터 워크스테이션, 태블릿 컴퓨팅 디바이스, 비디오 게임 플랫폼 또는 콘솔, (예컨대, 모바일 전화기, 셀룰러 전화기, 위성 전화기, 및/또는 모바일 전화기 핸드셋과 같은) 무선 통신 디바이스, 유선 전화기, 인터넷 전화기, 휴대형 디바이스, 예컨대 휴대형 비디오 게임 디바이스 또는 개인 휴대정보 단말기 (PDA), 개인용 음악 플레이어, 비디오 플레이어, 디스플레이 디바이스, 텔레비전, 텔레비전 셋-탑 박스, 서버, 중간 네트워크 디바이스, 메인프레임 컴퓨터 또는 그래픽 데이터를 프로세싱하거나 및/또는 디스플레이하는 임의의 다른 유형의 디바이스를 포함할 수도 있다.
도 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) 상에서 실행하는 소프트웨어 애플리케이션들은 예를 들어, 운영 시스템, 워드 프로세서 애플리케이션, 이메일 애플리케이션, 스프레드시트 애플리케이션, 미디어 플레이어 애플리케이션, 비디오 게임 애플리케이션, 그래픽 사용자 인터페이스 애플리케이션 또는 또 다른 프로그램을 포함할 수도 있다. 사용자는 키보드, 마우스, 마이크로폰, 터치 패드 또는 컴퓨팅 디바이스 (2) 에 사용자 인터페이스 (4) 를 통해서 커플링된 다른 입력 디바이스와 같은 하나 이상의 입력 디바이스들 (미도시) 을 통해서 컴퓨팅 디바이스 (2) 로의 입력을 제공할 수도 있다.
CPU (6) 상에서 실행하는 소프트웨어 애플리케이션들은 GPU (12) 에게 디스플레이 (18) 로의 그래픽스 데이터의 렌더링을 가능하도록 명령하는 하나 이상의 그래픽스 렌더링 명령들을 포함할 수도 있다. 일부 예들에서, 소프트웨어 명령들은 예컨대, 개방 그래픽스 라이브러리 (OpenGL®) API, OpenGL ES (Open Graphics Library Embedded Systems) API, Direct3D API, DirectX API, RenderMan API, WebGL API, OpenVG® 또는 임의의 다른 공개 또는 독점 표준 그래픽스 API 와 같은, 그래픽스 애플리케이션 프로그래밍 인터페이스 (API) 를 따를 수도 있다. 그래픽스 렌더링 명령들을 프로세싱하기 위해, CPU (6) 는 GPU (12) 로 하여금 그래픽스 데이터의 렌더링의 일부 또는 모두를 수행하도록 하기 위해서 하나 이상의 그래픽스 렌더링 커맨드들을 GPU (12) 로 발행할 수도 있다. 일부 예들에서, 렌더링될 그래픽스 데이터는 하나 이상의 정점 버퍼들을 포함할 수도 있다. 정점 버퍼는 그래픽스 프리미티브들, 예컨대, 지점들, 라인들, 삼각형들, 사변형들, 삼각형 스트립들, 패치들, 등의 리스트이다. 추가적인 예들에서, 렌더링될 정점 버퍼 그래픽스 데이터는 예컨대, 선분들, 타원 아크들, 2차 베지어 곡선들, 및 3차 베지어 곡선들과 같은, 하나 이상의 패스 렌더링 프리미티브들을 포함할 수도 있다.
메모리 제어기 (8) 는 메모리 (10) 로 그리고 그로부터의 데이터의 전송을 촉진한다. 예를 들어, 메모리 제어기 (8) 는 CPU (6) 및/또는 GPU (12) 로부터 메모리 판독 요청들 및 메모리 기록 요청들을 수신하고, 컴퓨팅 디바이스 (2) 에서의 구성요소들에 메모리 서비스들을 제공하기 위해 메모리 (10) 에 대해 이러한 요청들을 제공할 수도 있다. 메모리 제어기 (8) 은 메모리 (10) 에 통신가능하게 커플링된다. 메모리 제어기 (8) 가 CPU (6), GPU (12), 및 메모리 (10) 의 각각과는 별개인 프로세싱 모듈인 것으로 도 1 의 예시적인 컴퓨팅 디바이스 (2) 에서 예시되지만, 다른 예들에서, 메모리 제어기 (8) 의 기능 중 일부 또는 모두는 CPU (6), GPU (12), 및 메모리 (10) 중 하나 이상 상에서 구현될 수도 있다.
메모리 (10) 는 CPU (6) 에 의한 실행을 위해서 액세스가능한 프로그램 모듈들 및/또는 명령들 및/또는 CPU (6) 상에서 실행하는 프로그램들에 의해 사용하기 위한 데이터를 저장할 수도 있다. 예를 들어, 메모리 (10) 는 사용자 애플리케이션들 및 그 애플리케이션들과 연관되는 그래픽스 데이터를 저장할 수도 있다. 메모리 (10) 는 또한 컴퓨팅 디바이스 (2) 의 다른 구성요소들에 의한 사용을 위한 및/또는 그에 의해 생성되는 정보를 저장할 수도 있다. 예를 들어, 메모리 (10) 는 GPU (12) 에 대한 디바이스 메모리로서 역할을 할 수도 있으며, GPU (12) 상에서 그에 의해 연산될 데이터 뿐만 아니라 GPU (12) 에 의해 수행되는 연산들로부터 초래되는 데이터를 저장할 수도 있다. 예를 들어, 메모리 (10) 는 패스 데이터, 패스 세그먼트 데이터, 표면들, 텍스쳐 버퍼들, 심도 버퍼들, 스텐실 버퍼들 (stencil buffers), 정점 버퍼들 (vertex buffers), 프레임 버퍼들, 또는 기타 등등의 임의의 조합을 저장할 수도 있다. 게다가, 메모리 (10) 는 GPU (12) 에 의한 프로세싱을 위해 커맨드 스트림들을 저장할 수도 있다. 예를 들어, 메모리 (10) 는 패스 렌더링 커맨드들, 3D 그래픽스 렌더링 커맨드들, 및/또는 범용 GPU (GPGPU) 컴퓨팅 커맨드들을 저장할 수도 있다. 메모리 (10) 는 예를 들어, 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM), 동기적 동적 랜덤 액세스 메모리 (SDRAM), 판독 전용 메모리 (ROM), 소거가능한 프로그래밍가능 ROM (EPROM), 전기적 소거가능 프로그래밍가능 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) (블록 전송 또는 BLT) 커맨드들, 테셀레이션 커맨드들, 등을 포함할 수도 있다. 그래픽스 데이터는 정점 데이터, 텍스쳐 데이터, 표면 데이터, 등을 포함할 수도 있다. 일부 예들에서, CPU (6) 는 커맨드들 및 그래픽스 데이터를 GPU (12) 에 의해 액세스될 수도 있는 메모리 (10) 에 기록함으로써, 커맨드들 및 그래픽스 데이터를 GPU (12) 에 제공할 수도 있다.
본 개시물의 기법들에 따르면, CPU (6) 는 그리기 호출을 이용하여 그래픽스 데이터를 GPU (12) 에 제공할 수도 있다. 그리기 호출은 정점 버퍼, 또는 다수의 상이한 정점 유형들의 정점들을 포함하는 정점 버퍼로의 포인터를 인수로서 수신할 수도 있다. 그리기 호출은 또한 primtype 버퍼를 인수로서 수신할 수도 있다. primtype 버퍼의 (엔트리들로서 또한 지칭되는) 값들은 정점 버퍼에 포함되는 하나 이상의 정점들과 연관된 대응하는 프리미티브 유형을 표시할 수도 있다. 그리기 호출은 또한 일부 예들에서, 정점 버퍼 및 primtype 버퍼로의 포인터를 인수들로서 수신할 수도 있다. 정점 버퍼 및 primtype 버퍼는 메모리 (10) 에 저장된다.
CPU (6) 는 정점 및 primtype 버퍼들에 대해 메모리 (10) 의 부분을 할당할 수도 있다. CPU (6) 는 정점 버퍼에 대한 정점 데이터를 발생시키고, 예컨대, 그리기 호출을 통하여, 버스 (20) 를 이용하여, 그 정점들을 메모리의 할당된 부분으로 전송할 수도 있다. 프로그램이 CPU (6) 로 하여금 그리기 호출을 호출하도록 할 때, CPU (6) 는 메모리 제어기 (8) 로 하여금 버스 (20) 를 이용하여 정점 버퍼 및 primtype 버퍼 데이터를 GPU (12) 로 전송하도록 할 수도 있다. GPU (12) 는 정점 버퍼 및 primtype 버퍼 데이터를 GPU 의 메모리에 저장할 수도 있다.
GPU (12) 는 CPU (6) 보다 좀더 효율적인 그래픽스 동작들의 프로세싱을 제공하는 고속-병렬 구조로 형성될 수도 있다. 예를 들어, GPU (12) 는 다수의 정점들, 제어 지점들, 픽셀들 및/또는 다른 데이터에 대해 병렬 방식으로 동작하도록 구성된 복수의 프로세싱 엘리먼트들을 포함할 수도 있다. GPU (12) 의 고속 병렬 성질은 일부 경우, GPU (12) 로 하여금, CPU (6) 를 이용하여 이미지들을 렌더링하는 것보다 더 빨리 그래픽스 이미지들 (예컨대, GUIs 및 2차원 (2D) 및/또는 3차원 (3D) 그래픽스 장면들) 을 디스플레이 (18) 상으로 렌더링가능하게 할 수도 있다. 게다가, GPU (12) 의 고속 병렬 성질은 GPU (12) 로 하여금 범용 컴퓨팅 애플리케이션들에 대한 어떤 유형들의 벡터 및 매트릭스 연산들을 CPU (6) 보다 더 빨리 프로세싱가능하게 할 수도 있다.
본 개시물의 기법들에 따르면, 설명된 아래에서 좀더 자세하게 설명되는 바와 같이, GPU (12) 는 상이한 프리미티브 유형들의 정점들을 포함하는 단일 정점 버퍼를 수신하도록 구성될 수도 있다. 위에서 설명된 바와 같이, GPU (12) 는 시스템 메모리 (10) 로부터, CPU (6) 에 의해 개시되는 메모리 전송을 통해서 정점 버퍼들 (40) 의 정점 버퍼를 수신할 수도 있다. GPU (12) 는 또한 정점 버퍼 정점들의 프리미티브 유형들을 나타내는 primtype 버퍼를 수신하도록 구성될 수도 있다. 본 개시물에 따른 일 예로서, GPU (12) 는 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 수신하도록 구성될 수도 있으며, GPU (12) 의 정점 버퍼의 복수의 정점들의 각각은 복수의 프리미티브 유형 엔트리들 중 하나 이상과 연관된다. GPU (12) 는 복수의 정점들 및 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 결정하고, 그리고 복수의 정점들, 및 프리미티브 유형 버퍼의 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 렌더링할 수도 있다.
GPU (12) 는 일부 예들에서, 컴퓨팅 디바이스 (2) 의 마더보더에 통합될 수도 있다. 다른 경우, GPU (12) 는 컴퓨팅 디바이스 (2) 의 마더보더에서의 포트에 설치된 그래픽스 카드 상에 존재할 수도 있거나 또는 아니면, 컴퓨팅 디바이스 (2) 와 상호운용하도록 구성된 주변장치 디바이스 내에 통합될 수도 있다. 추가적인 경우들에서, GPU (12) 는 시스템 온 칩 (SoC) 을 형성하는 CPU (6) 로서 동일한 마이크로칩 상에 로케이트될 수도 있다. GPU (12) 는 하나 이상의 마이크로프로세서들, 주문형 집적회로들 (ASIC들), 필드 프로그래밍가능 게이트 어레이들 (FPGA들), 디지털 신호 프로세서들 (DSP들), 또는 다른 등가의 통합 또는 이산 로직 회로와 같은, 하나 이상의 프로세서들을 포함할 수도 있다.
일부 예들에서, GPU (12) 는 GPU 캐시 (14) 에 직접 커플링될 수도 있다. 따라서, GPU (12) 는 버스 (20) 를 반드시 이용하지 않고 GPU 캐시 (14) 로부터 데이터를 판독하고 그에 데이터를 기록할 수도 있다. 즉, GPU (12) 는 오프-칩 메모리 대신, 로컬 스토리지를 이용하여, 데이터를 로컬로 프로세싱할 수도 있다. 이것은 막대한 버스 트래픽을 겪을 수도 있는, GPU (12) 가 버스 (20) 통하여 데이터를 판독하고 기록할 필요성을 제거함으로써, GPU (12) 로 하여금 좀더 효율적인 방법으로 동작가능하게 한다. 일부의 경우, 그러나, GPU (12) 는 별개의 캐시를 포함하지 않고, 대신 버스 (20) 를 통해서 메모리 (10) 를 이용할 수도 있다. GPU 캐시 (14) 는 예컨대, 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM), 소거가능한 프로그래밍가능 ROM (EPROM), 전기적 소거가능 프로그래밍가능 ROM (EEPROM), 플래시 메모리, 자기 데이터 매체들 또는 광학 저장 매체들과 같은, 하나 이상의 휘발성 또는 비-휘발성 메모리 또는 저장 디바이스들을 포함할 수도 있다.
CPU (6) 및/또는 GPU (12) 는 렌더링된 이미지 데이터를 메모리 (10) 내에 할당된 프레임 버퍼에 저장할 수도 있다. 렌더링된 이미지 데이터는 렌더링될 패스 세그먼트에 대한 렌더링된 채움 영역들 및 스트로크 영역들을 포함할 수도 있다. 디스플레이 인터페이스 (16) 는 프레임 버퍼로부터 데이터를 취출하고, 렌더링된 이미지 데이터에 의해 표현되는 이미지를 디스플레이하도록 디스플레이 (18) 를 구성할 수도 있다. 일부 예들에서, 디스플레이 인터페이스 (16) 는 프레임 버퍼로부터 취출된 디지털 값들을 디스플레이 (18) 에 의해 소비가능한 아날로그 신호로 변환하도록 구성되는 디지털-대-아날로그 변환기 (DAC) 를 포함할 수도 있다. 다른 예들에서, 디스플레이 인터페이스 (16) 는 프로세싱을 위해 디지털 값들을 디스플레이 (18) 로 직접 전달할 수도 있다.
디스플레이 (18) 는 모니터, 텔레비전, 투사 디바이스, 액정 디스플레이 (LCD), 플라즈마 디스플레이 패널, 발광 다이오드 (LED) 어레이, 음극선관 (CRT) 디스플레이, 전자 종이, 표면-전도 전자방출 디스플레이 (SED), 레이저 텔레비전 디스플레이, 나노크리스탈 디스플레이 또는 또 다른 유형의 디스플레이 유닛을 포함할 수도 있다. 디스플레이 (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) 는 캡들, 및 접합부들, 및/또는 대싱 (dashing) 패턴들에 대한 도메인 좌표들을 결정할 수도 있으며, 프리미티브를 서브-세그먼트들로 분할할 수도 있다. GPU (12) 는 또한 패턴에 기초하여 세그먼트들을 유지하거나 또는 드롭하는 것과 같이, 대싱 패턴에 기초하여 그래픽 동작들을 수행할 수도 있다. 도메인 셰이더 스테이지와 같은, 후속 스테이지는 도메인 좌표들을 입력으로서 수신할 수도 있으며, 도메인 좌표들에 기초하여 정점 좌표들을 결정할 수도 있다.
스트로킹 동작의 부분으로서, 그리고 선분의 스트로크 영역에 공간적으로 대응하는 하나 이상의 프리미티브들 (예컨대, 삼각형 프리미티브들) 을 생성하기 위해, GPU (12) 는 방정식, 예컨대, 파라미터 방정식, 등에 의해 정의될 수도 있는 프리미티브를 수신할 수도 있다. GPU (12) 는 테셀레이션 유닛을 이용하여, 수신된 프리미티브를 하나 이상의 선분들을 분할할 수도 있다.
본 개시물에 개시된 패스 렌더링 기법들은 예컨대, CPU (6), GPU (12), 및 메모리 (10) 를 포함한, 도 1 에 예시된 컴퓨팅 디바이스 (2) 의 구성요소들 중 임의의 구성요소에서 구현될 수도 있다. 일부 예들에서, 패스 렌더링 기법들의 모두 또는 거의 모두는 GPU (12) 에서 (예컨대, GPU (12) 의 그래픽스 파이프라인에서) 구현될 수도 있다. 추가적인 예들에서, CPU (6) 는 본 개시물의 패스 렌더링 기법들을 수행하는 GPU (12) 에서 패스 렌더링 파이프라인을 구현하기 위해, 그래픽스 파이프라인의 상태를 구성하고 셰이더 프로그램들을 그래픽스 파이프라인에 바인딩하는 기법들을 구현할 수도 있다. 추가적인 예들에서, CPU (6) 는 하나 이상의 패스들을 렌더링하기 위해 렌더링될 패스를 나타내는 데이터를 GPU (12) 에 의해 액세스될 수도 있는 하나 이상의 버퍼들 (예컨대, 하나 이상의 정점 버퍼들 및 primtype 버퍼들) 에 배치하도록 구성될 수도 있다.
도 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) 에 의해 소비가능한 포맷으로 변환하는 런타임 서비스일 수도 있다. GPU 드라이버 (28) 는 소프트웨어 애플리케이션 (24) 으로부터 그래픽스 API (26) 를 통해서 명령들을 수신하고, 그 명령들을 제공하도록 GPU (12) 의 동작을 제어한다. 예를 들어, GPU 드라이버 (28) 는 하나 이상의 커맨드들 (38) 을 공식화하고, 커맨드들 (38) 을 메모리 (10) 에 배치하고, 그리고 GPU (12) 에게 커맨드들 (38) 을 실행하도록 명령할 수도 있다. 일부 예들에서, GPU 드라이버 (28) 는 커맨드들 (38) 을 메모리 (10) 로 배치하고 운영 시스템 (30) 을 통해서, 예컨대, 하나 이상의 시스템 호출들을 통해서, GPU (12) 와 통신할 수도 있다.
GPU (12) 는 커맨드 엔진 (32) 및 하나 이상의 프로세싱 유닛들 (34) 을 포함한다. 일부 예들에서, 하나 이상의 프로세싱 유닛들 (34) 은 3D 그래픽스 렌더링 파이프라인, 예컨대, DX 11 그래픽스 렌더링 파이프라인 (즉, DX 11 그래픽스 API 를 준수하는 3D 그래픽스 파이프라인) 을 형성하거나 및/또는 구현할 수도 있다.
커맨드 엔진 (32) 은 CPU (6) 로부터 (예컨대, 메모리 (10) 를 통해서) 커맨드들을 수신하고 GPU (12) 로 하여금 커맨드들을 실행하도록 구성된다. 상태 커맨드를 수신하는 것에 응답하여, 커맨드 엔진 (32) 은 상태 커맨드에 기초하여 GPU (12) 에서의 하나 이상의 상태 레지스터들을 특정의 값들로 설정하거나, 및/또는 상태 커맨드에 기초하여, 고정-함수 프로세싱 유닛들 (34) 중 하나 이상을 구성하도록 구성될 수도 있다. 그리기 호출 커맨드를 수신하는 것에 응답하여, 커맨드 엔진 (32) 은 프로세싱 유닛들 (34) 로 하여금, 렌더링될 정점 버퍼들 (41) 의 정점들에 포함될 수도 있는, 렌더링될 패스의 형태를 나타내는 데이터 뿐만 아니라, primtype 버퍼들 (42) 의 정점 버퍼 정점들의 프리미티브 유형을 나타내는 데이터에 기초하여, 메모리 (10) 에서의 정점들에 의해 표현되는 기하학적 구조를 렌더링가능하도록 구성될 수도 있다. 커맨드 엔진 (32) 은 또한 셰이더 프로그램 바인딩 커맨드들을 수신하고, 셰이더 프로그램 바인딩 커맨드들에 기초하여 특정의 셰이더 프로그램들을 프로그래밍가능 프로세싱 유닛들 (34) 중 하나 이상에 로드할 수도 있다.
프로세싱 유닛들 (34) 은 하나 이상의 프로세싱 유닛들을 포함할 수도 있으며, 그 프로세싱 유닛들 각각은 프로그래밍가능 프로세싱 유닛 또는 고정-함수 프로세싱 유닛일 수도 있다. 프로그래밍가능 프로세싱 유닛은 예를 들어, CPU (6) 로부터 GPU (12) 상으로 다운로드되는 하나 이상의 셰이더 프로그램들을 실행하도록 구성되는 프로그래밍가능 셰이더 유닛을 포함할 수도 있다. 셰이더 프로그램은, 일부 예들에서, 예컨대, GLSL (OpenGL Shading Language), HLSL (High Level Shading Language), Cg (C for Graphics) 셰이딩 언어, 등과 같은, 고급 셰이딩 언어로 기록된 프로그램의 컴파일된 버전일 수도 있다. 일부 예들에서, 프로그래밍가능 셰이더 유닛은 예컨대, SIMD 파이프라인과 병렬로 동작하도록 구성된 복수의 프로세싱 유닛들을 포함할 수도 있다. 프로그래밍가능 셰이더 유닛은 셰이더 프로그램 명령들 및 실행 상태 레지스터, 예컨대, 실행될 프로그램 메모리 내의 현재의 명령 또는 페치될 다음 명령을 나타내는 프로그램 카운터 레지스터를 저장하는 프로그램 메모리를 가질 수도 있다. 프로세싱 유닛들 (34) 에서의 프로그래밍가능 셰이더 유닛들은 예를 들어, 정점 셰이더 유닛들, 픽셀 셰이더 유닛들, 지오메트리 셰이더 유닛들, 헐 셰이더 유닛들, 도메인 셰이더 유닛들, 계산 셰이더 유닛들, 및/또는 통합 셰이더 유닛들을 포함할 수도 있다.
고정-함수 프로세싱 유닛은 어떤 기능들을 수행하도록 하드-와이어된 하드웨어를 포함할 수도 있다. 고정 함수 하드웨어가 하나 이상의 제어 신호들을 통해서 예를 들어, 상이한 기능들을 수행하도록 구성가능할 수도 있지만, 고정 함수 하드웨어는 일반적으로 사용자-컴파일된 프로그램들을 수신할 수 있는 프로그램 메모리를 포함하지 않는다. 게다가, 일부 예들에서, 프로세싱 유닛들 (34) 에서의 고정 함수 프로세싱 유닛들은 예를 들어, 예컨대, 심도 테스팅, 시저 테스팅 (scissors testing), 알파 블렌딩, 등과 같은, 래스터 연산들을 수행하는 프로세싱 유닛들을 포함할 수도 있다.
메모리 (10) 는 패스 데이터 (36) 및 하나 이상의 커맨드들 (38) 을 저장할 수도 있다. 일부 예들에서, 패스 데이터 (36) 는 메모리 (10) 에 할당된 정점 버퍼들 (41) 중 하나 이상에 복수의 정점들 (또는, 제어 지점들) 로서 저장될 수도 있다. 패스 데이터 (36) 는 또한 하나 이상의 primtype 버퍼들 (42) 을 포함할 수도 있다. primtype 버퍼들 (42) 의 각각은 정점 버퍼들 (41) 중 하나의 하나 이상의 정점들에 대응하는 primitype 유형들을 나타내는 데이터를 포함한다. 일부 예들에서, 패스 데이터는 패치 리스트 데이터 구조 (예컨대, 4 제어 지점 패치 리스트) 로 저장될 수도 있다. 커맨드들 (38) 은 하나 이상의 커맨드 버퍼들 (예컨대, 링 버퍼) 에 저장될 수도 있다. CPU (6) (예컨대, 운영 시스템 (30) 을 통한 GPU 드라이버 (28)) 는 GPU (12) 에 의한 소비를 위해 패스 데이터 (36) 및 커맨드들 (38) 을 메모리 (10) 에 배치할 수도 있다. GPU (12) (예컨대, 커맨드 엔진 (32)) 는 메모리 (10) 에 저장된 커맨드들 (38) 을 취출하여 실행할 수도 있다.
패스 데이터 (36) 가 정점들로서 저장되는 예들에서, 정점 버퍼들 (41) 의 정점들은 렌더링될 패스의 하나 이상의 프리미티브들을 기하학적으로 정의하는 하나 이상의 속성들을 포함할 수도 있다. 예를 들어, 라인에 있어, 패치 제어 리스트에서의 정점들은 라인의 종점들에 대한 좌표들 (예컨대, (x0, y0) 및 (x1, y1)) 을 나타내는 데이터를 포함할 수도 있다. 3차 베지어 곡선에 있어, 패치 제어 리스트에서의 정점들은 곡선을 정의하는 4개의 제어 지점들의 좌표들 (예컨대, (x0, y0), (x1, y1), (x2, y2), (x3, y3)) 을 나타내는 데이터를 포함할 수도 있다. 2차 베지어 곡선에 있어, 패치 제어 리스트에서의 정점들은 4개의 제어 지점들 대신 3개의 제어 지점들에 대한 좌표들을 나타내는 데이터를 포함할 수도 있다. 타원 아크들에 있어, 패치 제어 리스트에서의 정점들은 타원 아크의 종점 파라미터화를 나타내는 데이터 또는 타원 아크의 중심 파라미터화를 나타내는 데이터를 포함할 수도 있다.
정점 버퍼들 (41) 은 또한 정점 버퍼들 (41) 의 단일 정점 버퍼 내에 상이한 프리미티브 유형들의 정점들을 포함할 수도 있다. 예를 들어, 정점 버퍼들 (41) 중 하나는 라인을 기하학적으로 정의하는 2개의 정점들 (예컨대, (x0, y0) 및 (x1, y1)), 및 2차 베지어 곡선을 정의하는 3개의 정점들 (예컨대, (x2, y2), (x3, y3), 및 (x4, y4)) 을 포함할 수도 있다. 라인 및 2차 베지어 곡선의 정점들을 포함하는 정점 버퍼는 따라서 값들 ((x0, y0), (x1, y1), (x2, y2), (x3, y3), 및 (x4, y4)) 을 포함할 수도 있다. 일부 예들에서, 정점들은 2개의 정점들 간에 공유될 수도 있다. 예를 들어, (x1, y1) 은 (x0, y0) 을 또한 포함하는 제 1 라인의 종점, 및 종점이 (x2, y2) 인 제 2 라인의 시작 지점일 수도 있다.
정점 버퍼들 (41) 의 각각에 대해, primtype 버퍼들 (42) 중 하나는 정점 버퍼들 (41) 중 하나의 하나 이상의 정점들의 primitype 유형을 나타내는 데이터를 포함한다. Primtype 버퍼들 (42) 은 일반적으로 정점 버퍼들 (41) 중 하나의 하나 이상의 정점들의 프리미티브 유형을 나타내는 일정한 정수 값들 (예컨대, 32-비트 무부호 정수 값들) 을 포함할 수도 있다. primtype 버퍼들 (42) 의 값들은 일 예로서, C 프로그래밍 언어의 "enum" 유형들과 유사한 방법으로, 할당되거나 또는 구조화될 수도 있다.
다수의 패스-렌더링 프리미티브 유형들 (즉, 라인 및 2차 베지어 곡선) 을 포함하는 정점 버퍼의 예에서, primtype 버퍼는 정점 버퍼의 제 1 의 2개의 좌표들 쌍들 (즉 (x0,y0), 및 (x1, y1) 이 라인 프리미티브 유형이라는 것을 나타내는 상수 값, 및 제 3, 제 4, 및 제 5 좌표 쌍들 (즉, (x2, y2), (x3, y3), 및 (x4, y4)) 이 2차 베지어 곡선 프리미티브 유형이라는 것을 나타내는 제 2 값을 포함할 수도 있다. 따라서, 간단한 예에서, primtype 버퍼는 값들 (LINE, QUAD) 을 포함할 수도 있으며, 여기서, "라인 (LINE)" 및 "쿼드 (QUAD)" 는 각각 라인, 및 2차 베지어 곡선 프리미티브 유형에 대응하는 상수들이다.
하나 이상의 정점들의 primtiype 유형들을 나타내는 상수 값들에 더해서, primtype 버퍼들 (42) 는 또한 프리미티브의 시작 및/또는 끝이 새로운 서브패스의 시작을 마크하는지 여부를 나타내는 상수 값들뿐만 아니라, 프리미티브의 제 1 및 최종 정점들 (또한, 서브패스로서 지칭됨) 이 접속되는지 여부를 나타내는 상수 값을 포함할 수도 있다. 새로운 서브패스의 시작을 나타내는 primtype 버퍼 상수 값은 "OR" 로서 표시되는, 개방된 리셋이다. 서브패스의 제 1 및 최종 정점들이 접속된다는 것을 나타내는 primtype 값은 "CR" 로서 표시되는, 폐쇄된 리셋으로서 지칭된다. 일부 예들에서, 상이한 패스 유형들은 OpenVG API 에 의해 정의되는 패스 유형들의 세트에 대응할 수도 있다. primtype 값들 및 서브패스들은 도 4 에 대해 아래에서 더 자세히 설명된다.
커맨드들 (38) 은 하나 이상의 상태 커맨드들 및/또는 하나 이상의 그리기 호출 커맨드들을 포함할 수도 있다. 상태 커맨드는 GPU (12) 에게, 예컨대, 그리기 칼라, 채우기 칼라, 스트로크 칼라, 등과 같은, GPU (12) 에서의 상태 변수들 중 하나 이상을 변경하도록 명령할 수도 있다. 일부 예들에서, 상태 커맨드들은 패스를 렌더링하는 것과 연관되는 하나 이상의 상태 변수들을 설정하도록 구성되는 패스 렌더링 상태 커맨드들을 포함할 수도 있다. 예를 들어, 상태 커맨드들은 렌더링될 패스가 채워질지, 스트로크될지, 또는 양쪽인지를 나타내도록 구성되는 페인트 모드 커맨드를 포함할 수도 있다. 또 다른 예로서, 상태 커맨드들은 채우기 동작들에 사용될 칼라를 규정하는 채우기 칼라 커맨드 및/또는 스트로킹 동작들에 사용될 칼라를 규정하는 스트로크 칼라 커맨드를 포함할 수도 있다. 추가 예로서, 상태 커맨드들은 예컨대, 스트로크 폭, 엔드 캡 스타일 (예컨대, 버트 (butt), 라운드, 정사각형), 라인 접합부 스타일 (예컨대, 연귀, 라운드, 사면), 연귀 한계, 등과 같은, 스트로크 동작에 대한 하나 이상의 파라미터들을 규정할 수도 있다. 일부 예들에서, 하나 이상의 상태 파라미터들을 설정하는데 상태 커맨드를 이용하는 것에 더해서 또는 대신에, 상태 파라미터들 중 하나 이상은 그리기 호출 커맨드를 이용함으로써 또는 상태 표시자들을 패스 데이터 (36) 를 포함하는 정점 버퍼로 배치함으로써, 설정될 수도 있다.
그리기 호출 커맨드는 GPU (12) 에게, 메모리 (10) 에 저장된 (예컨대, 정점 버퍼에 정의된) 하나 이상의 정점들의 그룹에 의해 정의된 기하학적 구조를 렌더링하도록 명령할 수도 있다. 일부 예들에서, 그리기 호출 커맨드는 메모리 (10) 의 정의된 섹션 (예컨대, 패스 데이터 (36) 의 정점 버퍼들 (41)) 에 저장된 정점들 및 프리미티브들의 모두를 렌더링하도록 GPU (12) 를 호출할 수도 있다. 즉, 일단 GPU (12) 가 그리기 호출 커맨드를 수신하면, 제어는 메모리 (10) 의 정의된 섹션 (예컨대, 정점 버퍼 또는 패스 데이터 (36)) 에서의 정점들에 의해 표현되는 그 기하학적 구조 및 프리미티브들을 렌더링하기 위해 GPU (12) 로 전달된다. 본 개시물의 기법들에 따르면, GPU (12) 는 정점 버퍼 및 primtype 버퍼를 인수들로서 포함하는 그리기 호출 커맨드를 수신할 수도 있다.
그리기 호출 커맨드들은 3D 그리기 호출 커맨드들 및 패스 렌더링 그리기 호출 커맨드들의 하나 또는 양자를 포함할 수도 있다. 3D 렌더링 그리기 호출 커맨드들에 있어, 정점 버퍼에서 하나 이상의 정점들의 그룹에 의해 정의되는 기하학적 구조는 렌더링될 하나 이상의 3D 그래픽스 프리미티브들 (예컨대, 지점들, 라인들, 삼각형들, 사변형들, 삼각형 스트립들, 패치들, 등) 에 대응할 수도 있으며, 3D 렌더링 그리기 호출 커맨드는 GPU (12) 에게 하나 이상의 3D 그래픽스 프리미티브들을 렌더링하도록 명령할 수도 있다. 패스 렌더링 그리기 호출 커맨드들에 있어, 정점 버퍼에서 하나 이상의 정점들의 그룹에 의해 정의되는 기하학적 구조는 하나 이상의 렌더링될 패스 프리미티브들 (예컨대, 선분들, 타원 아크들, 2차 베지어 곡선들, 및 3차 베지어 곡선들, 등) 에 대응할 수도 있으며, 패스 렌더링 그리기 호출 커맨드는 GPU (12) 에게 하나 이상의 패스 프리미티브들을 렌더링하도록 명령할 수도 있다.
그리기 호출은 또한 고정 함수, 및 헐 셰이더, 테셀레이터 및 도메인 셰이더를 포함할 수도 있는 프로그래밍가능 유닛들을 이용하는 하나 이상의 테셀레이션 커맨드들을 규정할 수도 있다. 헐 셰이더는 테셀레이트될 도메인을 규정할 수도 있다. 일부 예들에서, 테셀레이트될 도메인은 아이소라인, 삼각형 (트리), 또는 쿼드 (사변형) 도메인 중 하나를 포함할 수도 있다. 테셀레이터는 규정된 도메인 상에서 동작하며, 도메인 좌표들을 출력하며, 그 도메인 좌표들에 기초하여, 도메인 셰이더가 정점 좌표들을 결정할 수도 있다.
일부 예들에서, 본 개시물에 개시된 패스 렌더링 기법들은 예컨대, 그래픽스 API (26), GPU 드라이버 (28), 커맨드 엔진 (32) 및 프로세싱 유닛들 (34) 을 포함한, 도 2 에 나타낸 구성요소들 중 임의의 구성요소로 구현될 수도 있다. 일부 예들에서, 패스 렌더링 기법들의 모두 또는 거의 모두는 프로세싱 유닛들 (34) 에 의해 형성된 GPU (12) 에서의 그래픽스 파이프라인으로 구현될 수도 있다. 예를 들어, 테셀레이션 유닛은 프로세싱 유닛들 (34) 의 유닛일 수도 있다. 추가적인 예들에서, CPU (6) 의 소프트웨어 애플리케이션 (24), 그래픽스 API (26) 및/또는 GPU 드라이버 (28) 는 본 개시물의 패스 렌더링 기법들을 수행하는 GPU (12) 에서의 패스 렌더링 파이프라인을 구현하기 위해, 그래픽스 파이프라인의 상태를 구성하고 그 셰이더 프로그램들을 그래픽스 파이프라인에 바인딩하는 기법들을 구현할 수도 있다. 추가적인 예들에서, CPU (6) 의 소프트웨어 애플리케이션 (24), 그래픽스 API (26) 및/또는 GPU 드라이버 (28) 는 하나 이상의 패스들을 렌더링하기 위해 렌더링될 패스를 나타내는 데이터를 GPU (12) 에 의해 액세스될 수도 있는 하나 이상의 버퍼들 (예컨대, 하나 이상의 정점 버퍼들 및 primtype 버퍼들) 에 배치하도록 구성될 수도 있다.
본 개시물의 기법들에 따르면, GPU (12) 는 상이한 프리미티브 유형들의 정점들을 포함하는 단일 정점 버퍼를 수신하도록 구성될 수도 있다. GPU (12) 는 또한 정점 버퍼 정점들의 프리미티브 유형들을 나타내는 primtype 버퍼를 수신하도록 구성될 수도 있다. 본 개시물에 따른 일 예로서, GPU (12) 는 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 수신하도록 구성될 수도 있으며, GPU (12) 의 정점 버퍼의 복수의 정점들의 각각은 복수의 프리미티브 유형 엔트리들 중 하나 이상과 연관된다. GPU (12) 는 복수의 정점들 및 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 결정하고, 그리고 복수의 정점들, 및 프리미티브 유형 버퍼의 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 렌더링할 수도 있다.
도 3 은 본 개시물의 패스 렌더링 기법들을 수행할 수도 있는 예시적인 그래픽스 파이프라인 (40) 을 예시하는 개념도이다. 일부 예들에서, 그래픽스 파이프라인은 마이크로소프트® DirectX (DX) 11 그래픽스 파이프라인에 대응할 수도 있다. 도 3 에 나타낸 바와 같이, 그래픽스 파이프라인 (40) 은 리소스들 블록 (42), 및 도 2 의 프로세싱 유닛들을 포함할 수 있는 복수의 프로세싱 스테이지들을 포함한다. 복수의 프로세싱 스테이지들 (예컨대, 프로세싱 유닛들 (34)) 은 입력 어셈블러 (IA) (44), 정점 셰이더 (VS) (46), 헐 셰이더 (HS) (48), 테셀레이터 (50), 도메인 셰이더 (DS) (52), 지오메트리 셰이더 (GS) (54), 래스터라이저 (56), 픽셀 셰이더 (PS) (58), 및 출력 병합기 (60) 를 포함한다. 헐 셰이더 (48), 테셀레이터 (50), 및 도메인 셰이더 (52) 는 그래픽스 파이프라인 (40) 의 테셀레이션 스테이지들 (62) 을 형성할 수도 있다.
리소스들 블록 (42) 은 예컨대, 하나 이상의 텍스쳐들 및/또는 하나 이상의 버퍼들과 같은, 그래픽스 파이프라인 (40) 에 의해 사용되는 하나 이상의 메모리 리소스들에 대응할 수도 있다. 리소스들 블록 (42) 은 그래픽스 파이프라인 (40) 에서 프로세싱 스테이지들 중 하나 이상에 의해 프로세싱될 입력 데이터, 및/또는 그래픽스 파이프라인 (40) 에서 프로세싱 스테이지들 중 하나 이상으로부터의 출력 데이터를 저장할 수도 있다. 일 예로서, 리소스들 블록 (42) 은 본 개시물에서 설명되는 바와 같은 패스 세그먼트에 대한 채움 영역의 래스터화된 버전 및/또는 패스 세그먼트에 대한 스트로크 영역의 래스터화된 버전을 유지하는 프레임 버퍼를 저장할 수도 있다. 일부 예들에서, 리소스들 블록 (42) 을 형성하는 메모리 리소스들은 컴퓨팅 디바이스 (2) 의 메모리 (10) 및/또는 GPU 캐시 (14) 에 상주할 수도 있다.
일직선 모서리들을 가진 도 3 에 도시된 프로세싱 스테이지들은 고정-함수 프로세싱 스테이지들을 나타내며, 둥근 모서리들을 가진 도 3 에 도시된 프로세싱 스테이지들은 프로그래밍가능 프로세싱 스테이지들을 나타낸다. 예를 들어, 도 3 에 나타낸 바와 같이, 입력 어셈블러 (44), 테셀레이터 (50), 래스터라이저 (56) 및 출력 병합기 (60) 는 고정-함수 프로세싱 스테이지들일 수도 있으며, 정점 셰이더 (46), 헐 셰이더 (48), 도메인 셰이더 (52), 지오메트리 셰이더 (54) 및 픽셀 셰이더 (58) 는 프로그래밍가능 프로세싱 스테이지들일 수도 있다. 프로그래밍가능 스테이지들의 각각은 특정의 유형의 셰이더 프로그램을 실행하도록 구성될 수도 있다. 예를 들어, 정점 셰이더 (46) 는 정점 셰이더 프로그램을 실행하도록 구성될 수도 있으며, 헐 셰이더 (48) 는 헐 셰이더 프로그램, 등을 실행하도록 구성될 수도 있다. 상이한 유형들의 셰이더 프로그램들의 각각은 GPU 의 공통 셰이더 유닛 상에서, 또는 하나 이상의 특정 유형들의 셰이더 프로그램들을 실행하는 것을 담당하는 하나 이상의 전용 셰이더 유닛들 상에서 실행할 수도 있다.
도 3 에 나타낸 바와 같이, 입력 어셈블러 (44), 정점 셰이더 (46), 헐 셰이더 (48), 도메인 셰이더 (52), 지오메트리 셰이더 (54), 픽셀 셰이더 (58) 및 출력 병합기 (60) 는 리소스들 블록 (42) 에 통신가능하게 커플링된다. 입력 어셈블러 (44), 정점 셰이더 (46), 헐 셰이더 (48), 도메인 셰이더 (52), 지오메트리 셰이더 (54), 픽셀 셰이더 (58) 및 출력 병합기 (60) 는 리소스들 블록 (42) 으로부터 입력 데이터를 취출하거나 및/또는 수신하도록 구성된다. 지오메트리 셰이더 (54) 및 출력 병합기 (60) 는 출력 데이터를 리소스들 블록 (42) 에 기록하도록 구성된다. 위에서 설명한, 그래픽스 파이프라인 (40) 과 리소스들 블록 (42) 에서의 프로세싱 스테이지들 사이의 통신의 구성은 단지, 통신이 그래픽스 파이프라인 (40) 과 리소스들 블록 (42) 의 프로세싱 스테이지들 사이에 구성될 수 있는 방법의 일 예이다. 다른 예들에서, 대략 단방향 및/또는 양방향 통신 채널들은 그래픽스 파이프라인 (40) 과 리소스들 블록 (42) 의 프로세싱 스테이지들 사이에 제공될 수도 있다.
DirectX 11 그래픽스 파이프라인의 일반적인 동작에 관한 추가적인 정보는 CRC Press (2011), Zink 등, "Practical Rendering & Computation with Direct3D 11" 에서 발견될 수도 있으며, 이의 전체 내용이 본원에 참고로 포함된다.
위에서 설명한 바와 같이, 2개의 메인 패스 렌더링 동작들은 다음과 같다: (1) 패스 세그먼트를 채우는 동작; 및 (2) 패스 세그먼트를 스트로킹하는 동작. 스트로킹 동작들을 그래픽스 렌더링 파이프라인 (40) (예컨대, DirectX 11 그래픽스 파이프라인) 으로 수행하는 솔루션들이 이하 설명될 것이다.
본 개시물의 기법들에 따르면, CPU (6) 는 하나 이상의 프리미티브들을 나타내는 정점들을 정점 버퍼에 배치할 수도 있다. CPU (6) 는 또한 하나 이상의 프리미티브 유형 값들을 primtype 버퍼에 배치할 수도 있다. 일부 예들에서, 정점 버퍼는 도 2 에 도시된 패스 데이터 (36) 의 정점 버퍼들 중 하나에 대응할 수도 있다. 정점 버퍼에서의 정점들에 대한 프리미티브 토폴로지는 일부 예들에서, 패치 제어 리스트일 수도 있다. 라인에 대해, 패치 제어 리스트에서의 정점들은 라인의 종점들에 대한 좌표들 (예컨대, (x0, y0) 및 (x1, y1)) 을 나타내는 데이터를 포함할 수도 있다. 3차 베지어 곡선에 있어, 패치 제어 리스트에서의 정점들은 곡선을 정의하는 4개의 제어 지점들의 좌표들 (예컨대, (x0, y0), (x1, y1), (x2, y2), (x3, y3)) 을 나타내는 데이터를 포함할 수도 있다. 2차 베지어 곡선에 대해, 패치 제어 리스트에서의 정점들은 4개의 제어 지점들 대신, 곡선을 정의하는 3개의 제어 지점들에 대한 좌표들을 나타내는 데이터를 포함할 수도 있다. 타원 아크들에 있어, 패치 제어 리스트에서의 정점들은 타원 아크의 종점 파라미터화를 나타내는 데이터 또는 타원 아크의 중심 파라미터화를 나타내는 데이터를 포함할 수도 있다. primtype 버퍼는 정점 버퍼에서의 정점들이 상이한 유형들의 프리미티브들과 연관될 때 정점 버퍼에서의 정점들과 연관된 프리미티브 유형들에 대응하는 값들을 포함할 수도 있다. 일부 예들에서, CPU (6) 는 렌더링될 패스의 유형을 나타내는 데이터를 패치 제어 리스트의 그외의 미사용된 정점 속성에 배치할 수도 있다.
패스 스트로킹 동작을 수행하기 위해, 입력 어셈블러 (44) 는 메모리 (10) 로부터 패스 데이터 (36) 를 획득하고, 정점 버퍼들 (41) 및 primtype 버퍼들 (42) 에 의해 규정된 패스 세그먼트들 (예컨대, 패스 프리미티브들) 을 렌더링하기 위해 그 패스 데이터를 그래픽스 파이프라인 (40) 의 하나 이상의 후속 스테이지들 상으로 전달한다. 예를 들어, 입력 어셈블러 (44) 는 메모리 (10) 에 저장된 정점 버퍼들 (42) 로부터 복수의 정점들을 획득할 수도 있다. primtype 버퍼들 (42) 의 프리미티브 데이터의 엔트리들에 기초하여, 입력 어셈블러 (44) 는 정점 버퍼에 저장된 정점들을 개개의 프리미티브들로 파싱할 수도 있다. 입력 어셈블러 (44) 는 프리미티브 식별자 ("primID") 에 각각의 개개의 프리미티브를 할당할 수도 있으며, 후속 재사용을 위해 각각의 프리미티브를 그의 연관된 primID 와 함께 레벨 2 ("L2") 캐시와 같은 캐시에 저장할 수도 있다. L2 캐시는 리소스들 블록 (64) 의 부분일 수도 있다. 일부 예들에서, 입력 어셈블러 (44) 는 primID 값들을 단조 증가하는 또는 감소하는 순서로 할당할 수도 있다.
각각의 프리미티브를 저장하는 것에 더해서, 입력 어셈블러 (44) 는 또한 프리미티브 유형 상태 변수들을 발생시킬 수도 있다. "sv_curr_primtype", "sv_prev_primtype", 및 "sv_next_primtype" 로시 표시되는, 변수들은 현재 렌더링되고 있는 프로세스 중에 있는 프리미티브에 대한, 현재, 이전, 및 다음 프리미티브 유형들을 표시한다. 입력 어셈블러 (44) 는 프리미티브 유형 상태 변수들을 도메인 셰이더 스테이지 (52), 지오메트리 셰이더 스테이지, 및 헐 셰이더 (48) 를 포함한, 그래픽스 파이프라인에서의 후속 스테이지들로 전달한다.
일단 입력 어셈블러 (44) 가 정점들을 발생하였으면, 정점 셰이더 (46) 는 발생된 정점들을 프로세싱한다. 일부 예들에서, 입력 어셈블러 (44) 는 프로세싱될 정점들을 정점 셰이더 (46) 로 직접 전달할 수도 있다. 추가적인 예들에서, 입력 어셈블러 (44) 는 정점 셰이더 (46) 에게, 예컨대 정점들과 연관된 primID 에 기초하여, 리소스들 블록 (64) 에서의 정점 버퍼들 (41) 중 하나로부터, 프로세싱을 위한 특정의 정점들을 취출하도록 명령할 수도 있다.
정점 셰이더 (46) 는 입력 어셈블러 (44) 및/또는 리소스들 블록 (42) 으로부터 수신된 정점들을 프로세싱하고, 정점 셰이더 (46) 에 의해 프로세싱된 각각의 입력 정점에 대해 출력 정점을 생성하도록 구성된다. 예를 들어, 각각의 입력 정점에 대해, 정점 셰이더 (46) 는 GPU (12) 의 셰이더 유닛 상에서 정점 셰이더 프로그램의 인스턴스를 실행할 수도 있다 정점 셰이더 (46) 에 의해 수신되는 입력 정점들 및 정점 셰이더 (46) 에 의해 생성되는 출력 정점들은 대안적으로 입력 제어 지점들 및 출력 제어 지점들로서 각각 지칭될 수도 있다.
추가적인 예들에서, 정점 셰이더 (46) 는 대응하는 입력 정점의 입력 속성들과 동일하지 않은 출력 정점에 대해 하나 이상의 출력 속성들을 생성할 수도 있다. 예를 들어, 정점 셰이더 (46) 는 입력 정점들의 속성들 중 하나 이상에 대해 실질적인 프로세싱을 수행하여, 출력 정점들에 대해 하나 이상의 속성들을 생성할 수도 있다. 또 다른 예로서, 정점 셰이더 (46) 는 입력 속성들의 세트로부터 속성들을 추가하거나 및/또는 삭제하여, 출력 정점에 대해 출력 속성들의 세트를 생성할 수도 있다.
테셀레이션 스테이지들 (62) (즉, 헐 셰이더 (48), 테셀레이터 (50), 및 도메인 셰이더 (52)) 은 입력 패스 데이터에 의해 정의되는 패스 세그먼트를 복수의 선분들로 테셀레이트할 수도 있다. 일부 예들에서, 테셀레이션 스테이지들 (62) 은 프리미티브를 형성하는 복수의 정점들을, 예컨대, 정점 셰이더 (46) 로부터 수신할 수도 있다. 일부 예들에서, 4개의 정점들은 프리미티브를 포함할 수도 있다. 테셀레이션 스테이지들 (62) 은 수신된 프리미티브에 기초하여 하나 이상의 도메인 좌표들을 결정할 수도 있다. 결정된 도메인 좌표들은 렌더링될 패스의 곡률을 근사화할 수도 있다.
일반적으로, 헐 셰이더 (48) 는 추가적인 프로세싱을 위해 정점 셰이더 (46) 로부터 수신된 제어 지점들을 도메인 셰이더 (52) 로 전달하고, 도메인 유형과 같은 구성 데이터를 테셀레이터 (50) 에 제공할 수도 있다. 헐 셰이더 (48) 는 또한 입력 어셈블러 (44) 에 의해 발생된 프리미티브 상태 변수들 (즉, sv_curr_primtype, sv_prev_primtype, 및 sv_next_primtype) 에 기초하여 제어 지점들을 결정할 수도 있다. 헐 셰이더 (48) 는 또한 프리미티브 상태 변수들에 기초하여 하나 이상의 테셀레이션 인자들을 발생시키고, 그 발생된 테셀레이션 인자들을 테셀레이터 (50) 로 전달할 수도 있다.
테셀레이터 (50) 는 패스 세그먼트 또는 프리미티브의 특정의 유형을 나타내는 하나 이상의 파라미터의 수식들이 평가되어야 하는 도메인 좌표들을 결정할 수도 있다. 예의 목적들을 위해, 테셀레이터 (50) 는 하나의 고정 함수 (fixed function) 유닛으로서 예시된다. 그래픽스 파이프라인 (40) 의 후속 스테이지들은 또한 테셀레이터 (50) 에 의해 결정된 도메인 좌표들을 이용할 수도 있다.
도메인 셰이더 (52) 는 테셀레이터 (50) 에 의해 결정된 도메인 좌표들 값들에서 파라미터의 수식들을 평가하고, 각각의 평가를 위해 정점을 출력할 수도 있다. 일부 예들에서, 도메인 셰이더 (52) 에 의해 출력된 정점들의 각각은 정점의 위치를 나타내는 하나 이상의 속성들을 포함할 수도 있다. 추가적인 예들에서, 도메인 셰이더 (52) 에 의해 출력된 정점들의 각각은 정점과 연관되는 패스 렌더링 프리미티브의 유형을 나타내는 하나 이상의 속성들을 포함할 수도 있다.
좀더 자세하게 설명하면, 헐 셰이더 (48) 는 정점 셰이더 (46) 및/또는 리소스들 블록 (42) 으로부터 수신되는 제어 지점들을 프로세싱할 수도 있으며, 헐 셰이더 (48) 에 의해 실행되는 헐 셰이더 프로그램의 각각의 인스턴스에 대해 출력 제어를 생성할 수도 있다. 예를 들어, 헐 셰이더 (48) 에 의해 생성되는 각각의 출력 제어 지점에 대해, 헐 셰이더 (46) 는 GPU (12) 의 셰이더 유닛 상에서 헐 셰이더 프로그램의 인스턴스를 실행할 수도 있다.
추가적인 예들에서, 헐 셰이더 (48) 는 입력 제어 지점들의 각각의 하나의 입력 속성들과 동일하지 않은 출력 제어 지점에 대해 하나 이상의 출력 속성들을 생성할 수도 있다. 예를 들어, 헐 셰이더 (48) 는 입력 제어 지점들의 속성들 중 하나 이상에 대해 실질적인 프로세싱을 수행하여, 출력 제어 지점들에 대해 하나 이상의 속성들을 생성할 수도 있다. 또 다른 예로서, 헐 셰이더 (48) 는 입력 속성들의 세트로부터 속성들을 추가하거나 및/또는 삭제하여, 출력 정점에 대해 출력 속성들의 세트를 생성할 수도 있다. 일부 예들에서, GPU (12) 가 종점 파라미터화의 유형인 타원형의 아크에 대해 패스 데이터를 수신하면, 헐 셰이더 (48) 는 아래에서 좀더 자세히 설명되는 바와 같이 타원형의 아크의 종점 파라미터화를 타원형의 아크의 중심 파라미터화로 변환할 수도 있다.
추가적인 예들에서, 헐 셰이더 (48) 는 특정의 렌더링 동작을 위해 렌더링되지 않는 프리미티브들을 드랍할 수도 있다. 프리미티브를 드랍하는 것은 프리미티브에 대응하는 데이터가 그래픽스 파이프라인의 추가적인 스테이지들 상으로 전달되지 않게 함으로써 이러한 프리미티브가 파이프라인의 나머지에 의해 효과적으로 렌더링되지 않게 하는 프로세스를 지칭할 수도 있다. 예를 들어, 그래픽스 파이프라인 (40) 이 채우기 동작을 수행하고 있을 때, 헐 셰이더 (48) 는 접합부 프리미티브들 및 캡 프리미티브들을 드랍할 수도 있다.
헐 셰이더 (48) 는 또한 각각의 패스 세그먼트에 대해 패치 상수 함수의 인스턴스를 실행할 수도 있다. 패치 상수 함수는 출력 값들을 생성할 때 테셀레이터 (50) 에 의해 사용되도록, 구성 파라미터들을 결정하여 테셀레이터 (50) 로 제공할 수도 있다. 본 개시물의 기법들에 따르면, 패치 상수 함수는 헐 셰이더 (48) 가 입력 어셈블러 (44) 로부터 수신할 수도 있는 프리미티브 상태 변수들에 부분적으로 의존할 수도 있다. 예를 들어, 패치 상수 함수는 헐 셰이더 (48) 로 하여금 테셀레이션 인자들을 테셀레이터 (50) 에 제공하도록 할 수도 있다. 테셀레이션 인자들은 테셀레이터 (50) 가 특정의 테셀레이션 도메인에 적용할 테셀레이션의 정도 (예컨대, 얼마나 도메인이 미세하게 세분되어야 하는지 및/또는 도메인이 세분되어야 하는 더 작은 오브젝트들의 개수) 를 규정할 수도 있다. 본 개시물의 기법들에 따르면, 헐 셰이더 (48) 는 테셀레이터 (50) 에 제공되는 테셀레이션 인자들을 결정할 때 프리미티브 상태 변수들을 고려할 수도 있다.
다른 예로서, 패치 상수 함수는 헐 셰이더 (48) 로 하여금 테셀레이션 도메인을 테셀레이터 (50) 에 제공하도록 할 수도 있다. 테셀레이션 도메인은 테셀레이터 (50) 에 의한 사용을 위해 테셀레이터 (50) 에 의해 복수의 좌표들을 생성하는데 사용되는 오브젝트를 지칭할 수도 있다. 개념적으로, 테셀레이션 도메인은 테셀레이터 (50) 에 의해 복수의 더 작은 오브젝트들로 세분되는 오브젝트에 대응할 수도 있다. 더 작은 오브젝트들의 정점들의 위치 좌표들은 그후 추가적인 프로세싱을 위해 도메인 셰이더 (52) 로 전송된다. 일부 예들에서, 테셀레이션 도메인은 쿼드 (quad), 트리 (tri), 및 아이소라인 (isoline) 중 하나로 선택될 수도 있다. 도메인이 세분되는 더 작은 오브젝트들은 일부 예들에서, 삼각형들, 선분들, 또는 점들에 대응할 수도 있다. 일부 예들에서, 헐 셰이더 (48) 는 아이소라인 테셀레이션 도메인을 규정하고 테셀레이터 (50) 가 아이소라인 도메인을 선분들로 세분해야 한다고 규정할 수도 있다.
일부 예들에서, 테셀레이터 (50) 는 2-패스 테셀레이션을 수행하도록 구성될 수도 있다. 2-패스 테셀레이션에서, 헐 셰이더 (48) 는 입력을 지오메트리 셰이더 (54) 로부터, 예를 들어, (GPU 캐시 (14) 또는 메모리 (10) 내) 스트림아웃 버퍼로부터 수신할 수도 있다. 일부 예들에서, 지오메트리 셰이더 (54) 로부터의 입력은 프리미티브 유형 데이터를 포함할 수도 있다. 이 입력에 기초하여, 헐 셰이더 (48) 는 제 2 테셀레이션 패스에서 사용될 테셀레이션 유닛 (50) 에 대한 테셀레이션 인자들을 발생시킨다. 이 제 2 패스는 제 1 패스에서 테셀레이터 (50) 에 의해 발생된 테셀레이션 인자들을 수신한다.
테셀레이터 (50) 는 테셀레이션 스테이지들 (62) 에 의해 프로세싱되는 각각의 패스 세그먼트에 대해 복수의 출력 값들을 생성할 수도 있다. 출력 값들은 패스 세그먼트의 특정의 유형을 나타내는 하나 이상의 파라미터의 수식들이 도메인 셰이더 (52) 에 의해 평가되어야 하는 값들을 결정할 수도 있다. 일부 예들에서, 테셀레이터 (50) 는 하나 이상의 테셀레이션 인자들 및/또는 헐 셰이더 (48) 에 의해 테셀레이터 (50) 에 제공되는 테셀레이션 도메인에 기초하여, 복수의 출력 값들을 생성할 수도 있다. 예를 들어, 테셀레이터 (50) 는 아이소라인을 복수의 선분들로 세분하고, 정규화된 좌표계 (normalized coordinate system) 에서 복수의 선분들의 각각의 종점에 대해 출력 값을 생성할 수도 있다. 본 개시물의 기법들에 따르면, 테셀레이터 (50) 는 또한 프리미티브 유형 데이터를 발생시키고, 프리미티브 유형 데이터를 지오메트리 셰이더 (54) 로 전달할 수도 있다.
도메인 셰이더 (52) 는 테셀레이터 (50) 로부터의 하나 이상의 그래픽 특징들 및 패스 세그먼트에 대한 제어 지점들을 나타내는 도메인 좌표들 및 정보, 테셀레이션 인자들 및 후속 프리미티브의 시작 법선을, 헐 셰이더 (48) 로부터, 수신할 수도 있다. 도메인 셰이더 (52) 는 또한 입력 어셈블러 (44) 로부터 프리미티브 상태 값들을 수신할 수도 있다. 이들 입력들에 기초하여, 도메인 셰이더 (52) 는 출력 정점 좌표들, 및 그 좌표들로 표현되는 정점에 대응하는 종점 법선들을 발생시킨다.
예를 들어, 테셀레이터 (50) 로부터 수신된 각각의 출력 값에 대해, 도메인 셰이더 (52) 는 GPU (12) 의 셰이더 유닛 상에서 도메인 셰이더 프로그램의 인스턴스를 실행할 수도 있다. 도메인 셰이더 프로그램은 도메인 셰이더 (52) 로 하여금, 하나 이상의 파라미터 방정식들을 테셀레이터 (50) 로부터 수신된 특정의 값에 기초하여 결정되는 특정의 값에서 평가하고, 그 평가들 뿐만 아니라, 각각의 정점 좌표와 연관된 그래픽 특징에 기초하여, 출력 정점에 대한 좌표들을 발생시키도록 할 수도 있다. 출력 정점 좌표들을 생성하는데 사용되는 파라미터의 수식들의 계수들 중 하나 이상은 헐 셰이더 (48) 로부터 수신된 제어 지점들 중 하나 이상에 기초하여 정의될 수도 있다. 각각의 출력 정점은 복수의 테셀레이트된 선분들 중 하나의 종점에 대응할 수도 있다. 2개의 연속된 출력 정점들은 단일 테셀레이트된 선분의 종점들에 대응할 수도 있다. 추가적인 예들에서, 도메인 셰이더 프로그램은 도메인 셰이더 (52) 로 하여금, 각각의 출력 정점에 대한 법선 좌표들을 발생시키기 위해, 하나 이상의 추가적인 파라미터 방정식들을 테셀레이터 (50) 로부터 수신된 특정의 값에 기초하여 결정되는 특정의 값에서 평가하도록 할 수도 있다.
도메인 셰이더 (52) 는 정점들을 순서화된 시퀀스로 출력할 수도 있으며, 여기서, 인접한 정점들의 각각의 세트는 테셀레이트된 선분을 나타낸다. 선분들은 정점 버퍼 및 primtype 버퍼에서 정의된 패스 세그먼트를 일괄하여 근사화할 수도 있다. 예를 들어, 도메인 셰이더 (52) 는 다음 선분들을 정의하는 정점들 {0, 1, 2, 3, 4, 5} 의 다음 세트를 출력할 수도 있다: {0, 1}, {1, 2}, {2, 3}, {3, 4}, {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) 에 의해 출력되는 값들에서 하나 이상의 파라미터의 수식들을 평가할 수도 있다.
라인에 대해, T 는 일부 예들에서, 1 과 항상 동일할 수도 있다. 이러한 예들에서, 도메인 셰이더 (52) 는 라인 패스 세그먼트에 대응하는 정점들을 생성하기 위해 임의의 평가를 반드시 수행할 필요가 없을 수도 있다.
3차 베지어 곡선에 대해, 도메인 셰이더 (52) 는 다음 파라미터의 수식에 따라서 곡선을 평가하고 출력 정점들을 생성할 수도 있다:
여기서, t 는 테셀레이터 (50) 에 의해 제공되는 출력 값에 대응하고, 는 특정의 출력 값 (즉, t) 에 대해 생성되는 출력 정점에 대응하고, 그리고 C0, C1, C2, C3 는 3차 베지어 곡선에 대한 제어 지점들에 대응한다.
이의 대안으로, 3차 베지어 곡선에 대해, 도메인 셰이더 (52) 는 곡선을 평가하고, 다음 파라미터의 수식들에 따라서 출력 정점들을 생성할 수도 있다:
여기서, t 는 테셀레이터 (50) 에 의해 제공되는 출력 값에 대응하고, 는 특정의 출력 값 (즉, t) 에 대해 생성되는 출력 정점의 x-좌표이고, 는 특정의 출력 값 (즉, t) 에 대해 생성되는 출력 정점의 y-좌표이고, 그리고, (X0, Y0), (X1, Y1), (X2, Y2), (X3, Y3) 는 3차 베지어 곡선에 대한 제어 지점들에 대응한다.
2차 베지어 곡선에 대해, 도메인 셰이더 (52) 는 다음 파라미터의 수식에 따라서 곡선을 평가하고 출력 정점들을 생성할 수도 있다:
여기서, t 는 테셀레이터 (50) 에 의해 제공되는 출력 값에 대응하고, 는 특정의 출력 값 (즉, t) 에 대해 생성되는 출력 정점에 대응하고, 그리고 C0, C1, C2 는 2차 베지어 곡선에 대한 제어 지점들에 대응한다.
이의 대안으로, 2차 베지어 곡선에 대해, 도메인 셰이더 (52) 는 다음 파라미터의 수식들에 따라서 곡선을 평가하고 출력 정점들을 생성할 수도 있다:
여기서, t 는 테셀레이터 (50) 에 의해 제공되는 출력 값에 대응하고, 는 특정의 출력 값 (즉, t) 에 대해 생성되는 출력 정점의 x-좌표에 대응하고, 는 특정의 출력 값 (즉, t) 에 대해 생성되는 출력 정점의 y-좌표에 대응하고, 그리고 (X0, Y0), (X1, Y1), (X2, Y2) 는 2차 베지어 곡선에 대한 제어 지점들에 대응한다.
타원 아크 패스 세그먼트에 대해, 도메인 셰이더 (52) 는 다음 파라미터의 수식들에 따라서 곡선을 평가하고 출력 정점들을 생성할 수도 있다:
여기서, 파라미터화 각도 는 테셀레이터 출력 t 로부터 결정되며, x 는 특정의 파라미터화 각도 (즉, ) 에 대해 생성되는 출력 정점의 x-좌표에 대응하고, y 는 파라미터화 각도 (즉, ) 에 대해 생성되는 출력 정점의 y-좌표에 대응하고, rh 는 미회전된 타원의 수평 반경을 나타내며, rv 는 미회전된 타원의 수직 반경을 나타내고, rvCos, rvSin, rhCos 및 rhSin 는 rv*Cos(angle), rv*Sin(angle), rh*Cos(angle) 및 rh*Sin(angle) 를 각각 나타내며, 그리고 angle 은 (rh, rv) 에 의해 스케일링하기 전에 측정된, x 축에 대한 타원의 반-시계방향 각도를 나타낸다. 일부 예들에서, 헐 셰이더 (48) 는 cos(angle) 및 sin(angle) 를 결정하거나 (예컨대, 미리 계산하거나) 및/또는 rvCos, rvSin, rhCos 및 rhSin 값들을 결정하고 (예컨대, 미리 계산하고), 타원 아크들에 대해 위에서 인용된 파라미터의 수식들을 평가할 때에 사용하기 위해 이 값들을 도메인 셰이더 (52) 에 제공하도록 구성될 수도 있다.
타원 아크들에 대해 위에서 설명한 바와 같이, 패치 제어 리스트에서의 정점들은, 일부 예들에서, 타원 아크에 대한 종점 파라미터화를 나타내는 데이터를 포함할 수도 있다. 이러한 예들에서, 헐 셰이더 (48) (예컨대, GPU (12) 의 셰이더 유닛 상에서 실행하는 헐 셰이더 프로그램) 은 타원 아크의 종점 파라미터화를 나타내는 데이터를 타원 아크의 중심 파라미터화를 나타내는 데이터로 변환하는데 사용될 수도 있다.
타원 아크의 종점 파라미터화를 타원 아크의 중심 파라미터화로 변환할 때 타원의 올바른 중심을 찾는 예시적인 기법이 이하 설명된다. 예시적인 기법은 파라미터들 (x0, y0), (x1, y1), rh, rv, φ, fS, 및 fA 의 세트에 의해 정의되는 타원의 종점 표현에 기초하여, 타원 및/또는 타원 아크의 중심 지점 (cx, cy) 및 초기 및 최종 각도들 θ1 및 θ2 을 결정할 수도 있다. 중심 지점 (cx, cy), 반경들 rh 및 rv, 및 회전 각도 rot 를 가진 타원은 음함수 방정식 (x´)2 + (y´)2 = 1 을 만족할 수도 있으며, 여기서, x´ = ((x-cx)*cos(rot) + (y-cy)*sin(rot))/rh 및 y´ = (-(x-cx)*sin(rot) + (y-cy)*cos(rot))/rv 이다. (x, y) 로부터 (x´, y´) 로의 변환은 원하는 타원을 원점을 중심으로 하는 단위 원으로 맵핑한다.
2개의 주어진 지점들 (x0, y0) 및 (x1, y1) 을 통과하는 공통 반경들 및 회전 각도를 가진 타원들의 쌍의 중심 지점들을 결정하기 위해, 평면은 각각의 타원의 수식이 (x´ -cx´)2 + (y´ -cy´)2 = 1 이 되도록, 적당히 스케일링되어 회전된 좌표계로 먼저 변환된다. 그후, 원주들이 2개의 주어진 지점들을 통과하는 2개의 단위 원들의 중심들 (즉, (cx0´, cy0´) 및 (cx1´, cy1´)) 이 발견될 수도 있다. 마지막으로, 중심 지점들이 원래 좌표계에서 솔루션들을 얻기 위해 역변환을 통해서 배치된다.
지점들 (x0, y0) 및 (x1, y1) 을 통과하는 2개의 단위 원들의 중심 지점들은 (xm ± Δy*d, ym Δx*d) 로 주어지며, 여기서, xm = (x0 + x1)/2, ym = (y0 + y1)/2, Δx = (x0 - x1), Δy = (y0 - y1), 및 d = √(1/(Δx2 + Δy2) - 1/4) 이다. d 가 무한대 또는 허수이면, 일치하거나 또는 너무 떨어져 있는 입력 지점들로 각각 인해 어떤 솔루션도 존재하지 않는다. 각도들 θ1 및 θ2 은 원 상의 종점들의 기울기를 찾아서 아크탄젠트들을 계산함으로써 발견될 수도 있다.
다음 의사-코드는 위에서 설명한 기법에 따라서 타원 중심들을 계산하는 프로세스를 예시한다. findUnitCircles 함수는 원래 타원 파라미터들의 역변환 이후에 findEllipses 에 의해 호출된다.
/* 주어진다: 지점들 (x0, y0) 및 (x1, y1)
* 솔루션이 존재하면 참, 아니면 거짓 (FALSE) 을 반환한다
* 원 중심들이 (cx0, cy0) 및 (cx1, cy1) 에 기록된다
*/
static VGboolean findUnitCircles(double x0, double y0,
double x1, double y1,
double *cx0, double *cy0,
double *cx1, double *cy1)
{
/* 차이들 및 평균들을 계산한다 */
double dx = x0 - x1;
double dy = y0 - y1;
double xm = (x0 + x1)/2;
double ym = (y0 + y1)/2;
double dsq, disc, s, sdx, sdy;
/* 교차하는 단위 원들에 대해 푼다 */
dsq = dx*dx + dy*dy;
if (dsq == 0.0) return VG_FALSE; /* 지점들이 일치한다 */
disc = 1.0/dsq - 1.0/4.0;
if (disc < 0.0) return VG_FALSE; /* 지점들이 너무 멀리 떨어져 있다 */
s = sqrt(disc);
sdx = s*dx;
sdy = s*dy;
*cx0 = xm + sdy;
*cy0 = ym - sdx;
*cx1 = xm - sdy;
*cy1 = ym + sdx;
return VG_TRUE;
}
/* 주어진다: 타원 파라미터들 rh, rv, rot (각도) 로 주어지며,
* 종점들 (x0, y0) 및 (x1, y1)
* 솔루션이 존재하면 참 (TRUE), 아니면 거짓 (FALSE) 를 반환한다
* 타원 중심들이 (cx0, cy0) 및 (cx1, cy1) 에 기록된다
*/
VGboolean findEllipses(double rh, double rv, double rot,
double x0, double y0, double x1, double y1,
double *cx0, double *cy0, double *cx1, double *cy1)
{
double COS, SIN, x0p, y0p, x1p, y1p, pcx0, pcy0, pcx1, pcy1;
/* 회전 각도를 도로부터 라디안으로 변환한다 */
rot *= M_PI/180.0;
/* 회전 매트릭스 엔트리들을 사전-계산한다 */
COS = cos(rot); SIN = sin(rot);
/* (x0, y0) 및 (x1, y1) 를 단위 공간으로 변환한다 */
/* (역) 회전, 이후 (역) 스케일링을 이용 */
x0p = (x0*COS + y0*SIN)/rh;
y0p = (-x0*SIN + y0*COS)/rv;
x1p = (x1*COS + y1*SIN)/rh;
y1p = (-x1*SIN + y1*COS)/rv;
if (!findUnitCircles(x0p, y0p, x1p, y1p,
&pcx0, &pcy0, &pcx1, &pcy1)) {
return VG_FALSE;
}
/* 원래 좌표 공간으로 되변환한다 */
/* (순방향) 스케일링, 이후 (순방향) 회전을 이용 */
pcx0 *= rh; pcy0 *= rv;
pcx1 *= rh; pcy1 *= rv;
*cx0 = pcx0*COS - pcy0*SIN;
*cy0 = pcx0*SIN + pcy0*COS;
*cx1 = pcx1*COS - pcy1*SIN;
*cy1 = pcx1*SIN + pcy1*COS;
return VG_TRUE;
}
타원 아크의 종점 파라미터화를 타원 아크의 중심 파라미터화로 변환하는 것에 관한 추가적인 세부 사항들은 http://www.khronos.org/registry/vg/specs/openvg-1.1.pdf 에서 입수가능한, 2008년 12월 3일, 섹션 18.4, "OpenVG Specification, Version 1.1" 에서 발견될 수 있으며, 이의 전체 내용이 본원에 참고로 포함된다.
지오메트리 셰이더 (54) 는 도메인 셰이더 (52) 로부터 테셀레이트된 선분들을 수신하고 그 테셀레이트된 선분들에 기초하여 복수의 삼각형 프리미티브들을 생성할 수도 있다. 본 개시물의 기법들에 따르면, 지오메트리 셰이더 (54) 는 또한 테셀레이터 (50) 로부터 수신된 프리미티브 유형 데이터에 기초하여 삼각형 프리미티브들을 발생시킬 수도 있다. 예를 들어, 테셀레이트된 선분들의 각각에 대해, 지오메트리 셰이더 (54) 는 GPU (12) 의 셰이더 유닛 상에서 지오메트리 셰이더 프로그램의 인스턴스를 실행하고, 각각의 테셀레이트된 선분에 기초하여 테셀레이트된 선분에 대해 삼각형 프리미티브를 생성할 수도 있다. 일부 예들에서, 테셀레이트된 선분들의 각각에 대해, 지오메트리 셰이더 (54) 는 각각의 테셀레이트된 선분에 대응하는 도메인 셰이더 (52) 로부터 2개의 정점들을 수신하고, 삼각형 프리미티브에 대응하는 3개의 정점들의 세트를 생성할 수도 있다.
일부 예들에서, 삼각형 프리미티브의 정점들 중 2개는 2개의 수신된 정점들과 동일한 정점들일 수도 (예컨대, 동일한 위치 좌표들을 가질 수도) 있다. 이러한 예들에서, 지오메트리 셰이더 (54) 는 렌더링될 패스 세그먼트과 연관되는 모든 테셀레이트된 선분들에 공통인 공통 정점에 기초하여 제 3 정점을 생성할 수도 있다. 공통 정점은 또는 테셀레이트된 선분들의 종점들 중 하나에 대응하거나 또는 대응하지 않을 수도 있다. 일부 예들에서, 공통 정점은 렌더링될 패스 세그먼트에 대한 테셀레이트된 선분들에 대응하는 정점들의 세트에서 제 1 정점에 대응할 수도 있다.
지오메트리 셰이더 (54) 는 도메인 셰이더 (52) 에 의해 생성된 테셀레이트된 선분들의 각각에 대해 한번 호출될 수도 있다. 테셀레이트된 선분들의 각각에 대해, 지오메트리 셰이더 (54) 는 삼각형 프리미티브를, 공통 제어 지점을 삼각형의 제 1 정점으로서 이용하여 그리고 각각의 테셀레이트된 선분의 2개의 종점들을 삼각형의 제 2 및 제 3 정점들로서 이용하여 생성할 수도 있다. 예를 들어, 도메인 셰이더 (52) 가 다음 선분들을 정의하는 다음 정점들의 세트 {0, 1, 2, 3, 4, 5} 를 생성하는 예가 위에서 제공되었다: {0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 5}. 상기 리스트된 선분들의 시퀀스에 대해, 지오메트리 셰이더 (54) 는 다음 삼각형들을 생성할 수도 있다: {C, 0, 1}, {C, 1, 2}, {C, 2, 3}, {C, 3, 4}, {C, 4, 5}, {C, 4, 5}, 여기서, C 는 삼각형들의 모두에 공통인 임의의 단일 정점이다.
일부 예들에서, 지오메트리 셰이더 (54) 는 또한 출력 데이터를 리소스들 블록 (42) 으로 되 "스트림 아웃하도록" 구성될 수도 있다. 그래픽스 파이프라인 (40) 은 일부 예들에서, 제 2 테셀레이션 패스를 수행하기 위해서, 그 스트림아웃된 데이터를 헐 셰이더 (48), 및 도메인 셰이더 (52) 로 되송신할 수도 있다.
래스터라이저 (56) 는 복수의 3D 그래픽들 프리미티브들 (예컨대, 지점들, 라인들, 및 삼각형들) 을 3D 그래픽들 프리미티브들에 대응하는 복수의 픽셀들로 변환하도록 구성될 수도 있다. 예를 들어, 래스터라이저 (56) 는 삼각형 프리미티브에 대응하는 3개의 정점들을 수신하고, 3개의 정점들을 삼각형 프리미티브에 의해 커버되는 스크린 픽셀 로케이션들에 대응하는 복수의 픽셀들로 변환할 수도 있다. 삼각형 프리미티브에 의해 커버되는 스크린 픽셀 로케이션들은 삼각형의 정점들, 삼각형의 에지들, 및 삼각형의 내부에 대응하는 스크린 픽셀 로케이션들을 포함할 수도 있다.
픽셀 셰이더 (58) 는 래스터라이저 (56) 로부터 픽셀들을 수신하고, 픽셀 셰이더 프로그램에 따라 그 수신된 픽셀들에 기초하여 음영처리된 픽셀들을 생성할 수도 있다. 예를 들어, 래스터라이저 (56) 로부터 수신된 각각의 픽셀에 대해, 픽셀 셰이더 (58) 는 GPU (12) 의 셰이더 유닛 상에서 픽셀 셰이더 프로그램의 인스턴스를 실행할 수도 있다.
추가적인 예들에서, 픽셀 셰이더 (58) 는 입력 픽셀들의 각각의 하나의 입력 속성들과 동일하지 않은 출력 픽셀에 대해 하나 이상의 출력 속성들을 생성할 수도 있다. 예를 들어, 픽셀 셰이더 (58) 는 출력 픽셀에 대해 하나 이상의 속성들을 생성하기 위해 입력 픽셀의 속성들 중 하나 이상에 대해 실질적인 프로세싱을 수행할 수도 있다. 또 다른 예로서, 픽셀 셰이더 (58) 는 출력 픽셀에 대해 출력 속성들의 세트를 생성하기 위해 입력 속성들의 세트로부터 속성들을 추가하거나 및/또는 삭제할 수도 있다.
출력 병합기 (60) 는 픽셀 셰이더 (58) 로부터 수신된 픽셀 데이터를 렌더 목표 (예컨대, 프레임 버퍼 또는 스텐실 버퍼) 에 배치할 수도 있다. 일부 예들에서, 출력 병합기 (60) 는 래스터 연산에 기초하여, 픽셀 셰이더 (58) 로부터 수신된 픽셀 데이터를 렌더 목표에 이미 저장된 픽셀 데이터와 병합할 수도 있다.
도메인 셰이더 (52) 가 파라미터 방정식들을 평가하여 정점들에 대한 위치 좌표들을 발생시키는 것에 더해서, 도메인 셰이더 (52) 는 또한 스트로킹 동작 동안 정점들에 대한 법선들, 예컨대, 접선들을 발생시킬 수도 있다. 법선들을 생성하기 위해, 도메인 셰이더 (52) 는 테셀레이터 (50) 에 의해 생성된 값들의 각각에 대해 추가적인 파라미터의 수식들을 평가하고, 각각의 평가에 대해 하나 이상의 법선들을 출력할 수도 있다. 일부의 경우, 법선들은 도메인 셰이더 (52) 에 의해 출력되는 정점의 속성들로서 출력될 수도 있다. 예를 들어, 스트로킹 동작에 있어, 도메인 셰이더 (52) 에 의해 생성되는 출력 정점은 정점의 위치를 나타내는 하나 이상의 속성들, 정점과 연관되는 법선 또는 접선을 나타내는 하나 이상의 속성들을 포함할 수도 있다.
곡선 패스 세그먼트들 (예컨대, 베지어 곡선들 및 타원 아크들) 에 대한 법선들을 생성하기 위해, 곡선 패스 세그먼트들에 대한 접선 공식들이 사용될 수도 있다. 일반적으로, (법선들을 결정하는데 사용될 수도 있는) 곡선들 및 타원 아크들에 대한 접선 공식들은 곡선들 및 아크들에 대한 정점들을 생성하는 것에 대해 위에서 설명된 파라미터의 공식들의 도함수들 (derivatives) 이다.
예를 들어, 3차 베지어 곡선에 대해, 도메인 셰이더 (52) 는 다음 파라미터의 수식에 따라서 곡선의 출력 정점들에 대한 법선들을 생성할 수도 있다:
여기서, t 는 테셀레이터 (50) 에 의해 제공되는 출력 값에 대응하고, 는 특정의 출력 값 (즉, t) 에 대해 생성되는 출력 법선에 대응하고, 그리고 C0, C1, C2, C3 는 3차 베지어 곡선에 대한 제어 지점들에 대응한다. 위에서 제공된 2차 베지어 곡선에 대한 파라미터의 수식의 유도는 2차 베지어 곡선에 대한 법선들을 유사한 방식으로 생성하는데 사용될 수도 있다.
대안적으로, 3차 베지어 곡선에 대해, 도메인 셰이더 (52) 는 다음 파라미터의 수식들에 따라서 곡선의 출력 정점들에 대한 법선들을 생성할 수도 있다:
여기서, t 는 테셀레이터 (50) 에 의해 제공되는 출력 값에 대응하고, 는 특정의 출력 값 (즉, t) 에 대해 생성되는 출력 법선의 x-좌표이고, 는 특정의 출력 값 (즉, t) 에 대해 생성되는 출력 법선의 y-좌표이고, 그리고, (X0, Y0), (X1, Y1), (X2, Y2), (X3, Y3) 는 3차 베지어 곡선에 대한 제어 지점들에 대응한다. 위에서 제공된 2차 베지어 곡선에 대한 파라미터의 수식들의 유도는 2차 베지어 곡선에 대한 법선들을 유사한 방식으로 생성하는데 사용될 수도 있다.
타원 아크 패스 세그먼트에 대해, 도메인 셰이더 (52) 는 다음 파라미터의 수식들에 따라서 곡선의 출력 정점들에 대한 법선들을 생성할 수도 있다:
여기서, 파라미터화 각도 는 테셀레이터 출력 (즉, t) 로부터 결정되며, 는 특정의 파라미터화 각도 (즉, ) 에 대해 생성되는 출력 법선의 x-좌표에 대응하고, 는 파라미터화 각도 (즉, ) 에 대해 생성되는 출력 법선의 y-좌표에 대응하고, rh 는 미회전된 타원의 수평 반경을 나타내며, rv 는 미회전된 타원의 수직 반경을 나타내고, rvCos, rvSin, rhCos 및 rhSin 는 rv*Cos(angle), rv*Sin(angle), rh*Cos(angle) 및 rh*Sin(angle) 를 각각 나타내며, 그리고 angle 은 (rh, rv) 에 의해 스케일링하기 전에 측정된, x 축에 대한 타원의 반-시계방향 각도를 나타낸다. 일부 예들에서, 헐 셰이더 (48) 는 cos(angle) 및 sin(angle) 를 결정하거나 (예컨대, 미리 계산하거나) 및/또는 rvCos, rvSin, rhCos 및 rhSin 값들을 결정하고 (예컨대, 미리 계산하고), 타원들에 대해 위에서 인용된 파라미터의 수식들을 평가할 때에 사용하기 위해 이 값들을 도메인 셰이더 (52) 에 제공하도록 구성될 수도 있다.
접선을 찾은 후, 법선 벡터는 다음 방정식에 따라서 찾아질 수도 있다:
법선 = normalize(-Tany,Tanx) (14)
여기서, 법선 (normal) 은 벡터에 대한 정규 벡터에 대응하며, normalize(x,y) 는 입력 벡터 (x,y) 의 정규화된 버전을 발생시키는 함수이다. 벡터 (x,y) 의 정규화된 버전은 벡터 (x,y) 와 동일한 동일한 방향 및 하나의 길이 (예컨대, 놈 (norm)) 를 가지는 벡터를 지칭할 수도 있다.
타원 아크들에 대해 위에서 설명한 바와 같이, 패치 제어 리스트에서의 정점들은 일부 예들에서, 종점 파라미터화를 나타내는 데이터를 포함할 수도 있다. 이러한 예들에서, 헐 셰이더 (48) 는 타원 아크의 종점 파라미터화를 나타내는 데이터를 타원 아크의 중심 파라미터화를 나타내는 데이터로 변환할 수 있다.
따라서, 본 개시물의 기법들에 따르면, 그래픽스 파이프라인 (40) 의 하나 이상의 스테이지는 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 수신하도록 구성될 수도 있으며, GPU (12) 의 정점 버퍼의 복수의 정점들의 각각은 복수의 프리미티브 유형 엔트리들 중 하나 이상과 연관된다. 그래픽스 파이프라인 (40) 은 복수의 정점들 및 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 결정하고, 그리고 복수의 정점들, 및 프리미티브 유형 버퍼의 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 렌더링하도록 더 구성될 수도 있다.
도 4 는 본 개시물의 GPU-가속된 패스 렌더링 기법들에 따른, GPU 의 버퍼들을 예시하는 개념도이다. 도 4 의 예는 샘플 정점 버퍼 (100), primtype 버퍼 (102), 및 대응하는 출력 (104) 을 포함한다. 도 4 의 예에서, 정점 버퍼 (100) 는 v0-v7 로서 표시되는, 8개의 정점들을 포함한다. 정점들 v0-v7 의 각각은 패스-렌더링 프리미티브의 정점을 포함한다. 입력 어셈블러 (44) 그리고, 일부 경우들에서, GPU (12) 의 다른 스테이지들은, primtype 버퍼 (102) 의 값들에 기초하여 정점들 v0-v7 의 각각과 연관된 프리미티브 유형을 결정한다.
도 4 의 예에서, primtype 버퍼 (102) 는 개방된 리셋을 나타내는 OR 값 (106) 에서 시작한다. 개방된 리셋은 접속되는 패스-렌더링 프리미티브들의 세트인 새로운 서브패스의 시작을 나타낸다. 좀더 자세하게 설명하면, 서브패스의 각각의 패스-렌더링 프리미티브의 최종 정점은 서브패스에서 후속 정점의 제 1 정점과 접속된다. 다음 서브패스가 OR 또는 폐쇄된 리셋 (CR) 에서 시작하는지 여부에 따라서, GPU (12) 는 서브패스의 제 1 정점을 서브패스의 최종 정점과 접속할 수도 있다. 각각의 서브패스의 끝, 및 새로운 서브패스의 시작은 또한 후속 리셋 값으로 표시된다.
서브패스의 시작을 나타내는 개방된 또는 폐쇄된 리셋 값 이후, 그리고 서브패스의 끝을 나타내는 리셋 값 이전에, 패스-렌더링 프리미티브 유형들을 나타내는 하나 이상의 primtype 버퍼 값들이 존재한다. 각각의 프리미티브 유형 값은 서브패스를 구성하는 프리미티브들 중 하나를 포함하는 하나 이상의 정점들의 프리미티브 유형을 표시한다. GPU (12) 의 입력 어셈블러 (44) 는 서브패스의 각각의 프리미티브를 포함하는 정점들을 결정하고, 그 프리미티브에서 시작하는 리셋에 후속하는 프리미티브 유형 값들의 각각에 기초하여 프리미티브를 발생시키고, 그리고 각각의 발생된 프리미티브의 표현을 리소스들 블록 (64) 에 저장한다.
정점 버퍼 (100) 의 정점들과 연관된 서브패스들의 개수를 결정하기 위해, 입력 어셈블러 (44) 는 primtype 버퍼 (102) 의 primtype 값들을 스캐닝하여, 임의의 개방된 또는 폐쇄된 리셋 값들의 인덱스들을 결정할 수도 있다. 도 4 의 예에서, 입력 어셈블러 (44) 는 버퍼 (102) 가 2개의 서브패스들을 포함한다고 결정한다. 제 1 서브패스의 시작은 개방된 리셋 (106) 으로 표시되며, 제 1 서브패스의 끝은 폐쇄된 리셋 (CR) (112) 으로 표시된다. CR (112) 은 또한 제 2 서브패스의 시작을 표시한다. 도 4 의 예에서, 제 2, 최종 서브패스는 서브패스의 끝을 표시하는 리셋을 포함하지 않는다. 최종 서브패스가 리셋을 포함하지 않으면, 입력 어셈블러 (44) 는 최종 서브패스의 끝 리셋이 폐쇄된 리셋이라고 추론한다.
각각의 서브패스에 대해, 입력 어셈블러 (44) 는 먼저 시작 리셋을 읽는다. 제 1 서브패스의 경우에, 시작 리셋은 OR (106) 이다. 서브패스의 시작 리셋을 판독한 후, 입력 어셈블러 (44) 는 primtype 버퍼 (102) 의 각각의 프리미티브 유형 값을, 서브패스의 끝 리셋까지 그를 포함하여 판독한다. 이 예에서, 제 1 서브패스의 프리미티브 유형들은 LINE 프리미티브 유형 (108), 및 QUAD 프리미티브 유형 (110) 을 포함하며, 끝 리셋은 CR (112) 이다. 입력 어셈블러 (44) 가 primtype 버퍼 (102) 로부터 판독하는 이들 프리미티브 유형들에 기초하여, 입력 어셈블러 (44) 는 라인 프리미티브 및 2차 곡선 프리미티브가 제 1 서브패스의 프리미티브들을 포함한다고 결정한다.
입력 어셈블러는 그후 정점 버퍼 (100) 의 정점들을 각각의 프리미티브의 표현들로 그룹화한다. 정점 버퍼 (100) 의 정점들을 프리미티브들로 그룹화하기 위해, 입력 어셈블러 (44) 는 서브패스의 각각의 프리미티브 유형과 연관된 정점들의 개수를 결정하고, 각각의 패스-렌더링 프리미티브 유형과 연관된 정점들의 개수에 기초하여, 각각의 프리미티브과 연관된 정점 버퍼 (100) 의 정점들을 추가로 결정한다. 도 4 의 예에서, OR (106) 을 시작한 후 제 1 프리미티브 유형 값은 라인 패스-렌더링 프리미티브 유형에 대응하는 LINE 프리미티브 유형 값 (108) 이다. 입력 어셈블러 (44) 는 정의 상, 라인이 2개의 정점들로 이루어지기 때문에, 정점 버퍼 (100) 의 2개의 정점들이 라인과 연관된다고 결정한다. 라인 프리미티브 유형 (108) 에 기초하여, 입력 어셈블러 (44) 는 정점 버퍼 (100) 의 제 1 의 2개의 정점들 (106, 및 108) 은 각각이 라인 프리미티브와 연관된다고 결정한다.
일단 입력 어셈블러 (44) 가 각각의 프리미티브, 이 경우, 라인 프리미티브의 정점들을 결정하였으면, 입력 어셈블러 (44) 는 정점들 (이 예에서 정점들 v0 및 v1) 을 포함한, 프리미티브의 표현을 리소스들 블록 (64) 에 저장한다. 일부 예들에서, 입력 어셈블러 (44) 는 primID 를 발생시키고 그 프리미티브 ID 를 프리미티브의 표현과 연관시킬 수도 있다. 입력 어셈블러 (44) 또는 GPU (12) 의 다른 스테이지들은 리소스들 블록 (64) 으로부터의 프리미티브 데이터 (예컨대, 프리미티브와 연관된 정점들) 에 액세스하기 위한 인덱스로서 primID 를 이용할 수도 있다.
입력 어셈블러는 그후 각각의 서브패스의 각각의 프리미티브에 대한 정점들, 및 프리미티브 유형을 결정하는 프로세스를 속행한다. 도 4 의 예에서, 입력 어셈블러 (44) 는, 다음 프리미티브 유형이, 서브패스의 다음 프리미티브 유형이 정의 상, 3개의 지점들을 가지는 2차 곡선임을 나타내는 QUAD 프리미티브 유형이라고 판독한다. 리셋 값의 부재 시, 입력 어셈블러 (44) 는 최종 프리미티브의 정점 (이 경우 정점 v1) 이 서브패스의 현재의 프리미티브의 제 1 정점이라고 결정한다. 따라서, 입력 어셈블러 (44) 는 2차 곡선이 정점들 v1, v2, 및 v3 (정점들 (122)) 과 연관된다고 결정한다. 입력 어셈블러 (44) 는 2차 곡선 프리미티브에 대한 primID 를 발생시키고, 그 프리미티브를 리소스들 블록 (64) 에 저장한다.
입력 어셈블러는 그후 primtype 버퍼 (102) 의 다음 값, 즉, 제 1 서브패스의 끝 및 제 2 서브패스의 시작을 나타내는 CR (112) 을 판독한다. 서브패스의 제 1 정점과 최종 정점이 접속된다는 것을 서브패스의 종료 리셋의 값이 나타내면, 입력 어셈블러 (44) 는 서브패스의 제 1 및 최종 정점들을 접속하는 라인 프리미티브에 대응하는 추가적인 프리미티브 데이터를 발생시키키고 저장할 수도 있다. 제 1 서브패스의 예에서, 종료 리셋, 즉, CR (112) 은 서브패스의 제 1 서브패스 및 최종 정점의 제 1 정점이 접속되지 않는다는 것을 표시한다.
새로운 서브패스의 시작을 또한 나타내는, 끝 리셋을 판독한 후, 입력 어셈블러 (44) 는 그후 제 2 서브패스의 프리미티브들을 발생시키는 것으로 이동하며, 그 서브패스의 프리미티브들의 시작은 CR (112) 로 표시된다. 제 2 서브패스의 시작을 나타내는, CR (112) 을 판독한 후, 입력 어셈블러 (44) 는 제 2 서브패스의 제 1 프리미티브가 3개의 정점들을 가지는 2차 곡선임을 나타내는 QUAD 프리미티브 유형 값 (114) 을 판독한다. CR (112) 이 새로운 서브패스의 시작을 나타내기 때문에, 입력 어셈블러 (44) 는 제 2 서브패스의 제 1 정점이 이전 (제 1) 서브패스의 최종 정점, 이 경우, v4 이후의 정점이라고 결정한다. 제 2 서브패스의 제 1 프리미티브가 2차 곡선이라고 결정한 후, 입력 어셈블러 (44) 는 정점들 v4, v5, 및 v6 (정점들 (124)) 이 프리미티브의 부분이라고 결정하고, 2차 곡선 프리미티브의 표현 및 2차 프리미티브에 대한 primID 를 발생시키고, 그리고 primID 및 프리미티브 표현을 리소스들 블록 (64) 에 저장한다.
입력 어셈블러는 그후 primtype 버퍼 (102) 의 다음 값, 즉 LINE 프리미티브 유형 값 (116) 을 판독한다. 입력 어셈블러는 제 2 프리미티브의 제 2 프리미티브가 2개의 정점들을 가지는 라인 프리미티브라고 결정한다 입력 어셈블러 (44) 는 이전 프리미티브의 최종 정점, 즉, 정점 v6, 및 다음 정점, 즉, v7 (정점들 (126)) 을 판독한다. 입력 어셈블러 (44) 는 그후 프리미티브에 대한 primID 를 발생시키고, 정점들 v6 및 v7 뿐만 아니라, primID 를 포함한, 프리미티브 데이터의 표현을 리소스들 블록 (64) 에 저장한다.
primtype 버퍼 (102), 입력 어셈블러에, 프리미티브 유형 값들이 더 이상 존재하지 않고 그리고 primtype 버퍼 (102) 에 포함된 어떤 종료 리셋 값도 존재하지 않기 때문에, 입력 어셈블러는 제 2 서브패스의 종료 리셋이 폐쇄된 리셋이라고, 그리고 제 2 서브패스의 정점들 v7 및 v4, 제 1 및 최종 정점들이 접속된다고 추론한다. 입력 어셈블러 (44) 는 v4 및 v7 을 접속하는 라인 프리미티브에 대한 primID 를 발생시키고, 그후 라인 프리미티브의 표현, 및 라인 프리미티브와 연관된 primID 를 리소스들 블록 (64) 에 저장한다.
도 4 는 입력 어셈블러가 정점 버퍼 및 primtype 버퍼에 기초하여 프리미티브 데이터를 발생시킬 수 있는 방법의 단지 일 예를 예시한다. 단지 2개의 서브패스들만을 가지는 것으로 예시되지만, 임의 개수의 서브패스들이 가능할 수도 있다. 또한, 도 4 는 단지 2개의 패스-렌더링 프리미티브들을 가지는 서브패스들을 예시하지만, 임의 개수의 패스-렌더링 프리미티브들이 서브패스 내에 포함될 수도 있다. 설령 도 4 가 단지 단일 primtype 버퍼 및 단일 정점 버퍼를 예시하더라도, 입력 어셈블러 (44) 는 정점 버퍼들 및 primtype 버퍼들을 프로세스 멀티플렉싱하여, 위에서 설명한 바와 같이 프리미티브 데이터를 발생시킬 수도 있다. 게다가, primtype 버퍼 (102) 가 단지 OR, CR, LINE, 및 QUAD 값들을 가지는 것으로 예시되지만, ARC (타원 아크) 와 같은 다른 값들, 및 고차 곡선 프리미티브 유형 값들이 또한 primtype 버퍼 (102) 에 포함될 수도 있다.
도 5 는 본 개시물의 하나 이상의 예들에 따른, GPU 의 스테이지들을 통과하는 상태 정보의 패스를 예시하는 개념도이다. 도 5 는 그래픽스 파이프라인 (40) 을 통해서, 입력 어셈블러 (44) 에 의해 처음 발생된, 프리미티브 유형 상태 변수 데이터의 여러 조각들의 통로를 예시한다. 도 3 에 예시된 바와 같이, 그래픽스 파이프라인 (40) 은 입력 어셈블러 (44), 정점 셰이더 (46), 헐 셰이더 (48), 테셀레이터 (50), 도메인 셰이더 (52), 지오메트리 셰이더 (54), 및 리소스들 블록 (64) 을 포함한다. 위에서 설명된 바와 같이, 입력 어셈블러 (44) 는 각각의 패스-렌더링 프리미티브의 표현을 발생시키고, 각각의 프리미티브를 리소스들 블록 (64) 에, 연관된 primID 와 함께 저장한다.
렌더링될 각각의 프리미티브에 대해, 입력 어셈블러 (44) 는 프리미티브 상태 변수들 sv_curr_primtype, sv_prev_primtype, 및 sv_next_primtype 을 발생시킬 수도 있다. sv_curr_primtype 은 그래픽스 파이프라인 (40) 의 스테이지들 중 하나에 의해 현재 프로세싱되고 있는 현재의 프리미티브의 유형을 나타낸다. sv_prev_primtype 및 sv_next_primptype 의 값들은 이전에 프로세싱된 프리미티브, 및 프로세싱될 다음 프리미티브의 프리미티브 유형들을 각각 나타낸다. 입력 어셈블러 (44) 는 sv_prev_primtype, sv_curr_primtype, 및 sv_next_primtype 변수들의 값들을 primID 값과 유사한 방법으로 할당할 수도 있다.
본 개시물의 기법들에 따르면, 입력 어셈블러 (44) 는 sv_current_primtype 및 sv_next_primtype 변수들을 헐 셰이더 스테이지 (48) 에 제공한다. sv_current_primtype 및 sv_next_primtype 변수들, 리소스들 블록 (64) 으로부터 취출된 현재의 프리미티브에 대한 데이터, 및 정점 셰이더 (46) 로부터 수신된 입력 제어 지점들에 기초하여, 헐 셰이더 (48) 는 테셀레이션 인자들을 발생시켜, 테셀레이터 (50) 로 출력한다. 헐 셰이더 (48) 는 또한 출력 제어 지점들, 프로세싱될 다음 프리미티브의 시작 법선, 및 테셀레이션 인자들을 발생시켜, 도메인 셰이더 (52) 로 출력한다.
테셀레이터 (50) 는 위에서 설명한 바와 같이, 헐 셰이더 (48) 로부터 테셀레이션 인자들을 수신하고 u-v 좌표 도메인에서의 도메인 좌표들을 출력한다. 테셀레이터 (50) 는 스트림아웃이 디스에이블되면, u-v 좌표들을 도메인 셰이더 (52) 로 출력한다. 데이터를 그래픽스 파이프라인의 하나의 스테이지로부터 그래픽스 파이프라인의 이전 스테이지로 되 공급하는 애플리케이션에 의해 사용될 수도 있는 옵션인, 스트림아웃이 인에이블되면, 테셀레이터 (50) 는 추후 사용을 위해 도메인 좌표들을 리소스들 블록 (64) 으로 되출력할 수도 있다.
도메인 셰이더 (52) 는 테셀레이터 (50) 로부터 수신된 도메인 좌표들 및 테셀레이션 인자들에 기초하여, 정점들을 발생시킬 수도 있다. 게다가, 도메인 셰이더 (52) 는 헐 셰이더 (48) 로부터 수신된 제어 지점들의 가변 수에 기초하여, 발생하는 정점들을 수신하는 것을 지원할 수도 있다. 제어 지점들의 가변 수는 헐 셰이더 (48) 로부터 수신된 sv_curr_primtype 의 값에 의해 표시될 수도 있다.
도 6 은 실행될 때, GPU 로 하여금 본 개시물의 기법들 중 하나 이상을 실행가능하게 할 수 있는 그래픽스 API 의 코드를 예시하는 다이어그램이다. 도 6 은 DirectX 11 또는 OpenGL 와 같은, 그래픽스 API 의 예시적인 코드로서 코드들의 17 라인들 ("라인들 1-17" 로서 지칭됨) 을 예시한다. 도 6 의 코드가 실행될 때, 라인들 1-5 (140) GPU (12) 는 정점 셰이더 (라인 1), 헐 셰이더 (라인 2), 도메인 셰이더 (라인 3), 지오메트리 셰이더 (라인 4), 및 픽셀 셰이더 (라인 5) 에 대한 리소스들을 각각 초기화하거나 또는 할당할 수도 있다.
라인들 6-12 (122) 의 라인들 6 은, 실행될 때, GPU (12) 로 하여금, 다수의 패스-렌더링 프리미티브들을 포함하는 일정한 버퍼를 할당하도록 할 수도 있다. 라인들 7-12 은 렌더링될 벡터 그래픽스 패스-렌더링 프리미티브들을 접합하고 스트로크하기 위한 여러 접합부 및 스트로킹 파라미터들을 정의한다. 라인들 13-17 (124) 은 스트라이드 (stride) 사이즈 (라인 13), 및 오프셋 값 (라인 14) 을 정의하고, 스트라이드 및 오프셋에 기초하여 하나 이상의 프리미티브들을 포함하는 정점 버퍼를 할당하고 (라인 15), 이전에 할당된 primtype 버퍼를 가리키도록 primptype 버퍼를 설정하고 (16), 그리고 그리기 호출 (라인 17) 을 포함한다.
라인 15 상에서, 오프셋 인수는 입력 어셈블러 (44) 가 정점 버퍼 정점들을 판독하기 시작하는 시작 인덱스를 나타내며, 스트라이드 인수는 GPU 가 정점들에 정확하게 액세스할 수 있도록 정점 버퍼 정점들이 배열되는 방법을 정의하는 것을 나타낸다.
라인 16 상에서, IASetPrimTypeBuffer 호출은 이전에 할당된 primType 버퍼로의 포인터를 제 1 인수로서 취한다. 다음 인수는 primtype 버퍼의 값들의 포맷을 정의한다. 이 예에서, 포맷은 32-비트 무부호 정수 포맷으로 정의된다. 라인 17 상에서, DrawPrimType 호출은 라인들 15 및 16 의 정의된 정점 및 primtype 버퍼들을 이용하는 그리기 호출이다. DrawPrimType 버퍼는 렌더링될 프리미티브들의 개수 (이 예들에서, 6) 를 그의 단독 인수로서 취한다. 실행 시, DrawPrimType 호출은 GPU (12) 로 하여금, 정점 버퍼에 포함된 프리미티브들을 그리도록 한다.
도 7 은 본 개시물에 따른 GPU-가속 패스 렌더링을 수행하는 방법을 예시하는 흐름도이다. 도 7 에 나타낸 기법들은 예시적인 목적들을 위해 도 1 및 도 2 에 나타낸 GPU (12) 에 의해, 그리고 도 3 및 도 5 에 도시된 그래픽스 파이프라인 (40) 으로 수행되는 것으로 설명된다. 다른 예들에서, 도 7 에 예시된 기법들은 동일한 또는 상이한 구성요소들을 가지는 다른 시스템들에서 동일한 또는 상이한 구성으로 구현될 수도 있다.
도 7 은 본 개시물에 따른 GPU-가속 패스 렌더링을 수행하는 예시적인 기법을 예시하는 흐름도이다. 단지 예의 목적을 위해, 그래픽스 파이프라인 (40) 의 여러 스테이지들은 도 7 에 예시된 기법들을 수행할 수도 있다. 도 7 의 프로세스에서, GPU (12) 의 입력 어셈블러 (44) 는 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 수신한다 (160). 여러 예들에서, 프리미티브 유형 엔트리들은 벡터 그래픽스 프리미티브 유형 데이터를 포함할 수도 있다. 일부 예들에서, 프리미티브 유형 엔트리들은 복수의 개방된 리셋, 폐쇄된 리셋, 라인, 삼각형, 아크, 2차 곡선, 3차 곡선, 및 쿼드를 포함할 수도 있다.
GPU 의 정점 버퍼의 복수의 정점들의 각각은 복수의 프리미티브 유형 엔트리들 중 하나 이상과 연관될 수도 있다. 입력 어셈블러 (44) (또는, 헐 셰이더 (48), 도메인 셰이더 (52), 등과 같은, 그래픽스 파이프라인 (40) 의 다른 스테이지) 는 복수의 정점들 및 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 결정할 수도 있다 (162). GPU (12) 는 그후 프리미티브 유형 버퍼의 연관된 하나 이상의 프리미티브 유형 엔트리들 및 복수의 정점들에 기초하여 프리미티브들을 렌더링할 수도 있다 (164).
여러 예들에서, 도 7 의 방법에서, 입력 어셈블러 (44) 는 프리미티브 유형 버퍼에서의 엔트리들의 엔트리에 기초하여 정점 버퍼의 복수의 정점들의 각각에 대한 연관된 프리미티브 유형을 결정하도록 구성될 수도 있다. 입력 어셈블러 (44) 는 현재의 프리미티브 유형, 이전 프리미티브 유형, 및 다음 프리미티브 유형의 표시를 헐 셰이더 (48) 및 도메인 셰이더 (52) 로 출력하도록 더 구성될 수도 있다.
다른 예에서, 헐 셰이더 (48) 는 입력 어셈블러 (44) 로부터, 프리미티브 유형 데이터를 수신할 수도 있다. 헐 셰이더 (48) 는 추가로 GPU 의 테셀레이터 (50) 에 대한 하나 이상의 테셀레이션 인자들을 결정하고, 수신된 프리미티브 유형 데이터에 기초하여 테셀레이션 도메인 유형을 결정할 수도 있다.
테셀레이터 (50) 는 헐 셰이더 (48) 로부터 하나 이상의 테셀레이션 인자들을 수신할 수도 있다. 테셀레이터 (50) 는 헐 셰이더 (48) 로부터 헐 셰이더 (48) 로부터의 테셀레이션 도메인 유형을 추가로 수신하고, 하나 이상의 수신된 테셀레이션 인자들에 기초하여 테셀레이션 도메인을 테셀레이트할 수도 있다. 다른 예에서, 도메인 셰이더 (52) 는 테셀레이터 (50) 로부터, 복수의 도메인 좌표들을 수신할 수도 있다. 도메인 셰이더 (52) 는 또한 프리미티브 유형 데이터를 헐 셰이더 (48) 로부터 수신할 수도 있다.
본 개시물에서 설명하는 기법들은 하드웨어, 소프트웨어, 펌웨어 또는 이들의 임의의 조합으로, 적어도 부분적으로, 구현될 수도 있다. 예를 들어, 설명되는 기법들의 여러 양태들은, 하나 이상의 마이크로프로세서들, 디지털 신호 프로세서들 (DSP들), 주문형 집적회로들 (ASIC들), 필드 프로그래밍가능 게이트 어레이들 (FPGA들), 또는 임의의 다른 등가의 통합 또는 이산 로직 회로, 뿐만 아니라, 이러한 구성요소들의 임의의 조합들을 포함한, 하나 이상의 프로세서들 내에서 구현될 수도 있다. 용어 "프로세서" 또는 "프로세싱 회로" 는 일반적으로 단독으로 또는 다른 로직 회로와 조합한, 전술한 로직 회로 중 임의의 로직 회로, 또는 프로세싱을 수행하는 별개의 하드웨어와 같은 임의의 다른 등가 회로를 지칭할 수도 있다.
이러한 하드웨어, 소프트웨어, 및 펌웨어는 본 개시물에서 설명하는 여러 동작들 및 기능들을 지원하기 위해 동일한 디바이스 내에 또는 별개의 디바이스들 내에 구현될 수도 있다. 게다가, 설명되는 유닛들, 모듈들 또는 구성요소들 중 임의의 것은 별개의 상호운용가능한 로직 디바이스들과 함께 또는 별개로 구현될 수도 있다. 모듈들 또는 유닛들과는 상이한 특성들의 서술은 상이한 기능적 양태들을 강조하려고 의도된 것이며, 이러한 모듈들 또는 유닛들이 별개의 하드웨어 또는 소프트웨어 구성요소들로 실현되어야 한다는 것을 반드시 암시하지는 않는다. 대신, 하나 이상의 모듈들 또는 유닛들과 연관되는 기능은 별개의 하드웨어, 펌웨어, 및/또는 소프트웨어 구성요소들에 의해 수행되거나, 또는 공통의 또는 별개의 하드웨어 또는 소프트웨어 구성요소들 내에 통합될 수도 있다.
본 개시물에서 설명하는 기법들은 또한 명령들을 저장하는 컴퓨터-판독가능 저장 매체와 같은 컴퓨터-판독가능 매체에 저장되거나, 수록되거나 또는 인코딩될 수도 있다. 컴퓨터-판독가능 매체에 수록되거나 또는 인코딩되는 명령들은 하나 이상의 프로세서들로 하여금, 예컨대, 명령들이 하나 이상의 프로세서들에 의해 실행될 때, 본원에서 설명되는 기법들을 수행하도록 할 수도 있다. 컴퓨터 판독가능 저장 매체들은 랜덤 액세스 메모리 (RAM), 판독전용 메모리 (ROM), 프로그래밍가능 판독전용 메모리 (PROM), 소거가능한 프로그래밍가능 판독전용 메모리 (EPROM), 전자적으로 소거가능한 프로그래밍가능 판독전용 메모리 (EEPROM), 플래시 메모리, 하드 디스크, CD-ROM, 플로피 디스크, 카세트, 자기 매체들, 광학 매체들, 또는 유형인 다른 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다.
컴퓨터-판독가능 매체는 위에서 리스트된 것들과 같은, 유형의 저장매체에 대응하는 컴퓨터-판독가능 저장 매체들을 포함할 수도 있다. 컴퓨터-판독가능 매체는 또한 예컨대, 통신 프로토콜에 따라서 한 장소로부터 또 다른 장소로 컴퓨터 프로그램의 전송을 용이하게 하는 임의의 매체를 포함한, 통신 매체들을 포함할 수도 있다. 이러한 방법으로, 어구 "컴퓨터-판독가능 매체들" 은 일반적으로 (1) 비일시적 유형의 컴퓨터-판독가능 저장 매체, 및 (2) 일시적인 신호 또는 반송파와 같은 비-유형의 컴퓨터-판독가능 통신 매체에 대응할 수도 있다.
여러 양태들 및 예들이 설명되었다. 그러나, 다음 청구항들의 범위로부터 일탈함이 없이 본 개시물의 구조 또는 기법들에 대해 변경들이 이루어질 수 있다.
Claims (30)
- 그래픽 프로세싱 유닛 (GPU) 의해 수행되는 방법으로서,
상기 GPU 에 의해, 복수의 정점들을 포함하는 정점 버퍼 및 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 인수로서 포함하는 그리기 호출 커맨드를 수신하는 단계로서, 상기 정점 버퍼의 상기 복수의 정점들의 각각의 정점은 상기 복수의 프리미티브 유형 엔트리들 중 하나 이상의 프리미티브 유형 엔트리들과 연관되어, 상기 복수의 정점들 중 제 1 정점이 상기 복수의 프리미티브 유형 엔트리들 중 적어도 하나와 연관되게 하고 상기 복수의 정점들 중 제 2 정점이 상기 복수의 프리미티브 유형 엔트리들 중 적어도 하나와 연관되게 하며, 상기 제 1 정점과 연관된 상기 복수의 프리미티브 유형 엔트리들 중 상기 적어도 하나는 상기 제 2 정점과 연관된 상기 복수의 프리미티브 유형 엔트리들 중 상기 적어도 하나와 상이한, 상기 수신하는 단계;
상기 GPU 에 의해, 상기 복수의 정점들 및 연관된 상기 하나 이상의 프리미티브 유형 엔트리들에 기초하여 프리미티브들을 결정하는 단계; 및
상기 GPU 에 의해, 상기 복수의 정점들, 및 상기 프리미티브 유형 버퍼의 상기 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여 상기 프리미티브들을 렌더링하는 단계를 포함하는, 그래픽 프로세싱 유닛 (GPU) 의해 수행되는 방법. - 제 1 항에 있어서,
상기 프리미티브 유형 엔트리들은 벡터 그래픽스 프리미티브 데이터를 포함하는, 그래픽 프로세싱 유닛 (GPU) 의해 수행되는 방법. - 제 1 항에 있어서,
상기 GPU 의 입력 어셈블러에 의해, 상기 프리미티브 유형 버퍼에서의 상기 엔트리들의 엔트리에 기초하여, 상기 정점 버퍼의 상기 복수의 정점들의 각각의 정점에 대한 연관된 프리미티브 유형을 결정하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 의해 수행되는 방법. - 제 1 항에 있어서,
상기 GPU 의 헐 셰이더에 의해, 상기 GPU 의 입력 어셈블러로부터, 프리미티브 유형 데이터를 수신하는 단계;
상기 헐 셰이더에 의해, 상기 GPU 의 테셀레이션 유닛에 대한 하나 이상의 테셀레이션 인자들을 결정하는 단계; 및
상기 헐 셰이더에 의해, 수신된 상기 프리미티브 유형 데이터에 기초하여, 테셀레이션 도메인 유형을 결정하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 의해 수행되는 방법. - 제 4 항에 있어서,
상기 GPU 의 테셀레이션 유닛에 의해, 상기 GPU 의 헐 셰이더로부터, 상기 하나 이상의 테셀레이션 인자들을 수신하는 단계;
상기 테셀레이션 유닛에 의해, 상기 헐 셰이더로부터, 상기 헐 셰이더로부터의 상기 테셀레이션 도메인 유형을 수신하는 단계; 및
상기 테셀레이션 유닛에 의해, 수신된 상기 하나 이상의 테셀레이션 인자들에 기초하여, 상기 테셀레이션 도메인을 테셀레이트하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 의해 수행되는 방법. - 제 1 항에 있어서,
상기 GPU 의 도메인 셰이더에 의해, 상기 GPU 의 테셀레이션 유닛으로부터, 복수의 도메인 좌표들을 수신하는 단계; 및
상기 도메인 셰이더에 의해, 상기 GPU 의 헐 셰이더로부터, 프리미티브 유형 데이터를 수신하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 의해 수행되는 방법. - 제 1 항에 있어서,
상기 프리미티브 유형 엔트리들은 개방된 리셋, 폐쇄된 리셋, 라인, 삼각형, 아크, 2차 곡선, 3차 곡선, 및 쿼드 중 복수를 포함하는, 그래픽 프로세싱 유닛 (GPU) 의해 수행되는 방법. - 제 1 항에 있어서,
상기 GPU 의 입력 어셈블러에 의해, 현재의 프리미티브 유형, 이전 프리미티브 유형, 및 다음 프리미티브 유형의 표시를 상기 GPU 의 헐 셰이더 스테이지 및 상기 GPU 의 도메인 셰이더 스테이지 중 적어도 하나로 출력하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 의해 수행되는 방법. - 그래픽 프로세싱 유닛 (GPU) 으로서,
정점 버퍼 및 프리미티브 유형 버퍼를 저장하도록 구성되는 메모리; 및
적어도 하나의 프로세서를 포함하며,
상기 적어도 하나의 프로세서는,
복수의 정점들을 포함하는 상기 정점 버퍼 및 복수의 프리미티브 유형 엔트리들을 포함하는 상기 프리미티브 유형 버퍼를 인수로서 포함하는 그리기 호출 커맨드를 수신하는 것으로서, 상기 정점 버퍼의 상기 복수의 정점들의 각각의 정점은 상기 복수의 프리미티브 유형 엔트리들 중 하나 이상의 프리미티브 유형 엔트리들과 연관되어, 상기 복수의 정점들 중 제 1 정점이 상기 복수의 프리미티브 유형 엔트리들 중 적어도 하나와 연관되게 하고 상기 복수의 정점들 중 제 2 정점이 상기 복수의 프리미티브 유형 엔트리들 중 적어도 하나와 연관되게 하며, 상기 제 1 정점과 연관된 상기 복수의 프리미티브 유형 엔트리들 중 상기 적어도 하나는 상기 제 2 정점과 연관된 상기 복수의 프리미티브 유형 엔트리들 중 상기 적어도 하나와 상이한, 상기 수신하고;
상기 복수의 정점들 및 연관된 상기 하나 이상의 프리미티브 유형 엔트리들에 기초하여, 프리미티브들을 결정하고; 그리고
상기 복수의 정점들, 및 상기 프리미티브 유형 버퍼의 상기 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여, 상기 프리미티브들을 렌더링하도록 구성되는, 그래픽 프로세싱 유닛 (GPU). - 제 9 항에 있어서,
상기 프리미티브 유형 엔트리들은 벡터 그래픽스 프리미티브 데이터를 포함하는, 그래픽 프로세싱 유닛 (GPU). - 제 9 항에 있어서,
상기 GPU 는 입력 어셈블러를 더 포함하며,
상기 입력 어셈블러는,
상기 프리미티브 유형 버퍼에서의 상기 엔트리들의 엔트리에 기초하여, 상기 정점 버퍼의 상기 복수의 정점들의 각각의 정점에 대한 연관된 프리미티브 유형을 결정하도록 구성되는, 그래픽 프로세싱 유닛 (GPU). - 제 9 항에 있어서,
입력 어셈블러;
테셀레이션 유닛; 및
헐 셰이더를 더 포함하며,
상기 헐 셰이더는,
상기 GPU 의 상기 입력 어셈블러로부터, 프리미티브 유형 데이터를 수신하고;
상기 GPU 의 테셀레이션 유닛에 대한 하나 이상의 테셀레이션 인자들을 결정하고; 그리고
수신된 상기 프리미티브 유형 데이터에 기초하여, 테셀레이션 도메인 유형을 결정하도록 구성되는, 그래픽 프로세싱 유닛 (GPU). - 제 12 항에 있어서,
상기 테셀레이션 유닛은,
상기 헐 셰이더로부터 상기 하나 이상의 테셀레이션 인자들을 수신하고;
상기 헐 셰이더로부터 상기 헐 셰이더로부터의 상기 테셀레이션 도메인 유형을 수신하고; 그리고
수신된 상기 하나 이상의 테셀레이션 인자들에 기초하여, 상기 테셀레이션 도메인을 테셀레이트하도록 구성되는, 그래픽 프로세싱 유닛 (GPU). - 제 9 항에 있어서,
테셀레이션 유닛; 및
도메인 셰이더를 더 포함하며,
상기 도메인 셰이더는 또한,
상기 GPU 의 상기 테셀레이션 유닛으로부터, 복수의 도메인 좌표들을 수신하고; 그리고
헐 셰이더로부터, 프리미티브 유형 데이터를 수신하도록 구성되는, 그래픽 프로세싱 유닛 (GPU). - 제 9 항에 있어서,
상기 프리미티브 유형 엔트리들은 개방된 리셋, 폐쇄된 리셋, 라인, 삼각형, 아크, 2차 곡선, 3차 곡선, 및 쿼드 중 복수를 포함하는, 그래픽 프로세싱 유닛 (GPU). - 제 9 항에 있어서,
헐 셰이더 스테이지;
도메인 셰이더 스테이지; 및
입력 어셈블러 스테이지를 더 포함하며,
상기 입력 어셈블러는,
현재의 프리미티브 유형, 이전 프리미티브 유형, 및 다음 프리미티브 유형의 표시를 상기 GPU 의 상기 헐 셰이더 스테이지 및 도메인 셰이더 스테이지 중 적어도 하나로 출력하도록 구성되는, 그래픽 프로세싱 유닛 (GPU). - 복수의 정점들을 포함하는 정점 버퍼 및 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 인수로서 포함하는 그리기 호출 커맨드를 수신하는 수단으로서, 상기 정점 버퍼의 상기 복수의 정점들의 각각의 정점은 상기 복수의 프리미티브 유형 엔트리들 중 하나 이상의 프리미티브 유형 엔트리들과 연관되어, 상기 복수의 정점들 중 제 1 정점이 상기 복수의 프리미티브 유형 엔트리들 중 적어도 하나와 연관되게 하고 상기 복수의 정점들 중 제 2 정점이 상기 복수의 프리미티브 유형 엔트리들 중 적어도 하나와 연관되게 하며, 상기 제 1 정점과 연관된 상기 복수의 프리미티브 유형 엔트리들 중 상기 적어도 하나는 상기 제 2 정점과 연관된 상기 복수의 프리미티브 유형 엔트리들 중 상기 적어도 하나와 상이한, 상기 수신하는 수단;
상기 복수의 정점들 및 연관된 상기 하나 이상의 프리미티브 유형 엔트리들에 기초하여, 프리미티브들을 결정하는 수단; 및
상기 복수의 정점들, 및 상기 프리미티브 유형 버퍼의 상기 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여, 상기 프리미티브들을 렌더링하는 수단을 포함하는, 장치. - 제 17 항에 있어서,
상기 프리미티브 유형 엔트리들은 벡터 그래픽스 프리미티브 데이터를 포함하는, 장치. - 제 17 항에 있어서,
상기 프리미티브 유형 버퍼에서의 상기 엔트리들의 엔트리에 기초하여, 상기 정점 버퍼의 상기 복수의 정점들의 각각의 정점에 대한 연관된 프리미티브 유형을 결정하는 수단을 더 포함하는, 장치. - 제 17 항에 있어서,
프리미티브 유형 데이터를 수신하는 수단;
테셀레이션 유닛에 대한 하나 이상의 테셀레이션 인자들을 결정하는 수단; 및
수신된 상기 프리미티브 유형 데이터에 기초하여, 테셀레이션 도메인 유형을 결정하는 수단을 더 포함하는, 장치. - 제 20 항에 있어서,
상기 하나 이상의 테셀레이션 인자들을 수신하는 수단;
상기 테셀레이션 도메인 유형을 수신하는 수단; 및
수신된 상기 하나 이상의 테셀레이션 인자들에 기초하여, 상기 테셀레이션 도메인을 테셀레이트하는 수단을 더 포함하는, 장치. - 제 17 항에 있어서,
복수의 도메인 좌표들을 수신하는 수단; 및
프리미티브 유형 데이터를 수신하는 수단을 더 포함하는, 장치. - 제 17 항에 있어서,
상기 프리미티브 유형 엔트리들은 개방된 리셋, 폐쇄된 리셋, 라인, 삼각형, 아크, 2차 곡선, 3차 곡선, 및 쿼드 중 복수를 포함하는, 장치. - 제 17 항에 있어서,
현재의 프리미티브 유형, 이전 프리미티브 유형, 및 다음 프리미티브 유형의 표시를 출력하는 수단을 더 포함하는, 장치. - 명령들을 포함하는 비일시적 컴퓨터-판독가능 저장 매체로서,
상기 명령들은, 실행될 때, 적어도 하나의 프로세서로 하여금,
복수의 정점들을 포함하는 정점 버퍼 및 복수의 프리미티브 유형 엔트리들을 포함하는 프리미티브 유형 버퍼를 인수로서 포함하는 그리기 호출 커맨드를 수신하게 하도록 하는 것으로서, 상기 정점 버퍼의 상기 복수의 정점들의 각각의 정점은 상기 복수의 프리미티브 유형 엔트리들 중 하나 이상의 프리미티브 유형 엔트리들과 연관되어, 상기 복수의 정점들 중 제 1 정점이 상기 복수의 프리미티브 유형 엔트리들 중 적어도 하나와 연관되게 하고 상기 복수의 정점들 중 제 2 정점이 상기 복수의 프리미티브 유형 엔트리들 중 적어도 하나와 연관되게 하며, 상기 제 1 정점과 연관된 상기 복수의 프리미티브 유형 엔트리들 중 상기 적어도 하나는 상기 제 2 정점과 연관된 상기 복수의 프리미티브 유형 엔트리들 중 상기 적어도 하나와 상이한, 상기 수신하게 하고;
상기 복수의 정점들 및 연관된 상기 하나 이상의 프리미티브 유형 엔트리들에 기초하여, 프리미티브들을 결정하게 하고; 그리고
상기 복수의 정점들, 및 상기 프리미티브 유형 버퍼의 상기 연관된 하나 이상의 프리미티브 유형 엔트리들에 기초하여, 상기 프리미티브들을 렌더링하게 하는, 비일시적 컴퓨터-판독가능 저장 매체. - 제 25 항에 있어서,
상기 프리미티브 유형 엔트리들은 벡터 그래픽스 프리미티브 데이터를 포함하는, 비일시적 컴퓨터-판독가능 저장 매체. - 제 25 항에 있어서,
실행될 때, 상기 적어도 하나의 프로세서로 하여금,
상기 적어도 하나의 프로세서의 입력 어셈블러에 의해, 상기 프리미티브 유형 버퍼에서의 상기 엔트리들의 엔트리에 기초하여, 상기 정점 버퍼의 상기 복수의 정점들의 각각의 정점에 대한 연관된 프리미티브 유형을 결정하게 하는 명령들을 더 포함하는, 비일시적 컴퓨터-판독가능 저장 매체. - 제 25 항에 있어서,
실행될 때, 상기 적어도 하나의 프로세서로 하여금,
상기 적어도 하나의 프로세서의 헐 셰이더에 의해, 상기 적어도 하나의 프로세서의 입력 어셈블러로부터, 프리미티브 유형 데이터를 수신하게 하고;
상기 헐 셰이더에 의해, 상기 적어도 하나의 프로세서의 테셀레이션 유닛에 대한 하나 이상의 테셀레이션 인자들을 결정하게 하고; 그리고
상기 헐 셰이더에 의해, 수신된 상기 프리미티브 유형 데이터에 기초하여, 테셀레이션 도메인 유형을 결정하게 하는 명령들을 더 포함하는, 비일시적 컴퓨터-판독가능 저장 매체. - 제 25 항에 있어서,
실행될 때, 상기 적어도 하나의 프로세서로 하여금,
상기 적어도 하나의 프로세서의 도메인 셰이더에 의해, 상기 적어도 하나의 프로세서의 테셀레이션 유닛으로부터, 복수의 도메인 좌표들을 수신하게 하고; 그리고
상기 도메인 셰이더에 의해, 상기 적어도 하나의 프로세서의 헐 셰이더로부터, 프리미티브 유형 데이터를 수신하게 하는 명령들을 더 포함하는, 비일시적 컴퓨터-판독가능 저장 매체. - 제 25 항에 있어서,
실행될 때, 상기 적어도 하나의 프로세서로 하여금,
상기 적어도 하나의 프로세서의 입력 어셈블러에 의해, 현재의 프리미티브 유형, 이전 프리미티브 유형, 및 다음 프리미티브 유형의 표시를 상기 적어도 하나의 프로세서의 헐 셰이더 스테이지 및 상기 적어도 하나의 프로세서의 도메인 셰이더 스테이지 중 적어도 하나로 출력하게 하는 명령들을 더 포함하는, 비일시적 컴퓨터-판독가능 저장 매체.
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US14/137,760 | 2013-12-20 | ||
US14/137,760 US9483862B2 (en) | 2013-12-20 | 2013-12-20 | GPU-accelerated path rendering |
PCT/US2014/068207 WO2015094647A1 (en) | 2013-12-20 | 2014-12-02 | Gpu-accelerated path rendering |
Publications (2)
Publication Number | Publication Date |
---|---|
KR20160101949A KR20160101949A (ko) | 2016-08-26 |
KR101776547B1 true KR101776547B1 (ko) | 2017-09-07 |
Family
ID=52146738
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020167017671A KR101776547B1 (ko) | 2013-12-20 | 2014-12-02 | Gpu-가속된 패스 렌더링 |
Country Status (6)
Country | Link |
---|---|
US (1) | US9483862B2 (ko) |
EP (1) | EP3084727B1 (ko) |
JP (1) | JP6147938B2 (ko) |
KR (1) | KR101776547B1 (ko) |
CN (1) | CN105830125B (ko) |
WO (1) | WO2015094647A1 (ko) |
Families Citing this family (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9747084B2 (en) * | 2014-09-09 | 2017-08-29 | Google Inc. | Offline shader compilation |
CN104933752B (zh) * | 2015-06-29 | 2018-08-07 | 上海兆芯集成电路有限公司 | 一种计算机系统、图形处理单元及其图形处理方法 |
US10347016B2 (en) * | 2016-01-12 | 2019-07-09 | Monotype Imaging Inc. | Converting font contour curves |
US10121222B2 (en) * | 2016-01-22 | 2018-11-06 | Mediatek Inc. | Bandwidth efficient method for generating an alpha hint buffer |
KR102521654B1 (ko) | 2016-01-25 | 2023-04-13 | 삼성전자주식회사 | 컴퓨팅 시스템 및 컴퓨팅 시스템에서 타일-기반 렌더링의 그래픽스 파이프라인을 수행하는 방법 |
US11379941B2 (en) * | 2016-09-22 | 2022-07-05 | Advanced Micro Devices, Inc. | Primitive shader |
US10460513B2 (en) * | 2016-09-22 | 2019-10-29 | Advanced Micro Devices, Inc. | Combined world-space pipeline shader stages |
US10217280B2 (en) * | 2016-11-17 | 2019-02-26 | Advanced Micro Devices, Inc. | Identifying primitives in input index system |
CN106815130B (zh) * | 2016-12-26 | 2019-12-03 | 珠海金山网络游戏科技有限公司 | 一种基于移动终端硬件的游戏品质分级的方法和系统 |
US10936792B2 (en) | 2017-12-21 | 2021-03-02 | Monotype Imaging Inc. | Harmonizing font contours |
US10733690B2 (en) * | 2018-05-17 | 2020-08-04 | Intel Corporation | GPU mixed primitive topology type processing |
DE102020130293A1 (de) | 2019-12-10 | 2021-06-10 | Nvidia Corporation | Polar stroking für vektorgrafiken |
US11164372B2 (en) * | 2019-12-10 | 2021-11-02 | Nvidia Corporation | Polar stroking for vector graphics |
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 |
US11417058B2 (en) * | 2020-09-14 | 2022-08-16 | Adobe Inc. | Anti-aliasing two-dimensional vector graphics using a multi-vertex buffer |
US12002132B1 (en) | 2021-03-09 | 2024-06-04 | Apple Inc. | Rendering using analytic signed distance fields |
US11869123B2 (en) | 2021-08-03 | 2024-01-09 | Adobe Inc. | Anti-aliasing two-dimensional vector graphics using a compressed vertex buffer |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100214294A1 (en) | 2009-02-20 | 2010-08-26 | Microsoft Corporation | Method for tessellation on graphics hardware |
Family Cites Families (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH02309452A (ja) * | 1989-05-24 | 1990-12-25 | Nec Corp | 表示装置における図形データ管理方式 |
JP2810609B2 (ja) * | 1993-03-29 | 1998-10-15 | 株式会社日立製作所 | 図形表示方法及びその装置 |
US20050243085A1 (en) * | 2004-05-03 | 2005-11-03 | Microsoft Corporation | Model 3D construction application program interface |
US7746347B1 (en) | 2004-07-02 | 2010-06-29 | Nvidia Corporation | Methods and systems for processing a geometry shader program developed in a high-level shading language |
US7639252B2 (en) | 2004-08-11 | 2009-12-29 | Ati Technologies Ulc | Unified tessellation circuit and method therefor |
US8217950B2 (en) * | 2005-05-27 | 2012-07-10 | Advanced Micro Devices, Inc. | Video processing across multiple graphics processing units |
US8171461B1 (en) | 2006-02-24 | 2012-05-01 | Nvidia Coporation | Primitive program compilation for flat attributes with provoking vertex independence |
US7696993B2 (en) | 2007-02-08 | 2010-04-13 | Via Technologies, Inc. | Geometry primitive type conversion in a GPU pipeline |
US20100164954A1 (en) * | 2008-12-31 | 2010-07-01 | Sathe Rahul P | Tessellator Whose Tessellation Time Grows Linearly with the Amount of Tessellation |
US20110216068A1 (en) * | 2010-03-08 | 2011-09-08 | Sathe Rahul P | Edge processing techniques |
US9153193B2 (en) | 2011-09-09 | 2015-10-06 | Microsoft Technology Licensing, Llc | Primitive rendering using a single primitive type |
CN102402798B (zh) * | 2011-09-14 | 2015-01-28 | 浙江大学 | 一种可交互的非匀质半透明物体绘制方法 |
US10089774B2 (en) * | 2011-11-16 | 2018-10-02 | Qualcomm Incorporated | Tessellation in tile-based rendering |
CN103946823B (zh) * | 2011-11-18 | 2017-04-05 | 英特尔公司 | 棋盘多gpu配置内的可缩放几何形状处理 |
CN103959197B (zh) * | 2011-11-30 | 2017-01-18 | 英特尔公司 | 降低3d工作负荷的功率 |
KR101850027B1 (ko) * | 2011-12-08 | 2018-04-24 | 한국전자통신연구원 | 실시간 3차원 실 환경 복원장치 및 그 방법 |
ITRM20120094A1 (it) * | 2012-03-14 | 2013-09-14 | Istituto Naz Di Fisica Nuclea Re | Scheda di interfaccia di rete per nodo di rete di calcolo parallelo su gpu, e relativo metodo di comunicazione internodale |
US10535185B2 (en) * | 2012-04-04 | 2020-01-14 | Qualcomm Incorporated | Patched shading in graphics processing |
-
2013
- 2013-12-20 US US14/137,760 patent/US9483862B2/en active Active
-
2014
- 2014-12-02 EP EP14819199.2A patent/EP3084727B1/en active Active
- 2014-12-02 JP JP2016541147A patent/JP6147938B2/ja active Active
- 2014-12-02 KR KR1020167017671A patent/KR101776547B1/ko active IP Right Grant
- 2014-12-02 WO PCT/US2014/068207 patent/WO2015094647A1/en active Application Filing
- 2014-12-02 CN CN201480067802.2A patent/CN105830125B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100214294A1 (en) | 2009-02-20 | 2010-08-26 | Microsoft Corporation | Method for tessellation on graphics hardware |
Also Published As
Publication number | Publication date |
---|---|
CN105830125B (zh) | 2018-08-28 |
KR20160101949A (ko) | 2016-08-26 |
JP2017504888A (ja) | 2017-02-09 |
CN105830125A (zh) | 2016-08-03 |
EP3084727B1 (en) | 2017-10-04 |
JP6147938B2 (ja) | 2017-06-14 |
WO2015094647A1 (en) | 2015-06-25 |
US20150178974A1 (en) | 2015-06-25 |
US9483862B2 (en) | 2016-11-01 |
EP3084727A1 (en) | 2016-10-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101776547B1 (ko) | Gpu-가속된 패스 렌더링 | |
JP6013606B2 (ja) | Gpuアクセラレーテッドパスレンダリング | |
JP6419827B2 (ja) | グラフィックス処理におけるプレフィックス総和長さ | |
US9619853B2 (en) | GPU-accelerated path rendering | |
US9330495B2 (en) | Extending DX11 GPU for programmable vector graphics | |
US9177351B2 (en) | Multi-primitive graphics rendering pipeline | |
US8786606B2 (en) | Point containment for quadratic Bèzier strokes | |
US9483861B2 (en) | Tile-based rendering |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A201 | Request for examination | ||
A302 | Request for accelerated examination | ||
E902 | Notification of reason for refusal | ||
E701 | Decision to grant or registration of patent right | ||
GRNT | Written decision to grant |