如何使用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>
答案 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