2012年8月18日 星期六

Running OpenGL on Linux Mint - 3

since: 2012/08/18
update: 2012/09/06

reference:
1. OpenGL Video Tutorial - Getting OpenGL Set Up on Linux
2. Howto Install OpenGL Development Environment
3. Computing Reference Wikispace - geany_settings
4. GLEW: The OpenGL Extension Wrangler Library

開發環境設定與繪圖測試

A. 檢查 OpenGL 與 GLUT 開發函式庫
     1. 說明:
          要讓 OpenGL 在 Linux 上正常運作, 至少要在檔案中找到 gl.hglut.h 檔案,
          它們通常位於 /usr/include/GL/ 目錄下.

     2. 檢查:
         $ cd /usr/include/GL/
         $ ls

------------------------------------------------------------------------------------

B. 安裝 IDE(整合開發環境)
     1. Menu > Software Manager

     2. > Programming

     3. > geany

     4. > Install

     5. 備註:
         或直接執行
         $ sudo apt-get install geany

------------------------------------------------------------------------------------

C. 開發環境設定與繪圖測試
     1. 開啟 Geany
         Menu > All applications (選單右上方)
         > Programming > Geany

     2. 查看/設定 專案的檔案目錄
          Edit > Preferences
         General > Startup > Project files:
         /home/lanli/projects

     3. 建立專案目錄:
         $ cd ~
         $ mkdir projects

     4. 新增 OpenGL 測試檔案
         開啓新檔案, 寫入以下程式碼, 存檔至 /home/lanli/projects/teapot.c
#include <GL/glut.h>

void init();
void display();

int main(int argc, char* argv[])
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
 glutInitWindowPosition(0, 0);
 glutInitWindowSize(300, 300);
 
 glutCreateWindow("OpenGL 3D View");
 
 init();
 glutDisplayFunc(display);
 
 glutMainLoop();

 return 0;
}

void init()
{
 glClearColor(0.0, 0.0, 0.0, 0.0);
 glMatrixMode(GL_PROJECTION);
 glOrtho(-5, 5, -5, 5, 5, 15);
 glMatrixMode(GL_MODELVIEW);
 gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
}

void display()
{
 glClear(GL_COLOR_BUFFER_BIT);
  
 glColor3f(1.0, 0, 0);
 glutWireTeapot(3);
 
 glFlush();
}

     5. 查看編譯設定
         Build > Set Build Commands

         (update: 2012/08/22)
     6. 調整編譯設定
         a. Build 的 Command 改成:
             gcc -Wall -o "%e.o" "%f" -lglut -lGL -lGLU -lSDL // -lSDL 非必要

         b.Execute 的 Command 改成: "./%e.o"        // 添加 .o

     7. 編譯並執行
         a. Build > Build
         b. Build > Execute

------------------------------------------------------------------------------------

D. 使用 GLEW 的方式: (update: 2012/08/30)
     1. 說明:
         a. 調整編譯設定:
             將 Build 的 Command 改成: 
             gcc -Wall -o "%e.o" "%f" -lglut -lGLEW -lGL -lGLU

         b. 如果 GLEW 要跟 GLUT 一起使用的話, 必須要先 include glew.h, 然後才
     
include glut.h, 並且 glew.h 已經有 include glu.h 了.

         c. GLEW 的初始化必須要在全部的 glutInitxxx 及  glutCreateWindow 之後進行.
             (可以在註冊 callback functions 動作之前)

*******************************************************

     2. 將 teapot.c 修改如下:
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GL/glut.h>

void init();
void display();
void initGlew();

int main(int argc, char* argv[])
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
 glutInitWindowPosition(0, 0);
 glutInitWindowSize(300, 300);
 
 glutCreateWindow("OpenGL 3D View"); 
 initGlew();
 init();
 glutDisplayFunc(display);
 
 glutMainLoop();

 return 0;
}

void init()
{
 glClearColor(0.0, 0.0, 0.0, 0.0);
 glMatrixMode(GL_PROJECTION);
 glOrtho(-5, 5, -5, 5, 5, 15);
 glMatrixMode(GL_MODELVIEW);
 gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
}

void display()
{
 glClear(GL_COLOR_BUFFER_BIT);
  
 glColor3f(1.0, 0, 0);
 glutWireTeapot(3);
 
 glFlush();
}

void initGlew()
{
    GLenum err = glewInit();
   
    if(err !=  GLEW_OK)
    {
        fprintf(stderr, "glewInitError\n");
        exit(1);
    }
   
    fprintf(stderr, "GLEW initialized OK\n");
    fprintf(stderr, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
}


*******************************************************

     3. 編譯並執行
         a. Build > Build
         b. Build > Execute

------------------------------------------------------------------------------------

E. 備註: (update: 2012/09/06)
     1. 後來在 geany 下使用 extern 變數時, 會造成編譯失敗的情況.
         ....
         extern void checkGLErrors(const char* caller);
         ....
         checkGLErrors("main here");
         ....

         *****************************************************

         main.c:(.text+0x70): undefined reference to `checkGLErrors'

         編譯失敗


     2. 試過安裝 codeblocks 來建立 OpenGL 專案, 編譯時也會出問題
         (可能是我不太熟  codeblocks). 

     3. 所以, 之後會改用 eclipse 來開發 OpenGL. 

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。