mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 05:44:44 +02:00
Fixed cube map conversion from equirectangular maps when done after HDR conversion
This commit is contained in:
parent
4dcce6ef45
commit
01c3ca17ee
1 changed files with 15 additions and 9 deletions
|
@ -983,6 +983,9 @@ public:
|
||||||
glm::vec2 dstCoord;
|
glm::vec2 dstCoord;
|
||||||
glm::ivec2 srcPixel;
|
glm::ivec2 srcPixel;
|
||||||
for (int y = 0; y < faceWidth; ++y) {
|
for (int y = 0; y < faceWidth; ++y) {
|
||||||
|
QRgb* destScanLineBegin = reinterpret_cast<QRgb*>( image.scanLine(y) );
|
||||||
|
QRgb* destPixelIterator = destScanLineBegin;
|
||||||
|
|
||||||
dstCoord.y = 1.0f - (y + 0.5f) * dstInvSize.y; // Fill cube face images from top to bottom
|
dstCoord.y = 1.0f - (y + 0.5f) * dstInvSize.y; // Fill cube face images from top to bottom
|
||||||
for (int x = 0; x < faceWidth; ++x) {
|
for (int x = 0; x < faceWidth; ++x) {
|
||||||
dstCoord.x = (x + 0.5f) * dstInvSize.x;
|
dstCoord.x = (x + 0.5f) * dstInvSize.x;
|
||||||
|
@ -995,13 +998,19 @@ public:
|
||||||
srcPixel.y = floor((1.0f - srcCoord.y) * srcFaceHeight);
|
srcPixel.y = floor((1.0f - srcCoord.y) * srcFaceHeight);
|
||||||
|
|
||||||
if (((uint32)srcPixel.x < (uint32)source.width()) && ((uint32)srcPixel.y < (uint32)source.height())) {
|
if (((uint32)srcPixel.x < (uint32)source.width()) && ((uint32)srcPixel.y < (uint32)source.height())) {
|
||||||
image.setPixel(x, y, source.pixel(QPoint(srcPixel.x, srcPixel.y)));
|
// We can't directly use the pixel() method because that launches a pixel color conversion to output
|
||||||
|
// a correct RGBA8 color. But in our case we may have stored HDR values encoded in a RGB30 format which
|
||||||
|
// are not convertible by Qt. The same goes with the setPixel method, by the way.
|
||||||
|
const QRgb* sourcePixelIterator = reinterpret_cast<const QRgb*>(source.scanLine(srcPixel.y));
|
||||||
|
sourcePixelIterator += srcPixel.x;
|
||||||
|
*destPixelIterator = *sourcePixelIterator;
|
||||||
|
|
||||||
// Keep for debug, this is showing the dir as a color
|
// Keep for debug, this is showing the dir as a color
|
||||||
// glm::u8vec4 rgba((xyzDir.x + 1.0)*0.5 * 256, (xyzDir.y + 1.0)*0.5 * 256, (xyzDir.z + 1.0)*0.5 * 256, 256);
|
// glm::u8vec4 rgba((xyzDir.x + 1.0)*0.5 * 256, (xyzDir.y + 1.0)*0.5 * 256, (xyzDir.z + 1.0)*0.5 * 256, 256);
|
||||||
// unsigned int val = 0xff000000 | (rgba.r) | (rgba.g << 8) | (rgba.b << 16);
|
// unsigned int val = 0xff000000 | (rgba.r) | (rgba.g << 8) | (rgba.b << 16);
|
||||||
// image.setPixel(x, y, val);
|
// *destPixelIterator = val;
|
||||||
}
|
}
|
||||||
|
++destPixelIterator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return image;
|
return image;
|
||||||
|
@ -1192,6 +1201,10 @@ gpu::TexturePointer TextureUsage::processCubeTextureColorFromImage(const QImage&
|
||||||
if ((srcImage.width() > 0) && (srcImage.height() > 0)) {
|
if ((srcImage.width() > 0) && (srcImage.height() > 0)) {
|
||||||
QImage image = processSourceImage(srcImage, true);
|
QImage image = processSourceImage(srcImage, true);
|
||||||
|
|
||||||
|
if (image.format() != QIMAGE_HDR_FORMAT) {
|
||||||
|
image = convertToHDRFormat(image, HDR_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
gpu::Element formatMip;
|
gpu::Element formatMip;
|
||||||
gpu::Element formatGPU;
|
gpu::Element formatGPU;
|
||||||
if (isCubeTexturesCompressionEnabled()) {
|
if (isCubeTexturesCompressionEnabled()) {
|
||||||
|
@ -1229,13 +1242,6 @@ gpu::TexturePointer TextureUsage::processCubeTextureColorFromImage(const QImage&
|
||||||
faces.push_back(faceImage);
|
faces.push_back(faceImage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (image.format() != QIMAGE_HDR_FORMAT) {
|
|
||||||
for (auto& face : faces) {
|
|
||||||
face = convertToHDRFormat(face, HDR_FORMAT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
qCDebug(imagelogging) << "Failed to find a known cube map layout from this image:" << QString(srcImageName.c_str());
|
qCDebug(imagelogging) << "Failed to find a known cube map layout from this image:" << QString(srcImageName.c_str());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
Loading…
Reference in a new issue