Skip to content

Commit a31e023

Browse files
committed
add cube demo2
1 parent eb5b5f8 commit a31e023

16 files changed

+128
-179
lines changed

CMakeLists.txt

+6-5
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ add_library(
5555
source/VK_Util.cpp
5656
)
5757

58-
set(DEMOS cube blend-color hello-triangle clear-color indexed-traingle uniform-buffer uniform-buffer2 viewport-buffer sampler texture)
58+
set(DEMOS cube-texture cube-color blend-color hello-triangle clear-color indexed-traingle uniform-buffer uniform-buffer2 viewport-buffer sampler texture)
5959

6060

6161
foreach(var IN LISTS DEMOS)
@@ -68,9 +68,10 @@ foreach(var IN LISTS DEMOS)
6868
endif()
6969
endforeach()
7070

71-
#if(WIN32)
72-
# add_executable(opengl demo/opengl.cpp glad/glad.c)
73-
# target_link_libraries(opengl glfw3 GL dl)
74-
#endif()
71+
if(WIN32)
72+
else()
73+
add_executable(opengl demo/opengl.cpp glad/glad.c)
74+
target_link_libraries(opengl glfw GL dl)
75+
endif()
7576

7677
message("finished ......................")

demo/main-blend-color.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ int main()
5353
context->initVulkanDevice(vkConfig);
5454

