OpenGL glDrawPixels на динамических 3D-массивах - PullRequest
1 голос
/ 03 ноября 2008

Как нарисовать следующий динамический массив 3D с OpenGL glDrawPixels () ? Вы можете найти документацию здесь: 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 ]

4 голосов
/ 04 ноября 2008

Э-э ... Поскольку вы выделяете каждый отдельный пиксель с отдельным malloc(), вам придется рисовать каждый пиксель с отдельным вызовом glDrawPixels(). Это (очевидно) безумие; Идея растровой графики заключается в том, что пиксели хранятся в смежном компактном формате, поэтому можно быстро и быстро ( O (1) ) переходить от одного пикселя к другому. Это выглядит очень смущенным для меня.

Более разумным подходом было бы выделение «трехмерного массива» (который часто называют двумерным массивом пикселей, где каждый пиксель состоит из красного, зеленого и синего компонента) с одним вызовом malloc(), вот так (в C):

float *array3d;
array3d = malloc(scene.camera.hres * scene.camera.vres * 3 * sizeof *array3d);
1 голос
/ 04 ноября 2008

Спасибо, раскрутите. Я получил такой же совет по 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();
}

Мое приложение еще не работает (на экране ничего не отображается), но я думаю, что это моя вина, и этот код будет работать.

0 голосов
/ 27 декабря 2009

вы не хотите использовать вместо glTexImage2D (): см. здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...