Added ETC2 and ASTC texture variants (Refs #174)

This commit is contained in:
saschawillems 2017-03-09 21:38:24 +01:00
parent 7403372ecd
commit a34bb203e0
14 changed files with 102 additions and 44 deletions

View file

@ -1,23 +0,0 @@
cd jni
call ndk-build
if %ERRORLEVEL% EQU 0 (
cd..
mkdir "assets\shaders\base"
xcopy "..\..\data\shaders\base\*.spv" "assets\shaders\base" /Y
mkdir "assets\shaders\scenerendering"
xcopy "..\..\data\shaders\scenerendering\*.*" "assets\shaders\scenerendering" /Y
mkdir "assets\models\sibenik"
xcopy "..\..\data\models\sibenik\*.*" "assets\models\sibenik" /Y
mkdir "res\drawable"
xcopy "..\..\android\images\icon.png" "res\drawable" /Y
call ant debug -Dout.final.file=vulkanScenerendering.apk
) ELSE (
echo error : ndk-build failed with errors!
cd..
)

View file

@ -0,0 +1,47 @@
import os
import shutil
import subprocess
import sys
import glob
APK_NAME = "scenerendering"
SHADER_DIR = "pbribl"
if subprocess.call("ndk-build", shell=True) == 0:
print("Build successful")
# Assets
if not os.path.exists("./assets"):
os.makedirs("./assets")
# Shaders
# Base
if not os.path.exists("./assets/shaders/base"):
os.makedirs("./assets/shaders/base")
for file in glob.glob("../../data/shaders/base/*.spv"):
shutil.copy(file, "./assets/shaders/base")
# Sample
if not os.path.exists("./assets/shaders/%s" % SHADER_DIR):
os.makedirs("./assets/shaders/%s" % SHADER_DIR)
for file in glob.glob("../../data/shaders/%s/*.spv" %SHADER_DIR):
shutil.copy(file, "./assets/shaders/%s" % SHADER_DIR)
# Textures and model
if not os.path.exists("./assets/models/sibenik/"):
os.makedirs("./assets/models/sibenik/")
for file in glob.glob("../../data/models/sibenik/*.*"):
shutil.copy(file, "./assets/models/sibenik")
# Icon
if not os.path.exists("./res/drawable"):
os.makedirs("./res/drawable")
shutil.copy("../../android/images/icon.png", "./res/drawable")
if subprocess.call("ant debug -Dout.final.file=%s.apk" % APK_NAME, shell=True) == 0:
if len(sys.argv) > 1:
if sys.argv[1] == "-deploy":
if subprocess.call("adb install -r %s.apk" % APK_NAME, shell=True) != 0:
print("Could not deploy to device!")
else:
print("Error during build process!")
else:
print("Error building project!")

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -148,6 +148,25 @@ private:
std::cout << "Material \"" << materials[i].name << "\"" << std::endl; std::cout << "Material \"" << materials[i].name << "\"" << std::endl;
// Textures // Textures
std::string texFormatSuffix;
VkFormat texFormat;
// Get supported compressed texture format
if (vulkanDevice->features.textureCompressionBC) {
texFormatSuffix = "_bc3_unorm";
texFormat = VK_FORMAT_BC3_UNORM_BLOCK;
}
//else if (vulkanDevice->features.textureCompressionASTC_LDR) {
// texFormatSuffix = "_astc_8x8_unorm";
// texFormat = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
//}
else if (vulkanDevice->features.textureCompressionETC2) {
texFormatSuffix = "_etc2_unorm";
texFormat = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
}
else {
vks::tools::exitFatal("Device does not support any compressed texture format!", "Error");
}
aiString texturefile; aiString texturefile;
// Diffuse // Diffuse
aScene->mMaterials[i]->GetTexture(aiTextureType_DIFFUSE, 0, &texturefile); aScene->mMaterials[i]->GetTexture(aiTextureType_DIFFUSE, 0, &texturefile);
@ -156,13 +175,14 @@ private:
std::cout << " Diffuse: \"" << texturefile.C_Str() << "\"" << std::endl; std::cout << " Diffuse: \"" << texturefile.C_Str() << "\"" << std::endl;
std::string fileName = std::string(texturefile.C_Str()); std::string fileName = std::string(texturefile.C_Str());
std::replace(fileName.begin(), fileName.end(), '\\', '/'); std::replace(fileName.begin(), fileName.end(), '\\', '/');
materials[i].diffuse.loadFromFile(assetPath + fileName, VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); fileName.insert(fileName.find(".ktx"), texFormatSuffix);
materials[i].diffuse.loadFromFile(assetPath + fileName, texFormat, vulkanDevice, queue);
} }
else else
{ {
std::cout << " Material has no diffuse, using dummy texture!" << std::endl; std::cout << " Material has no diffuse, using dummy texture!" << std::endl;
// todo : separate pipeline and layout // todo : separate pipeline and layout
materials[i].diffuse.loadFromFile(assetPath + "dummy.ktx", VK_FORMAT_BC2_UNORM_BLOCK, vulkanDevice, queue); materials[i].diffuse.loadFromFile(assetPath + "dummy_rgba_unorm.ktx", VK_FORMAT_R8G8B8A8_UNORM, vulkanDevice, queue);
} }
// For scenes with multiple textures per material we would need to check for additional texture types, e.g.: // For scenes with multiple textures per material we would need to check for additional texture types, e.g.:
@ -563,6 +583,7 @@ public:
VulkanExample() : VulkanExampleBase(ENABLE_VALIDATION) VulkanExample() : VulkanExampleBase(ENABLE_VALIDATION)
{ {
title = "Vulkan Example - Scene rendering";
rotationSpeed = 0.5f; rotationSpeed = 0.5f;
enableTextOverlay = true; enableTextOverlay = true;
camera.type = Camera::CameraType::firstperson; camera.type = Camera::CameraType::firstperson;
@ -570,8 +591,6 @@ public:
camera.position = { 15.0f, -13.5f, 0.0f }; camera.position = { 15.0f, -13.5f, 0.0f };
camera.setRotation(glm::vec3(5.0f, 90.0f, 0.0f)); camera.setRotation(glm::vec3(5.0f, 90.0f, 0.0f));
camera.setPerspective(60.0f, (float)width / (float)height, 0.1f, 256.0f); camera.setPerspective(60.0f, (float)width / (float)height, 0.1f, 256.0f);
title = "Vulkan Example - Scene rendering";
enabledFeatures.fillModeNonSolid = VK_TRUE;
} }
~VulkanExample() ~VulkanExample()
@ -579,6 +598,15 @@ public:
delete(scene); delete(scene);
} }
// Enable physical device features required for this example
virtual void getEnabledFeatures()
{
// Fill mode non solid is required for wireframe display
if (deviceFeatures.fillModeNonSolid) {
enabledFeatures.fillModeNonSolid = VK_TRUE;
};
}
void reBuildCommandBuffers() void reBuildCommandBuffers()
{ {
if (!checkCommandBuffers()) if (!checkCommandBuffers())
@ -762,11 +790,13 @@ public:
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &scene->pipelines.blending)); VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &scene->pipelines.blending));
// Wire frame rendering pipeline // Wire frame rendering pipeline
rasterizationState.cullMode = VK_CULL_MODE_BACK_BIT; if (deviceFeatures.fillModeNonSolid) {
blendAttachmentState.blendEnable = VK_FALSE; rasterizationState.cullMode = VK_CULL_MODE_BACK_BIT;
rasterizationState.polygonMode = VK_POLYGON_MODE_LINE; blendAttachmentState.blendEnable = VK_FALSE;
rasterizationState.lineWidth = 1.0f; rasterizationState.polygonMode = VK_POLYGON_MODE_LINE;
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &scene->pipelines.wireframe)); rasterizationState.lineWidth = 1.0f;
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &scene->pipelines.wireframe));
}
} }
void updateUniformBuffers() void updateUniformBuffers()
@ -839,8 +869,10 @@ public:
{ {
case KEY_SPACE: case KEY_SPACE:
case GAMEPAD_BUTTON_A: case GAMEPAD_BUTTON_A:
wireframe = !wireframe; if (deviceFeatures.fillModeNonSolid) {
reBuildCommandBuffers(); wireframe = !wireframe;
reBuildCommandBuffers();
}
break; break;
case KEY_P: case KEY_P:
scene->renderSingleScenePart = !scene->renderSingleScenePart; scene->renderSingleScenePart = !scene->renderSingleScenePart;
@ -866,19 +898,21 @@ public:
virtual void getOverlayText(VulkanTextOverlay *textOverlay) virtual void getOverlayText(VulkanTextOverlay *textOverlay)
{ {
if (deviceFeatures.fillModeNonSolid) {
#if defined(__ANDROID__) #if defined(__ANDROID__)
textOverlay->addText("Press \"Button A\" to toggle wireframe", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); textOverlay->addText("Press \"Button A\" to toggle wireframe", 5.0f, 85.0f, VulkanTextOverlay::alignLeft);
#else #else
textOverlay->addText("Press \"space\" to toggle wireframe", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); textOverlay->addText("Press \"space\" to toggle wireframe", 5.0f, 85.0f, VulkanTextOverlay::alignLeft);
if ((scene) && (scene->renderSingleScenePart)) if ((scene) && (scene->renderSingleScenePart))
{ {
textOverlay->addText("Rendering mesh " + std::to_string(scene->scenePartIndex + 1) + " of " + std::to_string(static_cast<uint32_t>(scene->meshes.size())) + "(\"p\" to toggle)", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); textOverlay->addText("Rendering mesh " + std::to_string(scene->scenePartIndex + 1) + " of " + std::to_string(static_cast<uint32_t>(scene->meshes.size())) + "(\"p\" to toggle)", 5.0f, 100.0f, VulkanTextOverlay::alignLeft);
} }
else else
{ {
textOverlay->addText("Rendering whole scene (\"p\" to toggle)", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); textOverlay->addText("Rendering whole scene (\"p\" to toggle)", 5.0f, 100.0f, VulkanTextOverlay::alignLeft);
} }
#endif #endif
}
} }
}; };