◤ 2022๋…„ 7์›” 31์ผ ์ผ์š”์ผ

● ์–ธ๋ฆฌ์–ผ ์—”์ง„์œผ๋กœ ๋งŒ๋“  ๋ฎค์ง ๋น„์ฅฌ์–ผ๋ผ์ด์ €

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.









◤ 2022๋…„ 7์›” 29์ผ ๊ธˆ์š”์ผ

● DirectXTex ์‚ฌ์šฉ

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.







๊นƒํ—ˆ๋ธŒ์— ๊ณต๊ฐœ๋œ ์†Œ์Šค๋ฅผ ๋‹ค์šด ๋ฐ›์•„ ์ด์šฉํ•œ๋‹ค
github.com/microsoft/directxtex ์ ‘์†ํ•˜์—ฌ ์ฝ”๋“œํŒŒ์ผ์„ ZIP์œผ๋กœ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค.



์••์ถ•์„ ํ’€๊ณ  DirectXTex_Desktop_2022.sln ์†”๋ฃจ์…˜ ํŒŒ์ผ์„ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค๋กœ ์—ด๊ณ  ๋นŒ๋“œ๋ฅผ ํ•ด์ค€๋‹ค.




๋นŒ๋“œ๊ฐ€ ์ž˜ ๋๋‚˜๋ฉด ์œ„์˜ ํด๋”์—์„œ DirectXTex.lib ํŒŒ์ผ์„ ์ด์šฉ์„ ํ•  ๊ฑด๋ฐ..
 




์—ฌ๊ธฐ์— ๋ณต์‚ฌ๋ฅผ ํ•ด์ฃผ๊ณ 



ํ—ค๋” ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์„œ..




Include ํด๋”๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ณต์‚ฌํ•ด ์ฃผ์—ˆ๋‹ค


์—”์ง„ ์†์„ฑ์—์„œ DLL๊ณผ LIB ํŒŒ์ผ์„ ๋ถˆ์–ด์˜ฌ ํŒŒ์ผ์„ ์„ค์ •ํ•ด์ฃผ๊ณ ..



ํด๋” ๊ฒฝ๋กœ ์„ค์ •๋„ ํ•ด์ค€๋‹ค



์†์„ฑ์—์„œ C/C++์€ ํ—ค๋” ํŒŒ์ผ์„ ์—ฐ๊ฒฐ, ํฌํ•จํ•ด์ค„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์„ค์ •ํ•ด ์ค€๋‹ค




C/C++ ์„ค์ •์€ ํ—ค๋”ํŒŒ์ผ, ๋ง์ปค๋Š” dll. lib ์—ฐ๊ฒฐ ์„ค์ •.










ํ”„๋กœ์ ํŠธ์— ํฌํ•จ ์‹œํ‚ฌ ๋•Œ๋Š” ๋งˆ์šฐ์Šค๋กœ ํŒŒ์ผ์„ ๋Œ์–ด๋‹ค๊ฐ€ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ํด๋” ํŠธ๋ฆฌ ์ฐฝ์— ๋“œ๋ž˜๊ทธ&๋“œ๋กญ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.



ํ…์Šค์ณ ํŒŒ์ผ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•œ ID3D11ShaderResourceView ์ด์šฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.



์ฝ”๋“œ ์˜ˆ์ œ.

//by JSHong CodeBlock//
#include "Core.h"
#include "TextureLoader.h"
#include <DirectXTex.h>
#include <Utility/STLException.h>

namespace STL
{
std::unordered_map<std::wstring, ID3D11ShaderResourceView*> TextureLoader::textureMap;

ID3D11ShaderResourceView* TextureLoader::CreateShaderResourceView(ID3D11Device* device, const std::wstring& filename)
{
auto search = textureMap.find(filename);
if (search != textureMap.end())
{
return search->second;
}

std::wstring extension = filename.substr(filename.find_last_of(TEXT(".")) + 1);
std::transform(extension.begin(), extension.end(), extension.begin(), tolower);

static auto basePath = std::filesystem::current_path().parent_path();

auto finalPath = basePath;
finalPath /= "Content\\Textures";
finalPath /= filename;

DirectX::ScratchImage image;
HRESULT hr = E_FAIL;
if (extension == TEXT("tga") || extension == TEXT("targa"))
{
hr = DirectX::LoadFromTGAFile(
finalPath.c_str(),
nullptr,
image
);
}
else
{
hr = DirectX::LoadFromWICFile(
finalPath.c_str(),
DirectX::WIC_FLAGS_NONE,
nullptr,
image
);
}

ThrowIfFailed(hr, "Failed to load scratch image.");

ID3D11Texture2D* texture = nullptr;
hr = DirectX::CreateTexture(
device,
image.GetImages(),
image.GetImageCount(),
image.GetMetadata(),
reinterpret_cast<ID3D11Resource**>(&texture)
);

ThrowIfFailed(hr, "Failed to create texture.");

D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
memset(&srvDesc, 0, sizeof(srvDesc));
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = 1;
srvDesc.Format = image.GetMetadata().format;

ID3D11ShaderResourceView* shaderResourceView = nullptr;
hr = device->CreateShaderResourceView(
texture,
&srvDesc,
&shaderResourceView
);

SafeRelease(texture);
ThrowIfFailed(hr, "Failed to shader resource view.");

textureMap.insert({ filename, shaderResourceView });

return shaderResourceView;
}

void TextureLoader::Release()
{
for (auto pair : textureMap)
{
SafeRelease(pair.second);
}
}
}


# ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ ์ฑ… (http://www.yes24.com/Product/Goods/7366949)



◤ 2022๋…„ 7์›” 28์ผ ๋ชฉ์š”์ผ

● ๊นƒํ—ˆ๋ธŒ ๊ณต๋ถ€ํ•ด๋ณด๊ธฐ

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.







# TDD ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ
# DDD ๋„๋ฉ”์ธ ์ฃผ๋„ ๊ฐœ๋ฐœ(์„ค๊ณ„)
    - ์˜ˆ์ „์— ์ธ๊ธฐ์˜€๋‹ค๊ฐ€ ์‚ฌ์žฅ๋˜๋‹ค๊ฐ€ ๋‹ค์‹œ ๋– ์˜ค๋ฅด๋Š” ๋ฐฉ์‹

# ๊นƒํ—ˆ๋ธŒ ๋ฌด๋ฃŒ ๊ฐ•์ขŒ (https://www.inflearn.com/course/30%EB%B6%84-%EC%8B%9C%EC%A6%8C4-%EA%B9%83%ED%97%88%EB%B8%8C)

#ํ•œ๋น› ์ „์ž์ฑ… https://www.hanbit.co.kr/realtime/



◤ 2022๋…„ 7์›” 27์ผ ์ˆ˜์š”์ผ

● ๊นƒํ—ˆ๋ธŒ ์ฒซ ์‚ฌ์šฉ

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.





# MS์˜ COM๊ตฌ์กฐ๋Š” ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ์—์„œ ํ†ต์ผํ™”๋ฅผ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ.

# ์ˆ™์ œ Effective Modern C++ ํ•ญ๋ชฉ 2 (๋งค์ฃผ ๊ธˆ์š”์ผ ๋ฐœํ‘œ)

# GitHub ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ ์„ค์ • ๋ฐ ๋™๊ธฐํ™”
    - GitHub Desktop ์„ค์น˜ ๋ฐ ์„ค์ •
    - ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ
    - .gitignore ํŒŒ์ผ ์ˆ˜์ •

◤ 2022๋…„ 7์›” 25์ผ ์›”์š”์ผ

● 7์›” 25์ผ ์›”์š”์ผ

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.





