MinGW+OpenGL+freeglut+glew+glfw 环境配置

TheBooksofShaders ShaderToy
OpenGL Tutorial
回复
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

MinGW+OpenGL+freeglut+glew+glfw 环境配置

帖子 523066680 »

系统:Win7 64位

  1. MinGW离线安装,两种资源:

    1. http://nuwen.net/mingw.html
    2. http://tdm-gcc.tdragon.net/
      自带了OpenGL的库文件
  2. Cmake

  3. FreeGLUT(实用工具库,主要是方便建立视窗和交互)

    1. 预编译版本:http://www.transmissionzero.co.uk/software/freeglut-devel/
      选择下载 Download freeglut 3.0.0 for MinGW
      动态库Dll 和 编译链接时需要的lib都已经在里面了。
      解压的文件位置(示例):D:\OGL\freeglut-MinGW-3.0.0-1.mp

    2. 手动编译
      从官网下载 freeglut-3.0.0.tar.gz ,解压,示例目录 D:\OGL\freeglut-3.0.0,命令行进入该目录
      执行:cmake -G"MinGW Makefiles" .
      注意MinGW Makefiles的大小写不能错,然后,
      执行:make
      中断,提示 permission denied, 使用Administrator权限进入该目录,执行
      set path=%path%;c:\mingw\bin
      make
      没有错误提示,生成示例程序位于 D:\OGL\freeglut-3.0.0\bin 目录

    === 如果只是编译运行简单的GL程序(比如业余玩玩的),以上环境就够用了。编译示例请移步2楼 ===

  4. GLEW(自动识别平台所支持的OpenGL高级扩展函数以及使用接口)
    需要的工具:MSYS2.0
    GLEW主页:http://glew.sourceforge.net/
    下载页面:https://sourceforge.net/projects/glew/files/glew/2.0.0/
    对于mingw,应选择 glew-2.0.0.zip,解压位置(示例):D:\OGL\glew2.0.0
    这里面的静态、动态库都是需要手动编译的,通过系统菜单打开 "MinGW-w64 Win32 Shell" (注意是32位版本的)
    执行make命令,得到类似下方的输出,有一些错误,但是库文件可以用。(编译 glew1.3.0 时没有这些问题)

    代码: 全选

    VSUS@VIC-PC MINGW32 ~
    $ cd "D:\OGL\glew-2.0.0"
    
    VSUS@VIC-PC MINGW32 /d/OGL/glew-2.0.0
    $ make
    sed \
            -e "s|@prefix@|/usr|g" \
            -e "s|@libdir@|/usr/lib|g" \
            -e "s|@exec_prefix@|/usr/bin|g" \
            -e "s|@includedir@|/usr/include/GL|g" \
            -e "s|@version@|2.0.0|g" \
            -e "s|@cflags@||g" \
            -e "s|@libname@|glew32|g" \
            -e "s|@requireslib@|glu|g" \
            < glew.pc.in > glew.pc
    gcc -fno-builtin -O2 -Wall -W -Iinclude -fno-builtin -fno-stack-protector -o bin/glewinfo.exe tmp/mingw/default/shared/glewinfo.o -Llib  -lglew32 -L/mingw/lib -nostdlib -lopengl32 -lgdi32 -luser32 -lkernel32
    tmp/mingw/default/shared/glewinfo.o:glewinfo.c:(.text+0x30): undefined reference to `fprintf'
    tmp/mingw/default/shared/glewinfo.o:glewinfo.c:(.text+0x5a): undefined reference to `strlen'
    ...
    tmp/mingw/default/shared/glewinfo.o:glewinfo.c:(.text.startup+0x1980): undefined reference to `__imp___iob_func'
    tmp/mingw/default/shared/glewinfo.o:glewinfo.c:(.text.startup+0x1993): undefined reference to `fprintf'
    collect2.exe: error: ld returned 1 exit status
    makefile:176: recipe for target 'bin/glewinfo.exe' failed
    make: *** [bin/glewinfo.exe] Error 1
  5. GLFW
    官网:http://www.glfw.org/

    1. 预编译版本(只有库文件,没有提供示例代码和程序)Windows pre-compiled binaries

    2. 手动编译
      例如下载到的压缩包是 glfw-3.1.1.zip,解压,命令行进入该目录,

      cmake -G"MinGW Makefiles" .
      make
      无误的话,会在 glfw-3.1.1\examples 目录内生成示例程序,可以试运行看看。
      库文件位置 glfw-3.1.1\src\libglfw3.a

头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

MinGW+GL+FreeGLUT 固定渲染管线编译示例

帖子 523066680 »

示例代码
/*
Torus_Vortex.c
Code by 523066680, 2013-02-05
paktcmail@gmail.com

Imitate whirlpool effect
*/

#include <GL/glut.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>

#define SIZE_X 400
#define SIZE_Y 400
#define PI M_PI

const double PI2 = M_PI*2;

int winID;
float keya = 1.0;
float keyb = 0.0;
unsigned int theVortex;

/* Torus_Vortex */
void vortex(float R, float r)
{
float x, y, mz, mx, c;
float m, n, o;
static float nparts=60.0, mparts=28.0;

/* 单个环的细分数量; 整个环状物的细分数量 */
float tm, move, detail;
detail = mparts / nparts;

/* 偏移量=mparts/nparts均值,使其最终形成一个回环 */
for (m = 0.0; m < mparts; m += 1.0)
{
c = (float)((int)m%2) * 0.9;
glColor3f(c, c, c);

glBegin(GL_QUAD_STRIP);
move = 0.0;
for (n = 0.0; n <= nparts; n += 1.0)
{
move += detail;
x = r * cos( n / nparts * PI2 );
y = r * sin( n / nparts * PI2 );
for (o = 0.0; o <= 1.0; o+=1.0)
{
tm = o + m + move;
mx = (x+R) * cos( tm / mparts * PI2 );
mz = (x+R) * sin( tm / mparts * PI2 );
glVertex3f(mx, y, mz);
}
}
glEnd();
}
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(keya, 1.0, 0.0, 0.0);
glRotatef(keyb, 0.0, -1.0, 0.0);
glCallList(theVortex);
glPopMatrix();
glutSwapBuffers();
}

void idle(void)
{
keyb += 1.0;
usleep(10000);
glutPostRedisplay();
}

void reshape(int Width,int Height)
{
static float fa = 32.0;
if (Width == Height)
{
glViewport(0, 0, Width, Height);
}
else if (Width>Height)
{
glViewport(0, 0, Height, Height);
}
else
{
glViewport(0, 0, Width, Width);
}

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//glOrtho(-20.0,20.0,-20.0,20.0,-100.0,100.0);
//glFrustum(-10.0,10.0,-10.0,10.0,3.0,60.0);
gluPerspective(90.0,1.0,1.0,80.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,fa, 0.0,0.0,0.0, 0.0,1.0,fa);
}

void keypress(unsigned char key, int mousex, int mousey)
{
switch (key)
{
case 'q':
glutDestroyWindow(winID);
exit(0);
break;
case 'a':
keya+=1.0;
glutPostRedisplay();
break;
}
}

void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glLineWidth( 2.0 );
glEnable(GL_DEPTH_TEST); //允许深度缓冲
theVortex=glGenLists(1);
glNewList(theVortex, GL_COMPILE);
vortex(20.0, 12.0);
glEndList();
}

void main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(SIZE_X, SIZE_Y); //窗口大小
glutInitWindowPosition(200, 200); //窗口位置
winID = glutCreateWindow("TorusVortex"); //窗口句柄
init();
glutDisplayFunc(display);
glutKeyboardFunc(keypress);
glutReshapeFunc(reshape);
glutIdleFunc(idle);
glutMainLoop();
}
编译命令
gcc "VortexTorus_Per.c" -o "VortexTorus_Per" -ID:\OGL\freeglut-MinGW-3.0.0-1.mp\include ^
-LD:\OGL\freeglut-MinGW-3.0.0-1.mp\lib\x64 ^
-lfreeglut -lopengl32 -lglu32
或者写Makefile
MAIN=VortexTorus_Per
CC=gcc

LIBDIR= -LD:/OGL/freeglut-MinGW-3.0.0-1.mp/lib/x64
INCDIR= -ID:/OGL/freeglut-MinGW-3.0.0-1.mp/include
LIBS= -lfreeglut -lopengl32 -lglu32

$MAIN:
${CC} -o ${MAIN} $(MAIN).c ${INCDIR} ${LIBDIR} ${LIBS}
将 freeglut-MinGW-3.0.0-1.mp\bin\freeglut.dll 文件复制到运行环境中,然后运行。
Torus.png
(24.96 KiB) 已下载 2424 次
附件:
basic.zip
(529.26 KiB) 已下载 75 次
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

MinGW+GLFW 编译示例

帖子 523066680 »

MinGW+GLFW 编译示例

http://www.glfw.org/documentation.html

gcc example.c -o example ^ -ID:\Lib\glfw-3.1.1\include ^ -LD:\Lib\glfw-3.1.1\lib ^ -lglfw3 -lopengl32 -lgdi32

代码: 全选

#include <GLFW/glfw3.h>

int main(void)
{
    GLFWwindow* window;

/* Initialize the library */
if (!glfwInit())
    return -1;

/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
    glfwTerminate();
    return -1;
}

/* Make the window's context current */
glfwMakeContextCurrent(window);

/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
    /* Render here */
    glClear(GL_COLOR_BUFFER_BIT);

    /* Swap front and back buffers */
    glfwSwapBuffers(window);

    /* Poll for and process events */
    glfwPollEvents();
}

glfwTerminate();
return 0;
}
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

补充 GLEW 库的编译 (MinGW + Cmake)

帖子 523066680 »

补充 GLEW 库的编译 (MinGW + Cmake)
下载 glew-2.0.0.zip ,解压

进入 glew-2.0.0\build\cmake 执行

$ cmake -G "MinGW Makefiles" .
-- Configuring done CMake Error: Error evaluating generator expression: $<TARGET_PDB_FILE:glew> TARGET_PDB_FILE is not supported by the target linker. -- Generating done -- Build files have been written to: D:/Lib/glew-2.0.0/build/cmake
错误提示不管,继续:

$ make

生成
libglew32.a
libglew32.dll.a
glew32.dll
glewinfo.exe
visualinfo.exe
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 1 访客