80                                                                                                                         {
   81    unsigned int captureFBO, captureRBO, tex;
   82    int size = level * level;
   83    unsigned int tex2d_size = size * level;
   84 
   85    glDisable(GL_CULL_FACE);
   86    glEnable(GL_BLEND);
   87    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   88 
   89    SetupFramebuffer(captureFBO, captureRBO, tex, tex2d_size);
   90 
   91    const auto& handle = m_handle;
   92    mat4 view = mat4::Identity();
 
   93    glUseProgram(handle->Program);
   94 
   95    material.AttachElement(0);
   96    auto albedo_tex = handle->UniformLocation("texture.albedo");
   97    if(albedo_tex != nullptr && albedo_tex->id >= 0) {
   98        const auto& e = material.GetElement("texture.albedo");
   99        if(e != nullptr) {
  100            STexture* tex_resource = SResource::Get<STexture>(e->valueStr[0]);
 
  101            tex_resource->Bind(albedo_tex->id, 0);
  102        }
  103    }
  104 
  105    if(handle->Uniforms.ViewMatrix >= 0)
  106        glUniformMatrix4fv(handle->Uniforms.ViewMatrix, 1, 0, view.Pointer());
  107    
  108    glClearColor(0, 0, 0, 0);
  109    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  110    Render(level, mesh, handle);
  111 
  112    unsigned char* data = new unsigned char[tex2d_size * tex2d_size * 4] {0};
  113 
  114    
  115    view = mat4::RotateY(180.f);
  116    ProcessAxisRender(level, mesh, handle, data, view, [=](int level, int x, int y, int z) {
  117        return GetIndex(level, size - x, y, z / 2 + size / 4);
  118    });
  119 
  120    
  121    view = mat4::RotateX(90.f);
  122    ProcessAxisRender(level, mesh, handle, data, view, [=](int level, int x, int y, int z) {
  123        return GetIndex(level, x, z / 2 + size / 4, y);
  124    });
  125 
  126    
  127    view = mat4::RotateY(-90.f);
  128    ProcessAxisRender(level, mesh, handle, data, view, [=](int level, int x, int y, int z) {
  129        return GetIndex(level, z / 2 + size / 4, y, x);
  130    });
  131 
  132    std::string save_str = CSE::AssetsPath() + "test" + ".png";
  133    SavePng(save_str.c_str(), tex2d_size, tex2d_size, 4, data);
  134    
  135    glEnable(GL_CULL_FACE);
  136    glDisable(GL_BLEND);
  137    glDeleteFramebuffers(1, &captureFBO);
  138    glDeleteRenderbuffers(1, &captureRBO);
  139    delete[] data;
  140}