OpenGL不会为不在命名空间中的对象绘制多边形

时间:2014-11-21 03:06:47

标签: c++ opengl

我创建了一个带有绘图函数.draw()的类,它将在屏幕上绘制该对象。此函数适用于命名的全局变量,但不适用于在堆上分配或放在数组中的函数。

这是带有main()的文件中的代码:

Object obj1 = Object::Object (SCALE);

Object obj2 = Object::Object (SCALE);
Object* objPtr2;

Object* objPtr3;

Object objArray [5];

void init (void)
{
    //...
    objPtr2 = &obj2;
    objPtr3 = new Object (SCALE);
    objArray [0] = Object::Object (SCALE);
    //...
}

void display (void)
{
    //...
    obj1.draw();            // Draws polygons
    objPtr2->draw();        // Draws polygons
    objPtr3->draw();        // POINTs only
    objArray [0].draw();    // POINTs only
    //...
}

2 个答案:

答案 0 :(得分:1)

您传递给glMaterialfv()的矢量没有足够的值:

float wh [] = {1, 1, 1};
glBegin ( GL_POINTS);
glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wh);

此调用需要一个四个值的向量(请参阅此处的man page)。因此,此调用将为第4个组件使用未定义的内存内容,该组件定义了alpha值。这可以解释"随机"没有绘制的物体。

调用应该是这样的:

float wh[] = {1.0f, 1.0f, 1.0f, 1.0f};
glBegin(GL_POINTS);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wh);

此处有第二次调用,其中未显示变量的定义。它可能有同样的问题:

glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color );

答案 1 :(得分:0)

我发现了这个问题。在我的构造函数中,我只是声明一个开始旋转,而不是初始化它。 我已经习惯了java,它会自动初始化为零,所以我没有抓到这个bug。

值得注意的是:对于静态对象,C ++将启动整数,浮点数或双精度值为零,这就是造成差异的原因。动态初始化在字段中留下垃圾以进行旋转。与命名空间无关或使用Heap进行动态内存存储。