Мой рендеринг d3d11 не сразу обновляет ту часть окна, которая была за кадромC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Мой рендеринг d3d11 не сразу обновляет ту часть окна, которая была за кадром

Сообщение Гость »

когда я рендерю треугольник
Изображение
я двигаюсь это за пределами экрана
Изображение
часть, которая была за пределами экрана экран не обновляется немедленно
Изображение

Я не знаю, как добавить это поведение, я не знаю, известна ли это вещь, и я не знаю, как ее решить, я не знал как искать об этом, чтобы я ничего не нашел.
Я просто хочу знать, как это решить, но не знаю как.
мой код:


#include
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
#include
#include
#include
#include

#include "indoin.hpp"

#pragma comment(lib, "d3dcompiler")
#pragma comment(lib, "d3d11")
#pragma comment(lib, "dxgi")

#define check(x) Check(x, std::to_string(__LINE__), __FILE__)

#define VSFile L"shader.sh"
#define FSFile L"shader.sh"

#include
struct position {
float x, y;
};
struct color {
float r, g, b;
};

struct vertex {

position pos;
color col;

};

const vertex vertices[] = {

{-1.0f, 1.0f, 0.0f, 1.0f, 0.0f},
{ 1.0f, -1.0f, 0.0f, 0.0f, 1.0f},
{-1.0f, -1.0f, 1.0f, 0.0f, 0.0f},

};

int other(HINSTANCE hInstance);

int main()
{

window wnd(800, 500, L"window name", Y_sizable_Y_windowed);

Microsoft::WRL::ComPtr factory = nullptr;
Microsoft::WRL::ComPtr device = nullptr;
Microsoft::WRL::ComPtr context = nullptr; {

check(CreateDXGIFactory1(IID_PPV_ARGS(&factory)));
Microsoft::WRL::ComPtr adapter = nullptr;
factory->EnumAdapters(0, adapter.GetAddressOf());
check(D3D11CreateDevice(adapter.Get(), D3D_DRIVER_TYPE_UNKNOWN, 0, D3D11_CREATE_DEVICE_DEBUG, 0, 0, D3D11_SDK_VERSION, device.GetAddressOf(), 0, context.GetAddressOf()));
DXGI_ADAPTER_DESC desc; HRESULT res = adapter->GetDesc(&desc);
if(!FAILED(res))std::wcout GetBufferPointer(), ps->GetBufferSize(), NULL, pixel_shader.GetAddressOf()));
}

Microsoft::WRL::ComPtr swapchain = nullptr;{

DXGI_SWAP_CHAIN_DESC desc = {}; {

desc.Windowed = 1;
desc.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL;
desc.OutputWindow = wnd.wnd;
desc.SampleDesc.Count = 1;
desc.BufferCount = 2;
desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.BufferDesc.RefreshRate = {120, 1};
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;

}

check(factory->CreateSwapChain(device.Get(), &desc, swapchain.GetAddressOf()));

}
Microsoft::WRL::ComPtr RTV = nullptr; {

D3D11_RENDER_TARGET_VIEW_DESC desc = {}; {

desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
desc.Texture2D.MipSlice = 0;
}
Microsoft::WRL::ComPtr back_buffer = nullptr;
check(swapchain->GetBuffer(0, IID_PPV_ARGS(back_buffer.GetAddressOf())));
check(device->CreateRenderTargetView(back_buffer.Get(), &desc, &RTV));

}
Microsoft::WRL::ComPtr layout = nullptr; {

const D3D11_INPUT_ELEMENT_DESC desc[] = {

{"POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, sizeof(position) , D3D11_INPUT_PER_VERTEX_DATA, 0}
};
check(device->CreateInputLayout(desc, ARRAYSIZE(desc), vs->GetBufferPointer(), vs->GetBufferSize(), layout.GetAddressOf()));
}
{ UINT32 stride = sizeof(vertex); UINT offset = 0;
context->IASetVertexBuffers(0, 1, vertex_buffer.GetAddressOf(), &stride, &offset);
context->IASetInputLayout(layout.Get());
context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

context->VSSetShader(vertex_shader.Get(), NULL, 0);
context->PSSetShader(pixel_shader.Get(), NULL, 0);

context->OMSetRenderTargets(1, RTV.GetAddressOf(), nullptr);
}

ShowWindow(wnd.wnd, SW_SHOW);

while (wnd.msg.message != WM_QUIT) {

handle_msg(wnd);

RECT winRect;
GetClientRect(wnd.wnd, &winRect);
D3D11_VIEWPORT port[] = {
{.TopLeftX = 0, .TopLeftY = 0,
.Width = (FLOAT)(winRect.right - winRect.left),
.Height = (FLOAT)(winRect.bottom - winRect.top),
.MinDepth = 0, .MaxDepth = 1 }
}; context->RSSetViewports(1, port);

float clearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f };

context->ClearRenderTargetView(RTV.Get(), clearColor);
context->Draw(3, 0);
swapchain->Present(1, 0);

}
return 0;
}


помощник окна
indoin.hpp:

#pragma once
#define NOMINMAX
#define WIN32_LEAN_AND_MEAN
#include
#include
#include

#define handle_msg(a) { if(PeekMessage(&a.msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&a.msg); DispatchMessageW(&a.msg); } }

static void Check(HRESULT hr, std::string str, std::string file);
#define check(x) Check(x, std::to_string(__LINE__), __FILE__)
enum window_type {
N_sizable_Y_windowed,
Y_sizable_N_windowed,
Y_sizable_Y_windowed,
N_sizable_N_windowed
};

enum window_controls {
MINIMIZE,
MAXIMIZE,
RESTORE,
HIDE,
SHOW
};

class window
{
public:
MSG msg = {};
int height = 0;
int width = 0;
DWORD style = WS_OVERLAPPED | WS_CAPTION | WS_BORDER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
HWND wnd = nullptr;
window(int width, int height, LPCWSTR title, window_type type):width(width),height(height){
WNDCLASS default_class = {
.style = CS_DBLCLKS,
.lpfnWndProc = PROC,
.cbClsExtra = 0,
.cbWndExtra = 0,
.hInstance = GetModuleHandle(nullptr),
.hIcon = nullptr,
.hCursor = nullptr,
.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 0, 0)),
.lpszMenuName = nullptr,
.lpszClassName = L"default_window_class_code98465665468"
};
if (!RegisterClass(&default_class)) {
DWORD error = GetLastError(); HRESULT res = HRESULT_FROM_WIN32(error); if (res == 0x80070582) res = S_OK; check(res); }
switch (type) {
case N_sizable_Y_windowed: style = WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
break;
case Y_sizable_N_windowed: style = WS_BORDER | WS_POPUP | WS_SYSMENU;
break;
case Y_sizable_Y_windowed: style = WS_OVERLAPPEDWINDOW;
break;
case N_sizable_N_windowed: style = WS_POPUP | WS_SYSMENU;
break;
default: style = WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
}
RECT wndrect = {
.left = 0, .top = 0,
.right = this->width, .bottom = this->height
};
AdjustWindowRect(&wndrect, this->style, false);
int w = wndrect.right - wndrect.left;
int h = wndrect.bottom - wndrect.top;
wnd = CreateWindow(default_class.lpszClassName, title, style, CW_USEDEFAULT, CW_USEDEFAULT, w, h, nullptr, nullptr, GetModuleHandle(nullptr), nullptr);
if (!wnd) throw std::runtime_error("window creation failed!");
UnregisterClass(default_class.lpszClassName, GetModuleHandle(nullptr));
}
static LRESULT CALLBACK PROC(HWND wnd, UINT msg, WPARAM wpr, LPARAM lpr) {
switch (msg) {
case WM_DESTROY: PostQuitMessage(0); break;
default: return DefWindowProc(wnd, msg, wpr, lpr);
}
return 0;
}
void show(window_controls control) {
switch (control) {
case MINIMIZE: ShowWindow(wnd, SW_MINIMIZE); break;
case MAXIMIZE: ShowWindow(wnd, SW_MAXIMIZE); break;
case HIDE: ShowWindow(wnd, SW_HIDE); break;
case RESTORE: case SHOW: default: ShowWindow(wnd, SW_SHOW); break;
}
}
};

static void Check(HRESULT hr, std::string str, std::string file) {
if (FAILED(hr)) {
LPVOID errorMsg;
DWORD errorMessageID = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, hr, 0, reinterpret_cast(&errorMsg), 0, NULL
);

std::wcerr

Подробнее здесь: https://stackoverflow.com/questions/781 ... -was-off-s
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Мой рендеринг d3d11 не сразу обновляет ту часть окна, которая была за кадром
    Гость » » в форуме C++
    0 Ответы
    20 Просмотры
    Последнее сообщение Гость
  • Мой рендеринг d3d11 не сразу обновляет ту часть окна, которая была за кадром
    Гость » » в форуме C++
    0 Ответы
    23 Просмотры
    Последнее сообщение Гость
  • Android Canvas не рендеринг на текстурной поверхности, связанной с кадром
    Anonymous » » в форуме Android
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Android Canvas не рендеринг на текстурной поверхности, связанной с кадром
    Anonymous » » в форуме Android
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • OpenGL за кадром MSAA не рендеринг
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»