Код: Выделить всё
#pragma once
#include "GraphicsEngine.h"
float bgcolor[4] = {0.0f,0.0f,0.0f,1.0f};
float angle = -2.0f;
struct VERTEX {
float pos[3];
float color[4];
};
struct Vec3 {
float x, y, z;
Vec3 operator-(const Vec3& v) const { return { x - v.x, y - v.y, z - v.z }; }
Vec3 cross(const Vec3& v) const {
return {
y * v.z - z * v.y,
z * v.x - x * v.z,
x * v.y - y * v.x
};
}
float dot(const Vec3& v) const { return x * v.x + y * v.y + z * v.z; }
float length() const { return std::sqrt(x * x + y * y + z * z); }
Vec3 normalize() const {
float len = length();
return { x / len, y / len, z / len };
}
};
struct matrixbuffer {
float model[4][4];
float view[4][4];
float projection[4][4];
};
matrixbuffer matrices;
VERTEX OurVertices[] =
{
{ {-0.25f, -0.25f, -0.25f}, {1, 0, 0, 1} },
{ {-0.25f, 0.25f, -0.25f}, {0, 1, 0, 1} },
{ { 0.25f, 0.25f, -0.25f}, {0, 0, 1, 1} },
{ { 0.25f, -0.25f, -0.25f}, {1, 1, 0, 1} },
{ {-0.25f, -0.25f, 0.25f}, {1, 0, 0, 1} },
{ {-0.25f, 0.25f, 0.25f}, {0, 1, 0, 1} },
{ { 0.25f, 0.25f, 0.25f}, {0, 0, 1, 1} },
{ { 0.25f, -0.25f, 0.25f}, {1, 1, 0, 1} }
};
DWORD indices[] = {
// Front face
0, 1, 2, 0, 2, 3,
// Back face
4, 6, 5, 4, 7, 6,
// Left face
4, 5, 1, 4, 1, 0,
// Right face
3, 2, 6, 3, 6, 7,
// Top face
1, 5, 6, 1, 6, 2,
// Bottom face
4, 0, 3, 4, 3, 7
};
void SetModelMatrix(float s, float angleX, float angleY, float angleZ,
const Vec3& translate,
float matrix[4][4])
{
float cx = cosf(angleX), sx = sinf(angleX);
float cy = cosf(angleY), sy = sinf(angleY);
float cz = cosf(angleZ), sz = sinf(angleZ);
// Zero-out the entire matrix
memset(matrix, 0, sizeof(float) * 16);
// Row 0:
matrix[0][0] = s * (cz * cy);
matrix[0][1] = s * (cz * sy * sx + sz * cx);
matrix[0][2] = s * (-cz * sy * cx + sz * sx);
matrix[0][3] = translate.x; // Translation X
// Row 1:
matrix[1][0] = s * (-sz * cy);
matrix[1][1] = s * (-sz * sy * sx + cz * cx);
matrix[1][2] = s * (sz * sy * cx + cz * sx);
matrix[1][3] = translate.y; // Translation Y
// Row 2:
matrix[2][0] = s * (sy);
matrix[2][1] = s * (-cy * sx);
matrix[2][2] = s * (cy * cx);
matrix[2][3] = translate.z; // Translation Z
// Row 3:
matrix[3][0] = 0.0f;
matrix[3][1] = 0.0f;
matrix[3][2] = 0.0f;
matrix[3][3] = 1.0f;
}
void SetViewMatrix(float mat[4][4], const Vec3& eye, const Vec3& target, const Vec3& up) {
Vec3 zaxis = (target - eye).normalize();
Vec3 xaxis = up.cross(zaxis).normalize();
Vec3 yaxis = zaxis.cross(xaxis);
memset(mat, 0, sizeof(float) * 16);
mat[0][0] = xaxis.x; mat[0][1] = xaxis.y; mat[0][2] = xaxis.z; mat[0][3] = -xaxis.dot(eye);
mat[1][0] = yaxis.x; mat[1][1] = yaxis.y; mat[1][2] = yaxis.z; mat[1][3] = -yaxis.dot(eye);
mat[2][0] = zaxis.x; mat[2][1] = zaxis.y; mat[2][2] = zaxis.z; mat[2][3] = -zaxis.dot(eye);
mat[3][0] = 0.0f; mat[3][1] = 0.0f; mat[3][2] = 0.0f; mat[3][3] = 1.0f;
}
void setPerspectiveFovLH(float m[4][4], float fov, float aspect, float znear, float zfar)
{
fov = fov * 3.1415962f / 180.0f;
float yscale = 1.0f / tan(fov / 2.0f);
float xscale = yscale / aspect;
m[0][0] = xscale;
m[1][1] = yscale;
m[2][2] = zfar / (zfar - znear);
m[2][3] = 1.0f;
m[3][2] = -znear * zfar / (zfar - znear);
m[3][3] = 0.0f;
}
void setIdentity(float m[4][4])
{
memset(m, 0, sizeof(float) * 16);
m[0][0] = 1;
m[1][1] = 1;
m[2][2] = 1;
m[3][3] = 1;
}
void GraphicsEngine::InitD3D(HWND hWnd, UINT width, UINT height)
{
DXGI_SWAP_CHAIN_DESC scd;
ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
scd.BufferCount = 1;
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
scd.BufferDesc.Width = width;
scd.BufferDesc.Height = height;
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
scd.OutputWindow = hWnd;
scd.SampleDesc.Count = 4;
scd.Windowed = TRUE;
scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
D3D11CreateDeviceAndSwapChain(NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
NULL,
NULL,
NULL,
D3D11_SDK_VERSION,
&scd,
&swapchain,
&dev,
NULL,
&devcon);
ID3D11Texture2D* pBackBuffer;
swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer);
pBackBuffer->Release();
devcon->OMSetRenderTargets(1, &backbuffer, NULL);
D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = (FLOAT)width;
viewport.Height = (FLOAT)height;
devcon->RSSetViewports(1, &viewport);
}
void GraphicsEngine::InitPipeline()
{
ID3DBlob* vsblob, * psblob;
D3DCompileFromFile(L"shader.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, &vsblob, nullptr);
D3DCompileFromFile(L"shader.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, &psblob, nullptr);
dev->CreateVertexShader(vsblob->GetBufferPointer(), vsblob->GetBufferSize(), NULL, &pVS);
dev->CreatePixelShader(psblob->GetBufferPointer(), psblob->GetBufferSize(), NULL, &pPS);
devcon->VSSetShader(pVS, 0, 0);
devcon->PSSetShader(pPS, 0, 0);
D3D11_INPUT_ELEMENT_DESC ied[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
};
dev->CreateInputLayout(ied, 2, vsblob->GetBufferPointer(), vsblob->GetBufferSize(), &pLayout);
devcon->IASetInputLayout(pLayout);
vsblob->Release();
psblob->Release();
}
void GraphicsEngine::InitGraphics()
{
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(VERTEX) * ARRAYSIZE(OurVertices);
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA ms;
ms.pSysMem = OurVertices;
dev->CreateBuffer(&bd, &ms, &pVBuffer);
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(matrixbuffer);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
ms.pSysMem = &matrices;
HRESULT hr = dev->CreateBuffer(&bd, &ms, &pCbuffer);
if (FAILED(hr)) {
OutputDebugString(L"CONSTANT BUFFER DID'T MAKE IT");
return;
}
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(DWORD) * ARRAYSIZE(indices);
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = 0;
ms.pSysMem = indices;
dev->CreateBuffer(&bd, &ms, &pIbuffer);
}
void GraphicsEngine::RenderFrame(int x, int y, int w, int h)
{
if (angle < 6.28f) angle += 0.01f ; else { angle = 0.0f; }
SetModelMatrix(1.0f, angle, angle, 0.0f, { 0.0f, 0.0f, 0.0f }, matrices.model);
SetViewMatrix(matrices.view, {0.0f, 0.0f, 0.5f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f });
setPerspectiveFovLH(matrices.projection, 90.0f, (float)w / (float)h, 0.1f, 100.0f);
//setIdentity(matrices.projection);
devcon->UpdateSubresource(pCbuffer, NULL, NULL, &matrices, NULL, NULL);
devcon->ClearRenderTargetView(backbuffer, bgcolor);
UINT stride = sizeof(VERTEX);
UINT offset = 0;
devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);
devcon->IASetIndexBuffer(pIbuffer, DXGI_FORMAT_R32_UINT, 0);
devcon->VSSetConstantBuffers(0, 1, &pCbuffer);
//devcon->PSSetConstantBuffers(0, 1, &pCbuffer);
devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
devcon->DrawIndexed(ARRAYSIZE(indices), 0, 0);
swapchain->Present(1, 0);
}
void GraphicsEngine::CleanD3D(void)
{
swapchain->SetFullscreenState(FALSE, NULL);
pLayout->Release();
pVS->Release();
pPS->Release();
pVBuffer->Release();
pCbuffer->Release();
pIbuffer->Release();
swapchain->Release();
backbuffer->Release();
dev->Release();
devcon->Release();
}
< /code>
функциональный файл заголовочного файла < /h1>
#pragma once
#include "Windows.h"
#include
#include
#include
#include
class GraphicsEngine
{
public:
void InitD3D(HWND hWnd, UINT width, UINT height);
void InitPipeline();
void InitGraphics();
void RenderFrame(int x, int y, int w, int h);
void CleanD3D(void);
private:
IDXGISwapChain* swapchain;
ID3D11Device* dev;
ID3D11DeviceContext* devcon;
ID3D11RenderTargetView* backbuffer;
ID3D11InputLayout* pLayout;
ID3D11VertexShader* pVS;
ID3D11PixelShader* pPS;
ID3D11Buffer* pVBuffer;
ID3D11Buffer* pCbuffer;
ID3D11Buffer* pIbuffer;
};
< /code>
shader file < /h1>
struct VOut
{
float4 position : SV_POSITION;
float4 color : COLOR;
};
cbuffer MatrixBuffer : register(b0)
{
float4x4 model;
float4x4 view;
float4x4 proj;
};
VOut VShader(float3 position : POSITION, float4 color : COLOR)
{
VOut output;
// Convert the 3D position to a homogeneous 4D vector.
float4 pos = float4(position, 1.0f);
// Transform the position by the model, view, and projection matrices.
pos = mul(pos, model);
pos = mul(pos, view);
pos = mul(pos, proj);
output.position = pos;
output.color = color;
return output;
}
float4 PShader(VOut input) : SV_TARGET
{
return input.color;
}
без проектной матрицы (или при установке на Идентификация) Вращающийся куб рендеринг просто хорош , когда добавляется проекционная матрица, он не работает, не может видеть куб. Я пробовал изменить значения Eye - z (местоположение камеры) и пытается использовать другие значения.
Используется ручка LH и RH в перспективе и матрице просмотра, ничего не работает < /strong> < /p>
Это изображение данных отладки см. Значения x, y, z и w в положении SV (вывод), которые кажутся неправильными
(https://i.sstatic.net/51ipepwh.png)
Подробнее здесь: https://stackoverflow.com/questions/794 ... rectx-11-c
Мобильная версия