2010-02-02 112 views
2

我无法使用SOIL加载纹理以正确显示此四边形。如果还不清楚,我只是写了一个小2D Sprite引擎,这是渲染部分(毫无疑问需要一点优化)。几个月后我还没有做过任何OpenGL,我承认它很生锈。OpenGL中的纹理映射(使用SOIL)

#include <OpenGL/OpenGL.h> 
#include <GLUT/GLUT.h> 
#include "SOIL.h" 

#include <stdio.h> 

GLuint linktex; 

void drawSprite(GLint left, GLint right, GLint bottom, GLint top, GLuint texture){ 
    //Draw clockwise 
    glColor3f(1.0, 1.0, 1.0); 
    glBindTexture(GL_TEXTURE_2D, texture); 

    glBegin(GL_QUADS); 
    glTexCoord2i(1,1); glVertex2i(right , top); 
    glTexCoord2i(1,0); glVertex2i(right , bottom); 
    glTexCoord2i(0,0); glVertex2i(left , bottom); 
    glTexCoord2i(0,1); glVertex2i(left , top); 
    glEnd(); 
} 

void display(void){ 
    glClearColor(0.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 
    glOrtho(0.0, 240.0, 0.0, 160.0, -1.0, 1.0); 
    drawSprite(50, 82, 50, 82, linktex); 
    glFlush(); 
} 

void reshape(int w, int h){ 
    glViewport(0, 0, (GLsizei)w, (GLsizei)h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glMatrixMode(GL_MODELVIEW); 
} 

void init(){ 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glFrontFace(GL_CW); 

    GLuint linktex = SOIL_load_OGL_texture(
     "link.png", 
     SOIL_LOAD_AUTO, 
     SOIL_CREATE_NEW_ID, 
     SOIL_FLAG_INVERT_Y 
    ); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); 

    if(0 == linktex) 
    { 
     printf("SOIL loading error: '%s'\n", SOIL_last_result()); 
    } 
} 

int main (int argc, char **argv) { 
    glutInit (&argc, argv); 
    glutInitDisplayMode (GLUT_SINGLE); 
    glutInitWindowSize (240, 160); 
    glutInitWindowPosition (100, 100); 
    glutCreateWindow ("Test"); 

    glutDisplayFunc (display); 
    glutReshapeFunc (reshape); 
    glutMainLoop(); 
    init(); 
    return 0; 
} 
+0

仍然没有运气的呢。 – revenantphoenix 2010-02-02 02:53:51

+0

你期望看到什么,以及你真正看到了什么? – 2010-02-02 04:46:10

+0

我想通了。我只需要init();在glutMainLoop()之前; – revenantphoenix 2010-02-03 16:25:45

回答

6

它看起来就像当你正在加载的纹理,你分配的ID给本地变量linktex不是全局的,你的文件的开头声明。

当您在void display(void);方法中引用linktex时,纹理未初始化。

试着改变您的通话将纹理加载到:

// comment out the type declaration, to assign to the global instead of a local 
/*GLuint*/ linktex = SOIL_load_OGL_texture(
     "link.png", 
     SOIL_LOAD_AUTO, 
     SOIL_CREATE_NEW_ID, 
     SOIL_FLAG_INVERT_Y 
    );