ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Shader Programming for DirectX(1)
    3D Graphics/Shader 2008. 3. 28. 16:36
    728x90

    걍 수업들으면서 멍하니 있는거보다는 뭔가라도 남기고자 HLSL에 대한 글을 씁니다.
    이 연재는 학기중이에는 계속 진행될듯 하네요~ㅎㅎ 간간히 이번에 진행하는 게임에 대한 포스트도 올릴테니 많은 관심 부탁드려요~^^ 제가 올리는 이 글이 다른 분들에게 도움이 되면 좋겠습니다~^^

    이 글에서 잘못된 내용은 코맨트 달아주시면 수정하도록 하겠습니다.
    자~ 그럼 시작해 볼까요?

    일단 DirectX에 대한 내용은 자세히는 다루지 않겠습니다. 필요한 경우에만 관련 내용을 이야기 하겠지만 DirectX에 대한 내용은 책에도 많으니 뭐~ㅎㅎ
    일단 쉐이더 프로그래밍을 하기위해서는 DIrectX에서 쉐이더 초기화를 해줘야 합니다.
    우선적으로 다음과 같이 쉐이더코드를 gpu로 올리는 과정을 수행해줍니다.

        HRESULT hr;
        LPD3DXBUFFER pCode;
        //정점셰이더 생성

        // 정점선언 오브젝트 생성
        D3DVERTEXELEMENT9 decl[] = {
            { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,
                     D3DDECLUSAGE_POSITION, 0 },
            D3DDECL_END()
        };
       
        if( FAILED( hr = m_pd3dDevice->CreateVertexDeclaration( decl, &m_pVertexDeclaration ) ) ) {
            return hr;
        }

        // 셰이더 읽기
        if( FAILED( hr = D3DXAssembleShaderFromFile(
                            _T("VertexShader.vsh"), NULL, NULL, 0, &pCode, NULL ))) {
            return hr;
        }
        //pCode는 메인 메모리에 존재

        // 정점 셰이더 생성 - 메인 메모리에 올라온 쉐이더 함수를 GPU에 올린다.
        hr = m_pd3dDevice->CreateVertexShader(
                              (DWORD*)pCode->GetBufferPointer(),
                              &m_pVertexShader );
        pCode->Release();

     자 이제 gpu에 작성한 쉐이더 코드가 올라갔습니다!! 쉐이더에서 작업하려면 처리할 데이터를 넣어주어야 하겠죠??
    자 쉐이더 내부에서 사용되는 상수를 지정해 봅시다~!

       //좌표변환용 상수 레지스터 설정
        D3DXMatrixMultiply( &mat, &m_matView, &m_matProj );
        D3DXMatrixTranspose( &mat, &mat );// 전치행렬로 변환
        m_pd3dDevice->SetVertexShaderConstantF(0, (float*)&mat, 4);
        // ★ 정점색 상수 레지스터 설정
        float color[] = {1.0f, 1.0f, 0.0f, 1.0f};// 적색
        m_pd3dDevice->SetVertexShaderConstantF(4, (float*)&color, 1);

     위의 코드에서 월드행렬을 전치행렬로 변환해 주는 이유는 쉐이더내부에서 열백터방식을 사용하기 때문입니다.
    DirectX에서는 행벡터방식을 사용하는지라 Transpose()로 열벡터방식으로 바꿔서 쉐이더에 값을 넣어줍시다.

    여기까지 읽으신 분들! 그럼 쉐이더코드는 어떻게 작성하냐?? 이렇게 생각하시겠죠??
    간단합니다. 그냥 메모장 열어서 HLSL언어로 코드를 작성하고 프로그램이 실행되는 폴더에 넣어주시면 됩니다.
    그리고 그 파일명을 저~ 위에 쉐이더 초기화부분에 넣어줌으로서 해당파일을 GPU로 올리게 되는거죠~.

    앗!! 근데 HLSL이란게 나오죠?? 이게뭐지?? 하시는분들이 있을실텐데 풀이하자면 High Level Shader Langeage의 약자입니다. 우리말로는 고수준 쉐이더 언어라고도 하죠~^^. 즉 Shader Programming을 하기 위해서는 HLSL을 알아야 합니다. (아 2.0 이상에서의 이야기입니다. 1.x에서는 어셈블리 언어를 사용하죠.)
     
     일단 수업내용과 일치시키기 위해서 어셈블리로 쉐이더코드를 작성해보고 그다음에 HLSL에 대한 내용을 올리도록 하죠~ 왜냐하면 지금 수업시간에 포스팅을 하는 거니깐요..-_-;; 퍽~

    그럼 다음글에서 뵙겠습니다~. 안녕히...

    '3D Graphics > Shader' 카테고리의 다른 글

    [CG-Fragment] texture  (0) 2007.11.07
    shader 1.x 설명..  (0) 2007.11.02
    Vertext Sader 1.1 예제  (0) 2007.10.12
    GLSL 강좌(1)  (1) 2007.06.23
    cgfx 안에서 쓸 수 있는 state  (1) 2007.04.16

    댓글

Designed by black7375.