数组中的 gldrawpixel rgb 值

Posted

技术标签:

【中文标题】数组中的 gldrawpixel rgb 值【英文标题】:gldrawpixel rgb value from a array 【发布时间】:2013-11-18 19:31:16 【问题描述】:

我有一个三维数组

unsigned int window_RGBData[3][640][480];
void display()
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDrawPixels(window_Width,window_Height,GL_RGB,GL_UNSIGNED_INT, window_RGBData);
    glutSwapBuffers();

无论数组中的值是什么,它都只会显示黑屏。数组是这样的,第1维是红色,第2维是绿色,第3维是蓝色。 当我使用 gl_unsinged_byte 而不是 int 时,我得到黑白线(如果所有数组都是 255)。所以它正在从数组中读取。 但我想我无法为opengl指定正确的数组格式。我可以使用

glBegin(GL_POINT)
// code here
glEnd

但由于特定原因,这种方式超出了范围。

关于如何在 gldrawpixels 函数或任何其他方式中指定格式的任何想法。

初始化等:

int Image::OpenGLShow()
// Display onscreen
    int argc=1;
    char* argv[1];
    argv[0]=strdup("Helloguys");
    glutInit(&argc, argv);
    window_Height=Height;
    window_Width= Width;
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  glutInitWindowSize(Width, Height);
  glutCreateWindow("OpenGL glDrawPixels demo");

  glutDisplayFunc(display);
  glEnable(GL_DEPTH_TEST);

  glutMainLoop();
    return 0; 

编辑: 我相信问题出在我放入数组中的值上。现在这是填充数组的方式:

for(int i =0;i<200;i++)
        for (int j=0; j<200;j++)
            // rgb values at i*j point on screen. 
            window_RGBData[0][i][j]=red_value;  // 0-255
            window_RGBData[1][i][j]=green_value;
            window_RGBData[2][i][j]=blue_value;
        
    

所以基本上我假设 gldrawpixels 方法会将这三者组合在一起并显示像素,具体取决于我提供的格式。这绝对不是 gldrawpixels 正在做的事情。那么我应该更改填充数组的方式还是更改甲酸盐值?

【问题讨论】:

你能展示你的opengl上下文的设置吗?具体来说,设置你的显示模式? 我编辑了这个问题.. 必须注意的是我已经尝试使用 glbegin() 和 glend() 绘制一个三角形并且它显示正确.. “第 1 维是红色,第 2 维是蓝色,第 3 维是绿色”——你是从哪里得到这个想法的?它(可能!)与您的问题无关,但肯定是对基础知识的误解。 我的 rgb fomat 不好。但我说的是我的数组是如何填充的。 【参考方案1】:

该数组太大而无法放入堆栈。

增加你的堆栈大小,在堆上分配它,或者尝试一些更小的东西:

#include <GL/glut.h>
#include <cstdlib>

const unsigned int W = 200;
const unsigned int H = 200;

void display()

    glClearColor( 0, 0, 0, 1 );
    glClear( GL_COLOR_BUFFER_BIT );

    unsigned int data[H][W][3];
    for( size_t y = 0; y < H; ++y )
    
        for( size_t x = 0; x < W; ++x )
        
            data[y][x][0] = ( rand() % 256 ) * 256 * 256 * 256;
            data[y][x][1] = ( rand() % 256 ) * 256 * 256 * 256;
            data[y][x][2] = ( rand() % 256 ) * 256 * 256 * 256;
        
    

    glDrawPixels( W, H, GL_RGB, GL_UNSIGNED_INT, data );

    glutSwapBuffers();


int main( int argc, char **argv )

    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
    glutInitWindowSize( W, H );
    glutCreateWindow( "GLUT" );
    glutDisplayFunc( display );
    glutMainLoop();
    return 0;

【讨论】:

即使我减小窗口和数组大小,它仍然只显示黑屏 所以我贴的程序给你黑屏了? 数组维度也在这里混合。但是,对于完全随机的数据,它是不可见的。 将 255 更改为 256 和交换数组中的 x , y 或 W , H【参考方案2】:

而不是

unsigned int window_RGBData[3][640][480];

试试

unsigned int window_RGBData[480][640][3];

当然也相应地填充缓冲区。

C(++) 中的多维数组只是一种语法糖。 window_RGBData 作为指针传递给 glDrawPixels。它指向内存中的一个区域,glDrawPixels 根据formattype 参数解释那里的值。 在当前情况下,值应该是无符号整数,它们的顺序如下:

row1_column1.r row1_column1.g row1_column1.b
row1_column2.r row1_column2.g row1_column2.b
...
row1_column640.r row1_column640.g row1_column640.b
row2_column1.r row2_column1.g row2_column1.b
row2_column2.r row2_column2.g row2_column2.b
...
row2_column640.r row2_column640.g row2_column640.b
...
row480_column1.r row480_column1.g row480_column1.b
row480_column2.r row480_column2.g row480_column2.b
...
row480_column640.r row480_column640.g row480_column640.b

另见http://mycodelog.com/tag/gldrawpixels/

也要注意对齐方式:

width × height 像素从内存中读取,从位置数据开始。 默认情况下,这些像素取自相邻的内存位置, 除了在读取所有宽度像素之后,读取指针是 前进到下一个四字节边界。四字节行对齐 由带有参数 GL_UNPACK_ALIGNMENT 的 glPixelStore 指定,并且它 可以设置为 1、2、4 或 8 个字节。

来源:http://www.opengl.org/sdk/docs/man2/xhtml/glDrawPixels.xml

使用一维数组声明和填充缓冲区的另一种方法:

unsigned window_RGBData[640 * 480 * 3]; // 640 mod 4 == 0
...
window_RGBData[3 * (y * 640 + x) + 0] = ColorYouWantAtXY(x, y).red;
window_RGBData[3 * (y * 640 + x) + 1] = ColorYouWantAtXY(x, y).green;
window_RGBData[3 * (y * 640 + x) + 2] = ColorYouWantAtXY(x, y).blue;

请注意,这里我们利用了 640 模 4 == 0,因此没有对齐问题。

【讨论】:

这解释了很多事情,所以多亏了你,我的代码实际上可以工作,但我不得不将数组更改为你指定的尺寸,并使 window_RGBData 成为 GLuByte 而不是 unsinged int。因此,为了进一步了解为什么 GluByte 工作,而 unsigned int 或 GLuInt 只显示黑屏(我确实在需要时将模式更改为 gl_unsinged_int)。

以上是关于数组中的 gldrawpixel rgb 值的主要内容,如果未能解决你的问题,请参考以下文章

glDrawPixels 访问冲突读取位置

灰度的glDrawPixels?

从 Python 中的图像中减去 RGB 值

将 3D 数组转换为 RGB 值数组 [关闭]

将数组值转换为 RGB 格式

Win32中的RGB后台缓冲区