如何用 DevIL 编译?

How to compile with DevIL?

我正在尝试为 3D 程序进行正确设置,下一步是纹理加载器。我正在尝试使用 DevIL,但我似乎无法让它工作,而且似乎没有最新的解释性文字。

首先,我将包含我的项目的转储:(请记住,它恰好处于这种状态,并非所有相关;另请注意 'IOUtil.cpp' 只是定义 'Print',打印到 'cout'。它似乎不相关,所以我排除了它。)

项目结构:

+- bin
+- include
|   +- GLFW
|   |   +- glfw3.h
|   |   +- glfw3native.h
|   +- IL
|   |   +- config.h
|   |   +- config.h.win
|   |   +- devil_internal_exports.h
|   |   +- il.h
|   |   +- il_wrap.h
|   |   +- ilu.h
|   |   +- ilu_region.h
|   |   +- ilut.h
|   |   +- ilut_config.h
+- lib
|   +- unicode
|   |   +- DevIL.dll
|   |   +- DevIL.lib
|   |   +- ILU.dll
|   |   +- ILU.lib
|   |   +- ILUT.dll
|   |   +- ILUT.lib
|   +- DevIL.dll
|   +- DevIL.lib
|   +- ILU.dll
|   +- ILU.lib
|   +- ILUT.dll
|   +- ILUT.lib
|   +- libglfw3dll.a
+- logs
+- src
|   +- Main.exe
+- build.bat
+- run.bat

Main.exe:

#include <GLFW/glfw3.h>
#include <IL/il.h>
#include <IL/ilu.h>
#include <IL/ilut.h>
#include <stdlib.h>
#include <algorithm>

#include "util/IOUtil.cpp"

float SENSITIVITY = 0.25;

float cursorX = 0;
float cursorY = 0;

float camX = 0;
float camY = 0;

static void error_callback(int error, const char* description) {
    Print("GLFW ERROR: " + (std::string)description);
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {
        glfwSetWindowShouldClose(window, GL_TRUE);
    }
}

static void cursor_position_callback(GLFWwindow* window, double xpos, double ypos) {
    float dx = xpos - cursorX;
    float dy = -ypos - cursorY;
    cursorX = xpos;
    cursorY = -ypos;

    camX += dx * SENSITIVITY;
    camY += dy * SENSITIVITY;
    if (camX < 0) {
        camX += 360;
    }
    if (camX > 360) {
        camX -= 360;
    }
    camY = std::max(-90.0f, std::min(90.0f, camY));
}

int main(void) {
    glfwSetErrorCallback(error_callback); //Set the error callback

    Print("Initializing GLFW");
    if (!glfwInit()) { //If initialization fails, crash
        Print("GLFW initialization failed!");
        exit(EXIT_FAILURE);
    }

    Print("Initializing window");
    GLFWwindow* window = glfwCreateWindow(600, 600, "FPS", NULL, NULL); //Initialize the window

    if (!window) { //If window initialization fails, crash
        Print("Window initialization failed!");
        glfwTerminate(); //Deinitialize
        exit(EXIT_FAILURE);
    }

    ilutRenderer(ILUT_OPENGL); //Bind Texture Loader to Renderer

    glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); //Capture the cursor

    glfwMakeContextCurrent(window); //Create the context
    glfwSwapInterval(1); //Set the swap interval

    glfwSetKeyCallback(window, key_callback); //Set the key callback
    glfwSetCursorPosCallback(window, cursor_position_callback); //Set the cursor callback

    //ilInit();
    //ILuint image;
    //ilGenImages(1, &image);
    //ilBindImage(image);
    //ilLoadImage("data/image.png");

    glEnable(GL_TEXTURE_2D);
    GLuint tex;
    //tex = ilutGLBindTexImage();

    Print("Beginning main loop");
    while (!glfwWindowShouldClose(window)) { //Main loop, ends when window close is requested
        float ratio;
        int width, height;
        glfwGetFramebufferSize(window, &width, &height); //Load the window dimensions
        ratio = width / (float) height; //Calculate the aspect ratio
        glViewport(0, 0, width, height); //Configure the viewport

        glClear(GL_COLOR_BUFFER_BIT); //Clear the buffer

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        float near = 1; //Near Clipping Plane
        float far = 1000; //Far Clipping Plane
        float fov = 1; //tan(fovAngle)/2.
        glFrustum(-ratio * near * fov, ratio * near * fov, -fov, fov, near, far);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        //Enable depth testing
        //glEnable(GL_DEPTH_TEST);

        //Set background color
        //glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

        glPushMatrix();

        glRotatef(camY, -1.0, 0.0, 0.0);
        glRotatef(camX, 0.0, 1.0, 0.0);

        //glTranslatef(0,0,-10);

        glBegin(GL_QUADS);
            //glColor3f(1.0, 0.0, 0.0);
            glVertex3f(-1.0, -1.0, -10.0);
            //glColor3f(1.0, 0.0, 1.0);
            glVertex3f(-1.0, 1.0, -10.0);
            //glColor3f(1.0, 1.0, 1.0);
            glVertex3f(1.0, 1.0, -10.0);
            //glColor3f(1.0, 1.0, 0.0);
            glVertex3f(1.0, -1.0, -10.0);
        glEnd();

        glBegin(GL_QUADS);
            glColor3f(1.0, 0.0, 0.0);
            glVertex3f(-1.0, -1.0, 10.0);
            glColor3f(1.0, 0.0, 1.0);
            glVertex3f(-1.0, 1.0, 10.0);
            glColor3f(1.0, 1.0, 1.0);
            glVertex3f(1.0, 1.0, 10.0);
            glColor3f(1.0, 1.0, 0.0);
            glVertex3f(1.0, -1.0, 10.0);
        glEnd();

        glPopMatrix();

        glfwSwapBuffers(window); //Swap buffers

        glfwPollEvents(); //Poll events
    }
    Print("Window close requested");
    glfwDestroyWindow(window); //Close the window
    Print("Deinitializing");
    glfwTerminate(); //Deinitialize
    exit(EXIT_SUCCESS); //End the program
}

build.bat:

g++ -c -v -Iinclude src/Main.cpp 2>logs/build.txt
g++ -v -o bin/main Main.o -Llib -lglfw3dll -lopengl32 -lgdi32 -lDevIL -lILU -lILUT 2>logs/link.txt
del Main.o
pause

这是批处理文件第一行的日志:

Using built-in specs.
COLLECT_GCC=g++
Target: mingw32
Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32 --build=mingw32 --without-pic --enable-shared --enable-static --with-gnu-ld --enable-lto --enable-libssp --disable-multilib --enable-languages=c,c++,fortran,objc,obj-c++,ada --disable-sjlj-exceptions --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --with-gmp=/usr/src/pkg/gmp-5.1.2-1-mingw32-src/bld --with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --with-mpfr= --with-system-zlib --with-gnu-as --enable-decimal-float=yes --enable-libgomp --enable-threads --with-libiconv-prefix=/mingw32 --with-libintl-prefix=/mingw --disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIME_T
Thread model: win32
gcc version 4.8.1 (GCC) 
COLLECT_GCC_OPTIONS='-c' '-v' '-I' 'include' '-shared-libgcc' '-mtune=generic' '-march=pentiumpro'
 c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/cc1plus.exe -quiet -v -I include -iprefix c:\mingw\bin\../lib/gcc/mingw32/4.8.1/ src/Main.cpp -quiet -dumpbase Main.cpp -mtune=generic -march=pentiumpro -auxbase Main -version -o C:\Users\MyUsername\AppData\Local\Temp\cccPMwk6.s
GNU C++ (GCC) version 4.8.1 (mingw32)
    compiled by GNU C version 4.8.1, GMP version 5.1.2, MPFR version 3.1.2, MPC version 1.0.1
warning: MPC header version 1.0.1 differs from library version 1.0.2.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include/c++"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include/c++/mingw32"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include/c++/backward"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/../../../../include"
ignoring duplicate directory "/mingw/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include-fixed"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/../../../../mingw32/include"
ignoring duplicate directory "/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
 include
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include/c++
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include/c++/mingw32
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include/c++/backward
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/../../../../include
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include-fixed
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/../../../../mingw32/include
End of search list.
GNU C++ (GCC) version 4.8.1 (mingw32)
    compiled by GNU C version 4.8.1, GMP version 5.1.2, MPFR version 3.1.2, MPC version 1.0.1
warning: MPC header version 1.0.1 differs from library version 1.0.2.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 1ebc2a6f92fbd3aadc367a20a63fdf9f
src/Main.cpp: In function 'int main()':
src/Main.cpp:95:14: error: expected unqualified-id before '=' token
   float near = 1; //Near Clipping Plane
              ^
src/Main.cpp:96:13: error: expected unqualified-id before '=' token
   float far = 1000; //Far Clipping Plane
             ^
src/Main.cpp:98:29: error: invalid type argument of unary '*' (have 'float')
   glFrustum(-ratio * near * fov, ratio * near * fov, -fov, fov, near, far);
                             ^
src/Main.cpp:98:49: error: invalid type argument of unary '*' (have 'float')
   glFrustum(-ratio * near * fov, ratio * near * fov, -fov, fov, near, far);
                                                 ^
src/Main.cpp:98:69: error: expected primary-expression before ',' token
   glFrustum(-ratio * near * fov, ratio * near * fov, -fov, fov, near, far);
                                                                     ^
src/Main.cpp:98:74: error: expected primary-expression before ')' token
   glFrustum(-ratio * near * fov, ratio * near * fov, -fov, fov, near, far);
                                                                          ^

抱歉我把所有东西都扔了,但我不知道还能做什么。我不明白为什么 IL 包含会导致语法正确的代码出现语法错误。

有人知道出了什么问题吗?

事实证明,问题是由变量的名称引起的,当我注意到 'fov' 没有受到影响时,我意识到了这一点。将 'near' 和 'far' 更改为 'near_plane' 和 'far_plane'(连同所有引用)解决了这个问题。

出于兴趣,'near'和'far'在DevIL中定义了什么?