OpenGL表现得很奇怪

时间:2010-06-06 01:35:45

标签: objective-c opengl macos

由于某种原因,OpenGL的表现非常奇怪。在我的NSOpenGLView子类中,我在-prepareOpenGL方法中有以下代码:

- (void)prepareOpenGL {
 GLfloat lightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
 GLfloat lightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
 GLfloat lightPosition[] = { 0.0f, 0.0f, 2.0f };

 quality = 0;
 zCoord = -6;

 [self loadTextures];

 glEnable(GL_LIGHTING);
 glEnable(GL_TEXTURE_2D);
 glShadeModel(GL_SMOOTH);
 glClearColor(0.2f, 0.2f, 0.2f, 0.0f);
 glClearDepth(1.0f);
 glEnable(GL_DEPTH_TEST);
 glDepthFunc(GL_LEQUAL);
 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

 glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient);
 glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse);
 glLightfv(GL_LIGHT1, GL_POSITION, lightPosition);
 glEnable(GL_LIGHT1);

 gameState = kGameStateRunning;
 int i = 0; // HERE ********
 [NSTimer scheduledTimerWithTimeInterval:0.03f target:self
           selector:@selector(processKeys) userInfo:nil repeats:YES];

 // Synchronize buffer swaps with vertical refresh rate
 GLint swapInt = 1;
 [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];
 // Setup and start displayLink
 [self setupDisplayLink];
}

我想将处理键输入的计时器分配给ivar,这样我可以在游戏暂停时使其无效(并在恢复时重新实现),但是当我这样做时(因为它已经在[N​​STimer scheduledTimer] ...),OpenGL不显示我绘制的立方体。当我拿走它时,没关系。所以我试着添加一个无害的声明,int i = 0;(maked // HERE *******),这使得灯光不起作用!当我拿走它时,一切都很好,但当我把它放回去时,一切都是黑暗的。有人可以为此提出合理的解释吗?只创建任何变量就可以做到这一点,即使已经声明了几个。

感谢。

1 个答案:

答案 0 :(得分:2)

很奇怪,但我发现了问题。在这一行:

GLfloat lightPosition[] = { 0.0f, 0.0f, 2.0f };

我只有3个元素而不是4个。我不知道为什么它在我没有int i = 0;时有效,但是当我向数组添加0.0f时,一切正常。