1

クラスを使用して OpenGL GLUT プロジェクトにテクスチャをロードしようとすると問題が発生します。テクスチャリングを含むコードを次に示します。

モデル クラスのサブクラスからのテクスチャ モデルの宣言。

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();
}

また、ライティング、深度テスト、ダブル バッファリングを有効にしています。

モデルとライティングは正常に機能しますが、テクスチャが表示されません。うまくいかない理由は何でもいいです。

4

1 に答える 1

2

コメントに追加すると、ここにいくつかのことがわかります。

  1. コメントで述べたように、データをアップロードする前にテクスチャをバインドする必要があります。でテクスチャを生成したらglGenTextures、データをロードしたり、でパラメータを設定したりする前に、それをアクティブ テクスチャに設定する必要があります。glTexParameteri

  2. ミップマップを作成していますが、使用していません。GL_TEXTURE_MIN_FILTERミップマップを利用するように設定するかGL_NEAREST_MIPMAP_LINEAR、そもそもそれらを構築しないでください。そのままでは、テクスチャメモリを無駄にしています。

  3. で行ったようにglBegin/の間にテクスチャをバインドすることは合法ではありません。の前にバインドします。glEnddrawTriangleglBegin

  4. どうぞ、どうぞ、あなたのコードで使い始めてください。glGetErrorこれにより、間違いを見つけに来る前に、間違ったことをしているかどうかがわかります。(使用していた場合、ここで間違いの 2/3 を見つけたはずです)。

于 2012-04-24T19:00:47.343 に答える