Decoding PFB file format (OpenGL Performer)

OpenGL Performer was an ancient 3d SW in use several years ago.
On NASA site there are hundreds of files in this format, but apparently no SW in the world is currently able to view or convert them (at least in Windows).
So I started writing my own decoder converter. As a start point I used OpenPFB on github, which has some basic structure for a PFB file.
My converter successfully extracts raw vertex, generating a point cloud; but I cannot understand how to extract and use texture data and faces definition.

For textures I found the names of the images and the list of coordinate pairs, but I can’t understand to which image each pair refers.

For faces, I can extract some “lists of lenghts”… but I don’t know how to use them. Applying them just to all vertex in sequence causes a mess…

Here there is[my current PFB format definition in KSY language (use kaitai struct to compile to other languages): this file can be used to create a structure for the file in various languages (I am using javascript but it can generate code for C, PHP, Python,…)

Unfortunately as of now I can’t post any link.

Until I am enabled to post links, you can have a look at my VST-converter repo on github

For file 2mesh_1870_n_137_ffl_59_v1.pfb I get this structure:
position, type, num of elements
0 ’ - type:’ 4 ‘=’ ‘Lenghts lists’ 69
1 ’ - type:’ 5 ‘=’ ‘Vertex lists’ 73
2 ’ - type:’ 6 ‘=’ ‘Colors lists’ 73
3 ’ - type:’ 7 ‘=’ ‘Normals lists’ 73
4 ’ - type:’ 8 ‘=’ ‘Texcoords lists’ 73
5 ’ - type:’ 9 ‘=’ ‘UNKNOWN’ 3
6 ’ - type:’ 0 ‘=’ ‘Materials’ 1
7 ’ - type:’ 1 ‘=’ ‘Textures list’ 2


  • 2N292380631XYLB159P0731L0M1.rgb
  • 2N292380548XYLB159P0691L0M1.rgb

How do I match 2 images to 73 groups of “vertex+colors+normals+textcoords”?
Each textcoords list is,as far a s I understand, just a list of (s,t) couples without any pointer to anything…

void PfbFile::readTexcoordList(PfbTexcoordList &list)
    struct {
        uint32_t size;
        int32_t  unknown1;
        int32_t  unknown2;
    } info;
    fread(&info, sizeof(info), 1, f);
    bswap(&info.size, 3);

    if (debugfile) fprintf(debugfile, "(%u)\n", info.size);

    fread(list.get(0), 4*2, info.size, f);
    bswap(list.get(0), 2 * info.size);

That’s new user spam prevention. Keep using the forums and you’ll be able to post links soon.

I’ve updated your post with links to the GitHub repros you mentioned.

thanks, I’ll wait.
At the top of PFB-converter.html page in my repo there is the link to .PFB files repository on NASA site, in case you want to add also it.

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.