DirectX Graphics 레퍼런스 셰이더 레퍼런스 셰이더 디버거   [목차열람] [주소복사] [슬롯비우기]
셰이더 디버거
 
Microsoft DirectX 9.0

셰이더 디버거


Microsoft® Visual Studio® . NET 는, 어셈블리 레벨의 상위 레벨 언어로 정점 셰이더 및 픽셀 셰이더의 디버그를 지원 한다.

DirectX Extensions for Visual Studio . NET

디버거는, 디버그 버전의 런타임 및 특정의 장치 타입으로 기능한다. 레퍼런스 장치를 사용하면 임의의 정점 셰이더 또는 픽셀 셰이더를 디버그 할 수 있다. 소프트웨어 정점 처리용의 하드웨어 추상 계층 (HAL) 장치상에서 실행하고 있으면, 정점 셰이더를 디버그 할 수 있다. 하드웨어 정점 처리 및 "퓨어" 인 HAL 장치에 대해서는, 디버그는 지원하지 않는다. 장치 타입의 더 자세한 정보는, 「D3DDEVTYPE 」를 참조할것.

디버그 정보를 사용한 빌드

셰이더를 소스 레벨로 디버그 하려면 , 셰이더를 디버그 정보를 사용해 빌드 해, 디스크 위에의 소스 파일과 관련짓고 할 필요가 있다. 그러한 셰이더를 생성 하는 방법에는, 다음의 2 통과해 방법이 있다.

디버거의 기동

애플리케이션을 디버그 하려면 , 그 애플리케이션이 디버그 버전의 Microsoft Direct3D® 런타임을 사용하고 있어, 셰이더 디버그가 유효하게 되지 않으면 안 된다. 이러한 옵션은, Microsoft DirectX® 컨트롤 패널 애플릿의 [Direct3D] 탭으로 구성할 수 있다. 타겟 컴퓨터에서는, DirectX Debug Service 도 실행되고 있을 필요가 있다. 이 서비스는, DirectX extensions for Visual Studio . NET 를 인스톨 하면, 자동적으로 인스톨 된다.

디버거를 기동하는 방법은 2 개 있다.

  1. [디버그] - [Direct3D] - [Start D3D] (Ctrl + Alt + F5 키)를 클릭해, 디버거를 기동한다.
  2. 이미 실행중의 Direct3D 프로세스에 "Attach" 할 수 있다. Visual Studio . NET 로, 이것을 실행하는 가장 간단한 방법은 다음과 같다.
    • [디버그] 메뉴의 [디버그없이 시작] 커멘드를 사용해, 목적의 애플리케이션을 기동한다.
    • [디버그] 메뉴의 [프로세스] 를 선택해,[프로세스] 윈도우를 연다.
    • 프로세스 일람중에서 목적의 애플리케이션을 선택해,[Attach] 버튼을 누른다.
    • [프로세스에 Attach] 다이알로그 박스로, C++ 코드를 디버그 하려면 [Native] 를 선택해, Direct3D 코드를 디버그 하려면 [Direct3D] 를 선택한다. C++ 코드와 Direct3D 코드는 동시에 디버그 할 수 있다 (이 주제의 마지막 편에 있는 「C++ 코드와 Direct3D 코드의 동시 디버그」를 참조할것).

Visual Studio . NET 에서도, Direct3D 애플리케이션의 리모트 디버그를 지원 하고 있다. 리모트 컴퓨터의 Direct3D 프로세스에 Attach 하려면 ,[프로세스] 다이알로그 박스의 [컴퓨터] 박스에 리모트 컴퓨터의 이름을 입력해, 로컬 프로세스의 경우와 같이 그 프로세스에 Attach 한다.

breakpoint

모듈 윈도우를 사용해, 현재 로드 되고 있는 셰이더를 모두 표시할 수 있다. native code를 디버그 하는 경우, 윈도우를 오른쪽 클릭해,[모든 프로그램의 모듈을 표시] 를 선택해, 로드 되고 있는 셰이더를 표시한다.

파일 / 행 breakpoint

정점 셰이더 또는 픽셀 셰이더의 소스 파일에 breakpoint를 설정하려면 , 셰이더에 디버그 정보를 제공시킬 필요가 있다 ( 「디버그 정보를 사용한 빌드」를 참조할것). 셰이더에 소스 코드 breakpoint를 설정하는 방법은, 다음에 설명하도록(듯이), C++ 소스 코드에 소스 코드 breakpoint를 설정하는 방법과 같다.

함수 breakpoint

