我创建了一个带有绘图函数.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
//...
}
答案 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进行动态内存存储。