Arrays c+的私人成员+;班级
我有一个问题,关于在opengl中渲染位图文件(手动): 如何从无符号字符指针获取数据,以便在glDrawPixels函数中使用它们? (无符号字符*位图\图像) 编辑: 再次阅读该问题后,您必须声明一个公共成员,该成员返回内部指针位图图像Arrays c+的私人成员+;班级,arrays,class,visual-c++,bitmap,Arrays,Class,Visual C++,Bitmap,我有一个问题,关于在opengl中渲染位图文件(手动): 如何从无符号字符指针获取数据,以便在glDrawPixels函数中使用它们? (无符号字符*位图\图像) 编辑: 再次阅读该问题后,您必须声明一个公共成员,该成员返回内部指针位图图像 ... public: const unsigned char* GetImageData() const { return bitmap_Image; } int GetWidth() const { return width; } in
...
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\u image
字段中可能会得到无效数组
glRasterPos
或glWindowPos
将帮助您设置要渲染图像的位置
如果您使用的GL2.0+没有固定的函数(虽然不太可能),那么您应该创建4顶点数组,并使用简单的片段着色器渲染四元组。基本上需要将位图二进制blob加载到字节(aka.
unsigned char
)数组中,然后将其传递给glDrawPixels()
函数:
unsigned char[] myBitmap;
...
glDrawPixels( ..., &myBitmap, ... );
我想把它变成一个常量函数(也返回指向常量数据的指针)@datenwolf:起初我只是不确定glDrawPixels参数(常量或非常量),现在我查阅了文档,并在GetImageData中添加了常量修饰符。谢谢您的编辑。今天我使用这个代码,在构建解决方案和运行程序后出错“程序已停止工作”,所以我决定在控制台(cmd)中打印位图_图像数组,发现const unsigned char*Ptr=YourBmp->GetImageData();无法显示我的位图数据:|”无法显示“-你是说程序在添加“const”修饰符后停止工作,还是说程序不工作?可能您的构造函数和load()函数中有错误。谁也猜不到。
unsigned char[] myBitmap;
...
glDrawPixels( ..., &myBitmap, ... );