动态3D阵列上的OpenGL glDrawPixels

时间:2008-11-03 20:44:20

标签: c++ arrays opengl graphics

如何使用OpenGL glDrawPixels()绘制以下动态 3D 数组? 您可以在此处找到文档:http://opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/drawpixels.html

float ***array3d;

void InitScreenArray()
{
    int i, j;

    int screenX = scene.camera.vres;
    int screenY = scene.camera.hres;

    array3d = (float ***)malloc(sizeof(float **) * screenX);

    for (i = 0 ;  i < screenX; i++) {
        array3d[i] = (float **)malloc(sizeof(float *) * screenY);

        for (j = 0; j < screenY; j++)
          array3d[i][j] = (float *)malloc(sizeof(float) * /*Z_SIZE*/ 3);
    }
}

我只能使用以下头文件:

#include <math.h>
#include <stdlib.h>
#include <windows.h>     

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h> 

3 个答案:

答案 0 :(得分:4)

呃...由于您使用单独的malloc()分配每个像素,您必须通过单独调用glDrawPixels()来绘制每个像素。这显然是疯了;位图图形的想法是像素以相邻的紧凑格式存储,以便快速和快速( O(1))从一个像素移动到另一个像素。这看起来很困惑。

更明智的方法是分配“3D阵列”(通常称为2D像素阵列,其中每个像素恰好由红色,绿色和蓝色组成),只需调用{ {1}},如此(在C中):

malloc()

答案 1 :(得分:1)

谢谢放松。我在gamedev.net上得到了相同的建议,所以我实现了以下算法:

typedef struct
{
    GLfloat R, G, B;
} color_t;

color_t *array1d;

void InitScreenArray()
{   
        long screenX = scene.camera.vres;
    long screenY = scene.camera.hres;
        array1d = (color_t *)malloc(screenX * screenY * sizeof(color_t));
}

void SetScreenColor(int x, int y, float red, float green, float blue)
{
    int screenX = scene.camera.vres;
    int screenY = scene.camera.hres;

    array1d[x + y*screenY].R = red;
    array1d[x + y*screenY].G = green;
    array1d[x + y*screenY].B = blue;
}

void onDisplay( ) 
{
    glClearColor(0.1f, 0.2f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glRasterPos2i(0,0); 
    glDrawPixels(scene.camera.hres, scene.camera.vres, GL_RGB, GL_FLOAT, array1d);

    glFinish();
    glutSwapBuffers();
}

我的应用程序尚未运行(屏幕上没有任何内容),但我认为这是我的错,此代码可以正常运行。

答案 2 :(得分:0)

您不想使用glTexImage2D()代替:请参阅here