응애맘마조
색상 구체 본문
RGB 색상표처럼 자연스러운 색상으로 되어있는 구체를 만드는 것이 과제였습니다.
#include "framework.h"
Mesh::Mesh()
{
vertexType = VertexType::PC;
primitiveTopology = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
int seta = 360;
int pi = 180;
vertexCount = seta * pi;
indexCount = vertexCount * 6;
byteWidth = sizeof(VertexPC);
VertexPC* Vertex = new VertexPC[vertexCount];
indices = new UINT[indexCount];
for (int i = 0; i < pi; i++)
{
for (int j = 0; j < seta; j++)
{
Vertex[i * seta + j].position = Vector3(sin(i * TORADIAN) * cos(j * TORADIAN),
cos(i * TORADIAN), sinf(i * TORADIAN) * sin(j * TORADIAN));
Vertex[i * seta + j].color.x
= (Vertex[i * seta + j].position.x +1)/2.0f * 1.7f;
Vertex[i * seta + j].color.y
= (Vertex[i * seta + j].position.y + 1) / 2.0f * 1.7f;
Vertex[i * seta + j].color.z
= (Vertex[i * seta + j].position.z + 1) / 2.0f * 1.7f;
}
}
for (int i = 0; i < pi; i++)
{
for (int j = 0; j < seta ; j++)
{
int rect = i * seta + j;
indices[rect * 6 + 0] = rect;
indices[rect * 6 + 1] = rect + seta + 1;
indices[rect * 6 + 2] = rect + seta;
indices[rect * 6 + 3] = rect;
indices[rect * 6 + 4] = rect + 1;
indices[rect * 6 + 5] = rect + seta + 1;
}
}
vertices = Vertex;
//CreateVertexBuffer
{
D3D11_BUFFER_DESC desc;
desc = { 0 };
desc.Usage = D3D11_USAGE_DEFAULT;
desc.ByteWidth = byteWidth * vertexCount;
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
D3D11_SUBRESOURCE_DATA data = { 0 };
data.pSysMem = vertices;
HRESULT hr = D3D->GetDevice()->CreateBuffer(&desc, &data, &vertexBuffer);
assert(SUCCEEDED(hr));
}
//Create Index Buffer
{
D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
desc.ByteWidth = sizeof(UINT) * indexCount;
desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
D3D11_SUBRESOURCE_DATA data = { 0 };
data.pSysMem = indices;
HRESULT hr = D3D->GetDevice()->CreateBuffer(&desc, &data, &indexBuffer);
assert(SUCCEEDED(hr));
}
}
Mesh::~Mesh()
{
}
void Mesh::Set()
{
UINT offset = 0;
D3D->GetDC()->IASetVertexBuffers(0,
1,
&vertexBuffer,
&byteWidth,
&offset);
D3D->GetDC()->IASetPrimitiveTopology
(primitiveTopology);
D3D->GetDC()->IASetIndexBuffer(indexBuffer, DXGI_FORMAT_R32_UINT, 0);
}
void Mesh::LoadFile(string file)
{
this->file = file;
BinaryReader in;
wstring path = L"../Contents/Mesh/" + Util::ToWString(file);
in.Open(path);
//읽기전
switch (vertexType)
{
case VertexType::P:
if (vertices)delete[](VertexP*)vertices;
break;
case VertexType::PC:
if (vertices)delete[](VertexPC*)vertices;
break;
case VertexType::PCN:
if (vertices)delete[](VertexPCN*)vertices;
break;
case VertexType::PTN:
if (vertices)delete[](VertexPTN*)vertices;
break;
case VertexType::MODEL:
if (vertices)delete[](VertexModel*)vertices;
break;
case VertexType::TERRAIN:
if (vertices)delete[](VertexTerrain*)vertices;
break;
case VertexType::PT:
if (vertices)delete[](VertexPT*)vertices;
break;
case VertexType::PS:
if (vertices)delete[](VertexPS*)vertices;
break;
case VertexType::PSV:
if (vertices)delete[](VertexPSV*)vertices;
break;
}
vertexType = (VertexType)in.UInt();
primitiveTopology = (D3D_PRIMITIVE_TOPOLOGY)in.UInt();
byteWidth = in.UInt();
vertexCount = in.UInt();
indexCount = in.UInt();
SafeDeleteArray(indices);
indices = new UINT[indexCount];
//읽고난후
switch (vertexType)
{
case VertexType::P:
{
vertices = new VertexP[vertexCount];
VertexP* vertex = (VertexP*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
vertex[i].position = in.vector3();
}
break;
}
case VertexType::PC:
{
vertices = new VertexPC[vertexCount];
VertexPC* vertex = (VertexPC*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
vertex[i].position = in.vector3();
vertex[i].color = in.color3f();
}
break;
}
case VertexType::PCN:
{
vertices = new VertexPCN[vertexCount];
VertexPCN* vertex = (VertexPCN*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
vertex[i].position = in.vector3();
vertex[i].color = in.color3f();
vertex[i].normal = in.vector3();
}
break;
}
case VertexType::PTN:
{
vertices = new VertexPTN[vertexCount];
VertexPTN* vertex = (VertexPTN*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
vertex[i].position = in.vector3();
vertex[i].uv = in.vector2();
vertex[i].normal = in.vector3();
}
break;
}
case VertexType::MODEL:
{
vertices = new VertexModel[vertexCount];
VertexModel* vertex = (VertexModel*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
vertex[i].position = in.vector3();
vertex[i].uv = in.vector2();
vertex[i].normal = in.vector3();
vertex[i].tangent = in.vector3();
vertex[i].indices = in.vector4();
vertex[i].weights = in.vector4();
}
break;
}
case VertexType::TERRAIN:
{
vertices = new VertexTerrain[vertexCount];
VertexTerrain* vertex = (VertexTerrain*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
vertex[i].position = in.vector3();
vertex[i].uv = in.vector2();
vertex[i].normal = in.vector3();
vertex[i].weights = in.Float();
}
break;
}
case VertexType::PT:
{
vertices = new VertexPT[vertexCount];
VertexPT* vertex = (VertexPT*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
vertex[i].position = in.vector3();
vertex[i].uv = in.vector2();
}
break;
}
case VertexType::PS:
{
vertices = new VertexPS[vertexCount];
VertexPS* vertex = (VertexPS*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
vertex[i].position = in.vector3();
vertex[i].size = in.vector2();
}
break;
}
case VertexType::PSV:
{
vertices = new VertexPSV[vertexCount];
VertexPSV* vertex = (VertexPSV*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
vertex[i].position = in.vector3();
vertex[i].size = in.vector2();
vertex[i].velocity = in.vector3();
}
break;
}
}
for (UINT i = 0; i < indexCount; i++)
{
indices[i] = in.UInt();
}
in.Close();
SafeRelease(vertexBuffer);
SafeRelease(indexBuffer);
//CreateVertexBuffer
{
D3D11_BUFFER_DESC desc;
desc = { 0 };
desc.Usage = D3D11_USAGE_DEFAULT;
desc.ByteWidth = byteWidth * vertexCount;
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
D3D11_SUBRESOURCE_DATA data = { 0 };
data.pSysMem = vertices;
HRESULT hr = D3D->GetDevice()->CreateBuffer(&desc, &data, &vertexBuffer);
assert(SUCCEEDED(hr));
}
//Create Index Buffer
{
D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
desc.ByteWidth = sizeof(UINT) * indexCount;
desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
D3D11_SUBRESOURCE_DATA data = { 0 };
data.pSysMem = indices;
HRESULT hr = D3D->GetDevice()->CreateBuffer(&desc, &data, &indexBuffer);
assert(SUCCEEDED(hr));
}
}
void Mesh::SaveFile(string file)
{
this->file = file;
BinaryWriter out;
wstring path = L"../Contents/Mesh/" + Util::ToWString(file);
out.Open(path);
out.UInt((UINT)vertexType);
out.UInt((UINT)primitiveTopology);
out.UInt(byteWidth);
out.UInt(vertexCount);
out.UInt(indexCount);
switch (vertexType)
{
case VertexType::P:
{
VertexP* vertex = (VertexP*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
out.vector3(vertex[i].position);
}
break;
}
case VertexType::PC:
{
VertexPC* vertex = (VertexPC*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
out.vector3(vertex[i].position);
out.color3f(vertex[i].color);
}
break;
}
case VertexType::PCN:
{
VertexPCN* vertex = (VertexPCN*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
out.vector3(vertex[i].position);
out.color3f(vertex[i].color);
out.vector3(vertex[i].normal);
}
break;
}
case VertexType::PTN:
{
VertexPTN* vertex = (VertexPTN*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
out.vector3(vertex[i].position);
out.vector2(vertex[i].uv);
out.vector3(vertex[i].normal);
}
break;
}
case VertexType::MODEL:
{
VertexModel* vertex = (VertexModel*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
out.vector3(vertex[i].position);
out.vector2(vertex[i].uv);
out.vector3(vertex[i].normal);
out.vector3(vertex[i].tangent);
out.vector4(vertex[i].indices);
out.vector4(vertex[i].weights);
}
break;
}
case VertexType::TERRAIN:
{
VertexTerrain* vertex = (VertexTerrain*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
out.vector3(vertex[i].position);
out.vector2(vertex[i].uv);
out.vector3(vertex[i].normal);
out.Float(vertex[i].weights);
}
break;
}
case VertexType::PT:
{
VertexPT* vertex = (VertexPT*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
out.vector3(vertex[i].position);
out.vector2(vertex[i].uv);
}
break;
}
case VertexType::PS:
{
VertexPS* vertex = (VertexPS*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
out.vector3(vertex[i].position);
out.vector2(vertex[i].size);
}
break;
}
case VertexType::PSV:
{
VertexPSV* vertex = (VertexPSV*)vertices;
for (UINT i = 0; i < vertexCount; i++)
{
out.vector3(vertex[i].position);
out.vector2(vertex[i].size);
out.vector3(vertex[i].velocity);
}
break;
}
}
for (UINT i = 0; i < indexCount; i++)
{
out.UInt(indices[i]);
}
out.Close();
}
코드입니다. 각각의 사각형 위치에 색상 값을 대입하는 것입니다.
실행 영상입니다.
읽어주셔서 감사합니다.