gcc 版本
(base) yuwenshuo@Cosmos-Computer build % gcc --version
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: arm64-apple-darwin22.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
o@Cosmos-Computer build % ./HelloGL
freeglut (./HelloGL): failed to open display ''
#include<stdio.h>
#include<GLUT/glut.h>
void displayMe(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex3f(0.5, 0.0, 0.5);
glVertex3f(0.5, 0.0, 0.0);
glVertex3f(0.0, 0.5, 0.0);
glVertex3f(0.0, 0.0, 0.5);
glEnd();
glFlush();
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(400, 300);
glutInitWindowPosition(100, 100);
glutCreateWindow("Hello world!");
glutDisplayFunc(displayMe);
glutMainLoop();
//return 0;
}
cmake_minimum_required(VERSION 3.0.0)
project(HelloGL VERSION 0.1.0)
# 使用 C++ 11 标准
set(CMAKE_CXX_STANDARD 11)
# 添加头文件
set(GLAD_H ${PROJECT_SOURCE_DIR}/include)
set(GLFW_H /opt/homebrew/Cellar/glfw/3.3.8/include)
set(GLUT_H /opt/homebrew/Cellar/freeglut/3.2.2/include)
include_directories(${GLAD_H} ${GLFW_H} ${GLUT_H})
# 添加目标链接
set(GLFW_LINK /opt/homebrew/Cellar/glfw/3.3.8/lib/libglfw.3.dylib)
set(GLUT_LINK /opt/homebrew/Cellar/freeglut/3.2.2/lib/libglut.3.dylib)
link_libraries(${GLFW_LINK} ${GLUT_LINK})
# 执行编译命令
set(SOURCES glad.c main.cpp)
add_executable(HelloGL ${SOURCES})
# 链接系统的 OpenGL 框架
if (APPLE)
target_link_libraries(HelloGL "-framework OpenGL")
endif()
include(CTest)
enable_testing()
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
(base) o@Cosmos-Computer build % export DISPLAY=localhost:1
(base) yuwenshuo@Cosmos-Computer build % ./HelloGL
freeglut (./HelloGL): failed to open display 'localhost:1'
(base) o@Cosmos-Computer build % export DISPLAY=0
(base) o@Cosmos-Computer build % ./HelloGL
freeglut (./HelloGL): failed to open display '0'
(base) o@Cosmos-Computer build % export DISPLAY=
(base) o@Cosmos-Computer build % ./HelloGL
freeglut (./HelloGL): failed to open display ''
可见大概不是host的问题
首先,在 macOS 上,使用 GLUT 时应使用 #include<GLUT/glut.h> 而不是 #include<glut.h>。
其次,你使用了 glutInitDisplayMode(GLUT_SINGLE),这将导致 GLUT 使用单缓冲模式,而不是双缓冲模式。在单缓冲模式下,当绘图函数调用 glFlush() 时,所有的绘图命令都会立即在单缓冲区上执行,而不是在双缓冲区上等待切换时再执行。这会导致你看不到任何图形,因为图形会立即消失。
要解决这个问题,可以将 glutInitDisplayMode(GLUT_SINGLE) 替换为 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB),这样就会使用双缓冲模式,并且可以看到绘制的图形。
还有一个问题是你使用了 glBegin(GL_POLYGON) 和 glEnd() 绘制多边形,但是你没有指定颜色。要解决这个问题,可以在绘图函数中调用 glColor3f(r, g, b) 设置颜色,其中 r, g, b 分别是红、绿、蓝三个颜色分量的值,取值范围为 0.0 ~ 1.0。
修改后的代码如下:
#include<GLUT/glut.h>
void displayMe(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0); // 设置颜色为红色
glBegin(GL_POLYGON);
glVertex3f(0.5, 0.0, 0.5);
glVertex3f(0.5, 0.0, 0.0);
glVertex3f(0.0, 0.5, 0.0);
glVertex3f(0.0, 0.0, 0.5);
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 使用双缓冲模式
glutInitWindowSize(400, 300);
glutInitWindowPosition(100, 100);
glutCreateWindow("Hello world!");
glutDisplayFunc(displayMe);
glutMainLoop();
return 0;
}