diff --git a/src/main.cpp b/src/main.cpp
index 7feb5bb..095aa48 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -71,6 +71,8 @@ private:
     std::vector<void*> m_uniformBuffersMapped;
     vk::raii::DeviceMemory m_textureImageMemory{ nullptr };
     vk::raii::Image m_textureImage{ nullptr };
+    vk::raii::ImageView m_textureImageView{ nullptr };
+    vk::raii::Sampler m_textureSampler{ nullptr };
     vk::raii::SwapchainKHR m_swapChain{ nullptr };
     std::vector<vk::Image> m_swapChainImages;
     vk::Format m_swapChainImageFormat;
@@ -118,6 +120,8 @@ private:
         createFramebuffers();
         createCommandPool();
         createTextureImage();
+        createTextureImageView();
+        createTextureSampler();
         createVertexBuffer();
         createIndexBuffer();
         createUniformBuffers();
@@ -274,7 +278,9 @@ private:
             swapChainAdequate = !swapChainSupport.formats.empty() && !swapChainSupport.presentModes.empty();
         }
 
-        return indices.isComplete() && extensionsSupported && swapChainAdequate;
+        auto supportedFeatures = physicalDevice.getFeatures();
+
+        return indices.isComplete() && extensionsSupported && swapChainAdequate && supportedFeatures.samplerAnisotropy;
     }
     void pickPhysicalDevice() {
         // std::vector<vk::raii::PhysicalDevice>
@@ -334,6 +340,7 @@ private:
         }
 
         vk::PhysicalDeviceFeatures deviceFeatures;
+        deviceFeatures.samplerAnisotropy = true;
 
         vk::DeviceCreateInfo createInfo;
         createInfo.setQueueCreateInfos( queueCreateInfos );
@@ -463,18 +470,8 @@ private:
     /// imageview
     void createImageViews() {
         m_swapChainImageViews.reserve( m_swapChainImages.size() );
-        for (size_t i = 0; i < m_swapChainImages.size(); i++) {
-            vk::ImageViewCreateInfo createInfo;
-            createInfo.image = m_swapChainImages[i];
-            createInfo.viewType = vk::ImageViewType::e2D;
-            createInfo.format = m_swapChainImageFormat;
-            createInfo.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
-            createInfo.subresourceRange.baseMipLevel = 0;
-            createInfo.subresourceRange.levelCount = 1;
-            createInfo.subresourceRange.baseArrayLayer = 0;
-            createInfo.subresourceRange.layerCount = 1;
-
-            m_swapChainImageViews.emplace_back( m_device.createImageView(createInfo) );
+        for (size_t i = 0; i < m_swapChainImages.size(); ++i) {
+            m_swapChainImageViews.emplace_back( createImageView(m_swapChainImages[i], m_swapChainImageFormat) );
         }
     }
     /////////////////////////////////////////////////////////////////
@@ -1288,6 +1285,53 @@ private:
         
     }
     /////////////////////////////////////////////////////////////////
+
+    /////////////////////////////////////////////////////////////////
+    /// image view and sampler
+    vk::raii::ImageView createImageView(vk::Image image, vk::Format format) {
+        vk::ImageViewCreateInfo viewInfo;
+        viewInfo.image = image;
+        viewInfo.viewType = vk::ImageViewType::e2D;
+        viewInfo.format = format;
+        viewInfo.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
+        viewInfo.subresourceRange.baseMipLevel = 0;
+        viewInfo.subresourceRange.levelCount = 1;
+        viewInfo.subresourceRange.baseArrayLayer = 0;
+        viewInfo.subresourceRange.layerCount = 1;
+
+        return m_device.createImageView(viewInfo);
+    }
+    void createTextureImageView() {
+        m_textureImageView = createImageView(m_textureImage, vk::Format::eR8G8B8A8Srgb);
+    }
+    void createTextureSampler() {
+        vk::SamplerCreateInfo samplerInfo;
+        samplerInfo.magFilter = vk::Filter::eLinear;
+        samplerInfo.minFilter = vk::Filter::eLinear;
+
+        samplerInfo.addressModeU = vk::SamplerAddressMode::eRepeat;
+        samplerInfo.addressModeV = vk::SamplerAddressMode::eRepeat;
+        samplerInfo.addressModeW = vk::SamplerAddressMode::eRepeat;
+
+        samplerInfo.anisotropyEnable = true;
+        auto properties = m_physicalDevice.getProperties();
+        samplerInfo.maxAnisotropy = properties.limits.maxSamplerAnisotropy;
+
+        samplerInfo.borderColor = vk::BorderColor::eIntOpaqueBlack;
+
+        samplerInfo.unnormalizedCoordinates = false;
+
+        samplerInfo.compareEnable = false;
+        samplerInfo.compareOp = vk::CompareOp::eAlways;
+
+        samplerInfo.mipmapMode = vk::SamplerMipmapMode::eLinear;
+        samplerInfo.mipLodBias = 0.0f;
+        samplerInfo.minLod = 0.0f;
+        samplerInfo.maxLod = 0.0f;
+
+        m_textureSampler = m_device.createSampler(samplerInfo);
+    }
+    /////////////////////////////////////////////////////////////////
 };
 
 int main() {
