diff --git a/kraken/KRPipelineManager.cpp b/kraken/KRPipelineManager.cpp index 57b06fc..c257b31 100644 --- a/kraken/KRPipelineManager.cpp +++ b/kraken/KRPipelineManager.cpp @@ -81,9 +81,20 @@ KRPipeline* KRPipelineManager::getPipeline(KRSurface& surface, const PipelineInf return itr->second; } + std::vector shaderNames; + shaderNames.push_back(*info.shader_name + ".vert"); + shaderNames.push_back(*info.shader_name + ".frag"); + std::vector shaders; - shaders.push_back(m_pContext->getShaderManager()->get(*info.shader_name + ".vert", "spv")); - shaders.push_back(m_pContext->getShaderManager()->get(*info.shader_name + ".frag", "spv")); + for (const std::string& name : shaderNames) { + KRShader* shader = m_pContext->getShaderManager()->get(name, "spv"); + if (shader == nullptr) { + KRContext::Log(KRContext::LOG_LEVEL_ERROR, "Shader not found: %s", name.c_str()); + return nullptr; + } + shaders.push_back(shader); + } + KRPipeline* pipeline = new KRPipeline(*m_pContext, surface.m_deviceHandle, info.renderPass, surface.getDimensions(), surface.getDimensions(), info, info.shader_name->c_str(), shaders, info.vertexAttributes, info.modelFormat); m_pipelines[key] = pipeline; diff --git a/kraken/nodes/KRAmbientZone.cpp b/kraken/nodes/KRAmbientZone.cpp index 5e79186..bdfa504 100755 --- a/kraken/nodes/KRAmbientZone.cpp +++ b/kraken/nodes/KRAmbientZone.cpp @@ -134,7 +134,7 @@ void KRAmbientZone::render(RenderInfo& ri) info.vertexAttributes = sphereModel->getVertexAttributes(); KRPipeline* pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - if (pPipeline->bind(ri, sphereModelMatrix)) { + if (pPipeline && pPipeline->bind(ri, sphereModelMatrix)) { sphereModel->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f); } } // sphereModel diff --git a/kraken/nodes/KRAudioSource.cpp b/kraken/nodes/KRAudioSource.cpp index 79f81e1..240ebd5 100755 --- a/kraken/nodes/KRAudioSource.cpp +++ b/kraken/nodes/KRAudioSource.cpp @@ -156,7 +156,7 @@ void KRAudioSource::render(RenderInfo& ri) info.vertexAttributes = sphereModel->getVertexAttributes(); KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - if (pShader->bind(ri, sphereModelMatrix)) { + if (pShader && pShader->bind(ri, sphereModelMatrix)) { sphereModel->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f); } } // sphereModels.size() diff --git a/kraken/nodes/KRBone.cpp b/kraken/nodes/KRBone.cpp index 79946dd..0beba3e 100755 --- a/kraken/nodes/KRBone.cpp +++ b/kraken/nodes/KRBone.cpp @@ -96,7 +96,7 @@ void KRBone::render(RenderInfo& ri) info.vertexAttributes = sphereModel->getVertexAttributes(); KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - if (pShader->bind(ri, sphereModelMatrix)) { + if (pShader && pShader->bind(ri, sphereModelMatrix)) { sphereModel->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f); } } // sphereModel diff --git a/kraken/nodes/KRCamera.cpp b/kraken/nodes/KRCamera.cpp index fb08479..da15b59 100755 --- a/kraken/nodes/KRCamera.cpp +++ b/kraken/nodes/KRCamera.cpp @@ -154,24 +154,19 @@ void KRCamera::render(KRNode::RenderInfo& ri) GL_PUSH_GROUP_MARKER("Sky Box"); - if (m_skyBox.val.isBound()) { + std::string shader_name("sky_box"); + PipelineInfo info{}; + info.shader_name = &shader_name; + info.pCamera = this; + info.renderPass = ri.renderPass; + info.rasterMode = RasterMode::kOpaqueNoDepthWrite; + info.cullMode = CullMode::kCullNone; - std::string shader_name("sky_box"); - PipelineInfo info{}; - info.shader_name = &shader_name; - info.pCamera = this; - info.renderPass = ri.renderPass; - info.rasterMode = RasterMode::kOpaqueNoDepthWrite; - info.cullMode = CullMode::kCullNone; - - KRPipeline* pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pPipeline->setImageBinding("diffuseTexture", m_skyBox.val.get(), getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER); - if (pPipeline->bind(ri, Matrix4())) { - - // Render a full screen quad - m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES, 1.0f); - vkCmdDraw(ri.commandBuffer, 4, 1, 0, 0); - } + KRPipeline* pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info); + if (pPipeline && pPipeline->bind(ri, Matrix4())) { + // Render a full screen quad + m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES, 1.0f); + vkCmdDraw(ri.commandBuffer, 4, 1, 0, 0); } GL_POP_GROUP_MARKER; @@ -625,7 +620,7 @@ void KRCamera::renderDebug(RenderInfo& ri) info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES; KRPipeline* fontShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); - if (fontShader->bind(ri, Matrix4())) { + if (fontShader && fontShader->bind(ri, Matrix4())) { m_debug_text_vbo_data.bind(ri.commandBuffer); @@ -860,6 +855,11 @@ bool KRCamera::getImageBinding(const std::string& name, const KRTextureBinding** *binding = &m_fontTexture; *sample = getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER; return true; + } else if (name == "skyboxTexture") { + *binding = &m_skyBox.val; + *sample = getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER; + return true; + } else { return KRNode::getImageBinding(name, binding, sample); } diff --git a/kraken/nodes/KRCollider.cpp b/kraken/nodes/KRCollider.cpp index 20e7af7..2b783b5 100755 --- a/kraken/nodes/KRCollider.cpp +++ b/kraken/nodes/KRCollider.cpp @@ -222,7 +222,7 @@ void KRCollider::render(RenderInfo& ri) KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - if (pShader->bind(ri, getModelMatrix())) { + if (pShader && pShader->bind(ri, getModelMatrix())) { m_model.val.get()->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f); } diff --git a/kraken/nodes/KRDirectionalLight.cpp b/kraken/nodes/KRDirectionalLight.cpp index d39bb34..75f0556 100755 --- a/kraken/nodes/KRDirectionalLight.cpp +++ b/kraken/nodes/KRDirectionalLight.cpp @@ -159,11 +159,13 @@ void KRDirectionalLight::render(RenderInfo& ri) info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_STRIP; KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pShader->setPushConstant(ShaderValue::light_direction_view_space, light_direction_view_space); - if (pShader->bind(ri, getModelMatrix())) { // TODO: Need to pass in the light index to the shader - // Render a full screen quad - m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &vertices, 1.0f); - vkCmdDraw(ri.commandBuffer, 4, 1, 0, 0); + if (pShader) { + pShader->setPushConstant(ShaderValue::light_direction_view_space, light_direction_view_space); + if (pShader->bind(ri, getModelMatrix())) { // TODO: Need to pass in the light index to the shader + // Render a full screen quad + m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &vertices, 1.0f); + vkCmdDraw(ri.commandBuffer, 4, 1, 0, 0); + } } } diff --git a/kraken/nodes/KRLight.cpp b/kraken/nodes/KRLight.cpp index f733118..92f6b82 100755 --- a/kraken/nodes/KRLight.cpp +++ b/kraken/nodes/KRLight.cpp @@ -226,14 +226,15 @@ void KRLight::render(RenderInfo& ri) info.vertexAttributes = (1 << KRMesh::KRENGINE_ATTRIB_VERTEX) | (1 << KRMesh::KRENGINE_ATTRIB_TEXUVA); info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES; KRPipeline* pParticleShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); - - pParticleShader->setPushConstant(ShaderValue::dust_particle_color, m_color.val * ri.camera->settings.dust_particle_intensity * m_dust_particle_intensity * m_intensity); - pParticleShader->setPushConstant(ShaderValue::particle_origin, Matrix4::DotWDiv(Matrix4::Invert(particleModelMatrix), Vector3::Zero())); - if (pParticleShader->bind(ri, particleModelMatrix)) { // TODO: Pass light index to shader - - m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_RANDOM_PARTICLES, 1.0f); - - vkCmdDraw(ri.commandBuffer, particle_count * 3, 1, 0, 0); + if (pParticleShader) { + pParticleShader->setPushConstant(ShaderValue::dust_particle_color, m_color.val * ri.camera->settings.dust_particle_intensity * m_dust_particle_intensity * m_intensity); + pParticleShader->setPushConstant(ShaderValue::particle_origin, Matrix4::DotWDiv(Matrix4::Invert(particleModelMatrix), Vector3::Zero())); + if (pParticleShader->bind(ri, particleModelMatrix)) { // TODO: Pass light index to shader + + m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_RANDOM_PARTICLES, 1.0f); + + vkCmdDraw(ri.commandBuffer, particle_count * 3, 1, 0, 0); + } } } } @@ -259,6 +260,12 @@ void KRLight::render(RenderInfo& ri) this_point_light.push_back(point_light); } + int slice_count = (int)(ri.camera->settings.volumetric_environment_quality * 495.0) + 5; + + float slice_near = -ri.camera->settings.getPerspectiveNearZ(); + float slice_far = -ri.camera->settings.volumetric_environment_max_distance; + float slice_spacing = (slice_far - slice_near) / slice_count; + PipelineInfo info{}; info.shader_name = &shader_name; info.pCamera = ri.camera; @@ -272,19 +279,14 @@ void KRLight::render(RenderInfo& ri) info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES; KRPipeline* pFogShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); - - int slice_count = (int)(ri.camera->settings.volumetric_environment_quality * 495.0) + 5; - - float slice_near = -ri.camera->settings.getPerspectiveNearZ(); - float slice_far = -ri.camera->settings.volumetric_environment_max_distance; - float slice_spacing = (slice_far - slice_near) / slice_count; - - pFogShader->setPushConstant(ShaderValue::slice_depth_scale, Vector2::Create(slice_near, slice_spacing)); - pFogShader->setPushConstant(ShaderValue::light_color, (m_color.val * ri.camera->settings.volumetric_environment_intensity * m_intensity * -slice_spacing / 10.0f)); - pFogShader->bind(ri, Matrix4()); // TODO: Pass indexes of lights to shader - - m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_VOLUMETRIC_LIGHTING, 1.0f); - vkCmdDraw(ri.commandBuffer, slice_count * 6, 1, 0, 0); + if (pFogShader) { + pFogShader->setPushConstant(ShaderValue::slice_depth_scale, Vector2::Create(slice_near, slice_spacing)); + pFogShader->setPushConstant(ShaderValue::light_color, (m_color.val * ri.camera->settings.volumetric_environment_intensity * m_intensity * -slice_spacing / 10.0f)); + if (pFogShader->bind(ri, Matrix4())) { // TODO: Pass indexes of lights to shader + m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_VOLUMETRIC_LIGHTING, 1.0f); + vkCmdDraw(ri.commandBuffer, slice_count * 6, 1, 0, 0); + } + } } @@ -314,22 +316,23 @@ void KRLight::render(RenderInfo& ri) info.vertexAttributes = sphereModel->getVertexAttributes(); KRPipeline* pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pPipeline->bind(ri, occlusion_test_sphere_matrix); + if (pPipeline && pPipeline->bind(ri, occlusion_test_sphere_matrix)) { - GLDEBUG(glGenQueriesEXT(1, &m_occlusionQuery)); + GLDEBUG(glGenQueriesEXT(1, &m_occlusionQuery)); #if TARGET_OS_IPHONE || defined(ANDROID) - GLDEBUG(glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, m_occlusionQuery)); + GLDEBUG(glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, m_occlusionQuery)); #else - GLDEBUG(glBeginQuery(GL_SAMPLES_PASSED, m_occlusionQuery)); + GLDEBUG(glBeginQuery(GL_SAMPLES_PASSED, m_occlusionQuery)); #endif - sphereModel->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "occlusion_test", 1.0f); + sphereModel->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "occlusion_test", 1.0f); #if TARGET_OS_IPHONE || defined(ANDROID) - GLDEBUG(glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT)); + GLDEBUG(glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT)); #else - GLDEBUG(glEndQuery(GL_SAMPLES_PASSED)); + GLDEBUG(glEndQuery(GL_SAMPLES_PASSED)); #endif + } } } @@ -362,11 +365,13 @@ void KRLight::render(RenderInfo& ri) KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pShader->setImageBinding("diffuseTexture", m_flareTexture.val.get(), getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER); - pShader->bind(ri, getModelMatrix()); - - m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &vertices, 1.0f); - vkCmdDraw(ri.commandBuffer, 4, 1, 0, 0); + if (pShader) { + pShader->setImageBinding("diffuseTexture", m_flareTexture.val.get(), getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER); + if (pShader->bind(ri, getModelMatrix())) { + m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &vertices, 1.0f); + vkCmdDraw(ri.commandBuffer, 4, 1, 0, 0); + } + } } } } @@ -464,6 +469,9 @@ void KRLight::renderShadowBuffers(RenderInfo& ri) GLDEBUG(glDisable(GL_DITHER)); + + ri.viewport = &m_shadowViewports[iShadow]; + // Use shader program PipelineInfo info{}; std::string shader_name("ShadowShader"); @@ -474,8 +482,8 @@ void KRLight::renderShadowBuffers(RenderInfo& ri) info.cullMode = CullMode::kCullNone; // Disabling culling, which eliminates some self-cast shadow artifacts KRPipeline* shadowShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); - ri.viewport = &m_shadowViewports[iShadow]; - if (shadowShader->bind(ri, Matrix4())) { + + if (shadowShader && shadowShader->bind(ri, Matrix4())) { getScene().render(ri); } } diff --git a/kraken/nodes/KRParticleSystemNewtonian.cpp b/kraken/nodes/KRParticleSystemNewtonian.cpp index d8fcebb..0aa02a2 100755 --- a/kraken/nodes/KRParticleSystemNewtonian.cpp +++ b/kraken/nodes/KRParticleSystemNewtonian.cpp @@ -102,7 +102,7 @@ void KRParticleSystemNewtonian::render(RenderInfo& ri) info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES; KRPipeline* pParticleShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); - if (pParticleShader->bind(ri, getModelMatrix())) { + if (pParticleShader && pParticleShader->bind(ri, getModelMatrix())) { m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_RANDOM_PARTICLES, 1.0f); vkCmdDraw(ri.commandBuffer, particle_count * 3, 1, 0, 0); diff --git a/kraken/nodes/KRPointLight.cpp b/kraken/nodes/KRPointLight.cpp index 7a4a48d..a40dab0 100755 --- a/kraken/nodes/KRPointLight.cpp +++ b/kraken/nodes/KRPointLight.cpp @@ -116,7 +116,7 @@ void KRPointLight::render(RenderInfo& ri) info.modelFormat = bInsideLight ? ModelFormat::KRENGINE_MODEL_FORMAT_STRIP : ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES; KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - if (pShader->bind(ri, sphereModelMatrix)) { // TODO: Pass light index to shader + if (pShader && pShader->bind(ri, sphereModelMatrix)) { // TODO: Pass light index to shader if (bInsideLight) { // Render a full screen quad diff --git a/kraken/nodes/KRReverbZone.cpp b/kraken/nodes/KRReverbZone.cpp index 667fb84..6230bc5 100755 --- a/kraken/nodes/KRReverbZone.cpp +++ b/kraken/nodes/KRReverbZone.cpp @@ -131,7 +131,7 @@ void KRReverbZone::render(RenderInfo& ri) info.vertexAttributes = sphereModel->getVertexAttributes(); KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - if (pShader->bind(ri, sphereModelMatrix)) { + if (pShader && pShader->bind(ri, sphereModelMatrix)) { sphereModel->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f); } } // sphereModel diff --git a/kraken/nodes/KRSprite.cpp b/kraken/nodes/KRSprite.cpp index 65aa684..bb7a7ee 100755 --- a/kraken/nodes/KRSprite.cpp +++ b/kraken/nodes/KRSprite.cpp @@ -136,10 +136,12 @@ void KRSprite::render(RenderInfo& ri) info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_STRIP; KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pShader->setImageBinding("diffuseTexture", m_spriteTexture.val.get(), m_pContext->getSamplerManager()->DEFAULT_CLAMPED_SAMPLER); - if (pShader->bind(ri, getModelMatrix())) { - m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &vertices, 1.0f); - vkCmdDraw(ri.commandBuffer, 4, 1, 0, 0); + if (pShader) { + pShader->setImageBinding("diffuseTexture", m_spriteTexture.val.get(), m_pContext->getSamplerManager()->DEFAULT_CLAMPED_SAMPLER); + if (pShader->bind(ri, getModelMatrix())) { + m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &vertices, 1.0f); + vkCmdDraw(ri.commandBuffer, 4, 1, 0, 0); + } } } } diff --git a/kraken/resources/material/KRMaterial.cpp b/kraken/resources/material/KRMaterial.cpp index 07ca38d..552ea3f 100755 --- a/kraken/resources/material/KRMaterial.cpp +++ b/kraken/resources/material/KRMaterial.cpp @@ -788,6 +788,9 @@ bool KRMaterial::bind(KRNode::RenderInfo& ri, ModelFormat modelFormat, __uint32_ info.vertexAttributes = vertexAttributes; info.cullMode = cullMode; KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); + if (pShader == nullptr) { + return false; + } // Bind bones if (pShader->hasPushConstant(ShaderValue::bone_transforms)) { diff --git a/standard_assets/shaders/sky_box_osx.fsh b/standard_assets/shaders/sky_box_osx.fsh index fdeaa74..44b36d1 100644 --- a/standard_assets/shaders/sky_box_osx.fsh +++ b/standard_assets/shaders/sky_box_osx.fsh @@ -32,10 +32,10 @@ out vec4 colorOut; -uniform samplerCube diffuseTexture; +uniform samplerCube skyboxTexture; in mediump vec3 texCoord; void main() { - colorOut = textureCube(diffuseTexture, normalize(texCoord)); + colorOut = textureCube(skyboxTexture, normalize(texCoord)); } \ No newline at end of file