| @@ -112,7 +112,7 @@ bool Model3DSponza::CheckXEngine() |
| // [EndExclude CheckXengine_ai_temporal] | // [EndExclude CheckXengine_ai_temporal] |
| | |
| // 查询是否支持时域AI超分 | // 查询是否支持时域AI超分 |
| - if (std::find(extensions.begin(), extensions.end(), XEG_TEMPORAL_UPSCALE_EXTENSION_NAME) != extensions.end()) { | + if (std::find(extensions.begin(), extensions.end(), XEG_TEMPORAL_UPSCALE_EXTENSION_NAME) != extensions.end()) { |
| // 正常业务逻辑 | // 正常业务逻辑 |
| // [StartExclude CheckXengine_ai_temporal] | // [StartExclude CheckXengine_ai_temporal] |
| isSupportTemporal = true; | isSupportTemporal = true; |
| @@ -120,14 +120,14 @@ bool Model3DSponza::CheckXEngine() |
| } else { | } else { |
| // 错误处理 | // 错误处理 |
| // [StartExclude CheckXengine_ai_temporal] | // [StartExclude CheckXengine_ai_temporal] |
| - isSupportTemporal = false; | + isSupportTemporal = false; |
| LOGE("Model3DSponza demo not support temporal upscale."); | LOGE("Model3DSponza demo not support temporal upscale."); |
| - // [EndExclude CheckXengine_ai_temporal] | + // [EndExclude CheckXengine_ai_temporal] |
| } | } |
| // [End CheckXengine_ai_temporal] | // [End CheckXengine_ai_temporal] |
| // [EndExclude CheckXengine_gpu_spatial] | // [EndExclude CheckXengine_gpu_spatial] |
| // 查询是否支持空域GPU超分 | // 查询是否支持空域GPU超分 |
| - if (std::find(extensions.begin(), extensions.end(), XEG_SPATIAL_UPSCALE_EXTENSION_NAME) != extensions.end()) { | + if (std::find(extensions.begin(), extensions.end(), XEG_SPATIAL_UPSCALE_EXTENSION_NAME) != extensions.end()) { |
| // 正常业务逻辑 | // 正常业务逻辑 |
| // [StartExclude CheckXengine_gpu_spatial] | // [StartExclude CheckXengine_gpu_spatial] |
| isSupportSpatial = true; | isSupportSpatial = true; |
| @@ -136,28 +136,28 @@ bool Model3DSponza::CheckXEngine() |
| // 错误处理 | // 错误处理 |
| // [StartExclude CheckXengine_gpu_spatial] | // [StartExclude CheckXengine_gpu_spatial] |
| isSupportSpatial = false; | isSupportSpatial = false; |
| - LOGE("Model3DSponza demo not support spatial upscale."); | + LOGE("Model3DSponza demo not support spatial upscale."); |
| // [EndExclude CheckXengine_gpu_spatial] | // [EndExclude CheckXengine_gpu_spatial] |
| } | } |
| // [End CheckXengine_gpu_spatial] | // [End CheckXengine_gpu_spatial] |
| // [EndExclude CheckXengine_VRS] | // [EndExclude CheckXengine_VRS] |
| // 查询是否支持自适应VRS | // 查询是否支持自适应VRS |
| - if (std::find(extensions.begin(), extensions.end(), XEG_ADAPTIVE_VRS_EXTENSION_NAME) != extensions.end()) { | + if (std::find(extensions.begin(), extensions.end(), XEG_ADAPTIVE_VRS_EXTENSION_NAME) != extensions.end()) { |
| // 正常业务逻辑 | // 正常业务逻辑 |
| // [StartExclude CheckXengine_VRS] | // [StartExclude CheckXengine_VRS] |
| - isSupportVrs = true; | + isSupportVrs = true; |
| // [EndExclude CheckXengine_VRS] | // [EndExclude CheckXengine_VRS] |
| } else { | } else { |
| // 错误处理 | // 错误处理 |
| // [StartExclude CheckXengine_VRS] | // [StartExclude CheckXengine_VRS] |
| - isSupportVrs = false; | + isSupportVrs = false; |
| - LOGE("Model3DSponza demo not support VRS."); | + LOGE("Model3DSponza demo not support VRS."); |
| // [EndExclude CheckXengine_VRS] | // [EndExclude CheckXengine_VRS] |
| } | } |
| // [End CheckXengine_VRS] | // [End CheckXengine_VRS] |
| // [EndExclude CheckXengine_ai_spatial] | // [EndExclude CheckXengine_ai_spatial] |
| // 查询是否支持空域AI超分 | // 查询是否支持空域AI超分 |
| - if (std::find(extensions.begin(), extensions.end(), XEG_NEURAL_UPSCALE_EXTENSION_NAME) != extensions.end()) { | + if (std::find(extensions.begin(), extensions.end(), XEG_NEURAL_UPSCALE_EXTENSION_NAME) != extensions.end()) { |
| // 正常业务逻辑 | // 正常业务逻辑 |
| // [StartExclude CheckXengine_ai_spatial] | // [StartExclude CheckXengine_ai_spatial] |
| isSupportNeural = true; | isSupportNeural = true; |
| @@ -165,13 +165,13 @@ bool Model3DSponza::CheckXEngine() |
| } else { | } else { |
| // 错误处理 | // 错误处理 |
| // [StartExclude CheckXengine_ai_spatial] | // [StartExclude CheckXengine_ai_spatial] |
| - isSupportNeural = false; | + isSupportNeural = false; |
| - LOGE("Model3DSponza demo not support neural upscale."); | + LOGE("Model3DSponza demo not support neural upscale."); |
| // [EndExclude CheckXengine_ai_spatial] | // [EndExclude CheckXengine_ai_spatial] |
| } | } |
| | |
| // 查询是否支持空域AI超分2 | // 查询是否支持空域AI超分2 |
| - if (std::find(extensions.begin(), extensions.end(), XEG_NEURAL_UPSCALE2_EXTENSION_NAME) != extensions.end()) { | + if (std::find(extensions.begin(), extensions.end(), XEG_NEURAL_UPSCALE2_EXTENSION_NAME) != extensions.end()) { |
| // 正常业务逻辑 | // 正常业务逻辑 |
| // [StartExclude CheckXengine_ai_spatial] | // [StartExclude CheckXengine_ai_spatial] |
| isSupportNeural2 = true; | isSupportNeural2 = true; |
| @@ -179,10 +179,10 @@ bool Model3DSponza::CheckXEngine() |
| } else { | } else { |
| // 错误处理 | // 错误处理 |
| // [StartExclude CheckXengine_ai_spatial] | // [StartExclude CheckXengine_ai_spatial] |
| - isSupportNeural2 = false; | + isSupportNeural2 = false; |
| - LOGE("Model3DSponza demo not support neural upscale 2."); | + LOGE("Model3DSponza demo not support neural upscale 2."); |
| // [EndExclude CheckXengine_ai_spatial] | // [EndExclude CheckXengine_ai_spatial] |
| - } | + } |
| // [End CheckXengine_ai_spatial] | // [End CheckXengine_ai_spatial] |
| return true; | return true; |
| } | } |
| @@ -227,9 +227,9 @@ void Model3DSponza::DispatchVRS(bool isUpscale) |
| light = m_lightColorTexture; | light = m_lightColorTexture; |
| } else if (m_upscalemode == 1) { | } else if (m_upscalemode == 1) { |
| if (isSupportNeural) { | if (isSupportNeural) { |
| - light = m_lowLightNativeTexture; | + light = m_lowLightNativeTexture; |
| - } else { | + } else { |
| - light = m_lowLightColorTexture; | + light = m_lowLightColorTexture; |
| } | } |
| } else { | } else { |
| light = m_lowLightColorTexture; | light = m_lowLightColorTexture; |
| @@ -375,9 +375,9 @@ void Model3DSponza::InitTemporalUpscale() |
| } | } |
| // [Start InitTemporalUpscale_gles] | // [Start InitTemporalUpscale_gles] |
| // m_lowResWidth与m_lowResHeight分别为用户自定义的渲染宽度与渲染高度 | // m_lowResWidth与m_lowResHeight分别为用户自定义的渲染宽度与渲染高度 |
| - GLsizei inputeSize[2] = {static_cast<GLsizei>(m_lowResWidth), static_cast<GLsizei>(m_lowResHeight)}; | + GLuint inputSize[2] = {static_cast<GLuint>(m_lowResWidth), static_cast<GLuint>(m_lowResHeight)}; |
| // 设置超分输入纹理的真实宽高 | // 设置超分输入纹理的真实宽高 |
| - HMS_XEG_TemporalUpscaleParameter(XEG_TEMPORAL_UPSCALE_INPUT_SIZE, inputeSize); | + HMS_XEG_TemporalUpscaleParameter(XEG_TEMPORAL_UPSCALE_INPUT_SIZE, inputSize); |
| // 设置相机抖动的周期数,此处以8为例 | // 设置相机抖动的周期数,此处以8为例 |
| GLuint jitterNum = 8; | GLuint jitterNum = 8; |
| HMS_XEG_TemporalUpscaleParameter(XEG_TEMPORAL_UPSCALE_JITTER_NUM, &jitterNum); | HMS_XEG_TemporalUpscaleParameter(XEG_TEMPORAL_UPSCALE_JITTER_NUM, &jitterNum); |
| @@ -657,8 +658,8 @@ unsigned int Model3DSponza::CreateFramebufferTexture(unsigned int width, unsigne |
| // [StartExclude OH_NativeBuffer_ai_spatial_gles] | // [StartExclude OH_NativeBuffer_ai_spatial_gles] |
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); |
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); |
| - // [EndExclude OH_NativeBuffer_ai_spatial_gles] | + // [EndExclude OH_NativeBuffer_ai_spatial_gles] |
| - // isNativeBuffer表示输入纹理需要关联OH_NativeBuffer | + // isNativeBuffer为true表示纹理需要关联OH_NativeBuffer,为false表示纹理不需要关联OH_NativeBuffer |
| if (isNativeBuffer) { | if (isNativeBuffer) { |
| // 当支持XEG_NEURAL_UPSCALE_EXTENSION_NAME时,输入纹理关联一个OH_NativeBuffer | // 当支持XEG_NEURAL_UPSCALE_EXTENSION_NAME时,输入纹理关联一个OH_NativeBuffer |
| // 创建OH_NativeBuffer | // 创建OH_NativeBuffer |
| @@ -698,6 +699,9 @@ unsigned int Model3DSponza::CreateFramebufferTexture(unsigned int width, unsigne |
| glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_eglImage); | glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_eglImage); |
| } else { | } else { |
| // 当支持XEG_NEURAL_UPSCALE2_EXTENSION_NAME时,输入纹理不需要关联OH_NativeBuffer | // 当支持XEG_NEURAL_UPSCALE2_EXTENSION_NAME时,输入纹理不需要关联OH_NativeBuffer |
| + // internalformat为GLint类型,指定纹理中的颜色分量数量,如GL_RGBA。 |
| + // format为GLenum类型,指定像素数据的格式,如GL_RED。 |
| + // type为GLenum类型,指定像素数据的数据类型,如GL_BYTE。 |
| glTexImage2D(GL_TEXTURE_2D, 0, internalformat, width, height, 0, format, type, NULL); | glTexImage2D(GL_TEXTURE_2D, 0, internalformat, width, height, 0, format, type, NULL); |
| } | } |
| // [End OH_NativeBuffer_ai_spatial_gles] | // [End OH_NativeBuffer_ai_spatial_gles] |
| @@ -725,11 +729,8 @@ void Model3DSponza::InitGBufferFrameBuffer() |
| CreateFramebufferTexture(m_highResWidth, m_highResHeight, GL_RGBA16F, GL_RGBA, GL_COLOR_ATTACHMENT1, GL_FLOAT); | CreateFramebufferTexture(m_highResWidth, m_highResHeight, GL_RGBA16F, GL_RGBA, GL_COLOR_ATTACHMENT1, GL_FLOAT); |
| m_gAlbedo = | m_gAlbedo = |
| CreateFramebufferTexture(m_highResWidth, m_highResHeight, GL_RGBA16F, GL_RGBA, GL_COLOR_ATTACHMENT2, GL_FLOAT); | CreateFramebufferTexture(m_highResWidth, m_highResHeight, GL_RGBA16F, GL_RGBA, GL_COLOR_ATTACHMENT2, GL_FLOAT); |
| - m_gNormalView = | + unsigned int attachmentsLight[3] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2}; |
| - CreateFramebufferTexture(m_highResWidth, m_highResHeight, GL_RGBA16F, GL_RGBA, GL_COLOR_ATTACHMENT3, GL_FLOAT); | + glDrawBuffers(3, attachmentsLight); |
| - unsigned int attachmentsLight[4] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, | |
| - GL_COLOR_ATTACHMENT3}; | |
| - glDrawBuffers(4, attachmentsLight); | |
| m_rboDepth = CreateFramebufferTexture(m_highResWidth, m_highResHeight, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, | m_rboDepth = CreateFramebufferTexture(m_highResWidth, m_highResHeight, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, |
| GL_DEPTH_ATTACHMENT, GL_UNSIGNED_SHORT); | GL_DEPTH_ATTACHMENT, GL_UNSIGNED_SHORT); |
| CheckFrameBuffer("GBufferHighResolution"); | CheckFrameBuffer("GBufferHighResolution"); |
| @@ -741,9 +742,7 @@ void Model3DSponza::InitGBufferFrameBuffer() |
| CreateFramebufferTexture(m_lowResWidth, m_lowResHeight, GL_RGBA16F, GL_RGBA, GL_COLOR_ATTACHMENT1, GL_FLOAT); | CreateFramebufferTexture(m_lowResWidth, m_lowResHeight, GL_RGBA16F, GL_RGBA, GL_COLOR_ATTACHMENT1, GL_FLOAT); |
| m_lowGAlbedo = | m_lowGAlbedo = |
| CreateFramebufferTexture(m_lowResWidth, m_lowResHeight, GL_RGBA16F, GL_RGBA, GL_COLOR_ATTACHMENT2, GL_FLOAT); | CreateFramebufferTexture(m_lowResWidth, m_lowResHeight, GL_RGBA16F, GL_RGBA, GL_COLOR_ATTACHMENT2, GL_FLOAT); |
| - m_gNormalView = | + glDrawBuffers(3, attachmentsLight); |
| - CreateFramebufferTexture(m_lowResWidth, m_lowResHeight, GL_RGBA16F, GL_RGBA, GL_COLOR_ATTACHMENT3, GL_FLOAT); | |
| - glDrawBuffers(4, attachmentsLight); | |
| m_lowGboDepth = CreateFramebufferTexture(m_lowResWidth, m_lowResHeight, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, | m_lowGboDepth = CreateFramebufferTexture(m_lowResWidth, m_lowResHeight, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, |
| GL_DEPTH_ATTACHMENT, GL_FLOAT); | GL_DEPTH_ATTACHMENT, GL_FLOAT); |
| CheckFrameBuffer("GBufferLowResolution"); | CheckFrameBuffer("GBufferLowResolution"); |
| @@ -804,9 +803,9 @@ void Model3DSponza::InitFrameBuffer() |
| HMS_XEG_NeuralUpscaleParameter(XEG_NEURAL_UPSCALE_SCISSOR, upscaleScissor); | HMS_XEG_NeuralUpscaleParameter(XEG_NEURAL_UPSCALE_SCISSOR, upscaleScissor); |
| // 设置超分输入纹理对应的OH_NativeBuffer句柄 | // 设置超分输入纹理对应的OH_NativeBuffer句柄 |
| // isSupportNeural表示是否支持XEG_NEURAL_UPSCALE_EXTENSION_NAME | // isSupportNeural表示是否支持XEG_NEURAL_UPSCALE_EXTENSION_NAME |
| - if (isSupportNeural) { | + if (isSupportNeural) { |
| - HMS_XEG_NeuralUpscaleParameter(XEG_NEURAL_UPSCALE_INPUT_HANDLE, m_lightNativeBufferHandle); | + HMS_XEG_NeuralUpscaleParameter(XEG_NEURAL_UPSCALE_INPUT_HANDLE, m_lightNativeBufferHandle); |
| - } | + } |
| // [End HMS_XEG_NeuralUpscaleParameter_gles] | // [End HMS_XEG_NeuralUpscaleParameter_gles] |
| // Init VRS ShadingRateImage | // Init VRS ShadingRateImage |
| // high resolution sir | // high resolution sir |
| @@ -854,14 +853,17 @@ void Model3DSponza::Destroy() |
| // 当支持XEG_NEURAL_UPSCALE_EXTENSION_NAME时,销毁相关资源 | // 当支持XEG_NEURAL_UPSCALE_EXTENSION_NAME时,销毁相关资源 |
| if (m_eglImage != nullptr) { | if (m_eglImage != nullptr) { |
| eglDestroyImageKHR(eglGetCurrentDisplay(), m_eglImage); | eglDestroyImageKHR(eglGetCurrentDisplay(), m_eglImage); |
| + m_eglImage = nullptr; |
| } | } |
| | |
| if (m_nativeWindowBuffer != nullptr) { | if (m_nativeWindowBuffer != nullptr) { |
| OH_NativeWindow_DestroyNativeWindowBuffer(m_nativeWindowBuffer); | OH_NativeWindow_DestroyNativeWindowBuffer(m_nativeWindowBuffer); |
| + m_nativeWindowBuffer = nullptr; |
| } | } |
| | |
| if (m_lightNativeBufferHandle != nullptr) { | if (m_lightNativeBufferHandle != nullptr) { |
| OH_NativeBuffer_Unreference(m_lightNativeBufferHandle); | OH_NativeBuffer_Unreference(m_lightNativeBufferHandle); |
| + m_lightNativeBufferHandle = nullptr; |
| } | } |
| // [StartExclude Destory_ai_spatial_gles] | // [StartExclude Destory_ai_spatial_gles] |
| | |
| @@ -871,25 +873,48 @@ void Model3DSponza::Destroy() |
| m_pModel = nullptr; | m_pModel = nullptr; |
| } | } |
| | |
| + DestroyShader(); |
| + |
| + DeleteFrameAndTexture(); |
| +} |
| + |
| +void Model3DSponza::DestroyShader() |
| +{ |
| if (m_shaderGBufferLight != nullptr) { | if (m_shaderGBufferLight != nullptr) { |
| m_shaderGBufferLight->Destroy(); | m_shaderGBufferLight->Destroy(); |
| delete m_shaderGBufferLight; | delete m_shaderGBufferLight; |
| m_shaderGBufferLight = nullptr; | m_shaderGBufferLight = nullptr; |
| } | } |
| - | + |
| if (m_shaderLight != nullptr) { | if (m_shaderLight != nullptr) { |
| m_shaderLight->Destroy(); | m_shaderLight->Destroy(); |
| delete m_shaderLight; | delete m_shaderLight; |
| m_shaderLight = nullptr; | m_shaderLight = nullptr; |
| } | } |
| - | + |
| if (m_shaderWindow != nullptr) { | if (m_shaderWindow != nullptr) { |
| m_shaderWindow->Destroy(); | m_shaderWindow->Destroy(); |
| delete m_shaderWindow; | delete m_shaderWindow; |
| m_shaderWindow = nullptr; | m_shaderWindow = nullptr; |
| } | } |
| - | + |
| - DeleteFrameAndTexture(); | + if (m_shaderFSREASU != nullptr) { |
| + m_shaderFSREASU->Destroy(); |
| + delete m_shaderFSREASU; |
| + m_shaderFSREASU = nullptr; |
| + } |
| + |
| + if (m_shaderFSRRCAS != nullptr) { |
| + m_shaderFSRRCAS->Destroy(); |
| + delete m_shaderFSRRCAS; |
| + m_shaderFSRRCAS = nullptr; |
| + } |
| + |
| + if (m_shaderMotionVector != nullptr) { |
| + m_shaderMotionVector->Destroy(); |
| + delete m_shaderMotionVector; |
| + m_shaderMotionVector = nullptr; |
| + } |
| } | } |
| | |
| void Model3DSponza::DeleteFrameAndTexture() | void Model3DSponza::DeleteFrameAndTexture() |
| @@ -903,10 +928,10 @@ void Model3DSponza::DeleteFrameAndTexture() |
| glDeleteFramebuffers(1, &m_lowNativeLightFBO); | glDeleteFramebuffers(1, &m_lowNativeLightFBO); |
| glDeleteFramebuffers(1, &m_upscaleFBO); | glDeleteFramebuffers(1, &m_upscaleFBO); |
| glDeleteFramebuffers(1, &m_fsrEASUFBO); | glDeleteFramebuffers(1, &m_fsrEASUFBO); |
| + glDeleteFramebuffers(1, &m_motionVectorFBO); |
| | |
| glDeleteTextures(1, &m_gPosition); | glDeleteTextures(1, &m_gPosition); |
| glDeleteTextures(1, &m_gNormal); | glDeleteTextures(1, &m_gNormal); |
| - glDeleteTextures(1, &m_gNormalView); | |
| glDeleteTextures(1, &m_gAlbedo); | glDeleteTextures(1, &m_gAlbedo); |
| | |
| glDeleteTextures(1, &m_lowGPosition); | glDeleteTextures(1, &m_lowGPosition); |
| @@ -924,9 +949,11 @@ void Model3DSponza::DeleteFrameAndTexture() |
| | |
| glDeleteTextures(1, &m_upscaleColorTexture); | glDeleteTextures(1, &m_upscaleColorTexture); |
| glDeleteTextures(1, &m_fsrEASUColorTexture); | glDeleteTextures(1, &m_fsrEASUColorTexture); |
| + glDeleteTextures(1, &m_motionVectorTexture); |
| + glDeleteTextures(1, &m_dynamicMaskTexture); |
| glDeleteTextures(1, &m_shadingRateImageTexture); | glDeleteTextures(1, &m_shadingRateImageTexture); |
| glDeleteTextures(1, &m_lowShadingRateImageTexture); | glDeleteTextures(1, &m_lowShadingRateImageTexture); |
| | |
| - glDeleteRenderbuffers(1, &m_rboDepth); | + glDeleteTextures(1, &m_rboDepth); |
| - glDeleteRenderbuffers(1, &m_lowGboDepth); | + glDeleteTextures(1, &m_lowGboDepth); |
| } | } |