# ์–ธ๋ฆฌ์–ผ ๋นŒ๋“œ ํˆด (https://docs.unrealengine.com/4.27/ko/ProductionPipelines/BuildTools/)
    - ๋นŒ๋“œ ํˆด ๊ณต๋ถ€ํ•ด์„œ ์˜ค๋ธŒ์ ํŠธ ๋งŒ๋“ค์–ด ๋ณผ ์ˆ˜ ์žˆ์Œ

# c++ unicode (ํ…์ŠคํŠธ ์ธ์ฝ”๋”ฉ)
https://www.youtube.com/watch?v=tOHnXt3Ycfo

#๋น„์ฅฌ์–ผ ์ŠคํŠœ๋””์˜ค ์ฝ”๋“œ (์—๋””ํ„ฐ) ์‚ฌ์šฉํ•ด ๋ณผ๊นŒ?

# ์†”๋ฃจ์…˜ ์„ค์ •
    - 'STL_RenderEngineV2'์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ์†”๋ฃจ์…˜ ์ƒ์„ฑ์„ ํ•ด์ฃผ๊ณ 

    - 'Game'๊ณผ 'Engine'์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ์„ ํ•ด์ฃผ์—ˆ๋‹ค.

    - Game ๋ฐ Engine ํ”„๋กœ์ ํŠธ ์†์„ฑ์—์„œ [๊ตฌ์„ฑ ์†์„ฑ]-[์ผ๋ฐ˜] ์†์„ฑ์—์„œ '์ถœ๋ ฅ ๋””๋ ‰ํ„ฐ๋ฆฌ'์™€ '์ค‘๊ฐ„ ๋””๋ ‰ํ„ฐ๋ฆฌ' ์„ค์ •์„ ํ•ด์ฃผ์—ˆ๋‹ค

    - Engine ํ”„๋กœ์ ํŠธ ์†์„ฑ์—์„œ๋Š” [์ผ๋ฐ˜]-[๊ตฌ์„ฑ ํ˜•์‹] ์—์„œ '์‹คํ–‰ํŒŒ์ผ'์„ '๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ'๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค

    - Engine ํ”„๋กœ์ ํŠธ ์†์„ฑ์—์„œ [๊ตฌ์„ฑ์†์„ฑ]-[C/C++]-[์ „์ฒ˜๋ฆฌ๊ธฐ] ์ „์ฒ˜๋ฆฌ๊ธฐ ์ •์˜์— ENIGNE_BUILD_DLL;๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค

    - Game์ด๋ž€ ํ”„๋กœ์ ํŠธ์™€ Engine์ด๋ž€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค

    - Engine์—๋Š” Sourceํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  Core ํด๋”์™€ Device ํด๋”๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค (์ด๋•Œ ํ•„ํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ ๋กœ์ปฌ ํด๋”๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•จ ์ฃผ์˜!)

    - Core์—๋Š” Core.cpp ์™€ Core.h ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ 

    - Device์—๋Š” Window.cpp์™€ Window.h ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค

    - ์ด๋•Œ Device ์šฐํด๋ฆญ ํ›„ ํด๋ž˜์Šค ์ถ”๊ฐ€๋กœ 'Widnows'๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ƒ์„ฑํ•˜๊ณ 

    - Windows.cpp ํŒŒ์ผ๊ณผ Windows.h ํŒŒ์ผ์€ ๋งˆ์šฐ์Šค๋กœ ๋Œ์–ด๋‹ค๊ฐ€ Device ํด๋”๋กœ ์˜ฎ๊ฒจ์ฃผ์—ˆ๋‹ค

    - Lib ์—ฐ๋™์„ ์œ„ํ•ด '์„ค์ •'์„ ํ•ด์ฃผ๊ณ 

    - Game ์†์„ฑ์—์„œ๋Š” ์ฐธ์กฐ ์ถ”๊ฐ€๋ฅผ 'Engine'์œผ๋กœ ํ•ด์ฃผ์—ˆ๋‹ค

    - Game ์†์„ฑ [๋งํฌ]์—์„œ ์ถ”๊ฐ€ ์ข…์†์„ฑ ์„ค์ •์„ ํ•˜์—ฌ Engine.lib๋ฅผ ๋ช…์‹œํ•ด์ฃผ์—ˆ๋‹ค

    - Game ์†์„ฑ [์ผ๋ฐ˜]-[์ถ”๊ฐ€ ํฌํ•จ ๋””๋ ‰ํ† ๋ฆฌ]์—์„œ '$(SolutionDir)Engine\Source\'๋ฅผ ๋ช…์‹œํ•ด์ฃผ์—ˆ๋‹ค




















# Engine.Lib ํŒŒ์ผ ๊ตฌ์กฐ
    - LoadLibrary("MyDLL") DLL์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค






์›๋ž˜ ๋”ฐ๋กœ ๋นŒ๋“œ ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ฐธ์กฐ ์„ค์ •์„ ํ•ด์ฃผ๋ฉด ์ž๋™์œผ๋กœ Engine ๋นŒ๋“œ ๋‹ค์‹œ ํ•ด์ฃผ๊ณ  Game ๋นŒ๋“œ๋ฅผ ํ•ด์ค€๋‹ค (์ž๋™ํ™”)





๊ฒฐ๊ณผ


๋นŒ๋“œ๋ฅผ 2๊ฐœ ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค!






๊ฐ€๋” ์‹ค์ œ ์˜ค๋ฅ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ 'warning'์ด ๊ท€์ฐฎ์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ ๊ฒฝ๊ณ  ๋ฉ”์„ธ์ง€๋ฅผ ๊บผ์ค€๋‹ค. (ใ…‹ใ…‹ใ…‹)





์™ธ๋ถ€์—์„œ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ• ๋•Œ ๋งˆ์šฐ์Šค๋กœ ๋Œ์–ด๋‹ค ๋†“์•„๋„ ๋˜์ง€๋งŒ ์ถ”๊ฐ€ [๊ธฐ์กด ํ•ญ๋ชฉ] ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ฐพ์•„ import๋ฅผ ํ•˜๋Š”๊ฒŒ ์•ˆ์ „(!)ํ•˜๋‹ค.





ํ—ˆ๋ฌดํ•˜์ง€๋งŒ... ์–ด์จŒ๋“  ์ฐฝ ํ•˜๋‚˜ ๋‹ฌ๋ž‘ ๋„์šฐ๊ธฐ ์„ฑ๊ณต ใ… ใ… 




# ์ˆ™์ œ '์ด๋“์šฐ์˜ ๊ฒŒ์ž„ ์ˆ˜ํ•™ ๋ธ”๋กœ๊ทธ' 16๋ฒˆ๊นŒ์ง€ ์ฝ์–ด๋ณด๊ธฐ






◤ 2022๋…„ 7์›” 22์ผ ๊ธˆ์š”์ผ

● ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์„ค์ •

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.





 






๋ฐฐ์น˜ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ง์ปค์˜ ์—ญํ• ์„ ๋Œ€์‹  ํ•ด์ค€๋‹ค


//๋นŒ๋“œ ์ „ ์ด๋ฒคํŠธ not exist "$(OutDir)..\Application" mkdir "$(OutDir)..\Application" if not exist "$(SolutionDir)Lib\Engine\$(Platform)\$(Configuration)" mkdir "$(SolutionDir)Lib\Engine\$(Platform)\$(Configuration)" //๋นŒ๋“œ ํ›„ ์ด๋ฒคํŠธ copy "$(OutDir)Engine.dll" "$(Outdir)..\Application\" copy "$(OutDir)Engine.lib" "$(SolutionDir)Lib\Engine\$(Platform)\$(Configuration)\" Engine.vcxproj ํŒŒ์ผ(xml)์„ ์—ด์–ด์„œ ๋ฉ”๋ชจ์žฅ์—์„œ ์ˆ˜์ •ํ•ด์ค˜๋„ ๋œ๋‹ค.




● ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ์•Œ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ ๋‚ ๋•Œ?

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.





Application 

    - Pixelshder.hlsl ๋งŒ๋“ค๊ณ 

    - VertexShader.hlsl ๋งŒ๋“ค๊ณ 


Engine

    - Test.h ๋งŒ๋“ค๊ณ 

    - Test.cpp ๋งŒ๋“ค๊ณ 



!!!!!! VIsual Studio์—์„œ Path ์„ค์ •์‹œ ์ŠคํŽ˜์ด์Šค ์ธ์‹ ์˜ค๋ฅ˜๋‚œ๋‹ค!!! ์ œ๊ธธ!!!!!!!!

$(SolutionDir)Engine\;$(SolutionDir)Engine\Source\;$(VC_IncludePath);$(WindowsSDK_IncludePath);

;๋’ค์— ํ•œ์นธ ๋„๋ฉด ๋’ท ๋ถ€๋ถ„ ์ธ์‹ ๋ชปํ•จ ใ…‹ใ…‹



# UE ๋ฐ์ดํ„ฐ ์Šค๋ฏธ์Šค (ํ”Œ๋Ÿฌ๊ทธ์ธ)

    - ์–ธ๋ฆฌ์–ผ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ FBX๋งŒ ์ง€์›ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ์Šค๋ฏธ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํฌ๋งท๋„ ์ง€์› ๊ฐ€๋Šฅํ•˜๋‹ค.


# ๋น„์ฅฌ์–ผ ์ŠคํŠœ๋””์˜ค 2019, 2022 ๋‹ค ์„ค์น˜ ๋ผ์„œ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์ด์ƒํ•˜๊ฒŒ ์ž๊พธ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ธธ๋ž˜.. ํ˜น์‹œ๋‚˜ ํ•ด์„œ 2019๋ฅผ ์‚ญ์ œํ•˜๋‹ˆ๊นŒ ํ•ด๊ฒฐ์ด ๋˜์—ˆ๋‹ค

    - ๊ตฌ๋ฌธ ํ•ด์„ ์‹ค์‹œ๊ฐ„ ์ž˜ ์•ˆ๋˜๋Š” ํ˜„์ƒ

    - ์ด์ƒํ•˜๊ฒŒ ์„ค์ • ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ include, link๊ฐ€ ์ž˜ ์•ˆ๋ผ์„œ ์˜ค๋ฅ˜ ๋‚˜๊ธฐ๋„ ํ•จ

    - 2019 ์ œ๊ฑฐํ•˜๊ณ  2022 ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋‹ˆ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐ์ด ๋จ ใ…‹ใ…‹ใ…‹

● ์œ ํŠœ๋ธŒ ๋น„๋””์˜ค ์ฑ•ํ„ฐ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์˜ฌ ์ˆ˜ ์žˆ์„๊นŒ?

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.






const axios = require('axios').default; // You have to install axios (npm install axios) in order to use this code const youtubeApiKey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // Your YouTube API Key here // Function for filtering array elements which don't contain a timestamp const notText = (array) => { const regexTimePattern = /\d:\d/; for (let i = 0; i < array.length; i++) { let result = regexTimePattern.exec(array[i]); if (result === null) { array[i] = ""; } } } const main = async (videoId) => { const videoDataResponse = await axios.get( `https://youtube.googleapis.com/youtube/v3/videos?part=snippet&id=${videoId}&key=${youtubeApiKey}`, { headers: { 'Accept': 'application/json' } } ); const description = JSON.stringify(videoDataResponse.data.items[0].snippet.description); //DESCRIร‡รƒO DO VรDEO // Find [number]:[number] pattern in description const numberNumberPattern = /\d:\d/gi; let descriptionLines = [], numberNumbeResult; while ((numberNumbeResult = numberNumberPattern.exec(description))) { descriptionLines.push(numberNumbeResult.index); } let min = [], sec = [], hour = [], chapterTitle = [], chapterStartIndex, chapterEndIndex; // Verifies if last [number]:[number] correspondence is in the last description line if (description.indexOf("\\n", descriptionLines[descriptionLines.length - 1]) === -1) { //รฉ na รบltima linha chapterEndIndex = description.length - 1; } else { // not in the last line chapterEndIndex = description.indexOf("\\n", descriptionLines[descriptionLines.length - 1]); } // Verifies if first [number]:[number] correspondence is in the first description line switch (descriptionLines[0]) { case 1: // it's in the first line ([number]:[number] pattern) chapterStartIndex = 1; break; case 2: // it's in the first line ([number][number]:[number] pattern) chapterStartIndex = 2; break; default: //it's not in the first line const auxiliarString = description.substring(descriptionLines[0] - 6); chapterStartIndex = auxiliarString.indexOf("\\n") + descriptionLines[0] - 4; } // get description part with timestamp and titles const chapters = description.substring(chapterStartIndex, chapterEndIndex); // separete lines const notFilteredLine = chapters.split("\\n"); // filter lines which don't have [number]:[number] pattern notText(notFilteredLine); // filter empty lines const filteredLine = notFilteredLine.filter(Boolean); for (let i = 0; i < filteredLine.length; i++) { const notNumberOrColonRegex = /[^:\d]/; // not number nor ":" const numberRegex = /\d/; // number let numberResult = numberRegex.exec(filteredLine[i]); filteredLine[i] = filteredLine[i].substring(numberResult.index); // starts line in first number found let notNumberOrColonResult = notNumberOrColonRegex.exec(filteredLine[i]); let tempo = filteredLine[i].substring(0, notNumberOrColonResult.index); // timestamp end (not number nor ":") let tempoSeparado = tempo.split(":"); // split timestamps in each ":" switch (tempoSeparado.length) { case 2: // doesn't have hour hour[i] = 0; min[i] = Number(tempoSeparado[0]); sec[i] = Number(tempoSeparado[1]); break; case 3: // has hour hour[i] = Number(tempoSeparado[0]); min[i] = Number(tempoSeparado[1]); sec[i] = Number(tempoSeparado[2]); break; } const numberOrLetterRegex = /[a-z0-9]/i; // number or letter const auxiliarString = filteredLine[i].substring(notNumberOrColonResult.index); // auxiliar string starts when not number nor ":" let numberOrLetterResult = numberOrLetterRegex.exec(auxiliarString); // chapter title starts in first letter or number found in auxiliarString chapterTitle[i] = auxiliarString.substring(numberOrLetterResult.index); } let chaptersData = []; for (let i = 0; i < chapterTitle.length; i++) { chaptersData[i] = { chapterTitle: chapterTitle[i], chapterTimestamp: [hour[i], min[i], sec[i]] } } console.log(chaptersData); // chaptersData contains the data we are looking for // chaptersData is an array of objects, in the format {chapterTitle: 'chapter title example', chapterTimestamp: [01, 25, 39]} // chapterTimestamp is in the format [hour, minute, second] } // calls main with the ID of the video of interest main('videoId'); // For example: main('R3WDe7byUXo');

#youtube video chapters API

◤ 2022๋…„ 7์›” 21์ผ ๋ชฉ์š”์ผ

● ์‚ผ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.






#ifndef UNICODE #define UNICODE #endif #include <windows.h> #include <tchar.h> #include <string> //#include <time.h> //#include <cmath> // DX Header #include <d3d11.h> // DirectX11 ํ—ค๋” #include <d3dcompiler.h> // ์‰์ด๋” ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋Šฅ ์ œ๊ณต #include <comdef.h> // lib ๋งํ‚น #pragma comment(lib, "d3d11.lib") #pragma comment(lib, "d3dcompiler.lib") // ๋ณ€์ˆ˜ // ์ „์—ญ ๋ณ€์ˆ˜ <-> ํ•จ์ˆ˜ ๋‚ด์— ์žˆ๋Š” ๋ณ€์ˆ˜๋Š” ์ง€์—ญ ๋ณ€์ˆ˜ std::wstring className = TEXT("Sample Window Class"); std::wstring title = TEXT("STL Render Engine"); HINSTANCE hInstance = nullptr; int width = 1600; int height = 900; HWND hwnd = nullptr; // DX ๋ณ€์ˆ˜ // DX ์žฅ์น˜ ID3D11Device* device = nullptr; ID3D11DeviceContext* context = nullptr; IDXGISwapChain* swapChain = nullptr; ID3D11RenderTargetView* renderTargetView = nullptr; // ์ •์  ๋ฒ„ํผ ๊ด€๋ จ ๋ณ€์ˆ˜ unsigned int vertexByteWidth = 0u; unsigned int vertexCount = 0u; ID3D11Buffer* vertexBuffer = nullptr; ID3D11VertexShader* vertexShader = nullptr; ID3D11PixelShader* pixelShader = nullptr; ID3D11InputLayout* inputlayout = nullptr; // DX ์žฅ์น˜ ์ดˆ๊ธฐํ™” void InitializeDevice(); // ์žฅ๋ฉด ์ดˆ๊ธฐํ™” void InitializeScene(); void Draw(); // ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์–ป์–ด์˜ค๋Š” ํ•จ์ˆ˜ std::wstring GetErrorMessage(HRESULT hr) { _com_error error(hr); return error.ErrorMessage(); } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd) { // Register the window class. ::hInstance = hInstance; // ::์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ด WNDCLASS wc = { }; //memset(&wc, 0, sizeof(wc)); // Invoke wc.lpfnWndProc = WindowProc; // ์ฝœ๋ฐฑ(Callback) / ์œ„์ž„(Delegate) wc.hInstance = hInstance; wc.lpszClassName = className.c_str(); // ์ฐฝ ํด๋ž˜์Šค ์ด๋ฆ„ ๋“ฑ๋ก RegisterClass(&wc); // Create the window. // ์ฐฝ ํฌ๊ธฐ ์กฐ์ •. // RECT๋Š” ์ง์‚ฌ๊ฐํ˜• ๊ตฌ์กฐ์ฒด, (left, top, right, bottom) RECT rect = { 0, 0, static_cast<long>(width), static_cast<long>(height) }; AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); // ์กฐ์ •๋œ ์ง์‚ฌ๊ฐํ˜• ํฌ๊ธฐ๋กœ ์ฐฝ ๊ฐ€๋กœ/์„ธ๋กœ ํฌ๊ธฐ ๊ตฌํ•˜๊ธฐ(Window๋Š” ์ขŒ์ธก ์ƒ๋‹จ์ด ๊ธฐ์ค€์ ) int windowWidth = rect.right - rect.left; int windowHeight = rect.bottom - rect.top; // ํ™”๋ฉด ์ค‘์‹ฌ์—์„œ ์ฐฝ์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ์ƒ์„ฑ์ขŒํ‘œ ๊ตฌํ•˜๊ธฐ // GetSystemMetrics(SM_CXSCREEN) -> ๋ชจ๋‹ˆํ„ฐ ๊ฐ€๋กœ ํฌ๊ธฐ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜ // GetSystemMetrics(SM_CYSCREEN) -> ๋ชจ๋‹ˆํ„ฐ ์„ธ๋กœ ํฌ๊ธฐ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜ int xPosition = (GetSystemMetrics(SM_CXSCREEN) - windowWidth) / 2; int yPosition = (GetSystemMetrics(SM_CYSCREEN) - windowHeight) / 2; hwnd = CreateWindowEx( 0, // Optional window styles. className.c_str(), // Window class title.c_str(), // Window text WS_OVERLAPPEDWINDOW, // Window style // Size and position (์‹คํ–‰ ์‹œ ์œ„์น˜์™€ ํฌ๊ธฐ) //CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, xPosition, yPosition, windowWidth, windowHeight, nullptr, // Parent window nullptr, // Menu hInstance, // Instance handle nullptr // Additional application data ); if (hwnd == nullptr) { return 0; } ShowWindow(hwnd, SW_SHOW); // window ์ฐฝ ์ผ๋ฐ˜์ ์ธ ์ƒํƒœ๋กœ ๋ณด์ด๊ธฐ UpdateWindow(hwnd); // ์ฐฝ ์—…๋ฐ์ดํŠธ // ------ ์ฐฝ ์ƒ์„ฑ ------ // // DX ์ดˆ๊ธฐํ™” InitializeDevice(); // ์žฅ๋ฉด ์ดˆ๊ธฐํ™” InitializeScene(); // Run the message loop. MSG msg = { }; // MSG ๊ตฌ์กฐ์ฒด์— ๋งˆ์šฐ์Šค ํด๋ฆญ ๋ฐ˜์‘ ๋“ฑ์ด ๋“ค์–ด์žˆ์Œ // WM_QUIT ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ณ„์† ๋ฃจํ”„ ์‹คํ–‰ while (msg.message != WM_QUIT) { // ์œˆ๋„์šฐ๊ฐ€ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌํ•˜๋ฉด ์‹คํ–‰ //if (GetMessage(&msg, NULL, 0, 0) > 0) if (PeekMessage(&msg, nullptr, 0u, 0u, PM_REMOVE)) { // ์œˆ๋„์šฐ(OS)๊ฐ€ ์ „๋‹ฌํ•œ ๋ฉ”์‹œ์ง€ ํ•ด์„ ๋ฐ ์ „๋‹ฌ(WindowProc ํ•จ์ˆ˜ ํ˜ธ์ถœ) TranslateMessage(&msg); DispatchMessage(&msg); } else { Draw(); // GameLoop // Rendering (DX ์ž‘์—…์€ ์—ฌ๊ธฐ์„œ ์‹คํ–‰) // ProcessInput // Update // Render // PostRender } } // ์ฐฝ ๋“ฑ๋ก ํ•ด์ œ UnregisterClass(className.c_str(), hInstance); return 0; } void InitializeDevice() { // ์žฅ์น˜ ์ƒ์„ฑํ•  ๋•Œ ์ „๋‹ฌํ•  ์˜ต์…˜ ๊ฐ’ unsigned int createFlag = 0; #if _DEBUG // Debug ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ, // ์žฅ์น˜ ์ƒ์„ฑ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐฉ์ƒํ–ˆ์„ ๋•Œ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ๋” ๋งŽ์ด ์ „๋‹ฌํ•ด๋‹ฌ๋ผ๋Š” ์˜ต์…˜ ์ถ”๊ฐ€ createFlag |= D3D11_CREATE_DEVICE_DEBUG; #endif // DX11 ๋ฒ„์ „ ์ง€์ • // ์ƒ์œ„ ๋ฒ„์ „์„ ์•ž์— ๋„ฃ์œผ๋ฉด ๋จผ์ € ์‹œ๋„ํ•ด๋ณด๊ณ , ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ๋ฒ„์ „์œผ๋กœ ๋„˜์–ด๊ฐ D3D_FEATURE_LEVEL levels[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0 }; // ์Šค์™‘์ฒด์ธ ์ƒ์„ฑ์„ ์œ„ํ•œ ๊ตฌ์กฐ์ฒด ์„ค์ • DXGI_SWAP_CHAIN_DESC swapChainDesc = {}; swapChainDesc.BufferCount = 1; // ๋ฐฑ๋ฒ„ํผ ๊ฐœ์ˆ˜ ์„ค์ • swapChainDesc.BufferDesc.Width = width; // ํ”„๋ ˆ์ž„(์ด๋ฏธ์ง€) ๊ฐ€๋กœ ํฌ๊ธฐ swapChainDesc.BufferDesc.Height = height; // ํ”„๋ ˆ์ž„(์ด๋ฏธ์ง€) ์„ธ๋กœ ํฌ๊ธฐ swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // ์ด๋ฏธ์ง€ ์ฑ„๋„๋ณ„ ํฌ๋ฉง swapChainDesc.Windowed = true; // ์ฐฝ(Window) ๋ชจ๋“œ ์—ฌ๋ถ€ ์„ค์ • swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // ํ”„๋ ˆ์ž„(์ด๋ฏธ์ง€)์˜ ์šฉ๋„ (๋ Œ๋”๋ง) swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; // Front <-> Back ๋ฒ„ํผ ๋ณ€๊ฒฝํ•  ๋•Œ ํšจ๊ณผ ๋„ฃ์„์ง€ ์„ค์ • swapChainDesc.SampleDesc.Count = 1; // ๋ฉ€ํ‹ฐ ์ƒ˜ํ”Œ๋ง ํ• ์ง€ ์—ฌ๋ถ€ ์„ค์ • -> ์•ˆํ•จ swapChainDesc.SampleDesc.Quality = 0; // ๋ฉ€ํ‹ฐ ์ƒ˜ํ”Œ๋ง ํ’ˆ์งˆ ์„ค์ • -> ๊ธฐ๋ณธ ๊ฐ’ (Count - 1) swapChainDesc.OutputWindow = hwnd; // DX๊ฐ€ ๊ทธ๋ฆด ์ฐฝ ํ•ธ๋“ค D3D_FEATURE_LEVEL finalFeature; // ์žฅ์น˜ ์ดˆ๊ธฐํ™” auto result = D3D11CreateDeviceAndSwapChain( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createFlag, levels, //ARRAYSIZE(levels), _countof(levels), D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, &finalFeature, &context ); // ์‹คํŒจ ์—ฌ๋ถ€ ํ™•์ธ if (FAILED(result)) { //MessageBox(nullptr, L"Failed to create device.", L"Error", MB_OK); MessageBox(nullptr, GetErrorMessage(result).c_str(), L"Error", MB_OK); exit(-1); } // ๋žœ๋”(Render, ๊ทธ๋ฆฐ๋‹ค, Draw) ํƒ€๊ฒŸ (๋ฐฑ๋ฒ„ํผ) -> ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ฆด ๋ฒ„ํผ(๋ฉ”๋ชจ๋ฆฌ) ID3D11Texture2D* backbuffer = nullptr; // ๊ทธ๋ž˜ํ”ฝ์นด๋“œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฑ๋ฒ„ํผ ์ •๋ณด๋ฅผ ์–ป์–ด์˜จ๋‹ค. result = swapChain->GetBuffer( 0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backbuffer) ); // ์˜ค๋ฅ˜ ํ™•์ธ if (FAILED(result)) { MessageBox(nullptr, GetErrorMessage(result).c_str(), L"Error", MB_OK); exit(-1); } // ๋ Œ๋” ํƒ€๊ฒŸ ๋ทฐ(RenderTargetView) ์ƒ์„ฑ renderTargetView = nullptr; result = device->CreateRenderTargetView( backbuffer, nullptr, &renderTargetView ); // ์˜ค๋ฅ˜ ํ™•์ธ if (FAILED(result)) { MessageBox(nullptr, GetErrorMessage(result).c_str(), L"Error", MB_OK); exit(-1); } // ๋ฐฑ๋ฒ„ํผ ํ•ด์ œ // COM backbuffer->Release(); // ๋ Œ๋” ํƒ€์ผ“ ๋ทฐ ์„ค์ • context->OMSetRenderTargets(1, &renderTargetView, nullptr); // ํ™”๋ฉด(Viewport) ์„ค์ • D3D11_VIEWPORT viewport = {}; viewport.TopLeftX = 0.0f; viewport.TopLeftY = 0.0f; viewport.Width = static_cast<float>(width); // width๊ฐ€ int ์ด๋ฏ€๋กœ float ๋กœ ํ˜•๋ณ€ํ™˜ viewport.Height = static_cast<float>(height); // height๊ฐ€ int ์ด๋ฏ€๋กœ float ๋กœ ํ˜•๋ณ€ํ™˜ viewport.MinDepth = 0.0f; viewport.MaxDepth = 1.0f; // ๋ทฐํฌํŠธ ์„ค์ • context->RSSetViewports(1, &viewport); } void InitializeScene() { // 1. ์ •์ (Virtex) ๋ฐ์ดํ„ฐ ์ƒ์„ฑ struct Vertex { float x; float y; float z; }; // ์  ๋ฐ์ดํ„ฐ // NDC-(Viewport) Vertex vertices[] = { { 0.0f, 0.5f, 0.5f }, /*{x, y, z?}*/ { 0.5f, -0.5f, 0.5f }, { -0.5f, -0.5f, 0.5f } }; // vertexByteWidth = sizeof(Vertex); vertexCount = _countof(vertices); // ์ •์  ๋ฒ„ํผ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ตฌ์กฐ์ฒด D3D11_BUFFER_DESC vertexBufferDesc = {}; vertexBufferDesc.ByteWidth = sizeof(Vertex) * _countof(vertices); vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; // ์ •์  ๋ฐฐ์—ด(๋ฐ์ดํ„ฐ)์„ ๋‹ด์„ ๊ตฌ์กฐ์ฒด D3D11_SUBRESOURCE_DATA vertexData = {}; vertexData.pSysMem = vertices; // ์ •์  ๋ฒ„ํผ //ID3D11Buffer* vertexBuffer = nullptr; // ์ •์  ๋ฒ„ํผ ์ƒ์„ฑ auto result = device->CreateBuffer( &vertexBufferDesc, &vertexData, &vertexBuffer ); // ์˜ค๋ฅ˜ ํ™•์ธ if (FAILED(result)) { MessageBox(nullptr, GetErrorMessage(result).c_str(), L"Error", MB_OK); exit(-1); } // ์…ฐ์ด๋”(Shader-๊ทธ๋ž˜ํ”ฝ ์นด๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ) ์ƒ์„ฑ (์ •์  ์…ฐ์ด๋” / ํ”ฝ์…€ ์…ฐ์ด๋”) // ์ •์  ์…ฐ์ด๋” ์ƒ์„ฑ // 1. ์ปดํŒŒ์ผ // 2. ์ปดํŒŒ์ผ๋œ ์ด์ง„ ํŒŒ์ผ ๋กœ๋“œ // 3. ์…ฐ์ด๋” ์ƒ์„ฑ ID3DBlob* vertexShaderBuffer = nullptr; result = D3DCompileFromFile( L"VertexShader.hlsl", nullptr, nullptr, "main", "vs_5_0", 0u, 0u, &vertexShaderBuffer, nullptr ); // ์˜ค๋ฅ˜ ํ™•์ธ if (FAILED(result)) { MessageBox(nullptr, GetErrorMessage(result).c_str(), L"Error", MB_OK); exit(-1); } // ์ •์  ์…ฐ์ด๋” ์ƒ์„ฑ //ID3D11VertexShader* vertexShader = nullptr; result = device->CreateVertexShader( vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), nullptr, &vertexShader ); // ์˜ค๋ฅ˜ ํ™•์ธ if (FAILED(result)) { MessageBox(nullptr, GetErrorMessage(result).c_str(), L"Error", MB_OK); exit(-1); } // ํ”ฝ์…€ ์…ฐ์ด๋” ID3DBlob* pixelShaderBuffer = nullptr; result = D3DCompileFromFile( L"pixelShader.hlsl", nullptr, nullptr, "main", "ps_5_0", 0u, 0u, &pixelShaderBuffer, nullptr ); // ์˜ค๋ฅ˜ ํ™•์ธ if (FAILED(result)) { MessageBox(nullptr, GetErrorMessage(result).c_str(), L"Error", MB_OK); exit(-1); } // ํ”ฝ์…€ ์…ฐ์ด๋” ์ƒ์„ฑ //ID3D11VertexShader* vertexShader = nullptr; result = device->CreatePixelShader( pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), nullptr, &pixelShader ); // ์˜ค๋ฅ˜ ํ™•์ธ if (FAILED(result)) { MessageBox(nullptr, GetErrorMessage(result).c_str(), L"Error", MB_OK); exit(-1); } // ์ž…๋ ฅ ๋ ˆ์ด์•„์›ƒ ์ƒ์„ฑ (์ž…๋ ฅ=์ •์ , ์ •์ ์˜ ์ƒ๊น€์ƒˆ) //ID3D11InputLayout* inputlayout = nullptr; //LPCSTR SemanticName; //UINT SemanticIndex; //DXGI_FORMAT Format; //UINT InputSlot; //UINT AlignedByteOffset; //D3D11_INPUT_CLASSIFICATION InputSlotClass; //UINT InstanceDataStepRate; D3D11_INPUT_ELEMENT_DESC inputElementDesc[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 } }; result = device->CreateInputLayout( inputElementDesc, _countof(inputElementDesc), vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &inputlayout ); // ์˜ค๋ฅ˜ ํ™•์ธ if (FAILED(result)) { MessageBox(nullptr, GetErrorMessage(result).c_str(), L"Error", MB_OK); exit(-1); } } void Draw() { // ๋ฐฐ๊ฒฝ ์ง€์šฐ๊ธฐ float color[] = { 0.2f, 0.4f, 0.6f, 1.0f }; // red, green, blue ์ˆœ์„œ context->ClearRenderTargetView(renderTargetView, color); // ๊ทธ๋ฆฌ๊ธฐ // ๋ฐ์ดํ„ฐ/์…ฐ์ด๋” ์„ค์ • // ์ˆœ์„œ ์ƒ๊ด€ ์—†์Œ // ์ ์„ ์—ฐ๊ฒฐํ•ด์„œ ๋ฉด์„ ๋งŒ๋“ค ๋•Œ ๊ธฐ์ค€์ด๋˜๋Š” ๋ฐฉ์‹์„ ์ง€์ •ํ•จ context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); static unsigned int stride = vertexByteWidth; // static์„ ์‚ฌ์šฉํ•˜๋ฉด ๋“œ๋กœ์šฐ ์ฝœ ํ• ๋•Œ ๋ณ€์ˆ˜๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ณต์œ ํ•œ๋‹ค. static unsigned int offset = 0u; // ์ •์  ๋ฒ„ํผ ์„ค์ • context->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); context->IASetInputLayout(inputlayout); // ์…ฐ์ด๋” ์„ค์ • context->VSSetShader(vertexShader, nullptr, 0); context->PSSetShader(pixelShader, nullptr, 0); // ๋“œ๋กœ์šฐ ์ฝœ context->Draw(vertexCount, 0); swapChain->Present(1u, 0u); // 1์„ ๋„ฃ์œผ๋ฉด ๋ชจ๋‹ˆํ„ฐ์™€ ํ”„๋ ˆ์ž„ ๋™๊ธฐํ™”, 0์„ ๋„ฃ์œผ๋ฉด ๋ชจ๋‹ˆํ„ฐ์™€ ํ”„๋ ˆ์ž„ ๋™๊ธฐํ™”๋ฅผ ํ•˜์ง€ ์•Š์Œ. // BeginRender -> ๋ฐฐ๊ฒฝ ์ง€์šฐ๊ธฐ // Render -> ์ •๋ฉด ๊ทธ๋ฆฌ๊ธฐ // EndRender -> ์Šค์™‘์ฒด์ธ ๊ตํ™˜ } // ์ฐฝ ๊ตฌํ˜„ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: // ์ฐฝ์ด ๋‹ซํžˆ๋Š” ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ PostQuitMessage(0); return 0; case WM_PAINT: // ๊ทธ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // All painting occurs here, between BeginPaint and EndPaint. FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); EndPaint(hwnd, &ps); } return 0; case WM_KEYDOWN: { // ESC ํ‚ค๊ฐ€ ๋ˆŒ๋ฆฌ๋ฉด if (wParam == VK_ESCAPE) { // ๋ฉ”์‹œ์ง€ ์ƒ์ž ๋„์šฐ๊ธฐ // ์˜ˆ/์•„๋‹ˆ์š” ๋ฒ„ํŠผ์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์‹œ์ง€ ์ƒ์ž๋ฅผ ๋„์šฐ๊ณ , "์˜ˆ"๋ฅผ ์„ ํƒํ•˜๋ฉด ์ฐฝ ์‚ญ์ œ if (MessageBox(nullptr, TEXT("Quit?"), TEXT("Quit Engine"), MB_YESNO/*๋””์ž์ธ*/) == IDYES/*YES๋ฅผ ๋ˆ„๋ฅด๋ฉด ์‹คํ–‰*/) { // ์ฐฝ ํ•ธ๋“ค ์‚ญ์ œ -> ์ฐฝ ์‚ญ์ œ DestroyWindow(hwnd); } } } return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }

● 7์›” 21์ผ DX ์ˆ˜์—… 2์ผ์ฐจ

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.






์ด๋“์šฐ์˜ ๊ฒŒ์ž„ ์ˆ˜ํ•™ ๋ธ”๋กœ๊ทธ

https://blog.naver.com/destiny9720/221408760120


์ˆ™์ œ : 13๋ฒˆ๊นŒ์ง€ ์ฝ์–ด๋ณด๊ธฐ




#์•„ํ•€๊ณต๊ฐ„

#๋™์ฐจ์ขŒํ‘œ๊ณ„


# ์ •์ ๋ฒ„ํผ

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=atom723&logNo=190302142


#๋ฒ„ํ…์Šค ์‰์ด๋”, ํ”ฝ์…€ ์‰์ด๋”






๊ทธ๋ž˜ํ”ฝ ํŒŒ์ดํ”„๋ผ์ธ





◤ 2022๋…„ 7์›” 13์ผ ์ˆ˜์š”์ผ

● ๋ฌด์Šจ ๋ถ€๊ท€ ์˜ํ™”๋ฅผ ๋ˆ„๋ฆฌ๊ฒ ๋‹ค๊ณ  ์ƒˆ๋กœ์šด ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฑธ๊นŒ? ใ…Žใ…Ž

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.





