Текстура не показывает - PullRequest
       1

Текстура не показывает

0 голосов
/ 08 января 2012

Я загружаю файл растрового изображения и создаю текстуру таким образом:

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 ]

2 голосов
/ 08 января 2012

Вы загружаете только один уровень, но включаете mipmapping, вызывая

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

Если загружается только один уровень, вы должны отключить mipmapping с помощью

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

или

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

Обновление из-за просмотра кода:

ОП попытался загрузить текстуры до того, как стал доступен контекст OpenGL.

1 голос
/ 08 января 2012

Вы «забыли» создавать мип-карты.

Либо отключите мип-отображение, используя методы, предложенные datenwolf:


glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

1008 *

или

glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); при


ИЛИ генерировать мипмапы.

Для генерации мип-карт:

  1. В OpenGL 3 и выше используйте glGenerateMipmap.
  2. В OpenGL 1.4 и выше используйте glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE) для своей текстуры.
  3. В более низких версиях OpenGL либо используйте gluBuild2DMipmaps, либо создавайте их вручную для каждого уровня текстуры, используя glTexImage2D.

Имейте в виду, что отключение мип-карт может негативно повлиять на производительность.

Чтобы легко получить доступ ко всем этим функциям на платформе Windows, вам потребуется что-то вроде GLEW .

1 голос
/ 08 января 2012

проблема выглядит аналогично моему предыдущему ответу:

Android OpenGL2.0, показывающий черные текстуры

Это довольно распространенная проблема текстурирования в OpenGL.

В случае отсутствия двух текстур режим обтекания может быть только GL_CLAMP_TO_EDGE в большинстве реализаций драйверов.

Существуют также ограничения на фильтр, который вы можете использовать, который может быть толькоGL_NEAREST или GL_LINEAR (другими словами, нет MIPMAPPING)

2 Параметры здесь:

  1. Попробуйте изменить размер текстуры на степень 2
  2. Измените параметры зажима с:

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_ED);glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Приветствия

1 голос
/ 08 января 2012

Рисуете ли вы треугольники против часовой стрелки, если смотреть с позиции вашей камеры?Чтобы проверить, является ли это проблемой, звоните glDisable(GL_CULL_FACE);.

Вы также должны всегда устанавливать активную текстурную единицу перед привязкой, попробуйте glActiveTexture(GL_TEXTURE0); перед привязкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...