grafika-lights kezdő

This commit is contained in:
Wiesner András 2020-04-24 17:46:23 +02:00
parent c9fcc60c35
commit b1cba59ea8
7 changed files with 82 additions and 10 deletions

View File

@ -141,7 +141,7 @@ namespace eg3d {
LOG("Creating descriptor heaps!"); LOG("Creating descriptor heaps!");
// ---------- RTV // ---------- RTV
D3D12_DESCRIPTOR_HEAP_DESC hD = {}; D3D12_DESCRIPTOR_HEAP_DESC hD = {};
hD.NumDescriptors = cSwapChainBufferCount; hD.NumDescriptors = cSwapChainBufferCount;
hD.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; hD.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
hD.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; hD.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
@ -363,6 +363,7 @@ namespace eg3d {
{ {
inputElements = { inputElements = {
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}, {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}
//{"COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0} //{"COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}
// TODO további elemek létrehozása // TODO további elemek létrehozása
}; };
@ -418,7 +419,7 @@ namespace eg3d {
psoD.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); psoD.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT);
//psoD.RasterizerState.CullMode = D3D12_CULL_MODE_NONE; //psoD.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;
psoD.RasterizerState.FillMode = D3D12_FILL_MODE_WIREFRAME; //psoD.RasterizerState.FillMode = D3D12_FILL_MODE_WIREFRAME;
psoD.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT); psoD.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
psoD.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT); psoD.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT);
psoD.SampleMask = UINT_MAX; psoD.SampleMask = UINT_MAX;

View File

@ -16,7 +16,7 @@ eg3d::Entity::Entity(const Entity& other): Geometry(other.device)
} }
void eg3d::Entity::loadDefaults() { void eg3d::Entity::loadDefaults() {
mConstBuf.color = { 1.0f, 1.0f, 1.0f, 1.0f }; mConstBuf.color = { 1.0f, 1.0f, 1.0f, 1.0f };
XMStoreFloat4x4(&mConstBuf.worldMatrix, XMMatrixIdentity()); // egységmátrix betöltése a világ-mátrixba XMStoreFloat4x4(&mConstBuf.worldMatrix, XMMatrixIdentity()); // egységmátrix betöltése a világ-mátrixba
mSRTProps.loadDefaults(); mSRTProps.loadDefaults();

View File

@ -141,11 +141,20 @@ namespace eg3d {
STLTriangle triangle; STLTriangle triangle;
inFile.read(reinterpret_cast<char *>(&triangle), 50); // egy háromszög betöltése inFile.read(reinterpret_cast<char *>(&triangle), 50); // egy háromszög betöltése
for (auto& vertex : triangle.vertices) for (auto& stlVertex : triangle.vertices)
{ {
if (pIAD != nullptr) { if (pIAD != nullptr) {
pIAD(vertex); pIAD(stlVertex);
} }
// koordináták másolása
Vertex vertex = stlVertex;
// normálvektorok hozzárendelése TODO szebben!
vertex.nx = triangle.normal.x;
vertex.ny = triangle.normal.y;
vertex.nz = triangle.normal.z;
vertices.emplace_back(vertex); vertices.emplace_back(vertex);
} }

View File

@ -1,7 +1,7 @@
struct VSInput // vertex shader bemeneti struktúra struct VSInput // vertex shader bemeneti struktúra
{ {
float3 position_D : POSITION; float3 position_D : POSITION;
//float3 color : COLOR; float3 normal : NORMAL;
}; };
struct VSOutput // vertex shader kimeneti struktúra struct VSOutput // vertex shader kimeneti struktúra
@ -29,6 +29,8 @@ VSOutput vs_main(VSInput input)
output.position_H = mul(float4(input.position_D, 1.0), mul(worldMatrix, mul(viewMatrix, projMatrix))); output.position_H = mul(float4(input.position_D, 1.0), mul(worldMatrix, mul(viewMatrix, projMatrix)));
output.color = color; output.color = color;
// TODO fények
return output; return output;
} }

View File

@ -17,4 +17,17 @@ eg3d::Vertex::Vertex(std::initializer_list<float> initList) {
y = pParams[1]; y = pParams[1];
z = pParams[2]; z = pParams[2];
} }
}
eg3d::Vertex::Vertex (const Vertex& other)
{
// koordináták másolása
x = other.x;
y = other.y;
z = other.z;
// normálvektor másolása
nx = other.nx;
ny = other.ny;
nz = other.nz;
} }

View File

@ -13,11 +13,13 @@ namespace eg3d {
struct Vertex { struct Vertex {
public: public:
float x, y, z; // koordináták float x, y, z; // koordináták
float nx, ny, nz; // normálvektor koordinátái
// float nx, ny, nz; // normálvektorok TODO // float nx, ny, nz; // normálvektorok TODO
Vertex(); // default konstruktor Vertex(); // default konstruktor
Vertex(const DirectX::XMFLOAT3 xmf3); // betöltés XMFLOAT3-ból Vertex(const DirectX::XMFLOAT3 xmf3); // betöltés XMFLOAT3-ból
Vertex(std::initializer_list<float> initList); // konstruktor struktúraszerû inicializációval Vertex(std::initializer_list<float> initList); // konstruktor struktúraszerû inicializációval
Vertex(const Vertex& other); // másolókonstruktor
}; };
} }

