Исходник Гайд RenderScreenBuffer - наконец-то SAMP на mimgui

RenderScreenBuffer - простенькая библиотека на C++ для получения буфера окна в качестве текстуры для рендера.

Исходный код: GitHub
Имеет как CAPI, так и полноценный API C++ библиотеки, которую при необходимости вы можете подключить свой проект. На все том же CAPI реализована обертка для Lua, таким образом можно использовать внутри MoonLoader.

Первое, что приходит на ум - рендер окна игры внутри окна ImGui:
Lua:
local RenderScreenBuffer = require("RenderScreenBuffer")
local imgui = require("mimgui")

local renderer = nil

function main()
  -- Аргументы: minX, minY, maxX, maxY
  renderer = RenderScreenBuffer:new(100, 100, 200, 200)
  --[[
    Fullscreen:
    renderer = RenderScreenBuffer:new()
  ]]
end

imgui.OnInitialize(function()
  imgui.GetIO().IniFilename = nil
end)

imgui.OnFrame(
  function() return true end,
  function(player)
    local sizeX, sizeY = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver)
    imgui.Begin("Main Window")
    if renderer ~= nil then
      local texture = renderer:get()
      if texture then
        imgui.Image(texture, imgui.ImVec2(100, 100))
      end
    end
    imgui.End()
  end
)
1750000573771.png
1750000886554.png

Но никто не мешает делать более интересные штуки, к примеру, скриншоты игры:
Lua:
local RenderScreenBuffer = require("RenderScreenBuffer")
local ffi = require("ffi")

ffi.cdef [[
  long D3DXSaveTextureToFileA(
    const char* pDestFile,
    int DestFormat,
    void* pSrcTexture,
    const void *pSrcPalette
  );
]]

local d3dx9 = ffi.load(("%s\\d3dx9_25.dll"):format(getFolderPath(0x25)))

function main()
  local renderer = RenderScreenBuffer:new(100, 100, 200, 200)

  while not isSampAvailable() do wait(0) end
  sampRegisterChatCommand("ts", function()
    local path = [[C:\Users\egaaa\OneDrive\Рабочий стол\test.png]]
    d3dx9.D3DXSaveTextureToFileA(path, 3, renderer:get(), nil)
    sampAddChatMessage("TakeScreenshot", -1)
  end)
end

Установка для MoonLoader: разархивировать содержимое архива в папку moonloader/lib
 

Вложения

  • RenderScreenBuffer.rar
    5.9 KB · Просмотры: 44

SR_team

like pancake
BH Team
4,920
6,624
C++:
RwRaster* frameBuffer = RwCamera ->frameBuffer;
_rwD3D9RasterExt* ext = reinterpret_cast<_rwD3D9RasterExt*>(reinterpret_cast<char*>(frameBuffer) + __RwD3D9RasterExtOffset);
ext->texture; // Текстура в которую back buffer пишет
Далее за надобностью текстуру можно скопировать и обрезать. Текстура всегда содержит текущее состояние кадра - если вызвать не в конце сцены, то будет не дорисована - например не будет худа
 
  • Нравится
Реакции: kyrtion и вайега52

2elnwndrer.

Известный
178
59
если делать скриншот при помощи этой либы то игра будет зависать или нет?
 

вайега52

Налуашил состояние
Автор темы
Модератор
2,995
3,116
если делать скриншот при помощи этой либы то игра будет зависать или нет?
зависает игра из-за функции для сохранения буффера в файл в режиме пнг, а не при самом его захвате