2011-08-06 137 views
3

这里是我尝试加载质地:奇的OpenGL纹理问题?:

enter image description here

这是当我运行我的代码我所看到的:

enter image description here

这里是我正在使用的代码:

#include "sdl.h" 
#include "sdl_opengl.h" 
#include <stdio.h> 
#include <gl/GL.h> 
#include <gl/GLU.h> 

Uint32 loadTexture(char* fileName) 
{ 
    Uint32 id; 
    SDL_Surface *img = NULL; 

    //load into memory using SDL 
    img = SDL_LoadBMP(fileName); 
    //generate an id for this texture 
    glGenTextures(1, &id); 
    //use this texture 
    glBindTexture(GL_TEXTURE_2D, id); 
    //load the texture into video memory via OpenGL 
    glTexImage2D(
     GL_TEXTURE_2D, 
     0, 
     GL_RGB, 
     img->w, 
     img->h, 
     0, 
     GL_RGB, 
     GL_UNSIGNED_SHORT_5_6_5, 
     img->pixels 
     ); 

    //set mip map settings 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    SDL_FreeSurface(img); 

    return id; 
} 

Uint32 tex; 

void init() 
{ 
    glClearColor(0.0, 0.0, 0.0, 1.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, 1.0, 1.0, 0.0, -1.0, 1.0); 
    glMatrixMode(GL_MODELVIEW); 
    glEnable(GL_TEXTURE_2D); 

    tex = loadTexture("fireball.bmp"); 
} 
void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 

    glBindTexture(GL_TEXTURE_2D, tex); 

    glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 0.0); 
    glVertex3f(0.25, 0.25, 0.0); 


    glTexCoord2f(1.0, 0.0); 
    glVertex3f(0.5, 0.25, 0.0); 


    glTexCoord2f(1.0, 1.0); 
    glVertex3f(0.5, 0.5, 0.0); 


    glTexCoord2f(0.0, 1.0); 
    glVertex3f(0.25, 0.5, 0.0); 
    glEnd(); 
} 

int main() 
{ 
    INT32 isRunning = 1; 
    SDL_Surface *screen = NULL; 
    SDL_Event event; 
    INT32 start; 
    INT32 FPS = 30; 

    SDL_Init(SDL_INIT_EVERYTHING); 

    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL); 

    init(); 

    while(isRunning) 
    { 
     start = SDL_GetTicks(); 

     while(SDL_PollEvent(&event)) 
     { 
      switch(event.type) 
      { 
       case SDL_QUIT: isRunning = 0; break; 
      } 
     } 

     display(); 

     SDL_GL_SwapBuffers(); 

     if(1000/FPS > SDL_GetTicks() - start) 
     { 
      SDL_Delay(1000/FPS - (SDL_GetTicks() - start)); 
     } 
    } 

    SDL_Quit(); 

    return(0); 
} 

回答

4
glTexImage2D(
    GL_TEXTURE_2D, 
    0, 
    GL_RGB, 
    img->w, 
    img->h, 
    0, 
    GL_RGB, 
    GL_UNSIGNED_SHORT_5_6_5, 
    img->pixels 
    ); 

这实际上是它的格式吗?每2个字节是一个5/6/5 RGB像素。我并不知道Windows BMP文件可以存储5/6/5图像数据,但我从来没有打算写图像加载代码,所以我不确定。我认为BMP数据只能是8/8/8 BGR格式。

那么,即使它可以是5/6/5,你确定这个图像是这种格式吗?

另外,什么是行对齐?我没有看到您使用glPixelStorei设置GL_UNPACK_ALIGNMENT,所以您必须期望每行的大小都对齐到4个字节。这是真的?

+0

我其实不确定GL_UNPACK_ALIGNMENT和glPixelStorei是什么。我现在要去查看OpenGL文档,但要知道我正在关注视频教程。这个人正在使用Linux而不是Windows。我也会尝试改变格式,因为你说它可能是错误的。 –

+1

经过与价值观发挥各地,这里是什么在起作用: \t glTexImage2D( \t \t GL_TEXTURE_2D, \t \t 0, \t \t GL_RGB, \t \t img-> W, \t \t img-> H, \t \t 0, \t \t GL_BGR, \t \t GL_UNSIGNED_BYTE, \t \t img->像素 \t \t); –