2012-01-29 119 views
5

我已经为Mac OS X 10.5及更高版本编写了一个OpenGL屏幕保护程序,它显示了使用行军立方体构建的旋转心脏。它工作正常,在我的黑13.3" 发展MacBook上运行的雪豹(10.6),漂亮而有光泽。Mac OS X 10.6中的OpenGL对象光鲜亮丽,但不是10.5。为什么?

但是,当我尝试在一个新的MacBook Pro,但运行Leopard(10.5),心脏ISN没有光泽,看起来好像只有环境光/漫射光,但没有镜面光,就好像我把光的镜面反射分量设置为0一样。新的Macbook有一块Nvidia显卡,一块较旧的运行10.6有一个英特尔XMA3100。

她e是我的OpenGL初始化代码。心脏是使用行军立方体创建的,我也在计算法向量。

 
- (void)setUpOpenGL 
{ 
    [[glView openGLContext] makeCurrentContext]; 

    // Synchronize buffer swaps with vertical refresh rate 
    GLint swapInterval = 1; 
    [[glView openGLContext] setValues:&swapInterval 
         forParameter:NSOpenGLCPSwapInterval]; 

    glShadeModel(GL_SMOOTH); 
    glClearDepth(1.0); 
    glClearColor (0.0, 0.0, 0.0, 0.0); 
    glEnable(GL_DEPTH_TEST); 

    // Light 
    GLfloat ambient_light[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
    GLfloat diffuse_light[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
    GLfloat specular_light[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
    GLfloat position_light[] = { 0.0f, 0.0f, -1.0f, 0.0f }; 

    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHTING); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_light); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_light); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, specular_light); 
    glLightfv(GL_LIGHT0, GL_POSITION, position_light); 

    // Material 
    glEnable(GL_COLOR_MATERIAL); 
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 

    GLfloat mat_ambient[] = {0.7, 0.0, 0.0, 1.0}; 
    GLfloat mat_diffuse[] = { 0.7, 0.0, 0.0, 1.0 }; 
    GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 0.0 }; 
    GLfloat mat_shininess[] = { 100.0 }; 

    glColor3f(1.0, 0.0, 0.0); 

    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 

    // Copy isosurface vertices to graphics array 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, [marchingCubes vertices]); 
    glNormalPointer(GL_FLOAT, 0, [marchingCubes normals]); 
} 

实际的绘图代码如下所示:

 
- (void)drawRect:(NSRect)rect 
{ 
    [super drawRect:rect]; 

    [[glView openGLContext] makeCurrentContext]; 

    glDrawBuffer(GL_BACK); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Adjust viewpoint to give heart beat effect 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0, radius, 2*radius/3, 
       0, 0, 0, 
       0, 0, 1); 

    // Adjust rotation to make heart spin 
    glRotatef(rotation, 0.0f, 0.0f, 1.0f); 

    // Draw heart 
    glDrawArrays(GL_TRIANGLES, 0, [marchingCubes vertexCount]/3); 

    glFlush(); 

    [[glView openGLContext] flushBuffer]; 

    // Rotate and scale a bit 
    rotation += 1.0f; 
    radius = 4.0 + 0.25*sin(rotation/4); 
} 

任何想法,为什么镜面照明区别?某些图形卡是否支持高光照明?任何指针都非常感谢。

+0

从来没有想通了这一点,但开源,开源项目:https://github.com/thinkski/ValentineGL – 2016-05-17 23:56:52

回答

1

的GL_SPECULAR(以及其它颜色)默认是{ 0.0,0.0,0.0,1.0 }

GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 1.0 }; 

你也可以做到这一点在你的设置FUNC年底1.优化图纸和2.仔细检查,如果实际应用照明当你设置它时,将它放在正面。

glCullFace(GL_BACK); 
glEnable(GL_CULL_FACE); 
+0

感谢您的建议。我在背面添加了扑灭,并确实发现前脸在内侧。所以我在setUpOpenGL中的“同步垂直刷新频率的缓冲区交换”之后立即添加了对glFrontFace(GL_CW)的调用,但仍然没有发光。 正如上面的代码一样,光线和材料镜面组件都被设置为{1.0,1.0,1.0,1.0}。如果我设置为{0.0,0.0,0.0,1.0},则亮度也会在10.6上消失。 – 2012-01-30 04:27:25

+0

这与材料和浅色混合时的乘法有关。黑色*其他颜色为黑色,当alpha也为0.0时,则无论3种颜色成分如何,结果都是完全透明的。我建议你明确定义使用glLight()可访问的光衰减和其他值。 – Sam 2012-01-30 09:41:32

+0

我会试试看。我无法再访问10.5测试机器,因此测试会变慢。我想到的另一件事是,10.5是一个32位操作系统,而10.6是64位,所以我将法向矢量和顶点写入每个文件并进行比较。它们是相同的,所以这不是问题。 – 2012-02-01 05:17:33