2012-05-02 2 views
-2
#include <stdio.h> 
#include <GL/gl.h> 
#include <GL/glut.h> 

#define KEY_ESCAPE 27 

void display(); 
void keyboard(unsigned char,int,int); 
GLuint LoadTextureRAW(const char * filename, int wrap); 

int main(int argc, char **argv) { 
    glutInit(&argc, argv);          
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH); 
    glutInitWindowSize(600,400);     
    glutCreateWindow("Opengl Test");        
    glutDisplayFunc(display); 
    glutKeyboardFunc(keyboard); 
    glutMainLoop(); 
    return 0; 
} 
void display() { 
    GLuint texture=LoadTextureRAW("ball.png",1); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D,texture); 
    glBegin(GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex2d(0.0,0.0); 
    glTexCoord2d(1.0,0.0); glVertex2d(1.0,0.0); 
    glTexCoord2d(1.0,1.0); glVertex2d(1.0,1.0); 
    glTexCoord2d(0.0,1.0); glVertex2d(0.0,1.0); 
    glEnd(); 
    glutSwapBuffers();  
} 
// load a 256x256 RGB .RAW file as a texture 
GLuint LoadTextureRAW(const char * filename, int wrap) 
{ 
    GLuint texture; 
    int width, height; 
// BYTE * data; 
    int *data; 
    FILE * file; 

    // open texture data 
    file = fopen(filename, "rb"); 
    if (file == NULL) return 0; 

    // allocate buffer 
    width = 256; 
    height = 256; 
    data = (int*)malloc(width * height * 3); 

    // read texture data 
    fread(data, width * height * 3, 1, file); 
    fclose(file); 

    // allocate a texture name 
    glGenTextures(1, &texture); 

    // select our current texture 
    glBindTexture(GL_TEXTURE_2D, texture); 

    // select modulate to mix texture with color for shading 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

    // when texture area is small, bilinear filter the closest mipmap 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
        GL_LINEAR_MIPMAP_NEAREST); 
    // when texture area is large, bilinear filter the first mipmap 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    // if wrap is true, the texture wraps over at the edges (repeat) 
    //  ... false, the texture ends at the edges (clamp) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
        wrap ? GL_REPEAT : GL_CLAMP); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
        wrap ? GL_REPEAT : GL_CLAMP); 

    // build our texture mipmaps 
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, 
         GL_RGB, GL_UNSIGNED_BYTE, data); 

    // free buffer 
    free(data); 

    return texture; 
} 
void keyboard(unsigned char key, int mousePositionX, int mousePositionY) { 
    switch (key) { 
     case KEY_ESCAPE: 
      exit (0); 
      break;  
     default:  
      break; 
    } 
} 

я следовал этим http://www.nullterminator.net/gltexture.htmlНевозможно загрузить .png изображение, используя OpenGL текстуры

Что я должен делать?

+0

Является ли размер вашей текстуре мощность 2? –

+0

Я не знаю, как бы я это узнал? – shibly

+2

Лучший способ узнать этот материал - не задавать нам вопросы каждый раз, когда какой-то код, который вы копируете и вставляете, не работает. –

ответ

3

"LoadTextureRAW()" не относится к файлам PNG. Для декодирования файла png вам понадобится сторонняя библиотека, например libpng, потому что они сжаты.

Если вы не хотите реализовать libpng самостоятельно, что является своего рода продвинутым, то вы, вероятно, можете найти библиотеку-обертку в google где-нибудь.

Вы можете найти минимальную реализацию Libpng здесь: http://zarb.org/~gc/html/libpng.html

+0

Будет .jpg работать? – shibly

+0

Как использовать libpng? – shibly

+0

Нет, для любого изображения, кроме .RAW, вам понадобится какой-то декодер/парсер. Даже несжатые изображения, такие как файлы таргета и bmp, будут иметь заголовок, который содержит, по крайней мере, размеры изображения. – bitwise

Смежные вопросы