2011-12-25 12 views
0

私はOpenGLでテクスチャを使用する方法を学ぼうとしています。 OpenGL Redbookのテクスチャマッピングに関する章を読み始めました。私はそれを理解していないので、私はグーグルとthis tutorialを見つけた。私は指示に従いましたが、私はまだそれを働かせることができません。 Thisはコードです。OpenGLテクスチャが動作しない

Thisは私のテクスチャ画像です。 Photoshopを使ってthisに変換しました。ファイルのサイズは175KBで、これは正しいサイズ(200x300x3 = 180000)です。

別のプログラムでファイルを読み込み、内容が正しいかどうかを確認しようとしました。私は約221ピクセルしか読むことができないと思われ、それはeof()に達する。私のプログラムでは、私が期待していたほど多くを読んでいましたが、デバッグしたときに、いくつかのポイントバイトがゼロになった後に気づいたです。

今私は混乱しています。私のプログラムに問題はありますか?テクスチャに問題はありますか?私に問題はありますか?私は間違って何をしていますか?どうすれば修正できますか?

答えて

1

問題はあなたのコードです。テキストモードでバイナリファイルを読み込もうとしました。

ifstream tex("ace.raw", ios::in | ios::binary); 
if(tex.is_open()) 
    for(int j=0; j<imH; ++j) 
    for(int i=0; i<imW; ++i) 
     for(int k=0; k<3; ++k) 
     { 
     face[j][i][k] = tex.get(); 
     } 

tex.close(); 

それともはるかに短いと同等のコード:

ifstream tex("ace.raw", ios::in | ios::binary); 
if (tex.is_open()) 
    tex.read((char*)face, sizeof(face)); 

tex.close(); 
どちらのコードがテストされ

と「顔」変数が「ace.raw」とまったく同じ内容で構成する代わりに、次のコードを使用します。

+0

私の驚いたことに、これはそれを解決するようです。テキストモードまたはバイナリモードでのファイルの読み込みの違いは何ですか?それは同じデータを含んでいなければなりませんか? – atoMerz

+0

テキストモードでは、印刷可能なASCII範囲に制限されています。バイナリモードでは、読み込んだ内容を読み込むだけの値もあります。 –

+0

そう、気づいていなかった。さて、もう一度、ありがとう。 – atoMerz

-2

いいえ、問題ありません。イメージには多くのゼロバイトが含まれていて、何も欠落することなくすべてを読み取るには、そのサイズを必ず記録してください。

+0

私はループ200x300x3でファイル全体を読み込み、RGB情報を読み込んでいます。ゼロを読み込んでいるという事実は無視しています。問題は実際にはゼロ(黒いテクスチャ)も表示することです!それは間違っている。実際の画像をアップロードして、どのように見えるかを確認できました。 – atoMerz

-1

テクスチャはどのように表示されますか?それはゴミですか?それは単なる純粋な白(つまりテクスチャなし)ですか?あなたのグラフィックスカードによっては、テクスチャが幅/高さとして2の累乗を必要とする可能性があり、テクスチャが正方形でなければならない可能性があります。ミップマップを使用しないと動作しますか?

完全なファイルを読み込めなくても、そこに何らかの破損したデータがあっても、ファイルが狂っていれば少なくともテクスチャとして見えるはずです。

+0

これは、以前は黒(ゼロを読み取る)でした。その後、それを少し編集した後、それは灰白色に変わった。 Osmanのソリューションが機能して以来、2つのテクスチャのパワーはありません。ミップマップがなければ同じ結果になります。 – atoMerz

関連する問題