纹理没有显示

时间:2012-01-08 11:15:15

标签: c opengl

我正在加载位图文件并以这种方式创建纹理:

LoadBitmapFromFile( "img.bmp", &bitmapFile );

glGenTextures(1, &texture[0] );
glBindTexture(GL_TEXTURE_2D, texture[0] );


glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmapFile.width, bitmapFile.height, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapFile.data);


glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                 GL_LINEAR_MIPMAP_NEAREST );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

稍后,我尝试纹理三角形:

glEnable( GL_TEXTURE_2D );
        glPushMatrix();
            glBindTexture( GL_TEXTURE_2D, texture[0] );
            glBegin( GL_TRIANGLE_STRIP );
                glTexCoord2f( 0, 0 ); glVertex2f( 0, 768 );
                glTexCoord2f( 1, 0 ); glVertex2f( 1024, 768 );
                glTexCoord2f( 1, 1 ); glVertex2f( 0, 0 );
                glTexCoord2f( 0, 1 ); glVertex2f( 1024, 0 );
            glEnd();
        glPopMatrix();
    glDisable( GL_TEXTURE_2D );

但纹理不会在屏幕上显示,其他彩色基元也会显示。

它适用于glDrawPixel,但不会纹理三角形,可能出错?

我简化了我的应用只是为了显示问题: (还必须包括glext,因为它没有找到GL_CLAMP_TO_EDGE)

#include <GL/glfw.h>
#include <fstream>
#include <cstdlib>
#include "glext.h"

typedef struct BitmapFile
{
    int width, height;
    unsigned char* data;
};

BitmapFile bitmapFile;

GLuint texture[1];

void LoadBitmapFromFile( char *filename, BitmapFile *bitmap )
{
    int bitmapSize = 0;
    int i = 0;

    FILE *file;

    file = fopen( filename, "rb" );
    if( !file )
    {
        fclose(file);
        return;
    }

    fseek(file, 18, SEEK_SET);
    fread(&bitmap->width, 4, 1, file);

    fseek(file, 22, SEEK_SET);
    fread(&bitmap->height, 4, 1, file);

    fseek(file, 34, SEEK_SET);
    fread(&bitmapSize, 4, 1, file);

    bitmap->data = (unsigned char*)malloc(bitmapSize);
    fseek(file, 54, SEEK_SET);
    fread(bitmap->data, bitmapSize, 1, file);

    for( i = 0; i < bitmapSize; i+=3 )
    {
        int tempByte = bitmap->data[i];
        bitmap->data[i] = bitmap->data[i+2];
        bitmap->data[i+2] = tempByte;
    }

    fclose(file);
}

int LoadGLTextures()                                  
{
    LoadBitmapFromFile( "img.bmp", &bitmapFile );

    glGenTextures(1, &texture[0] );
    glBindTexture(GL_TEXTURE_2D, texture[0] );


    glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmapFile.width, bitmapFile.height, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapFile.data);


    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

    /*glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                     GL_LINEAR_MIPMAP_NEAREST );

    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );*/
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);


    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); 
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );

    return true;
}

int main()
{
    glfwInit();

    glEnable( GL_TEXTURE_2D );
    glShadeModel( GL_SMOOTH );

    LoadGLTextures();

    glfwOpenWindowHint( GLFW_WINDOW_NO_RESIZE, GL_TRUE );
    glfwOpenWindow( 1024, 768, 0, 0, 255, 0, 32, 0, GLFW_WINDOW );


    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1024, 768, 0, -1.0, 1.0); 
    glMatrixMode( GL_MODELVIEW );

    while( !glfwGetKey( GLFW_KEY_ESC ) )
    {
        glClearColor(0.0, 1.0, 1.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glBindTexture( GL_TEXTURE_2D, texture[0] );
        glPushMatrix();

            glBegin( GL_TRIANGLE_STRIP );
                glTexCoord2f( 0, 0 ); glVertex2f( 0, 768 );
                glTexCoord2f( 1, 0 ); glVertex2f( 1024, 768 );
                glTexCoord2f( 1, 1 ); glVertex2f( 0, 0 );
                glTexCoord2f( 0, 1 ); glVertex2f( 1024, 0 );
            glEnd();
        glPopMatrix();

        glDrawPixels( bitmapFile.width, bitmapFile.height, GL_RGB, GL_UNSIGNED_BYTE, bitmapFile.data);

        glfwSwapBuffers();
        glFlush();
    }

    glfwTerminate();
}

http://imageshack.us/photo/my-images/254/89567090.jpg/


好吧,我无能为力,在最后一次更改加载功能后看起来像:

int LoadGLTextures()                                  
{
    LoadBitmapFromFile( "img.bmp", &bitmapFile );

    glGenTextures(1, &texture[0] );
    glBindTexture(GL_TEXTURE_2D, texture[0] );

    //glGenerateMipmap(GL_TEXTURE_2D);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapFile.width, bitmapFile.height, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapFile.data);

    for( int i = 0 ; i < 8 ; i++ )
    {
        glTexImage2D(GL_TEXTURE_2D, i+1, GL_RGB, bitmapFile.width/(2*(i+1)), bitmapFile.height/(2*(i+1)), 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapFile.data);
    }

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    return true;
}

但在屏幕上仍然没有变化。 (位图是256x256)

4 个答案:

答案 0 :(得分:2)

您只加载一个级别,但通过调用

启用mipmaping
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

如果只加载一个级别,则必须禁用使用

进行mipmaping
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

由于看过代码而更新:

OP试图在OpenGL上下文可用之前加载纹理。

答案 1 :(得分:1)

从相机位置查看时,是否逆时针绘制三角形?要测试这是否是问题,请致电glDisable(GL_CULL_FACE);

您还应始终在绑定前​​设置活动纹理单元,在绑定之前尝试glActiveTexture(GL_TEXTURE0);

答案 2 :(得分:1)

这个问题与我此前的回答类似:

Android OpenGL2.0 showing black textures

这是一个在OpenGL上纹理化的常见问题。

如果没有2个纹理的功能,在大多数驱动程序实现上,包装模式只能是GL_CLAMP_TO_EDGE。

您可以使用的过滤器也有限制,只能是GL_NEAREST或GL_LINEAR(换句话说,没有MIPMAPPING)

这里有两个选项:

  1. 尝试将纹理大小更改为2
  2. 的幂
  3. 更改夹紧选项:
  4. glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);

    干杯

答案 3 :(得分:1)

你“忘了”生成mipmap。

使用datenwolf建议的方法禁用mipmapping:


  

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

  

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); as


或生成mipmap。

生成mipmap:

  1. 在OpenGL 3及更高版本中使用glGenerateMipmap
  2. 在OpenGL 1.4及更高版本中,使用glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE)作为纹理。
  3. 在较低版本的OpenGL中,使用gluBuild2DMipmaps或自行为每个使用glTexImage2D的纹理级别生成它们。
  4. 请注意,禁用mipmap可能会对性能产生负面影响。

    轻松访问Windows平台上的所有这些功能,您需要GLEW之类的内容。