์ด์ MaterialInstance๋ฅผ ๊ตฌ์ฑํ๊ณ , ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ GLTF ์ ฐ์ด๋์ ํ์ํ ๊ตฌ์กฐ์ฒด๋ค์ ์ ์ํ๋ ์์ ๋ถํฐ ์์ํด๋ณด๊ฒ ์ต๋๋ค.
๋ค์ ๊ตฌ์กฐ์ฒด๋ค์ vk_types.h์ ์ถ๊ฐํฉ๋๋ค.
enum class MaterialPass :uint8_t {
MainColor,
Transparent,
Other
};
struct MaterialPipeline {
VkPipeline pipeline;
VkPipelineLayout layout;
};
struct MaterialInstance {
MaterialPipeline* pipeline;
VkDescriptorSet materialSet;
MaterialPass passType;
};
์ด ๊ตฌ์กฐ์ฒด๋ค์ ๋จธํ ๋ฆฌ์ผ ๋ฐ์ดํฐ์ ํ์ํ ๊ตฌ์กฐ์ฒด๋ค์ ๋๋ค. MaterialInstance๋ ์ค์ ํ์ดํ๋ผ์ธ์ ๋ด๋ MaterialPipeline์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๋ด์ต๋๋ค(์์ ํ์ง๋ ์์ต๋๋ค). ๋ํ, ๋์คํฌ๋ฆฝํฐ ์ ๋ ํจ๊ป ๋ด๊ณ ์์ต๋๋ค.
์ด๋ฌํ ๊ฐ์ฒด๋ค์ ์์ฑํ๋ ๋ก์ง์ VulkanEngine์ด ์ ์ ์ปค์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ๊ตฌ์กฐ์ฒด๋ก ๊ฐ์ธ์ ๋ถ๋ฆฌํ ์์ ์ ๋๋ค. ๋์ค์๋ ๋ค์ํ ๋จธํ ๋ฆฌ์ผ๋ค์ ์ฌ์ฉํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค์์ vk_engine.h์ ์ถ๊ฐํฉ๋๋ค.
struct GLTFMetallic_Roughness {
MaterialPipeline opaquePipeline;
MaterialPipeline transparentPipeline;
VkDescriptorSetLayout materialLayout;
struct MaterialConstants {
glm::vec4 colorFactors;
glm::vec4 metal_rough_factors;
//padding, we need it anyway for uniform buffers
glm::vec4 extra[14];
};
struct MaterialResources {
AllocatedImage colorImage;
VkSampler colorSampler;
AllocatedImage metalRoughImage;
VkSampler metalRoughSampler;
VkBuffer dataBuffer;
uint32_t dataBufferOffset;
};
DescriptorWriter writer;
void build_pipelines(VulkanEngine* engine);
void clear_resources(VkDevice device);
MaterialInstance write_material(VkDevice device, MaterialPass pass, const MaterialResources& resources, DescriptorAllocatorGrowable& descriptorAllocator);
};
ํ์ฌ๋ก์๋ ๋ ํ์ดํ๋ผ์ธ์ ๋ณด์ ํ๊ฒ ๋ฉ๋๋ค. ํ๋๋ ํฌ๋ช ํ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆด ๋, ๋ค๋ฅธ ํ๋๋ ๋ถํฌ๋ช ํ ๊ฐ์ฒด์ ์ํ๋ง์คํน๋ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆด ๋ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋จธํ ๋ฆฌ์ผ์ ์ํ ๋์คํฌ๋ฆฝํฐ ์ ๋ ์ด์์๋ ํฌํจ๋ฉ๋๋ค.
๋จธํ ๋ฆฌ์ผ ์์๋ฅผ ์ํ ๊ตฌ์กฐ์ฒด๋ ์์ต๋๋ค. ์ด ๊ตฌ์กฐ์ฒด๋ ๋์ค์ ์ ๋ํผ ๋ฒํผ์ ์ฐ์ผ ๊ฒ์ ๋๋ค. ์ง๊ธ ํ์ํ ํ๋ผ๋ฏธํฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
colorFactors
๋ ์์ ํ ์ค์ณ์ ๊ณฑํด์ง ์์ ๊ฐ์ ๋๋ค.metal_rough_factors
๋ metallic๊ณผ roughness ๊ฐ์ ๊ฐ๊ฐ r๊ณผ b์ปดํฌ๋ํธ์ ์ ์ฅํฉ๋๋ค.- ๊ทธ ์ธ์๋ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉ๋๋ ๋ ๊ฐ์ง ์ถ๊ฐ ๊ฐ์ด ํฌํจ๋ฉ๋๋ค.
์ด์ธ์๋ ์ฌ๋ฌ vec4๋ค์ด ์ถ๊ฐ๋์ด ์๋๋ฐ, ์ด๋ ํจ๋ฉ(padding)์ ์ํ ๊ฒ์ ๋๋ค. Vulkan์์๋ ์ ๋ํผ ๋ฒํผ๋ฅผ ๋ฐ์ธ๋ฉํ ๋๋ ์ต์ ์ ๋ ฌ ๊ท์น์ ๋ง์กฑํด์ผ ํฉ๋๋ค. ๋ณดํต 256๋ฐ์ดํธ ์ ๋ ฌ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ฉฐ, ์ฐ๋ฆฌ๊ฐ ๋ชฉํ๋ก ํ๋ ๋ชจ๋ GPU์์ ์ด๋ฅผ ์ง์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ฅผ 2566๋ฐ์ดํธ๋ก ๋ง์ถ๊ธฐ ์ํด vec4๋ค์ ์ถ๊ฐํฉ๋๋ค.
๋์คํฌ๋ฆฝํฐ ์
์ ์์ฑํ ๋๋ ๋ช ๊ฐ์ง ํ
์ค์ณ์ ํจ๊ป, ์์ ์ธ๊ธํ colorFactors
๋ฐ ๊ธฐํ ์์ฑ์ ๋ด๊ณ ์๋ ์ ๋ํผ ๋ฒํผ๋ฅผ ๋ฐ์ธ๋ฉํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์์๋ค์ MaterialResources ๊ตฌ์กฐ์ฒด์ ๋ด์ write_material
ํจ์์ ์ ๋ฌํ๊ธฐ ์ฝ๊ฒ ๊ตฌ์ฑํฉ๋๋ค.
build_pipelines
ํจ์๋ ํ์ดํ๋ผ์ธ์ ์ปดํ์ผ ํฉ๋๋ค. clear_resources
๋ ๊ด๋ จ๋ ๋ชจ๋ ์์์ ์ ๋ฆฌํ๊ณ , write_material
์ ๋์คํฌ๋ฆฝํฐ ์
์ ์์ฑํ๊ณ ๋ ๋๋ง ์ ์ฌ์ฉํ ์ ์๋ ์์ ํ MaterialInstance ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
์ด์ ์ด ํจ์๋ค์ ๊ตฌํ๋ถ๋ฅผ ์ดํด๋ด ์๋ค.
void GLTFMetallic_Roughness::build_pipelines(VulkanEngine* engine)
{
VkShaderModule meshFragShader;
if (!vkutil::load_shader_module("../../shaders/mesh.frag.spv", engine->_device, &meshFragShader)) {
fmt::println("Error when building the triangle fragment shader module");
}
VkShaderModule meshVertexShader;
if (!vkutil::load_shader_module("../../shaders/mesh.vert.spv", engine->_device, &meshVertexShader)) {
fmt::println("Error when building the triangle vertex shader module");
}
VkPushConstantRange matrixRange{};
matrixRange.offset = 0;
matrixRange.size = sizeof(GPUDrawPushConstants);
matrixRange.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
DescriptorLayoutBuilder layoutBuilder;
layoutBuilder.add_binding(0,VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
layoutBuilder.add_binding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
layoutBuilder.add_binding(2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
materialLayout = layoutBuilder.build(engine->_device, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT);
VkDescriptorSetLayout layouts[] = { engine->_gpuSceneDataDescriptorLayout,
materialLayout };
VkPipelineLayoutCreateInfo mesh_layout_info = vkinit::pipeline_layout_create_info();
mesh_layout_info.setLayoutCount = 2;
mesh_layout_info.pSetLayouts = layouts;
mesh_layout_info.pPushConstantRanges = &matrixRange;
mesh_layout_info.pushConstantRangeCount = 1;
VkPipelineLayout newLayout;
VK_CHECK(vkCreatePipelineLayout(engine->_device, &mesh_layout_info, nullptr, &newLayout));
opaquePipeline.layout = newLayout;
transparentPipeline.layout = newLayout;
// build the stage-create-info for both vertex and fragment stages. This lets
// the pipeline know the shader modules per stage
PipelineBuilder pipelineBuilder;
pipelineBuilder.set_shaders(meshVertexShader, meshFragShader);
pipelineBuilder.set_input_topology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST);
pipelineBuilder.set_polygon_mode(VK_POLYGON_MODE_FILL);
pipelineBuilder.set_cull_mode(VK_CULL_MODE_NONE, VK_FRONT_FACE_CLOCKWISE);
pipelineBuilder.set_multisampling_none();
pipelineBuilder.disable_blending();
pipelineBuilder.enable_depthtest(true, VK_COMPARE_OP_GREATER_OR_EQUAL);
//render format
pipelineBuilder.set_color_attachment_format(engine->_drawImage.imageFormat);
pipelineBuilder.set_depth_format(engine->_depthImage.imageFormat);
// use the triangle layout we created
pipelineBuilder._pipelineLayout = newLayout;
// finally build the pipeline
opaquePipeline.pipeline = pipelineBuilder.build_pipeline(engine->_device);
// create the transparent variant
pipelineBuilder.enable_blending_additive();
pipelineBuilder.enable_depthtest(false, VK_COMPARE_OP_GREATER_OR_EQUAL);
transparentPipeline.pipeline = pipelineBuilder.build_pipeline(engine->_device);
vkDestroyShaderModule(engine->_device, meshFragShader, nullptr);
vkDestroyShaderModule(engine->_device, meshVertexShader, nullptr);
}
build_pipelines
๋ VulkanEngine์์์ init_pipelines
ํจ์์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ํ๋๊ทธ๋จผํธ์ ์ ์ ์
ฐ์ด๋๋ฅผ ๋ถ๋ฌ์ ํ์ดํ๋ผ์ธ์ผ๋ก ์ปดํ์ผํฉ๋๋ค. ์ด ๊ณผ์ ์์ ํ์ดํ๋ผ์ธ ๋ ์ด์์๋ ์์ฑํ๋ฉฐ, ๋์ผํ PipelineBuilder๋ฅผ ์ฌ์ฉํด 2๊ฐ์ ํ์ดํ๋ผ์ธ์ ์์ฑํ๊ณ ์์ต๋๋ค. ๋จผ์ ๋ถํฌ๋ช
๋ ๋๋ง์ ์ํ ํ์ดํ๋ผ์ธ์ ์์ฑํ๊ณ , ๊ทธํ ๋ธ๋ ๋ฉ์ ํ์ฑํํ์ฌ ํฌ๋ช
๋ ๋๋ง์ ์ํ ํ์ดํ๋ผ์ธ์ ์์ฑํฉ๋๋ค. ํ์ดํ๋ผ์ธ์ ๋ชจ๋ ์์ฑํ ํ์๋ ์
ฐ์ด๋ ๋ชจ๋์ ํ๊ดดํด๋ ๋ฌธ์ ์์ต๋๋ค.
2๊ฐ์ ์๋ก์ด ์ ฐ์ด๋๊ฐ ์ถ๊ฐ๋์์์ ํ์ธํ ์ ์์ต๋๋ค. ์๋์ ํด๋น ์ ฐ์ด๋๋ค์ ์ฝ๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด์ ๋ถํฐ๋ ๋จธํ ๋ฆฌ์ผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋ง์ ์ํํ ๊ฒ์ด๋ฏ๋ก, ๊ธฐ์กด ์ ฐ์ด๋ ๋์ ์์ ํ ์๋ก์ด ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ํ ์ด๋ฒ์๋ ์ ฐ์ด๋ ์ฝ๋์ #include ์ง์๋ฌธ์ ์ฌ์ฉํ ์์ ์ ๋๋ค. ๋์ผํ ์ ๋ ฅ ๊ตฌ์กฐ๊ฐ ์ ์ ์ ฐ์ด๋์ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋ ์์ชฝ ๋ชจ๋์์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
input_structures.glsl์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
layout(set = 0, binding = 0) uniform SceneData{
mat4 view;
mat4 proj;
mat4 viewproj;
vec4 ambientColor;
vec4 sunlightDirection; //w for sun power
vec4 sunlightColor;
} sceneData;
layout(set = 1, binding = 0) uniform GLTFMaterialData{
vec4 colorFactors;
vec4 metal_rough_factors;
} materialData;
layout(set = 1, binding = 1) uniform sampler2D colorTex;
layout(set = 1, binding = 2) uniform sampler2D metalRoughTex;
์ฌ ๋ฐ์ดํฐ์ฉ ์ ๋ํผ์ด ํ๋ ์์ผ๋ฉฐ, ๋ทฐ ํ๋ ฌ๊ณผ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค. ์ด ์ ๋ํผ์ ์ ์ญ ๋์คํฌ๋ฆฝํฐ ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๊ทธํ ๋จธํ ๋ฆฌ์ผ์ ์ํ ๋์คํฌ๋ฆฝํฐ ์ (set 1)์๋ ์ด 3๊ฐ์ ๋ฐ์ธ๋ฉ์ด ์์ผ๋ฉฐ, ๊ฐ๊ฐ ๋จธํ ๋ฆฌ์ผ ์์๋ฅผ ์ํ ์ ๋ํผ ํ๋์ ํ ์ค์ณ ๋ ๊ฐ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
mesh.vert๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#version 450
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_buffer_reference : require
#include "input_structures.glsl"
layout (location = 0) out vec3 outNormal;
layout (location = 1) out vec3 outColor;
layout (location = 2) out vec2 outUV;
struct Vertex {
vec3 position;
float uv_x;
vec3 normal;
float uv_y;
vec4 color;
};
layout(buffer_reference, std430) readonly buffer VertexBuffer{
Vertex vertices[];
};
//push constants block
layout( push_constant ) uniform constants
{
mat4 render_matrix;
VertexBuffer vertexBuffer;
} PushConstants;
void main()
{
Vertex v = PushConstants.vertexBuffer.vertices[gl_VertexIndex];
vec4 position = vec4(v.position, 1.0f);
gl_Position = sceneData.viewproj * PushConstants.render_matrix *position;
outNormal = (PushConstants.render_matrix * vec4(v.normal, 0.f)).xyz;
outColor = v.color.xyz * materialData.colorFactors.xyz;
outUV.x = v.uv_x;
outUV.y = v.uv_y;
}
์ด์ ๊ณผ ๋์ผํ ์ ์ ์ฒ๋ฆฌ ๋ก์ง์ ์ฌ์ฉํ์ง๋ง, ์ด๋ฒ์๋ ์์น๋ฅผ ๊ณ์ฐํ ๋ ํ๋ ฌ์ ๊ณฑํด์ค๋๋ค. ๋ํ ์ ์ ์์๊ณผ UV๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ๊ณ ์์ต๋๋ค. ๋ฒ์ ์ ๊ฒฝ์ฐ ์นด๋ฉ๋ผ ํ๋ ฌ์ ์ฌ์ฉํ์ง ์๊ณ render_matrix๋ง ๊ณฑํฉ๋๋ค.
mesh.frag๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#version 450
#extension GL_GOOGLE_include_directive : require
#include "input_structures.glsl"
layout (location = 0) in vec3 inNormal;
layout (location = 1) in vec3 inColor;
layout (location = 2) in vec2 inUV;
layout (location = 0) out vec4 outFragColor;
void main()
{
float lightValue = max(dot(inNormal, sceneData.sunlightDirection.xyz), 0.1f);
vec3 color = inColor * texture(colorTex,inUV).xyz;
vec3 ambient = color * sceneData.ambientColor.xyz;
outFragColor = vec4(color * lightValue * sceneData.sunlightColor.w + ambient ,1.0f);
}
์ฌ๊ธฐ์ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ์กฐ๋ช ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉ์๋ฅผ ์กฐ๊ธ ๋ ๋์ ๋ฐฉ์์ผ๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ ์ ์์๊ณผ ํ ์ค์ณ๋ฅผ ๊ณฑํด ํ๋ฉด ์์ ๊ณ์ฐํ ๋ค, ํ๋์ ํ์๊ด๊ณผ ํ๊ฒฝ๊ด๋ง์ ์ฌ์ฉํ๋ ๋จ์ํ ์กฐ๋ช ๋ชจ๋ธ์ ์ ์ฉํฉ๋๋ค.
์ด ๋ฐฉ์์ ์ค๋๋ ๊ฒ์์์ ๋ณผ ์ ์๋ ์ข ๋ฅ์ ์กฐ๋ช ๋ชจ๋ธ๋ก, ํ๋์ ํ๋์ฝ๋ฉ๋ ์กฐ๋ช ๊ณผ ์์ฃผ ๋จ์ํ ๊ณฑ์ ๊ธฐ๋ฐ ์กฐ๋ช ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ๋์ค์ ๊ฐ์ ํ ์์ ์ด์ง๋ง, ํ์ฌ๋ ๋จธํ ๋ฆฌ์ผ์ ์ข ๋ ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ์ต์ํ์ ์กฐ๋ช ๊ณ์ฐ์ด ํ์ํฉ๋๋ค.
์ด์ GLTFMetallic_Roughness
๋ก ๋์๊ฐ ๋์คํฌ๋ฆฝํฐ ์
์ ์์ฑํ๊ณ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ๋ write_material ํจ์๋ฅผ ๊ตฌํํด๋ด
์๋ค.
MaterialInstance GLTFMetallic_Roughness::write_material(VkDevice device, MaterialPass pass, const MaterialResources& resources, DescriptorAllocatorGrowable& descriptorAllocator)
{
MaterialInstance matData;
matData.passType = pass;
if (pass == MaterialPass::Transparent) {
matData.pipeline = &transparentPipeline;
}
else {
matData.pipeline = &opaquePipeline;
}
matData.materialSet = descriptorAllocator.allocate(device, materialLayout);
writer.clear();
writer.write_buffer(0, resources.dataBuffer, sizeof(MaterialConstants), resources.dataBufferOffset, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
writer.write_image(1, resources.colorImage.imageView, resources.colorSampler, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
writer.write_image(2, resources.metalRoughImage.imageView, resources.metalRoughSampler, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
writer.update_set(device, matData.materialSet);
return matData;
}
materaiPass์ ๋ฐ๋ผ ํฌ๋ช ๊ณผ ๋ถํฌ๋ช ํ์ดํ๋ผ์ธ ์ค ์ ํํ ํ, ๋์คํฌ๋ฆฝํฐ ์ ์ ํ ๋นํฉ๋๋ค. ์ดํ MaterialResource์ ์๋ ์ด๋ฏธ์ง์ ๋ฒํผ๋ฅผ ์ฌ์ฉํด ๋์คํฌ๋ฆฝํฐ ์ ์ ์์ฑํฉ๋๋ค.
์ด์ ์์ง์ ๋ก๋ฉ ์ํ์ค๋ฅผ ํ ์คํธํ ์ ์๋ ๊ธฐ๋ณธ ๋จธํ ๋ฆฌ์ผ์ ์์ฑํฉ์๋ค.
๋จผ์ VulkanEngine์ ๋จธํ ๋ฆฌ์ผ ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ณ , ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํ MaterialInstance ๊ตฌ์กฐ์ฒด๋ ์ ์ํฉ์๋ค.
MaterialInstance defaultData;
GLTFMetallic_Roughness metalRoughMaterial;
init_pipelines() ํจ์์ ๋ง์ง๋ง์์ ๋จธํ ๋ฆฌ์ผ ๊ตฌ์กฐ์ฒด์ ๋ํด build_pipelinesํจ์๋ฅผ ํธ์ถํ์ฌ ํ์ดํ๋ผ์ธ์ ์ปดํ์ผํฉ๋๋ค.
void VulkanEngine::init_pipelines()
{
//rest of initializing functions
metalRoughMaterial.build_pipelines(this);
}
์ด์ init_default_data()
ํจ์์ ๋ง์ง๋ง์์, ์์ ๋ง๋ ๊ธฐ๋ณธ ํ
์ค์ณ๋ค์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ MaterialInstance ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํ ์์ ๋ฒํผ์์ ํ๋ ๊ฒ์ฒ๋ผ, ๋ฒํผ๋ฅผ ํ ๋นํ ํ ์ญ์ ํ์ ๋ฑ๋กํ ๊ฒ์ธ๋ฐ, ์ด๋ฒ์๋ ์ ์ญ ์ญ์ ํ์ ์ถ๊ฐํฉ๋๋ค. ๊ธฐ๋ณธ ๋จธํ
๋ฆฌ์ผ ์์ ๋ฒํผ๋ ์์ฑ ์ดํ์๋ ๋ ์ด์ ์ ๊ทผํ ํ์๊ฐ ์์ต๋๋ค.
GLTFMetallic_Roughness::MaterialResources materialResources;
//default the material textures
materialResources.colorImage = _whiteImage;
materialResources.colorSampler = _defaultSamplerLinear;
materialResources.metalRoughImage = _whiteImage;
materialResources.metalRoughSampler = _defaultSamplerLinear;
//set the uniform buffer for the material data
AllocatedBuffer materialConstants = create_buffer(sizeof(GLTFMetallic_Roughness::MaterialConstants), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU);
//write the buffer
GLTFMetallic_Roughness::MaterialConstants* sceneUniformData = (GLTFMetallic_Roughness::MaterialConstants*)materialConstants.allocation->GetMappedData();
sceneUniformData->colorFactors = glm::vec4{1,1,1,1};
sceneUniformData->metal_rough_factors = glm::vec4{1,0.5,0,0};
_mainDeletionQueue.push_function([=, this]() {
destroy_buffer(materialConstants);
});
materialResources.dataBuffer = materialConstants.buffer;
materialResources.dataBufferOffset = 0;
defaultData = metalRoughMaterial.write_material(_device,MaterialPass::MainColor,materialResources, globalDescriptorAllocator);
MaterialResources์ ์๋ ๋จธํ ๋ฆฌ์ผ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ธฐ๋ณธ ํฐ์ ์ด๋ฏธ์ง๋ก ์ฑ์ธ ๊ฒ์ ๋๋ค. ์ดํ ๋จธํ ๋ฆฌ์ผ ์์์ ์ ์ฅํ ๋ฒํผ๋ฅผ ์์ฑํ๊ณ ์ญ์ ํ์ ๋ฑ๋กํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ write_material ํจ์๋ฅผ ํธ์ถํ์ฌ ๋์คํฌ๋ฆฝํฐ ์ ์ ์์ฑํ๊ณ , ๊ธฐ๋ณธ ๋จธํ ๋ฆฌ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ด๊ธฐํํฉ๋๋ค.
Next: Meshes and Camera