3D programming with Klimt
来源:互联网 发布:北京理工大学知乎 编辑:程序博客网 时间:2024/05/21 11:25
以OpenGL 來講, 最有名大概就是MESA LIBRARY;
而OpenGL ES則是Vincent 3D LIBRARY了, 但這套似乎主要支援wince的環境,
如果要在linux上run, 應該還要下一翻苦工. 所以我選用了可以在linux上compile的 klimt 3D Library
雖然這套宣稱不是OpenGL ES library, 但是OpenGL ES大部份的function都可以使用
而這套library 的EGL 是建構在SDL 上的, 所以在執行之前, 需先在平台上準備好你的X和SDL
#Cross compiling SDL for arm... 1. version: arm-linux-gcc v3.4.3 SDL:SDL-1.2.13( http://www.libsdl.org/ ) 2. assuming installed path is /home/jacob/test 3. configure: ./configure --build=i686 --host=arm-linux --prefix=/home/jacob/test --enable-static --enable-joystick=no --enable-cdrom=no --enable-alsa=no --disable-alsatest --enable-esd=no --disable-esdtest --enable-pulseaudio=no --enable-arts=no --enable-nas=no --enable-diskaudio=no --enable-mintaudio=no --enable-nasm=no --enable-altivec=no --enable-ipod=no --enable-video-dga=no --enable-video-photon=no --enable-video-carbon=no --enable-video-cocoa=no --enable-video-ps2gs=no --enable-video-svga=no --enable-video-xbios=no --enable-video-gem=no --enable-directx=no --enable-rpath; make; make install 4. result: jacob@jacob-laptop:~/test/lib$ ls libSDL* libSDL-1.2.so.0 libSDL-1.2.so.0.11.2 libSDL.a libSDL.la libSDLmain.a libSDL.so
SDL 目前安裝在/home/jacob/test裡, 下一步則是cross compiling klimt 3d library了,
不知道是不是gcc version的問題, 我必須做一些修改, 才能順利compiling
#decompressing the klimt 3d library#Cross compiling klimt library for arm...a. modify klimt-src-0.6.2/klimt/build/LinuxX11/Makefile: CXXFLAGS = -g -Wall -pipe -O3 -fPIC -funroll-all-loops -D_LINUX CXXFLAGS += -I/home/jacob/test/include -D_GNU_SOURCE=1 -D_REENTRANT # -D_USE_OLDRASTERIZER_ LFLAGS = -shared -Wl,-soname,libKlimt.so.0 -L/home/jacob/test/lib -lSDL -lpthread LIBS = -L/home/jacob/test/lib -Wl -lSDL -lpthread -lmb. modify klimt-src-0.6.2/klimt/src/Base/klVec3.h: Line 127: //#ifdef GCC_295Xfriend const klVec3T operator+ (const klVec3T& left, const klVec3T& right);friend const klVec3T operator- (const klVec3T& left, const klVec3T& right); //#else //friend const klVec3T operator+<> (const klVec3T& left, const klVec3T& right); //friend const klVec3T operator-<> (const klVec3T& left, const klVec3T& right); //#endif // GCC_2.95.Xc. modify klimt-src-0.6.2/klimt/src/Base/klVec4.h: Line 137: //#ifdef GCC_295X friend const klVec4T operator+ (const klVec4T& left, const klVec4T& right); friend const klVec4T operator- (const klVec4T& left, const klVec4T& right); //#else // friend const klVec4T operator+<> (const klVec4T& left, const klVec4T& right); // friend const klVec4T operator-<> (const klVec4T& left, const klVec4T& right); //#endif // GCC_2.95.Xd. modify klimt-src-0.6.2/klimt/src/Base/klFloat_fixed.h: Line 164: klFloat_fixed& operator*=(double nV) { v = MATHBASE::multiply(v, MATHBASE::fixedFromDouble(nV)); return *this; } klFloat_fixed& operator/=(double nV) { v = MATHBASE::divide(v, MATHBASE::fixedFromDouble(nV)); return *this; }e. cd klimt-src-0.6.2/klimt/build/LinuxX11/ make CXX=arm-linux-g++ f. ls klimt-src-0.6.2/klimt/bin/: libKlimt.so libKlimt.so.0 libKlimt.so.0.5 libKlimt.so.0.5.0 g. cp libKlimt.so libKlimt.so.0 libKlimt.so.0.5 libKlimt.so.0.5.0 to /home/jacob/test/libh. cd klimt-src-0.6.2/klimt/test/simple_linux_x11 modify Makefile: CXXFLAGS = -g -Wall -pipe -O3 -fPIC -funroll-all-loops CXXFLAGS += -D_LINUX -I/home/jacob/test/include/SDL -I../../klimt/include LDFLAGS = -L/home/jacob/test/lib -lKlimt -lSDL -lpthread modify simple.cpp 1. comment "#include "glut.h" " 2. Line 116: glutSolidCube -> klutSolidCube make CXX=arm-linux-g++ i. copy /home/jacob/test/lib to the specify direction in the target
如此, 把剛剛編出來的klimt 和sdl library放到target上, 就可以跑一些OpenGL ES的程式啦~~
接下來, 來試試一些OpenGL ES的基本功能, 先試試畫線, 三角形以及方形,
令我訝異的是, 我無法畫點, 真不是哪裡出了錯:
My Makefile:
### Makefile for Unix#CXX = arm-linux-g++CXXFLAGS = -g -Wall -pipe -O3 -fPIC -funroll-all-loopsCXXFLAGS += -I/home/jacob/target/opengl/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -I../../klimt/includeLDFLAGS = -lKlimt -L/home/jacob/target/opengl/lib -lSDL -lpthread -L../../binLIBS = -lKlimt -L/home/jacob/target/opengl/lib -Wl -lSDL -lpthread -lmTARGET = ./sampleOBJS = sample.o load_bmp.o$(TARGET): $(OBJS)$(CXX) -o $(TARGET) $(LIBS) $(OBJS)%.o: %.cpp$(CXX) $(CXXFLAGS) -c $< -o $@demo: demo.o$(CXX) -o demo $(LIBS) demo.oclean:rm -f $(OBJS) *.o sample
Source Code:
#include stdio.h#include stdlib.h#include stdio.h#include string.h#include math.h#include SDL.h#include "gl/gl.h"#include "gl/glu.h"#include "sample.h"#define FixedFromFloat(x) (GLfixed)( x * (1<<16))void render(){ int i=0; GLfixed x,y,z; GLfloat sizes[2]; GLfloat step; glClearColorx( 0, 0, 0, 1 ); glColor3x( FixedFromFloat(1.0f), FixedFromFloat(1.0f), FixedFromFloat(1.0f) ); //draw green points glShadeModel(GL_FLAT); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glPolygonMode(GL_BACK,GL_LINE); glPolygonMode(GL_FRONT,GL_LINE); glViewport(0, 0, 640, 480); while(i<100){ /* Gl_POINTS failed, I dont know why. It draws nothing */ glBegin(GL_POINTS); x = FixedFromFloat(0.5f); y = FixedFromFloat(0.9f); glVertex3x( x, y, 0); glVertex3x( x, y+500, 0); glEnd(); /* Draws an oblique line in the X-Y+ region. */ /* It is the same as glVertex3f( -0.5f, 0.5f, 0.3f) in the floating system. */ glBegin(GL_LINES); x = -FixedFromFloat(0.5f); // (1<<16)*0.5 y = FixedFromFloat(0.5f); z = FixedFromFloat(0.3f); glVertex3x( 0, 0, 0); glVertex3x( x, y, z); glEnd(); /* Draws an oblique LINE_STRIP in the X-Y- region. */ glBegin(GL_LINE_STRIP); x = -FixedFromFloat(0.5f); y = -FixedFromFloat(0.5f); z = FixedFromFloat(0.3f); glVertex3x( 0, 0, 0); glVertex3x( x, y, z); x = -FixedFromFloat(0.33f); glVertex3x( x, y, z); glEnd(); /* Draws triangles in the X+Y- region */ glBegin(GL_TRIANGLES); x = FixedFromFloat(0.0f); y = -FixedFromFloat(0.0f); z = FixedFromFloat(0.0f); glVertex3x( x, y, z); glVertex3x( x+FixedFromFloat(0.1f), y-FixedFromFloat(0.2f), z); glVertex3x( x+FixedFromFloat(0.2f), y, z); glEnd(); /* Draws triangle strip in the X+Y- region */ glBegin(GL_TRIANGLE_STRIP); x = FixedFromFloat(0.2f); y = -FixedFromFloat(0.2f); z = FixedFromFloat(0.0f); glVertex3x( x, y, z); glVertex3x( x+FixedFromFloat(0.1f), y-FixedFromFloat(0.2f), z); glVertex3x( x+FixedFromFloat(0.2f), y, z); glVertex3x( x+FixedFromFloat(0.3f), y-FixedFromFloat(0.2f), z); glEnd(); /* Draws triangle strip in the X+Y+ region */ glBegin(GL_TRIANGLE_FAN); x = FixedFromFloat(0.4f); y = FixedFromFloat(0.4f); z = FixedFromFloat(0.0f); glVertex3x( x, y, z); glVertex3x( x+FixedFromFloat(0.2f), y+FixedFromFloat(0.2f), z); glVertex3x( x+FixedFromFloat(0.4f), y-FixedFromFloat(0.1f), z); glVertex3x( x+FixedFromFloat(0.3f), y-FixedFromFloat(0.2f), z); glEnd(); /* Draws a rectangle in the X-Y+ region*/ glBegin(GL_QUADS); x = -FixedFromFloat(0.4f); y = FixedFromFloat(0.2f); glVertex3x( x, y, 0); glVertex3x( x, y-FixedFromFloat(0.2f), 0); glVertex3x( x-FixedFromFloat(0.2f), y-FixedFromFloat(0.2f), 0); glVertex3x( x-FixedFromFloat(0.2f), y, 0); glEnd(); //other types: GL_QUAD_STRIP, GL_POLYGON EGLSurface surface = eglGetCurrentSurface(EGL_DRAW); EGLDisplay display = eglGetCurrentDisplay(); eglSwapBuffers(display, surface); i++; }}int main(int argc, char *argv[]){ SDL_Surface *screen; SDL_Init(SDL_INIT_VIDEO); //create egl interface screen=SDL_SetVideoMode(640,480,16,SDL_HWSURFACE|SDL_DOUBLEBUF); EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); EGLint major, minor; eglInitialize(display, &major, &minor); EGLSurface sfc = eglCreateWindowSurface(display, 0, screen, 0); EGLContext ctx = eglCreateContext(display, 0, screen, 0); eglMakeCurrent(display, sfc, sfc, ctx); render(); SDL_Quit();return 0;}
以下是畫出來的結果:
而三角椎旋轉, 漸層色彩以及load background都正常
但是blend 功能實在是令人無法接受啊, 下圖我是想讓1個小黃色quard 和紅色的quard混合在一起
而且這套library居然不支持alpha, lighting和 frog的效果也十分不怎麼樣
不過物件texture的功能可以正常運行, 但如預期的, 只要物件一貼圖速度馬上慢了下來
一個場景應該不能畫太多elements
- 3D programming with Klimt
- 基于Klimt的嵌入式3D程序演示效果图
- 3D GAME PROGRAMMING WITH DIRECTX11(3)
- Introduction to 3D Game Programming with DirectX 9.0
- Game Programming with DirectX -- 05[3D中的太阳]
- Game Programming with DirectX -- 07[基本3D模型构造]
- Programming 3D games on Android with Irrlicht and Bullet
- Programming 3D games on Android with Irrlicht and Bullet
- Advance 3D Game Programming With DirectX 10.0练习源代码
- 3D GAME PROGRAMMING WITH DIRECTX11 (1)
- 3D GAME PROGRAMMING WITH DIRECTX11 (2)
- 3D GAME PROGRAMMING WITH DIRECTX11(4)
- 学习《Introduction to 3D Game Programming with DirectX 11》
- Game Programming with DirectX -- 02[并非3D的3D]
- Layer Programming with Quartz Core 2D 3D的学习
- 3D programming reference
- Introdution to 3D Game Programming With DirectX11 第3章 习题解答
- Introduction to 3D Game Programming with DirectX 11学习笔记 1~3章
- j2ee5.0开发中jstl标签失效
- Android界面开发工具DroidDraw
- Android四种Activity的加载模式
- 【转】android 中的 Bitmap 相关
- MediaPlayer中文API
- 3D programming with Klimt
- log4j使用详解
- Osip2和eXosip协议栈的简析(转)
- 内存泄露工具
- Android MediaPlayer 常用方法介绍
- 进程的堆栈空间
- VC6.0创建DLL动态链接库四大要素
- Android 【drawable-hdpi/drawable-ldpi/drawable-mdpi】的认识和区分
- 计算机中的字是如何处理的