mirror of
https://github.com/overte-org/overte.git
synced 2025-07-23 15:24:03 +02:00
Merge pull request #6016 from samcake/calvin
Fix the cauterized Cluster Matrices issue when rear view mirror is enabled
This commit is contained in:
commit
a363493a99
6 changed files with 45 additions and 48 deletions
|
@ -109,7 +109,7 @@ GLBackend::GLFramebuffer* GLBackend::syncGPUObject(const Framebuffer& framebuffe
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, attachement, GL_TEXTURE_2D, gltexture->_texture, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, attachement, GL_TEXTURE_2D, gltexture->_texture, 0);
|
||||||
} else {
|
} else {
|
||||||
attachement = GL_DEPTH_STENCIL_ATTACHMENT;
|
attachement = GL_DEPTH_STENCIL_ATTACHMENT;
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachement, GL_RENDERBUFFER, gltexture->_texture);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, attachement, GL_TEXTURE_2D, gltexture->_texture, 0);
|
||||||
}
|
}
|
||||||
(void) CHECK_GL_ERROR();
|
(void) CHECK_GL_ERROR();
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,11 @@ public:
|
||||||
case gpu::DEPTH:
|
case gpu::DEPTH:
|
||||||
texel.internalFormat = GL_DEPTH_COMPONENT;
|
texel.internalFormat = GL_DEPTH_COMPONENT;
|
||||||
break;
|
break;
|
||||||
|
case gpu::DEPTH_STENCIL:
|
||||||
|
texel.type = GL_UNSIGNED_INT_24_8;
|
||||||
|
texel.format = GL_DEPTH_STENCIL;
|
||||||
|
texel.internalFormat = GL_DEPTH24_STENCIL8;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
qCDebug(gpulogging) << "Unknown combination of texel format";
|
qCDebug(gpulogging) << "Unknown combination of texel format";
|
||||||
}
|
}
|
||||||
|
@ -65,11 +70,6 @@ public:
|
||||||
case gpu::RGBA:
|
case gpu::RGBA:
|
||||||
texel.internalFormat = GL_RG;
|
texel.internalFormat = GL_RG;
|
||||||
break;
|
break;
|
||||||
case gpu::DEPTH_STENCIL:
|
|
||||||
texel.type = GL_UNSIGNED_BYTE;
|
|
||||||
texel.format = GL_DEPTH_STENCIL;
|
|
||||||
texel.internalFormat = GL_DEPTH24_STENCIL8;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
qCDebug(gpulogging) << "Unknown combination of texel format";
|
qCDebug(gpulogging) << "Unknown combination of texel format";
|
||||||
}
|
}
|
||||||
|
@ -182,6 +182,11 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case gpu::DEPTH_STENCIL:
|
||||||
|
texel.type = GL_UNSIGNED_INT_24_8;
|
||||||
|
texel.format = GL_DEPTH_STENCIL;
|
||||||
|
texel.internalFormat = GL_DEPTH24_STENCIL8;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
qCDebug(gpulogging) << "Unknown combination of texel format";
|
qCDebug(gpulogging) << "Unknown combination of texel format";
|
||||||
}
|
}
|
||||||
|
@ -198,11 +203,6 @@ public:
|
||||||
case gpu::RGBA:
|
case gpu::RGBA:
|
||||||
texel.internalFormat = GL_RG;
|
texel.internalFormat = GL_RG;
|
||||||
break;
|
break;
|
||||||
case gpu::DEPTH_STENCIL:
|
|
||||||
texel.type = GL_UNSIGNED_BYTE;
|
|
||||||
texel.format = GL_DEPTH_STENCIL;
|
|
||||||
texel.internalFormat = GL_DEPTH24_STENCIL8;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
qCDebug(gpulogging) << "Unknown combination of texel format";
|
qCDebug(gpulogging) << "Unknown combination of texel format";
|
||||||
}
|
}
|
||||||
|
@ -341,18 +341,6 @@ GLBackend::GLTexture* GLBackend::syncGPUObject(const Texture& texture) {
|
||||||
|
|
||||||
auto semantic = texture.getTexelFormat().getSemantic();
|
auto semantic = texture.getTexelFormat().getSemantic();
|
||||||
|
|
||||||
if (semantic == gpu::DEPTH_STENCIL) {
|
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
|
||||||
glDeleteTextures(1, &object->_texture);
|
|
||||||
|
|
||||||
glGenRenderbuffers(1, &object->_texture);
|
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, object->_texture);
|
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, texture.getWidth(), texture.getHeight());
|
|
||||||
// At this point the mip pixels have been loaded, we can notify
|
|
||||||
texture.notifyMipFaceGPULoaded(0, 0);
|
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0,
|
glTexImage2D(GL_TEXTURE_2D, 0,
|
||||||
texelFormat.internalFormat, texture.getWidth(), texture.getHeight(), 0,
|
texelFormat.internalFormat, texture.getWidth(), texture.getHeight(), 0,
|
||||||
texelFormat.format, texelFormat.type, bytes);
|
texelFormat.format, texelFormat.type, bytes);
|
||||||
|
@ -365,7 +353,6 @@ GLBackend::GLTexture* GLBackend::syncGPUObject(const Texture& texture) {
|
||||||
object->_target = GL_TEXTURE_2D;
|
object->_target = GL_TEXTURE_2D;
|
||||||
|
|
||||||
syncSampler(texture.getSampler(), texture.getType(), object);
|
syncSampler(texture.getSampler(), texture.getType(), object);
|
||||||
}
|
|
||||||
|
|
||||||
// At this point the mip pixels have been loaded, we can notify
|
// At this point the mip pixels have been loaded, we can notify
|
||||||
texture.notifyMipFaceGPULoaded(0, 0);
|
texture.notifyMipFaceGPULoaded(0, 0);
|
||||||
|
|
|
@ -71,7 +71,7 @@ void FramebufferCache::createPrimaryFramebuffer() {
|
||||||
auto depthFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::DEPTH);
|
auto depthFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::DEPTH);
|
||||||
_primaryDepthTexture = gpu::TexturePointer(gpu::Texture::create2D(depthFormat, width, height, defaultSampler));
|
_primaryDepthTexture = gpu::TexturePointer(gpu::Texture::create2D(depthFormat, width, height, defaultSampler));
|
||||||
|
|
||||||
auto stencilFormat = gpu::Element(gpu::VEC2, gpu::UINT32, gpu::DEPTH_STENCIL);
|
auto stencilFormat = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::DEPTH_STENCIL); // Depth24_Stencil8 texel format
|
||||||
_primaryStencilTexture = gpu::TexturePointer(gpu::Texture::create2D(stencilFormat, width, height, defaultSampler));
|
_primaryStencilTexture = gpu::TexturePointer(gpu::Texture::create2D(stencilFormat, width, height, defaultSampler));
|
||||||
|
|
||||||
_primaryFramebufferFull->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
|
_primaryFramebufferFull->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
|
||||||
|
|
|
@ -212,7 +212,11 @@ void MeshPartPayload::bindTransform(gpu::Batch& batch, const ModelRender::Locati
|
||||||
|
|
||||||
Transform transform;
|
Transform transform;
|
||||||
if (state.clusterBuffer) {
|
if (state.clusterBuffer) {
|
||||||
|
if (model->_cauterizeBones) {
|
||||||
|
batch.setUniformBuffer(ModelRender::SKINNING_GPU_SLOT, state.cauterizedClusterBuffer);
|
||||||
|
} else {
|
||||||
batch.setUniformBuffer(ModelRender::SKINNING_GPU_SLOT, state.clusterBuffer);
|
batch.setUniformBuffer(ModelRender::SKINNING_GPU_SLOT, state.clusterBuffer);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (model->_cauterizeBones) {
|
if (model->_cauterizeBones) {
|
||||||
transform = Transform(state.cauterizedClusterMatrices[0]);
|
transform = Transform(state.cauterizedClusterMatrices[0]);
|
||||||
|
|
|
@ -167,9 +167,7 @@ bool Model::updateGeometry() {
|
||||||
MeshState state;
|
MeshState state;
|
||||||
state.clusterMatrices.resize(mesh.clusters.size());
|
state.clusterMatrices.resize(mesh.clusters.size());
|
||||||
state.cauterizedClusterMatrices.resize(mesh.clusters.size());
|
state.cauterizedClusterMatrices.resize(mesh.clusters.size());
|
||||||
if (mesh.clusters.size() > 1) {
|
|
||||||
state.clusterBuffer = std::make_shared<gpu::Buffer>(mesh.clusters.size() * sizeof(glm::mat4), nullptr);
|
|
||||||
}
|
|
||||||
_meshStates.append(state);
|
_meshStates.append(state);
|
||||||
|
|
||||||
auto buffer = std::make_shared<gpu::Buffer>();
|
auto buffer = std::make_shared<gpu::Buffer>();
|
||||||
|
@ -1006,15 +1004,21 @@ void Model::updateClusterMatrices() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Once computed the cluster matrices, update the buffer
|
// Once computed the cluster matrices, update the buffer(s)
|
||||||
if (state.clusterBuffer) {
|
if (mesh.clusters.size() > 1) {
|
||||||
const float* bones;
|
if (!state.clusterBuffer) {
|
||||||
if (_cauterizeBones) {
|
state.clusterBuffer = std::make_shared<gpu::Buffer>(state.clusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) state.clusterMatrices.constData());
|
||||||
bones = (const float*)state.cauterizedClusterMatrices.constData();
|
|
||||||
} else {
|
} else {
|
||||||
bones = (const float*)state.clusterMatrices.constData();
|
state.clusterBuffer->setSubData(0, state.clusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) state.clusterMatrices.constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_cauterizeBoneSet.empty() && (state.cauterizedClusterMatrices.size() > 1)) {
|
||||||
|
if (!state.cauterizedClusterBuffer) {
|
||||||
|
state.cauterizedClusterBuffer = std::make_shared<gpu::Buffer>(state.cauterizedClusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) state.cauterizedClusterMatrices.constData());
|
||||||
|
} else {
|
||||||
|
state.cauterizedClusterBuffer->setSubData(0, state.cauterizedClusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) state.cauterizedClusterMatrices.constData());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
state.clusterBuffer->setSubData(0, state.clusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) bones);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -256,6 +256,8 @@ protected:
|
||||||
QVector<glm::mat4> clusterMatrices;
|
QVector<glm::mat4> clusterMatrices;
|
||||||
QVector<glm::mat4> cauterizedClusterMatrices;
|
QVector<glm::mat4> cauterizedClusterMatrices;
|
||||||
gpu::BufferPointer clusterBuffer;
|
gpu::BufferPointer clusterBuffer;
|
||||||
|
gpu::BufferPointer cauterizedClusterBuffer;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
QVector<MeshState> _meshStates;
|
QVector<MeshState> _meshStates;
|
||||||
|
|
Loading…
Reference in a new issue