2011-11-29 142 views
1

我想加載並使用GLFW和SOIL使用OpenGL繪製2d紋理。我有這個代碼,但我只能得到一個純色(這似乎來自紋理)。OpenGL 2d紋理渲染問題

我已經測試過.png是否加載了一個帶有SOIL的例子,並且它工作正常,所以我的代碼中必須有一些問題。

這是我的代碼:

#include <cstdio> 

#include "GL/glfw.h" 
#include "SOIL.h" 

// function declarations 
void drawscene(); 
void idlefunc(); 
void updatedisplay(); 

// global data 
GLuint texture; // our example texture 

int main(int argc, char **argv) { 
    if (!glfwInit()) { 
     fprintf(stderr, "Failed to initialize GLFW\n"); 
     return 1; 
    } 

    if (!glfwOpenWindow(640, 480, 0, 0, 0, 0, 16, 0, GLFW_WINDOW)) { 
     fprintf(stderr, "Failed to open GLFW window\n"); 
     return 1; 
    } 

    // enable vsync (if available) 
    glfwSwapInterval(1); 

    // load textures 
    texture = SOIL_load_OGL_texture(
     "tex.png", 
     SOIL_LOAD_AUTO, 
     SOIL_CREATE_NEW_ID, 
     SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_DDS_LOAD_DIRECT 
    ); 

    // check for an error during the texture loading 
    if (!texture) { 
     printf("SOIL loading error: '%s'\n", SOIL_last_result()); 
    } 

    while (glfwGetWindowParam(GLFW_OPENED)) { 
     idlefunc(); 
    } 

    // if we get here something went wrong 
    return 0; 
} 

// this function gets called every frame 
void idlefunc() { 
    updatedisplay(); 
    drawscene(); 
} 

// set up te display 
void updatedisplay() { 
    int screen_width, screen_height; 
    glfwGetWindowSize(&screen_width, &screen_height); 

    if (screen_height <= 0) screen_height = 1; 
    if (screen_width <= 0) screen_width = 1; 

    glViewport(0, 0, screen_width, screen_height); 

    glClearColor(0.02f, 0.02f, 0.02f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glEnable(GL_TEXTURE_2D); 
    glDisable(GL_DEPTH_TEST); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, screen_width, screen_height, 0.0, 0.0, 1.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // displacement trick for exact pixelization 
    glTranslatef(0.375f, 0.375f, 0.0f); 
} 

// draw the scene in this function 
void drawscene() { 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glPushMatrix(); 
     glTranslatef(10.0f, 10.0f, 0); 
     glBegin(GL_QUADS); 
      glTexCoord2f(0.0f, 0.0f); 
      glVertex2f(0.0f, 0.0f); 
      glTexCoord2f(0.0f, 128.0f); 
      glVertex2f(0.0f, 128.0f); 
      glTexCoord2f(128.0f, 128.0f); 
      glVertex2f(128.0f, 128.0f); 
      glTexCoord2f(128.0f, 0.0f); 
      glVertex2f(128.0f, 0.0f); 
     glEnd(); 
    glPopMatrix(); 

    glfwSwapBuffers(); 
} 
+0

可能不是頭(只)的原因,但紋理座標通常在範圍0..1 – user786653

+0

你的意思是在'glTexCoord2f'的給予?我真的很想使用像素座標來表示四邊形的位置/大小。 – orlp

+0

非常簡短(我不熟悉你使用的庫,所以我可能會在這裏):OpenGL主要在0..1座標中工作,這很方便,所以你不必擔心你的紋理是256x256或512x512,或者屏幕是高清或標清,但這意味着您必須自己跟蹤尺寸,並在您關注像素時適當縮放。 – user786653

回答

1

發現問題(感謝user786653)。無論頂點座標,tex座標都在0.0到1.0之間。這是固定的代碼:

// draw the scene in this function 
void drawscene() { 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glPushMatrix(); 
     glTranslatef(10.0f, 10.0f, 0); 
     glBegin(GL_QUADS); 
      glTexCoord2f(0.0f, 0.0f); 
      glVertex2f(0.0f, 0.0f); 
      glTexCoord2f(0.0f, 1.0f); 
      glVertex2f(0.0f, 128.0f); 
      glTexCoord2f(1.0f, 1.0f); 
      glVertex2f(128.0f, 128.0f); 
      glTexCoord2f(1.0f, 0.0f); 
      glVertex2f(128.0f, 0.0f); 
     glEnd(); 
    glPopMatrix(); 

    glfwSwapBuffers(); 
}