OpenGL像素默认像素存储格式

来源:互联网 发布:女生基本款 知乎 编辑:程序博客网 时间:2024/05/17 20:31

OpenGL的像素存储格式是有glPixedStore来设定的,默认情况下相邻两行的存储的位置是相差4的整数倍,

也就是一行的存储要用4的整数倍的字节,不够的情况下要补充。举例说明:

一个2*2的红色图片(用GL_UNSIGNED_BYTE来表示一个颜色通道)的默认存储格式为:

(255,0,0),(255,0,0)_ _

(255,0,0),(255,0,0)_ _

这里(255,0,0)表示三个连续的byte,“_”表示一个byte,这样一行就是“(255,0,0),(255,0,0)_ _”,正好是8个byte,这里“_”表示补充的byte。

用代码来测试一下:读取RGBA,然后再提取其中的RGB,在画到屏幕上:

#include <glew.h>#include <freeglut.h>#include <iostream>#include<vector>using namespace std;int WinX = 512, WinY = 512;void initialize(){if (glewInit()!=GLEW_OK){cout << "failed to init glew\n"; exit(0);}int para;glGetIntegerv(GL_PACK_ALIGNMENT, ¶);cout << para << endl;glGetIntegerv(GL_UNPACK_ALIGNMENT, ¶);cout << para << endl;glClearColor(0., 0., 0., 1);}void reshape(int w, int h){WinX = w; WinY = h;glViewport(0, 0, w, h);}void display(){glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);{glColor3f(0, 0, 1);glVertex3f(0, 0, 0);glVertex3f(0.9, 0, 0);glVertex3f(0, 1, 0);}glEnd();vector<unsigned char> image(WinX*WinY * 4);glReadPixels(0, 0, WinX, WinY, GL_RGBA, GL_UNSIGNED_BYTE, image.data());vector<unsigned char >data;int len = WinX*3 ;if (len % 4) len += 4 - (len % 4);data.resize(len*WinY);for (int i = 0; i < WinY; i++){auto *ptr = data.data() + i*len;int id2 = 0;for (int  j = 0; j < WinX; j++){int id = (i*WinX + j) * 4;ptr[id2++] = image[id++];ptr[id2++] = image[id++];ptr[id2++] = image[id++];}}glClear(GL_COLOR_BUFFER_BIT);glDrawPixels(WinX, WinY, GL_RGB, GL_UNSIGNED_BYTE, data.data());glFinish();}void main(int argc,char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);glutInitWindowSize(WinX, WinY);glutCreateWindow(argv[0]);glutDisplayFunc(display);glutReshapeFunc(reshape);initialize();glutMainLoop();}


0 0
原创粉丝点击