이름에 셰이더 함수의 이름 (대문자 소문자가 구별된다)을 입력해, 언어에 [D3D Shader] 를 설정한다. 함수명은, 디버그 정보에 저장 되고 있는 셰이더 함수의 이름, 셰이더를 포함하고 있는 파일의 이름, 또는 셰이더 타입이 선두를 뒤따르는 셰이더 핸들 번호 (VS1 등)이다. 모듈 윈도우에는, 현재 로드 사라질 수 있어 모든 셰이더와 그 이름의 일람이 표시된다. IDirect3DDevice9::BeginSceneIDirect3DDevice9::EndScene 의 breakpoint는, 이전과 같이 기능한다.

조건 breakpoint

조건이 TRUE 때에 breakpoint가 유효하게 되도록(듯이) 설정되어 있는 경우에 한정해 (조건이 바뀌었을 때에 유효하게 되는 경우와 반대), 다음의 타입의 breakpoint에는 조건을 갖게할 수가 있다.

식은, 단일 요소의 불형의 결과를 평가해야 한다.

메모리 breakpoint

메모리 breakpoint는, 지정된 직사각형내에서 픽셀을 변경하기 직전의 픽셀 셰이더의 최초의 명령으로 방아쇠 된다. 메모리 breakpoint를 설정하려면 ,[breakpoint의 생성] 다이얼로그의 [주소] 탭을 열어, 언어에 [D3D Shader] 를 선택해, 다음의 몇개의 형식에서 범위를 입력한다.

어셈블리 코드 (주소) breakpoint

셰이더의 특정의 명령에 breakpoint를 설정하는 경우는, 디버그 정보는 필요없다. 주소 breakpoint는, 다음의 방법으로 설정한다.

BeginScene breakpoint 또는 EndScene breakpoint

디버그 하고 있는 애플리케이션이 IDirect3DDevice9::BeginScene 또는 IDirect3DDevice9::EndScene 에 이르렀을 때에 breakpoint를 설정하려면 ,[breakpoint의 생성] 커멘드 (디폴트에서는 Ctrl + B 키)를 선택해,[함수] 탭을 선택해,[언어] 박스의 일람으로부터 [Direct3D Shader] 를 선택한다. 함수명으로서 「BeginScene」또는 「EndScene」라고 입력한다.

스텝 실행

셰이더 코드를 스텝 실행하려면 ,[디버그] 메뉴의 [스텝오버] 커멘드 (디폴트에서는 F10 키)를 사용한다. Direct3D 코드를 스텝 실행하는 것에 의해, 디버그중의 애플리케이션은, 다음에 실행하는 정점 셰이더 명령 또는 픽셀 셰이더 명령으로 멈춘다.

식의 평가

디버그중의 애플리케이션이 정점 셰이더나 픽셀 셰이더 또는 BeginScene 나 EndScene 의 breakpoint로 멈추면[시계] 윈도우를 사용해 디버그중의 애플리케이션 상태를 조사할 수 있다. 또,[혼합 모드] 윈도우 또는 셰이더의 소스 코드로 마우스 포인터를 레지스터 위에 짧게 두면 레지스터의 내용을 곧바로 확인할 수 있다.

식의 구문에서는, 레지스터명, 바꿔 넣어 이하의 연산자가 지원 되고 있다. 연산자는 모두 성분 단위로 연산을 실시한다.

 + - * / == != < <= > >= [] ! || && 

또, 다음의 2 개의 편입 함수도 지원 되고 있다.

모든 형태가 정확하게 일치하고 있을 필요가 있다. 부동 소수점 리터럴에는 소수점이 없으면 안 된다. 소수점이 없으면 정수로 보여진다.

차의 식에서는, r0 의 최초의 3 개의 성분 모든 것이 대응하는 c4 의 성분보다 작으면 TRUE 를 돌려준다.

 all( r0.xyz < c4.xyz ) 

정수 레지스터에는, 1 에 a0 의 x 성분을 더한 인덱스가 생성 된다.

 c[a0.x+1] 

레지스터의 내용의 표시

시계 윈도우에 레지스터의 내용을 표시하려면 , 다음의 식의 구문을 사용한다.

 registerName[. swizzle][, format][, w] 

여기서

장치 스테이트의 표시

장치의 렌더링 스테이트와 텍스처 스테이지 스테이트의 현재의 값을 표시하려면 ,[시계] 윈도우에 「$DeviceState」라고 입력한다.

현재의 픽셀 위치의 표시

