1

私は現在、OpenGLの優れたものを読んでいます。また、本に示されているソース コードの一部で問題が発生しています。特にコードは、現在のシーンのスクリーンショットを撮るためのコードです。これは提供されたコードです:

GLint gltWriteTGA(const char *szFileName)  
{  
FILE *pFile;                // File pointer  
TGAHEADER tgaHeader;        // TGA file header  
unsigned long lImageSize;   // Size in bytes of image  
GLbyte  *pBits = NULL;      // Pointer to bits  
GLint iViewport[4];         // Viewport in pixels  
GLenum lastBuffer;          // Storage for the current read buffer setting  

// Get the viewport dimensions  
glGetIntegerv(GL_VIEWPORT, iViewport);  

// How big is the image going to be (targas are tightly packed)  
lImageSize = iViewport[2] * 3 * iViewport[3];     
// Allocate block. If this doesn't work, go home  
pBits = new GLbyte[lImageSize];
if(pBits == NULL)  
    return 0;  
// Read bits from color buffer  
glPixelStorei(GL_PACK_ALIGNMENT, 1);  
glPixelStorei(GL_PACK_ROW_LENGTH, 0);  
glPixelStorei(GL_PACK_SKIP_ROWS, 0);  
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);

// Get the current read buffer setting and save it. Switch to  
// the front buffer and do the read operation. Finally, restore  
// the read buffer state   
glGetIntegerv(GL_READ_BUFFER, &lastBuffer);  
glReadBuffer(GL_FRONT);  
glReadPixels(0, 0, iViewport[2], iViewport[3], GL_BGR_EXT, GL_UNSIGNED_BYTE, pBits);  
glReadBuffer(lastBuffer);    

// Initialize the Targa header  
tgaHeader.identsize = 0;  
tgaHeader.colorMapType = 0;  
tgaHeader.imageType = 2;  
tgaHeader.colorMapStart = 0;  
tgaHeader.colorMapLength = 0;  
tgaHeader.colorMapBits = 0;  
tgaHeader.xstart = 0;  
tgaHeader.ystart = 0;  
tgaHeader.width = iViewport[2];  
tgaHeader.height = iViewport[3];  
tgaHeader.bits = 24;  
tgaHeader.descriptor = 0;  

// Attempt to open the file  
pFile = fopen(szFileName, "wb");  
if(pFile == NULL)  
    {  
    free(pBits);    // Free buffer and return error  
    return 0;  
    }  

// Write the header  
fwrite(&tgaHeader, sizeof(TGAHEADER), 1, pFile);  

// Write the image data  
fwrite(pBits, lImageSize, 1, pFile);  

// Free temporary buffer and close the file  
free(pBits);      
fclose(pFile);  

// Success!  
return 1;  
}  

コードの問題は、正しいサイズのファイルを吐き出すことですが、何らかのジャンク データが含まれています。開くことができる .tga ファイルは生成されません。もう 1 つの問題は、「glGetIntegerv」関数が GLint を受け取るという事実ですが、上記のソース コードでは GLenum が提供されます。

4

1 に答える 1