Texture2D BuildBRDFTexture( System.IO.FileInfo _TableFileName, uint _TableSize ) {
float2[,] Table = new float2[_TableSize,_TableSize];
float MinA = 1, MaxA = 0;
float MinB = 1, MaxB = 0;
using ( System.IO.FileStream S = _TableFileName.OpenRead() )
using ( System.IO.BinaryReader R = new System.IO.BinaryReader( S ) )
for ( int Y=0; Y < _TableSize; Y++ )
for ( int X=0; X < _TableSize; X++ ) {
float A = R.ReadSingle();
float B = R.ReadSingle();
Table[X,Y].x = A;
Table[X,Y].y = B;
MinA = Math.Min( MinA, A );
MaxA = Math.Max( MaxA, A );
MinB = Math.Min( MinB, B );
MaxB = Math.Max( MaxB, B );
}
// MaxA = 1
// MaxB = 0.00014996325546887346
// MaxA = 1.0;
// MaxB = 1.0;
// Create the texture
// PixelsBuffer Content = new PixelsBuffer( _TableSize*_TableSize*4 );
PixelsBuffer Content = new PixelsBuffer( (uint) (_TableSize*_TableSize*2*4) );
using ( System.IO.BinaryWriter W = Content.OpenStreamWrite() )
for ( int Y=0; Y < _TableSize; Y++ )
for ( int X=0; X < _TableSize; X++ ) {
// W.Write( (ushort) (65535.0 * Table[X,Y].x / MaxA) );
// W.Write( (ushort) (65535.0 * Table[X,Y].y / MaxB) );
W.Write( Table[X,Y].x );
W.Write( Table[X,Y].y );
}
// Texture2D Result = new Texture2D( m_Device, _TableSize, _TableSize, 1, 1, PIXEL_FORMAT.RG16_UNORM, false, false, new PixelsBuffer[] { Content } );
Texture2D Result = new Texture2D( m_Device, _TableSize, _TableSize, 1, 1, PIXEL_FORMAT.RG32_FLOAT, false, false, new PixelsBuffer[] { Content } );
return Result;
}