2012-04-24 5 views
1

У меня проблемы с загрузкой текстур в проекте OpenGL GLUT с использованием классов. Вот код, который включает текстурирование:Текстура не появится - GLUT OpenGL

Объявление текстурированной модели из подкласса класса модели.

TextureModel * title = new TextureModel("Box.obj", "title.raw");

метод Конструктор TextureModel подкласса:

TextureModel(string fName, string tName) : Model(fName), textureFile(tName) 
{ 
    material newMat = {{0.63,0.52,0.1,1.0},{0.63,0.52,0.1,1.0},{0.2,0.2,0.05,0.5},10}; 
    Material = newMat; 
    // enable texturing 
    glEnable(GL_TEXTURE_2D); 

    loadcolTexture(textureFile); 
    glGenTextures(1, &textureRef); 
    // specify the filtering method 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    // associate the image read in to the texture to be applied 
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, image_array); 
} 

функция текстуры загрузки для чтения в данных в RAW файле:

int loadcolTexture(const string fileName) { 
ifstream inFile; 
inFile.open(fileName.c_str(), ios::binary); 

if (!inFile.good()) 
{ 
    cerr << "Can't open texture file " << fileName << endl; 
    return 1; 
} 
inFile.seekg (0, ios::end); 
int size = inFile.tellg(); 
image_array = new char [size]; 
inFile.seekg (0, ios::beg); 
inFile.read (image_array, size); 
inFile.close(); 
return 0;} 

Метод нарисовать треугольники:

virtual void drawTriangle(int f1, int f2, int f3, int t1, int t2, int t3, int n1, int n2, int n3) 
{ 
    glColor3f(1.0,1.0,1.0); 
    glBegin(GL_TRIANGLES); 
    glBindTexture(GL_TEXTURE_2D, textureRef); 
    glNormal3fv(&normals[n1].x); 
    glTexCoord2f(textures[t1].u, textures[t1].v); 
    glVertex3fv(&Model::vertices[f1].x); 

    glNormal3fv(&normals[n2].x); 
    glTexCoord2f(textures[t2].u, textures[t2].v); 
    glVertex3fv(&Model::vertices[f2].x); 

    glNormal3fv(&normals[n3].x); 
    glTexCoord2f(textures[t3].u, textures[t3].v); 
    glVertex3fv(&Model::vertices[f3].x); 
    glEnd(); 
} 

У меня также есть освещение, проверка глубины и двойная буферизация.

Модели и освещение прекрасно работают, но текстуры не отображаются. Любые причины, по которым это не сработает, будут отличными.

+1

Вы, по крайней мере, пропустите вызов 'glBindTexture' в конструкторе' TextureModel'. – user786653

ответ

2

Чтобы добавить комментарий, я вижу кое-что здесь:

  1. Как уже говорилось в комментарии, вам нужно связать текстуру, прежде чем загружать данные. После того, как вы создаете текстуру с glGenTextures, вам необходимо установить его, чтобы быть активной текстуры, прежде чем пытаться загрузить данные или установить заданные параметры с glTexParameteri

  2. Вы строите мип, но они не используются. Либо установите GL_TEXTURE_MIN_FILTER на GL_NEAREST_MIPMAP_LINEAR, чтобы использовать mipmaps, либо не создавать их в первую очередь. Как вы просто тратите память текстур.

  3. Это не законно, чтобы связать текстуру/glBegin между ними glEnd как вы сделали в drawTriangle. Привяжите его до glBegin.

  4. Пожалуйста, пожалуйста, пожалуйста начать использовать glGetError в вашем коде. Это скажет вам, если вы делаете неправильные вещи, прежде чем приходить и попросить найти свои ошибки. (вы бы нашли 2/3 ошибок здесь, если бы вы его использовали).

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