[1]. 셰이더 파일의 속성 부터 변경한다.

[2]. Client 프로젝트도 추가해놓은 Effect.h 파일을 알아야하므로, Base.h 에, Engine_Define.h 이 들어있어서, Client 프로젝트 입장에서는 Effect.h를 모르고 있다. 배치 파일을 열고 /s 옵션을 더 추가 → 해당 폴더 안에 있는 하위 폴더까지 복사한다는 명령어

[3]. 셰이더 파일에, technique11 함수를 추가하는데, 이는 사양이 좋지 않은 그래픽 카드는, 셰이더 모델을 지원하지 않는 경우가 있기 때문에, 성능 조사를 통해 좀 더 낮은 모델로 사용가능하게 끔 해주는 함수 이다.

[4]. technique11 함수 안에, pass 라는 함수가 있는데, 이 함수들을 여러 개 정의해서, 특정 하나의 모델을 그리는데, 그 모델이 렌더링 상태가 다양할 때, pass 함수의 인덱스, 즉 몇 번째 pass 함수로 이 모델을 렌더할 건가. 라는 느낌이다. 하나의 모델에 적용되는 셰이더 기법들을 구분지을 때 사용한다 라고 보면 되겠다.

[5]. Shader 클래스의 Begin 함수라고, 이 pass 의 인덱스 값을 받아와, 어떤 인덱스의 셰이더를 선택해서 그릴 것인지 렌더링 할 것이다.

[6]. Shader 클래스의 Initialize_Prototype 함수를 작성하는데, 여기서는 처음 보는 함수와 구조체 들이 많기 때문에, 흐름을 이해하도록 한다.

HRESULT CShader::Initialize_Prototype(const _tchar* _pShaderFilePath, const D3D11_INPUT_ELEMENT_DESC* _pVertexElements, _uint _iNumElements)
{
_uint			iHlslFlag = {};

#ifdef _DEBUG
iHlslFlag = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
#else
iHlslFlag = D3DCOMPILE_OPTIMIZATION_LEVEL1;
#endif

ID3DBlob* pErrMsg = { nullptr };

if (FAILED(D3DX11CompileEffectFromFile(_pShaderFilePath, nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE, iHlslFlag, 0, m_pDevice, &m_pEffect, &pErrMsg)))
    return E_FAIL;

//
ID3DX11EffectTechnique* pTechnique = m_pEffect->GetTechniqueByIndex(0);
if (nullptr == pTechnique)
    return E_FAIL;

D3DX11_TECHNIQUE_DESC   TechniqueDesc{};
// 테크닉의 정보를 가져오기.
pTechnique->GetDesc(&TechniqueDesc);

// 얻어온 테크닉의 pass 갯수.
m_iNumPasses = TechniqueDesc.Passes;

// 그 pass 갯수 만큼 루프 돌려서, 최종적으로 pass 의 정보에 접근한다.
for (size_t i = 0; i < m_iNumPasses; ++i)
{
    // 테크닉의 특정 pass 가져왔고,
    ID3DX11EffectPass* pPass = pTechnique->GetPassByIndex((uint32_t)i);
    ID3D11InputLayout* pInputLayout = { nullptr };

    D3DX11_PASS_DESC        PassDesc{};

    // 가져온 특정 pass 에서 pass의 구조체 주소를 가져와서, 채워주기.
    pPass->GetDesc(&PassDesc);

    // 내가 그릴려고 하는 정점은, 어떻게 생겼다. (D3D11_INPUT_ELEMENT_DESC 구조체) / 정점의 멤버 변수는 ~개를 가진다. / 쉐이더가 어떤 정점을 받고있는가, / 쉐이더가 받고있는 정점의 크기 / &pInputlayout
    // pInputLayout 에다가 담기, 그걸 벡터에 집어넣기.
    // PassDesc.pIAInputSignature & PassDesc.IAInputSignatureSize 라고 채우기 위해서,
    if (FAILED(m_pDevice->CreateInputLayout(_pVertexElements, _iNumElements, PassDesc.pIAInputSignature, PassDesc.IAInputSignatureSize, &pInputLayout)))
        return E_FAIL;

    m_vecInputLayout.push_back(pInputLayout);
}

return S_OK;

}

먼저, D3DX11CompileEffectFromFile 함수가 받는 파라미터는,