diff --git a/Sources/viewport_server.cpp b/Sources/viewport_server.cpp index 085b38b..fd3a0d3 100644 --- a/Sources/viewport_server.cpp +++ b/Sources/viewport_server.cpp @@ -461,19 +461,23 @@ void viewport_server_end_frame(void) { g_stagingWriteIdx = writeIdx ^ 1; } -//#elif defined(KINC_OPENGL) -// glReadPixels(0, 0, g_viewport_state.width, g_viewport_state.height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); -// size_t row_size = g_viewport_state.width * 4; -// for (int y = 0; y < g_viewport_state.height / 2; ++y) { -// uint8_t* row_top = pixels + y * row_size; -// uint8_t* row_bottom = pixels + (g_viewport_state.height - 1 - y) * row_size; -// for (size_t x = 0; x < row_size; ++x) { -// uint8_t temp = row_top[x]; -// row_top[x] = row_bottom[x]; -// row_bottom[x] = temp; -// } -// } -// memcpy(pixel_dest, pixels, pixel_size); +#elif defined(KINC_OPENGL) + glReadBuffer(GL_BACK); + glReadPixels(0, 0, g_viewport_state.width, g_viewport_state.height, + GL_RGBA, GL_UNSIGNED_BYTE, pixels); + // OpenGL reads bottom-to-top; flip to top-to-bottom to match D3D11 convention + size_t row_size = (size_t)g_viewport_state.width * 4; + for (int y = 0; y < g_viewport_state.height / 2; ++y) { + uint8_t* row_top = pixels + y * row_size; + uint8_t* row_bottom = pixels + (g_viewport_state.height - 1 - y) * row_size; + for (size_t x = 0; x < row_size; ++x) { + uint8_t temp = row_top[x]; + row_top[x] = row_bottom[x]; + row_bottom[x] = temp; + } + } + memcpy(pixel_dest, pixels, pixel_size); + pixels_written = true; #else // other platforms use render target if (g_viewport_state.render_target) {