제 목 14강 cubemap 에서 질문이 있습니다.
작성자 제원 등록날짜 2021-07-29 16:33:15 / 조회수 : 132
강좌명 [단과] DirectX 11 3D게임프로그래밍 Part 2
  • CubeMap::~CubeMap()
    {
        SafeDelete(cube);

        SafeRelease(srv);
    }

    이부분에서 제가 추가로 SafeRelease(sSrv); 를 넣으니 sSrv 읽기 억세스 위반으로 에러가 납니다.

    에러가 난이유(즉, sSrv를 해제하지 않으신 이유)를 알 수 있을까요?

  • 작성자 : 게임클래스 / 등록날짜 : 2021-07-30 17:03:13
  • 안녕하세요 게임클래스 프로그래밍 강사 하민우 입니다.

    ID3DX11EffectShaderResourceVariable* sSrv;

    위 객체는 포인터 객체로 큐브 맵에 선언 되어 있으나

    sSrv = shader->AsSRV("CubeMap");

    큐브맵 클래스에서 생성이 되는 것이 아닌 위와 같이 쉐이더 클래스로 부터 생성 된 객체를 받아와서 연결하여 사용하는 형태 입니다. 쉐이더 클래스를 따라가보면

     

    ID3DX11EffectShaderResourceVariable * Shader::AsSRV(string name)
    {
        return effect->GetVariableByName(name.c_str())->AsShaderResource();
    }

    effect 객체로 부터 해당 객체 정보를 받아오는 것을 알 수 있으며, effect 객체의 생성과 해제는 쉐이더 클래스에서 처리되고 있는 것을 확인 하실 수 있으실 겁니다.

     

    그래서 큐브맵에서 해제를 하게 되면, 2중 해제가 되는 경우이고 만약 2중 해제가 되지 않도록 한다고 하더라도 쉐이더 클래스에서 관리 하는 부분을 큐브맵에서 해제를 시키는 것이기 때문에 클래스 구조에 따라서 문제가 될 수 있습니다.

     

    간단히 다시 정리 드리자면 큐브맵의 sSRV는 큐브맵에서 생성 되고 있는 객체가 아니기 때문에 큐브맵에서 해제 하지 않고 있습니다.

     

    항상 열공하시고 또 궁금한 점이 있을 때는 언제든지 질문 주시기 바립니다.

    게임 개발자가 되는 가장 빠른 길, 게임클래스!