6

事前計算されたテクスチャを含むから浮動小数点数を読み取りCSV file、それを 1 次元配列に格納してから、その読み取りデータを 2 次元テクスチャに入れようとしています。
データへのアクセスに問題があり、エラーの場所がわからないため、次のコードでそれが行われることを確認する必要があります。

// Allocate memory  
float * image = new float [width * height * 3 ];  
for( int i = 0; i < height; i++)  
    {  
        for( int j = 0; j < width-1; j++)  
            {  
                fscanf( fDataFile, "%f,", &fData );  
                image[ 4 * i * j + 0 ] = fData;  
                image[ 4 * i * j + 1 ] = fData;  
                image[ 4 * i * j + 2 ] = fData;  
            }  
        fscanf( fDataFile, "%f", &fData );  
        image[ 4 * i * width-1 + 0 ] = fData;  
        image[ 4 * i * width-1 + 1 ] = fData;  
        image[ 4 * i * width-1 + 2 ] = fData;  
     }   

ここで問題はないはずですが、私が困っているのは次のことです。

// create the texture  
glGenTextures(1, &texHandle);  
glBindTexture(GL_TEXTURE_2D, texHandle);   
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, &image[0]); 

glTexImage2D一次元配列へのポインタを渡すだけでいいですか?
配列のサイズは width*height*3 で、テクスチャのフォーマットは width*height で 3 チャンネルにする必要があります。それでも私のプログラムは期待どおりに動作せず、これがエラーの潜在的な原因の 1 つです。

4

2 に答える 2

5

混乱したテクスチャの読み取りを解決しました。何が入ったのかわかりませんが、アレイの初期化はまったく意味がありませんでした。これが修正されたコードです。テストテクスチャを書き込もうとしたときにわかりました。

// Allocate memory  
float * image = new float [width * height * 3 ];  
for( int i = 0; i < height; i++)  
{  
    for( int j = 0; j < width-1; j++)  
    {  
        fscanf( fDataFile, "%f,", &fData );  
        image[ 3 * (i * width + j) + 0 ] = fData;  
        image[ 3 * (i * width + j) + 1 ] = fData;  
        image[ 3 * (i * width + j) + 2 ] = fData;  
        //image[ 4 * i * j + 2 ] = 1.0f;  
    }  
    fscanf( fDataFile, "%f", &fData );  
    image[ 3 * (i * width + width-1) + 0 ] = fData;  
    image[ 3 * (i * width + width-1) + 1 ] = fData;  
    image[ 3 * (i * width + width-1) + 2 ] = fData;  
    //image[ 4 * i * width-1 + 2 ] = 1;  
}  

さらに、内部フォーマットとは無関係に機能するようになりました。GL_RGB, GL_RGBA, GL_RGB32F and GL_RGBA32Fテクスチャの読み方を変えることなく、すべて正常に動作します。

于 2013-03-06T15:58:18.953 に答える
2
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, &image[0]);

浮動小数点内部フォーマットを使用する必要があります。たとえば、GL_RGB32F. それは 3 番目のパラメーターである必要があります。

于 2013-03-06T00:23:44.257 に答える