5555
auto shaderSet = context->createShaderSet();
56-
shaderSet->addShader("../shader/vertex/vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
57-
shaderSet->addShader("../shader/vertex/frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
56+
shaderSet->addShader("../shader/cube-color/vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
57+
shaderSet->addShader("../shader/cube-color/frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
5858

5959
shaderSet->appendAttributeDescription(0, sizeof (float) * 3);
6060
shaderSet->appendAttributeDescription(1, sizeof (float) * 4);

demo/main-cube.cpp

-151
This file was deleted.

include/VK_Image.h

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class VK_Image : public VK_Deleter
99
virtual VkImage getImage()const = 0;
1010
virtual int getWidth()const = 0;
1111
virtual int getHeight()const = 0;
12+
virtual int getMipLevel()const = 0;
1213
};
1314

1415
#endif // VK_IMAGE_HPP

include/VK_ImageView.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
class VK_ImageView : public VK_Deleter
77
{
88
public:
9-
static VkImageViewCreateInfo createImageViewCreateInfo(VkImage image, VkFormat format);
9+
static VkImageViewCreateInfo createImageViewCreateInfo(VkImage image, VkFormat format,uint32_t mipLevels = 1);
1010

1111
virtual void setSampler(VkSampler sampler) = 0;
1212
virtual VkWriteDescriptorSet createWriteDescriptorSet(VkDescriptorSet descriptorSet)const = 0;

include/VK_Texture.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
class VK_Sampler : public VK_Deleter
77
{
88
public:
9-
static VkSamplerCreateInfo createSamplerCreateInfo();
9+
static VkSamplerCreateInfo createSamplerCreateInfo(uint32_t mipLevels = 0);
1010
virtual VkSampler getSampler()const = 0;
1111
};
1212

shader/depth/frag.spv

-88 Bytes
Binary file not shown.

shader/depth/shader_depth.frag

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
#version 450
22

33
layout(binding = 1) uniform sampler2D texSampler;
4-
5-
layout(location = 0) in vec3 fragColor;
6-
layout(location = 1) in vec2 fragTexCoord;
7-
4+
layout(location = 0) in vec2 fragTexCoord;
85
layout(location = 0) out vec4 outColor;
96

107
void main() {

shader/depth/shader_depth.vert

+2-6
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,10 @@ layout(binding = 0) uniform UniformBufferObject {
55
} ubo;
66

77
layout(location = 0) in vec3 inPosition;
8-
layout(location = 1) in vec3 inColor;
9-
layout(location = 2) in vec2 inTexCoord;
10-
11-
layout(location = 0) out vec3 fragColor;
12-
layout(location = 1) out vec2 fragTexCoord;
8+
layout(location = 1) in vec2 inTexCoord;
9+
layout(location = 0) out vec2 fragTexCoord;
1310

1411
void main() {
1512
gl_Position = ubo.model * vec4(inPosition, 1.0);
16-
fragColor = inColor;
1713
fragTexCoord = inTexCoord;
1814
}

shader/depth/vert.spv

-152 Bytes
Binary file not shown.

source/VK_ContextImpl.cpp

+91-2
Original file line numberDiff line numberDiff line change
@@ -1497,7 +1497,7 @@ uint32_t VK_ContextImpl::findMemoryType(uint32_t typeFilter, VkMemoryPropertyFla
14971497
return ~0;
14981498
}
14991499

1500-
void VK_ContextImpl::transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout)
1500+
void VK_ContextImpl::transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t mipLevels)
15011501
{
15021502
VkCommandBuffer commandBuffer = beginSingleTimeCommands();
15031503

@@ -1510,7 +1510,7 @@ void VK_ContextImpl::transitionImageLayout(VkImage image, VkFormat format, VkIma
15101510
barrier.image = image;
15111511
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15121512
barrier.subresourceRange.baseMipLevel = 0;
1513-
barrier.subresourceRange.levelCount = 1;
1513+
barrier.subresourceRange.levelCount = mipLevels;
15141514
barrier.subresourceRange.baseArrayLayer = 0;
15151515
barrier.subresourceRange.layerCount = 1;
15161516

@@ -1608,3 +1608,92 @@ void VK_ContextImpl::endSingleTimeCommands(VkCommandBuffer commandBuffer)
16081608

16091609
vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
16101610
}
1611+
1612+
void VK_ContextImpl::generateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels)
1613+
{
1614+
VkFormatProperties formatProperties;
1615+
vkGetPhysicalDeviceFormatProperties(physicalDevice, imageFormat, &formatProperties);
1616+
1617+
if (!(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)) {
1618+
std::cerr << "texture image format does not support linear blitting!" << std::endl;
1619+
}
1620+
1621+
VkCommandBuffer commandBuffer = beginSingleTimeCommands();
1622+
1623+
VkImageMemoryBarrier barrier = {};
1624+
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
1625+
barrier.image = image;
1626+
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
1627+
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
1628+
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1629+
barrier.subresourceRange.baseArrayLayer = 0;
1630+
barrier.subresourceRange.layerCount = 1;
1631+
barrier.subresourceRange.levelCount = 1;
1632+
1633+
int32_t mipWidth = texWidth;
1634+
int32_t mipHeight = texHeight;
1635+
1636+
for (uint32_t i = 1; i < mipLevels; i++) {
1637+
barrier.subresourceRange.baseMipLevel = i - 1;
1638+
barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
1639+
barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
1640+
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1641+
barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1642+
1643+
vkCmdPipelineBarrier(commandBuffer,
1644+
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,
1645+
0, nullptr,
1646+
0, nullptr,
1647+
1, &barrier);
1648+
1649+
VkImageBlit blit = {};
1650+
blit.srcOffsets[0] = {0, 0, 0};
1651+
blit.srcOffsets[1] = {mipWidth, mipHeight, 1};
1652+
blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1653+
blit.srcSubresource.mipLevel = i - 1;
1654+
blit.srcSubresource.baseArrayLayer = 0;
1655+
blit.srcSubresource.layerCount = 1;
1656+
blit.dstOffsets[0] = {0, 0, 0};
1657+
blit.dstOffsets[1] = { mipWidth > 1 ? mipWidth / 2 : 1, mipHeight > 1 ? mipHeight / 2 : 1, 1 };
1658+
blit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1659+
blit.dstSubresource.mipLevel = i;
1660+
blit.dstSubresource.baseArrayLayer = 0;
1661+
blit.dstSubresource.layerCount = 1;
1662+
1663+
vkCmdBlitImage(commandBuffer,
1664+
image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1665+
image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1666+
1, &blit,
1667+
VK_FILTER_LINEAR);
1668+
1669+
barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
1670+
barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1671+
barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1672+
barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
1673+
1674+
vkCmdPipelineBarrier(commandBuffer,
1675+
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0,
1676+
0, nullptr,
1677+
0, nullptr,
1678+
1, &barrier);
1679+
1680+
if (mipWidth > 1)
1681+
mipWidth /= 2;
1682+
if (mipHeight > 1)
1683+
mipHeight /= 2;
1684+
}
1685+
1686+
barrier.subresourceRange.baseMipLevel = mipLevels - 1;
1687+
barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
1688+
barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1689+
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1690+
barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
1691+
1692+
vkCmdPipelineBarrier(commandBuffer,
1693+
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0,
1694+
0, nullptr,
1695+
0, nullptr,
1696+
1, &barrier);
1697+
1698+
endSingleTimeCommands(commandBuffer);
1699+
}

source/VK_ContextImpl.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,10 @@ class VK_ContextImpl : public VK_Context
107107
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size)override;
108108
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties)override;
109109

110-
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout);
110+
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout,uint32_t mipLevels = 1);
111111
void copyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height);
112+
113+
void generateMipmaps(VkImage image, VkFormat format, int32_t width, int32_t height, uint32_t mipLevels);
112114
private:
113115
void recreateSwapChain();
114116

0 commit comments

Comments
 (0)