Skip to content

Commit dfbd68b

Browse files
committed
DDS plugin: use the right pixel format for RGTC-compressed images
Currently these will get corrupted due to unimplemented vertical flip
1 parent 68c5c57 commit dfbd68b

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

src/osgPlugins/dds/ReaderWriterDDS.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,11 @@ struct DXT1TexelsBlock
258258
* FOURCC codes for 3dc compressed-texture pixel formats
259259
*/
260260
#define FOURCC_ATI1 (MAKEFOURCC('A','T','I','1'))
261+
#define FOURCC_BC4U (MAKEFOURCC('B','C','4','U'))
262+
#define FOURCC_BC4S (MAKEFOURCC('B','C','4','S'))
261263
#define FOURCC_ATI2 (MAKEFOURCC('A','T','I','2'))
264+
#define FOURCC_BC5U (MAKEFOURCC('B','C','5','U'))
265+
#define FOURCC_BC5S (MAKEFOURCC('B','C','5','S'))
262266

263267
/*
264268
* FOURCC codes for DX10 files
@@ -517,11 +521,31 @@ osg::Image* ReadDDSFile(std::istream& _istream, bool flipDDSRead)
517521
internalFormat = GL_COMPRESSED_RED_RGTC1_EXT;
518522
pixelFormat = GL_COMPRESSED_RED_RGTC1_EXT;
519523
break;
524+
case FOURCC_BC4U:
525+
OSG_INFO << "ReadDDSFile info : format = BC4U" << std::endl;
526+
internalFormat = GL_COMPRESSED_RED_RGTC1_EXT;
527+
pixelFormat = GL_COMPRESSED_RED_RGTC1_EXT;
528+
break;
529+
case FOURCC_BC4S:
530+
OSG_INFO << "ReadDDSFile info : format = BC4S" << std::endl;
531+
internalFormat = GL_COMPRESSED_SIGNED_RED_RGTC1_EXT;
532+
pixelFormat = GL_COMPRESSED_SIGNED_RED_RGTC1_EXT;
533+
break;
520534
case FOURCC_ATI2:
521535
OSG_INFO << "ReadDDSFile info : format = ATI2" << std::endl;
522536
internalFormat = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
523537
pixelFormat = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
524538
break;
539+
case FOURCC_BC5U:
540+
OSG_INFO << "ReadDDSFile info : format = BC5U" << std::endl;
541+
internalFormat = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
542+
pixelFormat = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
543+
break;
544+
case FOURCC_BC5S:
545+
OSG_INFO << "ReadDDSFile info : format = BC5S" << std::endl;
546+
internalFormat = GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;
547+
pixelFormat = GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;
548+
break;
525549
case 0x00000024: // A16B16G16R16
526550
OSG_INFO << "ReadDDSFile info : format = A16B16G16R16" << std::endl;
527551
internalFormat = GL_RGBA;
@@ -770,6 +794,26 @@ osg::Image* ReadDDSFile(std::istream& _istream, bool flipDDSRead)
770794
dataType = GL_SHORT;
771795
break;
772796

797+
case OSG_DXGI_FORMAT_BC4_UNORM:
798+
internalFormat = GL_COMPRESSED_RED_RGTC1_EXT;
799+
pixelFormat = GL_COMPRESSED_RED_RGTC1_EXT;
800+
break;
801+
802+
case OSG_DXGI_FORMAT_BC4_SNORM:
803+
internalFormat = GL_COMPRESSED_SIGNED_RED_RGTC1_EXT;
804+
pixelFormat = GL_COMPRESSED_SIGNED_RED_RGTC1_EXT;
805+
break;
806+
807+
case OSG_DXGI_FORMAT_BC5_UNORM:
808+
internalFormat = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
809+
pixelFormat = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
810+
break;
811+
812+
case OSG_DXGI_FORMAT_BC5_SNORM:
813+
internalFormat = GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;
814+
pixelFormat = GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;
815+
break;
816+
773817
default:
774818
OSG_WARN << "ReadDDSFile warning: unhandled DX10 pixel format 0x"
775819
<< std::hex << std::setw(8) << std::setfill('0')

0 commit comments

Comments
 (0)