레지스터 vPos 에는, 픽셀 셰이더가 현재 렌더링중의 픽셀의 좌표가 저장 되고 있다.

표면의 내용의 표시

렌더링 타겟의 표시 - 현재의 렌더링 타겟 표면의 내용을 표시하려면 ,[디버그] 메뉴의 [Direct3D] - [Render Target] 메뉴 옵션을 선택해,[Render Target] 윈도우를 연다. 이 윈도우는, 디버그중의 애플리케이션이 "브레이크" 모드에 들어갈 때마다, 렌더링 타겟의 현재의 내용에 갱신된다.

텍스처의 표시 - 텍스처 스테이지에 현재 선택되고 있는 텍스처의 내용을 표시하려면 ,[디버그] 메뉴의 [Direct3D] - [Textures] 메뉴로부터 적절한 텍스처 스테이지를 선택해,[Texture] 윈도우를 연다. 텍스처 윈도우는, 디버그중의 애플리케이션이 "브레이크" 모드에 들어갈 때마다, 대응하는 텍스처 스테이지의 현재의 내용에 갱신된다.

표면 (렌더링 타겟 또는 텍스처)의 내용을 표시할 수 없는 경우는, 표면의 윈도우에 "Unavailable" 라고 하는 문자가 표시된다. 표면을 표시할 수 없는 경우, 다음과 같은 이유가 생각된다.

C++ 코드와 Direct3D 코드의 동시 디버그

Visual Studio . NET 디버거는, 복수의 프로그램 타입의 동시 디버그를 지원 하고 있다. 보통의 C++ 디버그는,"네이티브" 프로그램 타입을 사용한다. Direct3D 디버그는,"Direct3D" 프로그램 타입을 사용한다. 디버그중의 애플리케이션이 C++ 코드내에서 멈추면 현재의 프로그램은 네이티브로 설정되어 Call Stack, 시계 윈도우, 그 외의 디버그 윈도우에는 네이티브 프로그램의 스테이트가 반영된다. 같이 디버그중의 애플리케이션이 셰이더 코드내에서 멈추었을 경우, 현재의 프로그램은 Direct3D 로 설정되어 디버그 윈도우에는 Direct3D 프로그램의 스테이트가 반영된다. 프로그램 타입을 바꾸려면 ,[디버그의 장소] 툴바의 [프로그램] 박스를 사용한다. 디버그중의 애플리케이션이 native code내에서 멈추었을 경우, Direct3D 프로그램의 대부분의 스테이트는 표시되지 않게 된다. 다만, 그 역의 경우는 같지 않다. 예를 들어, 셰이더내의 breakpoint로 멈추었다고 하면, 네이티브 프로그램으로 전환해, 셰이더의 호출원이 된 C++ Call Stack를 표시할 수 있다.

복수의 프로그램 타입을 동시 디버그 하는 방법의 더 자세한 정보는, Visual Studio . NET 의 문서의 「복수 프로그램의 디버그」를 참조할것.

디버그 정보를 사용하지 않는 빌드

가능하면, 셰이더는 디버그 정보를 사용 가능하게 해 빌드 하는 것 ( 「디버그 정보를 사용한 빌드」를 참조할것). "그 자리에서" 빌드 되는 셰이더 등, 디버그 정보를 사용한 빌드가 불가능한 경우, 디버그는 할 수 있어도, 보다 한층 어려워진다. 소스 코드를 사용할 수 없기 때문에, 소스 코드 breakpoint는 기능하지 않는다. 디버그 정보없이 디버그 하는 방법의 1 개로서 BeginScene breakpoint를 설정해, 그 breakpoint에 이르면 F10 키를 눌러 실행되고 있는 최초의 셰이더의 셰이더 코드를 스텝 실행하는 방법이 있다. 혼합 모드 코드를 스텝 실행하고 있을 때는,[혼합 모드] 윈도우로 breakpoint를 설정할 수 있다. [Modules] 윈도우를 사용하면 현재 로드 사라질 수 있어 모든 셰이더의 이름을 표시해, 필요에 따라서 셰이더에 breakpoint를 선택적으로 설정할 수 있다.

다른 방법으로서는, C++ 코드내에서 IDirect3DDevice9::DrawPrimitive 또는 IDirect3DDevice9::DrawIndexedPrimitive 를 호출하기 직전에 breakpoint를 설정하는 방법이 있다. 이 breakpoint에 이르면 현재의 셰이더 핸들을 사용해 주소 breakpoint를 설정해, 그 breakpoint에 이를 때까지 실행한다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP