Tôi đang cố gắng học lập trình đồ họa và DirectX11.
Tôi đang cố gắng học cách giảm thiểu việc chuyển CPU-GPU và lập trình đồ họa nói chung.
Tôi có một câu hỏi mà tôi không thể tự trả lời từ các tài nguyên trực tuyến:
Phương thức D3D nào thực sự gửi dữ liệu tới GPU (và, tương tự, đối với lưới tĩnh, TẤT CẢ dữ liệu đỉnh được truyền đến GPU mỗi khung hình hay chỉ một lần)?
Mã sau:
(đơn giản hóa cho stackexchange)
Trong lớp "lưới" của tôi, tôi có một bộ đệm đỉnh:
ID3D11Buffer *m_pVBuffer;
Trong hàm tạo của lưới của tôi, tôi đặt một số đỉnh cho bộ đệm đỉnh:
D3D11_MAPPED_SUBRESOURCE ms;
devcon->Map(m_pVBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
memcpy(ms.pData, &vertices[0], sizeof(VERTEX) * vertices.size());
devcon->Unmap(m_pVBuffer, NULL);
Sau đó, trong phương thức "kết xuất" của lưới của tôi, tôi làm điều này:
UINT stride = sizeof(VERTEX);
UINT offset = 0;
devcon->IASetVertexBuffers(0, 1, &m_pVBuffer, &stride, &offset);
devcon->IASetIndexBuffer(m_pIBuffer, DXGI_FORMAT_R32_UINT, 0);
devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
devcon->DrawIndexed(m_num_indices, 0, 0);
Nhắc lại: Dữ liệu được tải lên GPU khi I Map, memcpy và Unmap bộ đệm đỉnh, hay nó được tải lên mọi khung hình, khi tôi gọi IASetVertexBuffers?