๊ฐ€๋” ๋‚ด ์ž์‹ ์ด ์กฐ๊ธˆ ๋ถˆ์Œํ•ด(?)์งˆ ๋•Œ๊ฐ€ ์žˆ๋‹ค
์ข€ ๋” ํŽธํ•˜๊ฒŒ ์‚ด์•„๋„ ๋˜๋Š”๋ฐ ์™œ ์ด๋ฆฌ ๋นก์‹œ๊ฒŒ ์‚ฌ๋Š”๊ฑธ๊นŒ? ใ…‹ใ…‹
๋ฌผ๋ก  '๋นก์…ˆ'์„ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์— ๋”ฐ๋ผ ์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.

๋‚˜์ด๊ฐ€ ๋“ค์–ด์„œ๋„ ํ•˜๋ฃจ ์ข…์ผ ์ฑ…์ƒ์ด๋‚˜ ์ปดํ“จํ„ฐ ์•ž์— ์•‰์•„ ๊ณต๋ถ€๋งŒ ํ•˜๋Š” ์‚ฌ๋žŒ์„ ํž˜๋“ค๊ฒ ๋‹ค๊ณ  ๋ณด๋Š” ์‚ฌ๋žŒ๋„ ์žˆ๊ณ , ํ•˜๋ฃจ ์ข…์ผ ๊ณต์‚ฌ ํ˜„์žฅ์—์„œ ์ผ์„ ํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณด๋ฉฐ ํž˜๋“ค ๊ฒƒ์ด๋ผ ๋ณด๋Š” ์‚ฌ๋žŒ๋“ค๋„ ์žˆ๋‹ค.

๋‘˜ ๋‹ค ํž˜๋“  ๊ฑด ๋งž๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค๋งŒ ์–ด๋А์ชฝ์ด ๋” ํž˜๋“œ๋ƒ ์šฐ์—ด์„ ๊ฐ€๋ฆฌ์ž๋ฉด ๊ทธ๊ฑด ์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ  ์ข€ ์• ๋งคํ•ด์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๋„์„œ๊ด€์—์„œ 10์‹œ๊ฐ„ ์•‰์•„์„œ ๊ณต๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณด๋ฉฐ "์–ดํœด ๋‚˜ ๊ฐ™์œผ๋ฉด ๊ทธ๋ƒฅ ๋‚˜๊ฐ€์„œ ์ผ์„ ํ•˜์ง€ ์ €๋ ‡๊ฒŒ ๊ณต๋ถ€ ๋ชปํ•ด ๋„ˆ๋ฌด ํž˜๋“ค์–ด์„œ" ๋ผ๊ณ  ๋ง์„ ํ•˜๋Š” ์‚ฌ๋žŒ๋„ ์žˆ๋Š” ๋ฐ˜๋ฉด "๋ฐ–์—์„œ ๋•€ ํ˜๋ฆฌ๋ฉฐ ํž˜ ์“ฐ๋Š” ์ผ์€ ๋„ˆ๋ฌด ํž˜๋“ค์–ด์„œ ๋ชป ํ•  ๊ฒƒ ๊ฐ™์•„. ์ฐจ๋ผ๋ฆฌ ํ•˜๋ฃจ ์ข…์ผ ์ฑ…์ƒ ์•ž์— ์•‰์•„์„œ ๊ณต๋ถ€ํ•˜๋Š”๊ฒŒ ๋œ ํž˜๋“ค์–ด"๋ผ๊ณ  ๋ง์„ ํ•˜๋Š” ์‚ฌ๋žŒ๋„ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ๋‹ค๋ฅธ ์ชฝ์ด ์‰ฌ์›Œ์„œ ๋œ ํž˜๋“ค์–ด์„œ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์‹ถ์–ด๋„ ๋‹น์žฅ ์ƒ๊ณ„ ๋ฌธ์ œ๊ฐ€ ๊ฑธ๋ ค์„œ ๊ณต๋ถ€๋ฅผ ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ๋„ ์žˆ์œผ๋ฉฐ ์‹ ์ฒด์  ๊ฒฐํ•จ์ด๋‚˜ ์ฒด๋ ฅ์ด ๋„ˆ๋ฌด ์•ฝํ•ด์„œ ํž˜์“ฐ๋Š” ์ผ์„ ํ•˜๊ณ  ์‹ถ์–ด๋„ ํ•  ์ˆ˜ ์—†๋Š” ์‚ฌ๋žŒ๋„ ์žˆ๋‹ค.

์•„๋ฌดํŠผ ์–ด๋–ค ๊ฒƒ์ด ๋” ํž˜๋“œ๋ƒ, ๋ฌด์—‡์ด ํž˜๋“  ๊ฒƒ์ด๋ƒ๋ฅผ ์ •์˜ํ•˜๊ฒ ๋‹ค๊ธฐ ๋ณด๋‹ค๋Š” ์ฃผ๊ด€์ ์œผ๋กœ ๊ฐ€๋” ์˜ค๋Š” ํ˜„ํƒ€์™€(๋‚˜๋Š” ๋ฌด์—‡ ๋•Œ๋ฌธ์— ์™œ ์ด๋Ÿฌ๊ณ  ์žˆ์„๊นŒ?) ๊ฐ๊ด€์ ์œผ๋กœ ์ฃผ์œ„์—์„œ ํ•ด์ฃผ๋Š” ๋ง๋“ค(๊ทธ ๋‚˜์ด์— ๊ตณ์ด ํ•ด์•ผ๊ฒ ๋ƒ? + ๊ทธ ๋‚˜์ด์—๋„ ๋Œ€๋‹จํ•˜์‹œ๋„ค์š”)๋กœ ์ธํ•ด์„œ ๊ฐ€๋˜ ๊ธธ์„ ์ž ์‹œ ๋ฉˆ์ถ”๊ณ  ์‹ถ์–ด ์งˆ ๋•Œ๋„ ์žˆ๊ณ ..

์ž ๊น ๋ฉˆ์ท„์„ ๋•Œ ์•ž์œผ๋กœ ๋‚จ์€ ๊ธธ์„ ์žฌ๋ณด๊ธฐ๋„ ํ•˜๊ณ  ๋’ค๋ฅผ ๋Œ์•„๋ณด๋ฉฐ ์˜ค๋Š” ๊ธธ์„ ๋Œ์ด์ผœ ๋ณด๋ฉด์„œ '๊ณผ์—ฐ ๋‚˜๋Š” ์ž˜ ํ•˜๊ณ  ์žˆ์„๊นŒ?' '๋‚จ๋“ค ์•ˆ ๊ฐ€๋Š” ๊ธธ์„ ๊ฐ€์•ผ๋งŒ ์ง์„ฑ์ด ํ’€๋ฆฌ๋Š” ๊ฒƒ์ธ๊ฐ€?' '์™œ ๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ”๋˜ ๊ธธ์„ ๊ฐ€๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€๋Š” ๊ธธ์„ ํ•จ๊ป˜ ๊ฑท์ง€ ๋ชปํ•˜๋Š”๊ฐ€?' ์ƒ๊ฐ์„ ๋งŽ์ด ํ•ด๋ณด๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฐ ์ƒ๊ฐ๋“ค์„ ํ•˜๋ฉด ํ•ญ์ƒ ๋งˆ์ง€๋ง‰์€ ๋‚˜๋Š” ์™œ ์ด๋ ‡๊ฒŒ ์‚ด๊ณ  ์žˆ์ง€? ์™œ ์ด๋ ‡๊ฒŒ ํž˜๋“ค๊ฒŒ ์‚ด๊ณ  ์žˆ์„๊นŒ๋ž€ ์ƒ๊ฐ์ด ๋“ค๋ฉฐ ์Šค์Šค๋กœ๊ฐ€ ์ธก์€ํ•ด ์ง€๊ธฐ๋„ ํ•œ๋‹ค.

◤ 2022๋…„ 7์›” 10์ผ ์ผ์š”์ผ

● ๋จธ๋ฆฌ์นด๋ฝ ๊ฑฐ๋ฆ„๋ง ๊ตฌ๋งค (17000์›), ํ•˜์ง€๋งŒ 4600์›์œผ๋กœ ๋” ํ–‰๋ณตํ•ด์ง

※ ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ผ์ƒ ๋ฉ”๋ชจ์™€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.





ํ…์‰ฌ๋ฃธ ์Šคํ…Œ์ธ๋ฆฌ์Šค ์šธํŠธ๋ผ ์š•์กฐ ๋จธ๋ฆฌ์นด๋ฝ ๊ฑฐ๋ฆ„๋ง ๊ตฌ๋งค

๋จธ๋ฆฌ์นด๋ฝ ๋•Œ๋ฌธ์— ์ŠคํŠธ๋ ˆ์Šค ใ…Žใ…Ž

๋จธ๋ฆฌ ๊ฐ๊ณ  ๋‚ ๋•Œ๋งˆ๋‹ค ์š•์กฐ์— ํ•œ ์›…ํผ์”ฉ ๋น ์ ธ์„œ ์ž˜ ๊ฑธ๋Ÿฌ์ค˜์•ผ ํ•˜๋Š”๋ฐ ๊ธฐ์กด์— ์“ฐ๋˜ ๊ฑด ์˜ ๋ณ„๋กœ๋‹ค. 


๊ทธ๋ž˜์„œ ์˜ค๋Š˜ ์šฐ์—ฐํžˆ ๊ฒ€์ƒ‰ํ•˜๋‹ค๊ฐ€ ํ‰์ด ๋„ˆ๋ฌด ์ข‹๊ธธ๋ž˜ ๊ตฌ๋งค๋ฅผ ํ•ด๋ดค๋‹ค. ์ฟ ํŒก์—์„œ 23880์› ํ•˜๋Š”๋ฐ (๋ญ๊ฐ€ ์ด๋ฆฌ ๋น„์‹ธ๋ƒ ใ… ใ…  ์Šคํ…Œ์ธ๋ ˆ์Šค ์žฌ์งˆ์—๋‹ค๊ฐ€ ํŠนํ—ˆ๊ถŒ์ด ์žˆ๋‚˜๋ณด๋‹ค ๋˜‘๊ฐ™์ด ์ƒ๊ฒผ๋Š”๋ฐ ์งํ‰ 8000์›์งœ๋ฆฌ๋Š” ์žฌ์งˆ์ด ํ”Œ๋ผ์Šคํ‹ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค ใ…‹ใ…‹ใ…‹ใ…‹) ์œ„๋ฉ”ํ”„์—์„œ 17000์›(๋ฌด๋ฃŒ๋ฐฐ์†ก) ํ˜œ์ž์Šค๋Ÿฌ์›Œ์„œ ๋ฐ”๋กœ ๊ตฌ๋งค! 


https://front.wemakeprice.com/product/390168156?utm_source=naver_ep&utm_medium=PRICE_af&utm_campaign=null&NaPm=ct%3Dl5f1dbz4%7Cci%3Da07111e23846ac66bef067d387be76405ae93e61%7Ctr%3Dslsl%7Csn%3D197023%7Chk%3Dd09941c60b9e7b1db722d7f287c8003c2f4e5ee4



์œ„๋ฉ”ํ”„ ์ตœ์ €๊ฐ€!?


์ฟ ํŒก์—์„œ๋„ 17000์›!!




์ผ๋‹จ ์งˆ๋ €์Œ ใ…Žใ…Ž


์š”๊ฑด ์ƒ๊ธด ๊ฑด ๋น„์Šทํ•œ๋ฐ ํ”Œ๋ผ์Šคํ‹ฑ์ด๋ž€๋‹ค ใ…‹


์‚ฌ์šฉํ•ด ๋ณด๋‹ˆ ์ •๋ง ๋จธ๋ฆฌ์นด๋ฝ์„ ์ž˜ ๊ฑธ๋Ÿฌ์ค€๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ ์ด ์žˆ๋‹ค. ๋จธ๋ฆฌ์นด๋ฝ์ด ๋ง์— ๊ฑธ๋Ÿฌ์ง€๋Š” ๊ฑด ์ข‹์€๋ฐ ๊ธด ๋จธ๋ฆฌ์นด๋ฝ๋“ค์ด ์นญ์นญ ๊ฐ๊ฒจ ์žˆ๋Š” ๊ฑธ ํœด์ง€๋กœ ๋‹ค์‹œ ๋‹ฆ์•„ ๋‚ด๋“ฏ์ด ์ง‘์–ด ๋นผ์•ผ ํ•˜๋Š”๋ฐ ๊ธˆ์† ์žฌ์งˆ์ด๋ผ ๋‹จ๋‹จํ•ด์„œ ์˜คํžˆ๋ ค ๋จธ๋ฆฌ์นด๋ฝ์„ ํ›”์ณ ๋‚ด๊ธฐ๊ฐ€ ์‰ฝ์ง€๋Š” ์•Š๋‹ค.





์ด๊ฒƒ์ด ์žฌ์งˆ์ด ์ข€ ๋ง๋ž‘๋ง๋ž‘ํ•˜๋ฉด ํœด์ง€๋กœ ๊ฐ์‹ธ์ฅ๊ณ  ๋จธ๋ฆฌ์นด๋ฝ์„ ๊ธ์–ด ๋‚ด๊ธฐ๊ฐ€ ๋” ์‰ฌ์šธํ…๋ฐ.. ๊ทธ ์ƒ๊ฐ์œผ๋กœ ์ข€ ๋” ๊ฒ€์ƒ‰์„ ํ•ด๋ณด๋‹ˆ.. ์—ญ์‹œ๋‚˜ ๊ทธ๋Ÿฐ ์ œํ’ˆ๋„ ์žˆ์—ˆ๋‹ค. ํ…์‰ฌ๋ฃธ์ด๋ž‘ ๋ชจ์–‘์€ ์‚ด์ง ๋‹ค๋ฅด์ง€๋งŒ ๊ทธ ๋ชจ์–‘์ƒˆ๋งŒ ๋ด๋„ ๋Œ€๋žต ํ…์‰ฌ๋ฃน๊ณผ ๊ฐ™์€ ์›๋ฆฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๋ž€ ๋А๋‚Œ์ด ๋ฐ”๋กœ ๋“ ๋‹ค.






๊ฒฐ๊ตญ ๋” ์ €๋ ดํ•œ(4600์›) ์ œํ’ˆ์ด ์‹ค์ œ ์‚ฌ์šฉ์‹œ ๋งŒ์กฑ๋„๋Š” ๋” ๋†’๋‹ค. ์ด๊ฒƒ๋„ ์ฟ ํŒก์—์„œ ์ตœ์ €๊ฐ€๋กœ ํŒ๋งค ์ค‘์ธ๋ฐ ์ƒ‰๊น”๋„ ๋‹ค์–‘(์ด 4๊ฐ€์ง€?)ํ•˜๊ณ  2๊ฐœ์”ฉ, 4๊ฐœ์”ฉ ๋ฌถ์Œ ํŒ๋งค๋„ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ€์ •์—์„œ๋Š” 2๊ฐœ์”ฉ ๋ฌถ์Œ์ด๋ฉด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.

์š•์กฐ ์“ธ ๋•Œ๋งŒ ๊ฝ‚์•„์„œ ์“ฐ๊ณ  ์•ˆ ์”ป๊ณ  ๋‚˜์„œ๋Š” ๋ฐ”๋กœ ๋นผ์„œ ๋ฌผ๊ธฐ ๋ง๋ ค์ฃผ๋‹ˆ๊นŒ ๊ฑฐ์˜ ๋ฐ˜์˜๊ตฌ์ ์œผ๋กœ ์“ธ ๊ฒƒ ๊ฐ™๋‹ค.


๋“œ๋””์–ด ๊ธด๊ธด ๋จธ๋ฆฌ์นด๋ฝ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์š•์กฐ ๋ง‰ํžˆ๋˜ ์ŠคํŠธ๋ ˆ์Šค์—์„œ ํ•ด๋ฐฉ์ด ๋˜์—ˆ๋‹ค. ์ด๊ฒŒ ๋ญ๋ผ๊ณ  ํ–‰๋ณตํ•˜๋‹ค๋ƒ ใ…‹ใ…‹



#ํ…์‰ฌ๋ฃธ

#๋ฆฌ๋ฒ„๊ทธ๋ฆฐ

#๋จธ๋ฆฌ์นด๋ฝ๊ฑฐ๋ฆ„๋ง