2013-02-01 2 views
0

매번 파일 시스템에서 버텍스 쉐이더, 픽셀 쉐이더 등을 장치/장치 컨텍스트에 다시로드하지 않고 버퍼링하는 가장 좋은 방법은 무엇입니까?많은 버텍스, 기하학 및 픽셀 쉐이더를 버퍼하는 방법

ID3D11Device :: CreateVertexShader http://msdn.microsoft.com/en-us/library/windows/desktop/ff476524(v=vs.85).aspx

ID3D11DeviceContext :: VSSetShader http://msdn.microsoft.com/en-us/library/windows/desktop/ff476493(v=vs.85).aspx

장치 :: CreateVertexShader 시스템의 쉐이더, (안 GPU), 메모리의 단일 인스턴스를 버퍼합니까? 1 개 이상을 버퍼링 할 수 있습니까?

DeviceContext :: CreateVertexShader는 시스템이 아닌 GPU에서 메모리의 셰이더 단일 인스턴스를 버퍼링합니까? 1 개 이상을 버퍼링 할 수 있습니까?

시스템 내에서 셰이더를 버퍼링하는 데 권장되는 방법은 무엇입니까?

감사합니다. 당신이 ID3D11Device :: CreateVertexShader를 사용하는 경우

+3

한 번에 하나의 버텍스 쉐이더 만 만들 수 있다는 생각을 어디서 얻었습니까? –

답변

2

, 당신은 그들에 대한 참조를 검색, 뜻은 GPU에서 버텍스 쉐이더를 대표하는, 그래서 당신은 3 정점 셰이더가있는 경우 당신이 할 :

ID3D11VertexShader* vsref1; 
ID3D11VertexShader* vsref2; 
ID3D11VertexShader* vsref3; 

CreateVertexShader(bytecode1,sizeofbytecode1,NULL,&vsref1); 
CreateVertexShader(bytecode2,sizeofbytecode2,NULL,&vsref2); 
CreateVertexShader(bytecode3,sizeofbytecode3,NULL,&vsref3); 

당신이 추적 확인 vsref1,2 및 3 (클래스 구성원과 동일). 만든 후에는 gpu에 업로드되어 다시 할 필요가 없으며 VSSetShader가 호출되어 사용하려는 VSSetShader가 호출됩니다.

그런 다음 다음을 사용하여 파이프 라인 언제로 버텍스 쉐이더를 지정할 수 있습니다 : 업로드가 발생하지 않습니다

VSSetShader(vsref1,NULL,0); 

또는

VSSetShader(vsref2,NULL,0); 

을, 그것은 단지 당신의 GPU에게의 어떤 버텍스 쉐이더 당신 다음 Draw 호출에 사용하고 싶습니다.

+0

이것은 굉장합니다! VertexShaderPtr-> Release()가 GPU에서 셰이더를 제거합니까? 일반적으로 내가 다이어그램, 문서, CPU와 GPU 메모리, 버퍼 등의 상호 작용을 설명하는 곳을 어디에서 알 수 있다고 생각하지 않습니까? "이 방법은 CPU 메모리의 쉐이더를 인스턴스화합니다.이 쉐이더는 GPU 메모리에 바인드합니다.이 것은 GPU 메모리에 바인드합니다.하지만 이것은 버텍스 버퍼, 상수, 더 중요한 것은 리소스와 텍스처와 같은 것들입니다. 귀하의 도움을! –

+0

예 GPU에서 제거됩니다 (모든 DirectX 개체는 참조 카운터입니다). 다이어그램에 관해서는 dx11 렌더링에 대한 여러 프레젠테이션에서 슬라이드를 얻었으므로 원하는 경우 링크를 보낼 수 있습니다. 일부 튜토리얼을 가지고 있지만 아직 게시되지 않았습니다. (일부는 C#/SlimDX를 사용하고 일부는 raw C++/dx11을 사용합니다) – catflier

+0

Set가 GPU에 바인딩하는 동안 Create 메소드가 일반적으로 CPU 호스트 버퍼를 만드는 것으로 생각했습니다. Create는 버퍼, 텍스쳐 등을 활성화시키는 것입니다. CreateVertexBuffer는 GPU 호스트 버퍼를 만들고 IA Set Buffers는 ac를 변경합니다. tive 버퍼, 등? 도와 줘서 고마워. –