-1

我有一个问题,关于在 opengl 中渲染位图文件(手动):如何从 unsigned char 指针获取数据以便在 glDrawPixels 函数中使用它们?(无符号字符 *bitmap_Image)

class bitmap
{
private:
    unsigned long BPP;
    unsigned long width;
    unsigned long height;
    unsigned long size;
    unsigned char *bitmap_Image; // how use this member??
    unsigned int bps;

public:
    bitmap();
    ~bitmap();

    bool Load(const char *filename);
    #pragma pack(push,1)

     typedef struct 
     {
     WORD bfType;
     DWORD bfSize;
     DWORD bfReserved;
     DWORD bfOffBits;
     }BITMAPFILEHEADER;

     //BITMAPINFOHEADER
     typedef struct 
     {
     DWORD biSize;
     LONG biWidth;
     LONG biHeight;
     WORD biPlanes;
     WORD biBitCount;
     DWORD biCompression;
     DWORD biSizeImage;
     LONG biXPelsPerMeter;
     LONG biYPelsPerMeter;
     DWORD biClrUsed;
     DWORD biClrImportant;
     }BITMAPINFOHEADER;

     #pragma pack(pop)

     BITMAPFILEHEADER FileHeader;
     BITMAPINFOHEADER InfoHeader;
};
4

2 回答 2

0

编辑:

再次阅读问题后,您必须声明一个返回内部指针 bitmap_Image 的公共成员。

...
public:
   const unsigned char* GetImageData() const { return bitmap_Image; }
   int GetWidth() const { return width; }
   int GetHeight() const { return heigth; }
   int GetBPP() const { return BPP; }
...

围绕该领域的私密性没有其他(标准和安全)方法。

假设 BPP 是 BitsPerPixel 并且是 24 或 32,您可以调用

 bitmap* YourBmp = ... // construct and load

 const unsigned char* Ptr = YourBmp->GetImageData();
 int W = YourBmp->GetWidth();
 int H = YourBmp->GetHeight();
 int Fmt  = (YourBmp->GetBPP() == 24) ? GL_BGR : GL_BGRA; // or maybe GL_RGB or GL_RGBA
 int Type = GL_UNSIGNED_BYTE;
 glDrawPixels(W, H, Fmt, Type, Ptr);

如果您的图像使用调色板(8 位或更少),则会出现问题 - 您必须将其转换为 RGB(A)。如果图像的单行大小不能被 4 整除,则存在另一个问题,您可能会在bitmap_Image字段中得到无效数组。

glRasterPosglWindowPos将帮助您设置要渲染图像的位置。

如果您使用没有固定功能的 GL2.0+(尽管不太可能),那么您应该创建 4 顶点数组并使用简单的片段着色器渲染四边形。

于 2012-11-27T16:46:06.473 回答
0

您基本上需要将位图二进制 blob 加载到一个字节(aka. unsigned char)数组中,然后将其传递给您的glDrawPixels()函数:

unsigned char[] myBitmap;
...
glDrawPixels( ..., &myBitmap, ... );
于 2012-11-27T16:46:13.580 回答