Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Mac OS X 10.6中的OpenGL对象有光泽,但不是10.5。为什么?_Macos_Cocoa_Opengl_Lighting_Specular - Fatal编程技术网

Macos Mac OS X 10.6中的OpenGL对象有光泽,但不是10.5。为什么?

Macos Mac OS X 10.6中的OpenGL对象有光泽,但不是10.5。为什么?,macos,cocoa,opengl,lighting,specular,Macos,Cocoa,Opengl,Lighting,Specular,我已经为MacOSX10.5和更高版本编写了一个OpenGL屏幕保护程序,它显示了一个使用移动立方体构建的旋转心脏。它在我的黑色13.3英寸开发版Macbook running Snow Leopard(10.6)上运行得很好,漂亮且光滑 但当我在运行leopard(10.5)的新款Macbook Pro上试用时,它的心脏并没有光泽。它似乎只使用环境光/漫反射光照明,而没有镜面反射光。这就好像我将灯光的镜面反射组件设置为0。新款Macbook有一个Nvidia图形卡。运行10.6的旧款Macb

我已经为MacOSX10.5和更高版本编写了一个OpenGL屏幕保护程序,它显示了一个使用移动立方体构建的旋转心脏。它在我的黑色13.3英寸开发版Macbook running Snow Leopard(10.6)上运行得很好,漂亮且光滑

但当我在运行leopard(10.5)的新款Macbook Pro上试用时,它的心脏并没有光泽。它似乎只使用环境光/漫反射光照明,而没有镜面反射光。这就好像我将灯光的镜面反射组件设置为0。新款Macbook有一个Nvidia图形卡。运行10.6的旧款Macbook有一个Intel XMA3100

这是我的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)设置OpenGL { [[glView openGLContext]makeCurrentContext]; //使用垂直刷新率同步缓冲区交换 闪烁swapInterval=1; [[glView openGLContext]设置值:&swapInterval forParameter:NSOpenGLCPSwapInterval]; glShadeModel(GL_平滑); glClearDepth(1.0); glClearColor(0.0,0.0,0.0,0.0); glEnable(GLU深度试验); //轻的 GLfloat环境光[]={0.2f,0.2f,0.2f,1.0f}; GLfloat漫反射光[]={1.0f,1.0f,1.0f,1.0f}; GLfloat镜面反射光[]={1.0f,1.0f,1.0f,1.0f}; GLfloat位置灯[]={0.0f,0.0f,-1.0f,0.0f}; glEnable(GL_LIGHT0); glEnable(德国劳埃德大学照明); glLightfv(GL_LIGHT0、GL_环境光、环境光); glLightfv(GL_LIGHT0、GL_漫反射、漫反射光); glLightfv(GL_LIGHT0、GL_镜面反射、镜面反射光); glLightfv(GLU灯0、GLU位置、位置灯); //材料 glEnable(GL_颜色_材料); GLCOLOR材质(GL_前部、GL_环境_和_漫反射); GLfloat mat_环境[]={0.7,0.0,0.0,1.0}; GLfloat mat_diffuse[]={0.7,0.0,0.0,1.0}; GLfloat mat_镜面反射[]={0.0,0.0,0.0,0.0}; GLfloat mat_亮度[]={100.0}; GL3F(1.0,0.0,0.0); GLMATERIALV(GL_前部、GL_环境、mat_环境); GLMATERIALV(GL_前部、GL_漫反射、mat_漫反射); GLMATERIALV(GL_前部、GL_镜面反射、mat_镜面反射); GLMATERIALV(GL_正面、GL_反光、mat_反光); //将等值面顶点复制到图形阵列 glEnableClientState(GL_顶点_数组); glEnableClientState(GL_普通_阵列); glVertexPointer(3,GL_FLOAT,0,[marchingCubes顶点]); 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); } -(void)drawRect:(NSRect)rect { [超级drawRect:rect]; [[glView openGLContext]makeCurrentContext]; glDrawBuffer(GL_BACK); glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位); //调整视点以产生心跳效果 glMatrixMode(GLU模型视图); glLoadIdentity(); gluLookAt(0,半径,2*radius/3, 0, 0, 0, 0, 0, 1); //调整旋转以使心脏旋转 glRotatef(旋转,0.0f,0.0f,1.0f); //鼓起勇气 glDrawArray(GL_三角形,0,[marchingCubes vertexCount]/3); glFlush(); [[glView openGLContext]刷新缓冲区]; //旋转和缩放一点 旋转+=1.0f; 半径=4.0+0.25*sin(旋转/4); }
你知道为什么镜面照明会有差异吗?一些图形卡上根本不支持镜面照明吗?任何指针都很受欢迎。

GL_镜面照明(和其他颜色)的默认值是
{0.0,0.0,0.0,1.0}

GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 1.0 };
您也可以在设置功能结束时执行此操作,即1.优化图形和2.在设置前表面时仔细检查照明是否实际应用于前表面

glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);

谢谢你的建议。我在背面添加了剔除,确实发现正面在里面。因此,我在setUpOpenGL中“将缓冲区交换与垂直刷新率同步”之后添加了对glFrontFace(GL_CW)的调用,但仍然没有光泽。灯光和材质镜面反射组件都设置为{1.0,1.0,1.0,1.0}如上面的代码所示,如果我设置为{0.0,0.0,0.0,1.0}10.6版的光泽度也会消失。这与材质和灯光颜色混合时的乘法有关。黑色*其他颜色为黑色,当alpha也为0.0时,则结果是完全透明的,无论3种颜色成分是什么。我建议您使用glLigh明确定义光衰减和其他可访问的值t()。我会试试。我再也不能访问10.5测试机了,所以测试速度会慢一些。我想到的另一件事是,10.5是一个32位的操作系统,而10.6是64位的,所以我将法向量和顶点分别写入一个文件并进行比较。它们是相同的,所以这不是问题。我从未想到这一点,但开源项目: