การติดตั้ง openGL บน linux (Ubuntu) [ใน 5 นาที(มั้ง)]
เราเทสบน เครื่อง linux จริง ไม่ได้ทำผ่าน virtual machine (VM Ware) หรือ WSL (linux terminal เทียม) น๊ะจ๊ะ
# Update central repository library/(อัพเดต สโตร์กลาง)
sudo apt-get update
# Program && librarry /(ตัวโปรแกรมและไลบารี่ที่จำเป็นสำหรับ openGL)
sudo apt-get install freeglut3
sudo apt-get install freeglut3-dev
sudo apt-get install binutils-gold
sudo apt-get install g++
sudo apt-get install cmake
sudo apt-get install libglew-dev
sudo apt-get install mesa-common-dev
sudo apt-get install mesa-utils
sudo apt-get install build-essential
sudo apt-get install libglew1.5-dev libglm-dev
หลังจากที่เราติดตั้งซอฟต์แวร์ช้างต้นแล้ว ให้เราเช็ค เวอร์ชั่นของ openGl โดยใช้คำสั่ง
glxinfo | grep "OpenGL version"
เทสว่า เครื่องเราลองรับ opengl หรือไม่ โดยใช้คำสั่ง (โดยจะปรากฏเป็น simulation วัตถุเกียร์)
glxgears
การรันไฟล์ .cpp เราต้องนำเข้าไลบารี่ที่ เราได้ระบุไว้ในส่วนของ include ซึ่ง ณ ที่นี้ ได้แก่ Gl, GLEW, glfw
ซึ่งเราจะ นำเข้าไลบารี่ มาคอมไพล์ด้วยวิธีดังนี้ (อัพไฟล์ main.cpp ให้แล้วนะ)
g++ main.cpp -lGL -lGLEW -lglfw
รูปแบบ syntax -l คือ
# -l => มาจากคำว่า library ส่วนที่ตามหลังคือ ไลบารี่นั้น โดยเราสามารรันแบนี้ก็ได้
# -lGl หรือ -l Gl
โดยหลังจากที่เราคอมไพล์ไฟล์แล้วเราจะได้ไฟล์เบื้องต้นมาชื่อว่า a.out โดยการรันไฟล์นี้ จะเหมือนกับใน gcc คือ
./a.out
หากเพื่อนอยากจะรันแบบไม่ต้องดีบัก สามารถ ก็อปไฟล์นี่ไปใช้ .vscode เรามาเข้ากันก่อนว่า task.json คืออะไร?? task.json คือ ไฟล์ที่เอาไว้ใส่ค่าการคอมไพล์ โดยเรามาดูที่ตัวแปร args ใน task.json กันดีกว่าา...
"args": [
"-fdiagnostics-color=always",
"-g", // ใช้เวลาที่เราต้องการจะสั่งให้คอมไพล์เลอร์ ไปคอมไพล์ที่ไฟล์ไหนบ้าง
"Libs/*.cpp", // เป็นการบอกว่า เราจะเอา dircetory(โฟลเดอร์) ที่ชื่อ Libs มาคอมไพล์ด้วยนะ
"-g",
"${fileDirname}/*.cpp", // คอมไพล์ไฟล์ในไดเรคทอรี่ร์ปัจจุบันที่เราอยู่ โดยคอมไพล์ เฉพาะไฟล์ที่เป็นนามสกุล .cpp ในไดเรคทอรี่ นี้
"-l", "GL", // ในเข้าไลบารี่ที่ชื่อ GL มาคอมไพล์ด้วย [ -l (library) ]
"-l", "GLEW",
"-l", "glfw",
"-o", // จะเอาไฟล์ชื่ออะไร [ -o (output) ]
"${fileDirname}/${fileBasenameNoExtension}" // ชื่อไฟล์ ตามชื่อที่เซฟไว้
],
โดยเราสามารถแปลง args เป็นคำสั่งใน terminal ได้แบบด้านล่างนี้
g++ -g Libs/*.cpp -g *.cpp -l GL -l GLEW -l glfw -o test
ส่วนคำสั่ง launch.json นี่ปกติแล้ว vs code จะ config มาให้อยู่แล้วคุณไม่ต้องก็อปไปก็ได้นะ (launch.json เป็นไฟล์ที่เอาไว้บอกว่ารันยังไง)
ในภาษาโปรแกรมมิ่ง นั้นมี ไลบารี่ให้เราใช้ ซึ่งบางครั้งเราก็บอกชื่อ ไลบารี่ไปแล้วด้วย -l แต่ คอมไพลเลอร์ดันจ๊าดง๊าว ไม่รู้ว่า ไลบารี่เราเก็บไว้ที่ไหนซ่ะงั้น
เช่นนั้นแล้ว เราก็บอก absolute path (ที่อยู่ที่แน่นอน) ให้มันรู้กันไปเล้ยยย....
Syntax
-Lพาธที่เก็บไลบารี่ไว้ -lชื่อไลบารี่ที่จะใช้ # -L => Links , -l => library
ตัวอย่าง
gcc main.cpp -L/usr/include/GL -lGL
Syntax
-I พาธที่ต้องการจะ Include มาใช้ที่ไฟล์ # -I --> Include
ตัวอย่าง
gcc main.cpp -I /usr/include/glm/*
วิธีนี้จะเป็นการอ้างพาธที่อยู่ ไลบารี่ แบบโครตตตต จะสุดแล้ววว (แต่แอบยาวนะ555) มาดูกันโล้ด Syntax
-Ipath -Lpath -l(libraryName)
Ex. gcc main.cpp -I /usr/include/GL/ -L /usr/include/GL -l GL
ในแลปที่เจ็ด เราจะต้อง นำโฟลเดอร์ Libs เข้ามาคอมไพล์ดัวยนะ โดยใช้คำสั่งด้านล่างนี้ (ไฟล์ OpenGLFirstProject)
g++ Libs/*.cpp -g main.cpp -lGL -lGLEW -glfw
เราสามารถรวบทั้งการคอมไพล์และรันมาไว้ในบรรทัดเดียวกันได้ดังนี้
g++ main.cpp -lGL -lGLEW -lglfw && ./a.out
# หรือเราจะตั้งชื่อไฟล์ด้วยก็ได้ เช่น
g++ main.cpp -o test -lGL -lGLEW -lglfw && ./test
ถ้าคอมไพล์ไม่ผ่านทั้งที่โค้ดถูกแล้วแสดงว่าอาจจะไม่ได้นำเข้าไลบารี่เข้ามาคอมไพล์ด้วย แนะนำว่าให้เซิชใน
StackOverFlow แล้ว ติดตั้งไลบารี่นั้นซ่ะ แล้วตอนคอมไพล์ก็แนบไลบารี่นั้นด้วย
เมื่อคุณคอมไพล์และรันสำเร็จจะได้รูปภาพประมาณนี้นะ
ปัญหาที่วันนี้เจอบ่อยในการช่วยแก้ปัญหาให้เพื่อนๆ
-
gcc จะไม่รองรับชื่อโฟลเดอร์ภาษาไทย ใครใช้ภาษาไทย ต้องเปลี่ยนเป็นภาษาอังกฤษครับ
-
เครื่อง Mac จะ error GLFW window creation failed! จะมีบรรทัดนึงใน main ไฟล์แรก และ Window.cpp ใน Library เขียนไว้ว่า GLFW_OPENGL_ANY_PROFILE ให้เพิ่มบรรทัดนี้ไปอีกบรรทัดนึง
glfwWindowHint(GLFW_OPENGL_ANY_PROFILE, GLFW_OPENGL_CORE_PROFILE);
(จริงๆอันนี้มีบอกไว้ในคลิป setup ของ Mac แล้วครับ)
3. เครื่อง Mac M1 (Arm) อันนี้ปัญหา Launch ไม่ได้ ต้องติดตั้ง Extension เสริม ชื่อ CodeLLDB แล้วเปลี่ยน Configuration เป็น LLDB: Launch ครับ ที่เหลือแก้ตัวแปรให้คล้ายๆเดิมครับ
ถ้าเริ่มลอง uniform แล้ว รูปสามเหลี่ยมหายไป
ให้ไปที่ Shader.cpp ย้ายบรรทัดที่ 107 และ 108 ที่เขียนว่า
uniformModel = glGetUniformLocation(shader, "model");
uniformProjection = glGetUniformLocation(shader, "projection");
ไปไว้ที่บรรทัดที่ 99 แทนครับ (ก่อน if (!result) อันสุดท้ายของฟังก์ชัน)
https://www.wikihow.com/Install-Mesa-(OpenGL)-on-Linux-Mint (Suggest)
http://www.codebind.com/linux-tutorials/install-opengl-ubuntu-linux/