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}