gldrawpixel来自数组的rgb值

时间:2013-11-18 19:31:16

标签: c++ arrays opengl freeglut

我有一个三维数组

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是绿色,第三个是蓝色。 当我使用 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正在做的事情。那么我应该改变数组的填充方式还是改变格式值?

2 个答案:

答案 0 :(得分:3)

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

增加堆栈大小,在堆上分配或尝试更小的东西:

#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;
}

答案 1 :(得分:1)

而不是

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/

同时注意对齐:

  从位置数据开始,从存储器读取

宽度×高度像素。   默认情况下,这些像素取自相邻的内存位置,   除了在读取所有宽度像素之后,读指针是   前进到下一个四字节边界。四字节行对齐   由glPixelStore指定,带有参数GL_UNPACK_ALIGNMENT,它   可以设置为一个,两个,四个或八个字节。

来源: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 modulo 4 == 0,因此对齐没有问题。