我有一个问题,关于在opengl中渲染位图文件(手动): 如何从unsigned char指针获取数据以便在glDrawPixels函数中使用它们? (unsigned char * 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;
};
答案 0 :(得分: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
字段中获得无效数组。
glRasterPos
或glWindowPos
可帮助您设置要渲染图像的位置。
如果您使用没有固定功能的GL2.0 +(虽然不太可能),那么您应该创建4顶点数组并使用简单的片段着色器渲染四边形。
答案 1 :(得分:0)
您基本上需要将位图二进制blob加载到一个字节(又名。unsigned char
)数组中,然后将其传递给glDrawPixels()
函数:
unsigned char[] myBitmap;
...
glDrawPixels( ..., &myBitmap, ... );