View File

@ -14,6 +14,7 @@
#include "Timer.h" #include "Timer.h"
#include "Geometry.h" #include "Geometry.h"
#include "Entity.h" #include "Entity.h"
#include <random>
// FPS-mérés // FPS-mérés
size_t gFrames = 0; size_t gFrames = 0;
@ -31,6 +32,7 @@ using namespace eg3d;
Cam gCam; // virtuális kamera Cam gCam; // virtuális kamera
DrawablePool gDrawables; // geometriák halmaza DrawablePool gDrawables; // geometriák halmaza
DrawablePool gTeapots;
// ÁLLAPOTVÁLTOZÓK // ÁLLAPOTVÁLTOZÓK
bool gMoveForward = false; bool gMoveForward = false;
@ -83,9 +85,44 @@ void mouseCB(EventHandlerCBData * pCBData)
pTeapot->loadBinarySTL("assets/utahteapot.stl", ImportAdapters::IAD_SwapYZ_RH); pTeapot->loadBinarySTL("assets/utahteapot.stl", ImportAdapters::IAD_SwapYZ_RH);
pTeapot->setEntitySRT(srtProps); pTeapot->setEntitySRT(srtProps);
pTeapot->setColor(0.8f, 0.8f, 0.1f); // szín random generálása
std::random_device rndDevice;
std::uniform_real_distribution<float> dist(0.0f, 1.0f);
float r = dist(rndDevice);
float g = dist(rndDevice);
float b = dist(rndDevice);
gDrawables.push_back(pTeapot); pTeapot->setColor(r, g, b);
gTeapots.push_back(pTeapot);
}
void randomizeColor()
{
std::random_device rndDevice;
std::uniform_real_distribution<float> dist(0.0f, 1.0f);
for (auto teapot : gTeapots)
{
auto pTeapot = static_cast<Entity *>(teapot.get());
float r = dist(rndDevice);
float g = dist(rndDevice);
float b = dist(rndDevice);
pTeapot->setColor(r, g, b);
}
}
void lMouseCB(EventHandlerCBData * pCbData)
{
randomizeColor();
}
void timedRandomizeColor(eg3d::Timer *pTimer, const double *pTrigTimeElapsed, void *ptr)
{
randomizeColor();
} }
void moveForward_H(EventHandlerCBData * pCBData) void moveForward_H(EventHandlerCBData * pCBData)
@ -141,6 +178,7 @@ void regEventHandlers(EventHandler * pEH)
// kattintás // kattintás
pEH->regMouseCB(mouseCB, nullptr, { ET_RMouseDown }); pEH->regMouseCB(mouseCB, nullptr, { ET_RMouseDown });
pEH->regMouseCB(lMouseCB, nullptr, { ET_LMouseDown });
// mozgás // mozgás
pEH->regKeyCB('W', moveForward_H, nullptr, { ET_KeyDown, ET_KeyUp }); // előre pEH->regKeyCB('W', moveForward_H, nullptr, { ET_KeyDown, ET_KeyUp }); // előre
@ -178,7 +216,10 @@ int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszA
TimerCallbackData timerCBData; TimerCallbackData timerCBData;
timerCBData.callBackFn = CB_FPSaux; timerCBData.callBackFn = CB_FPSaux;
timerCBData.ptr = nullptr; timerCBData.ptr = nullptr;
gTmr1s.reg(timerCBData); gTmr1s.reg(timerCBData);
timerCBData.callBackFn = timedRandomizeColor;
gTmr1s.reg(timerCBData);
std::vector<Vertex> vertices = { // vertexek std::vector<Vertex> vertices = { // vertexek
{ -0.5f, -0.5f, 1.0f }, { -0.5f, -0.5f, 1.0f },
@ -250,7 +291,11 @@ int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszA
std::string winTitle = "Open world game - P: (" + std::to_string(position.x) + "; " + std::to_string(position.y) + "; " + std::to_string(position.z) + "), " + std::string winTitle = "Open world game - P: (" + std::to_string(position.x) + "; " + std::to_string(position.y) + "; " + std::to_string(position.z) + "), " +
"yaw: " + std::to_string(yaw) + "°, pitch: " +std::to_string(pitch) + "° ---- " + gFPS_FT_msg; "yaw: " + std::to_string(yaw) + "°, pitch: " +std::to_string(pitch) + "° ---- " + gFPS_FT_msg;
win.setTitle(winTitle); win.setTitle(winTitle);
win.Draw(gDrawables); // kirajzolás
DrawablePool mergedDrawables = gDrawables;
mergedDrawables.insert(mergedDrawables.end(), gTeapots.begin(), gTeapots.end());
win.Draw(mergedDrawables); // kirajzolás
gFrames++; // képkockaszám léptetése gFrames++; // képkockaszám léptetése
} }