0

Visual Studio C++ 2010 で、opengl と glsl を使用しています。シェーダーを作成しており、テクスチャをロードする必要があります。私は本からコードを読んでいて、そこでQtでテクスチャをロードしていますが、DevIlでそれを行う必要があります.DevILでテクスチャをロードするための同等のコードを誰かが書いてもらえますか? DevIL は初めてで、これを翻訳する方法がわかりません。

// Load texture file
const char * texName = "texture/brick1.jpg";
QImage timg = QGLWidget::convertToGLFormat(QImage(texName,"JPG"));

// Copy file to OpenGL
glActiveTexture(GL_TEXTURE0);
GLuint tid;
glGenTextures(1, &tid);
glBindTexture(GL_TEXTURE_2D, tid);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, timg.width(), timg.height(), 0,
             GL_RGBA, GL_UNSIGNED_BYTE, timg.bits());
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4

1 に答える 1

3

DevIL が維持されなくなり、ILUT 部分が 2 の累乗のテクスチャ ディメンションの要件を想定し、その便利な関数で画像を再スケーリングすることを考えると、手動で行うという迂回を実際に行うことは理にかなっています。

最初に DevIL を使用してファイルから画像をロードすることは、OpenGL で画像からテクスチャをロードするのと非常によく似ています。まず、DevIL イメージ名を作成してバインドします

GLuint loadImageToTexture(char const * const thefilename)
{

    ILuint imageID;
    ilGenImages(1, &imageID);
    ilBindImage(imageID);

ファイルから画像を読み込めるようになりました

ilLoadImage(thefilename);

画像がデータを提供していることを確認し、そうでない場合はクリーンアップします

void data = ilGetData();
if(!data) {
    ilBindImage(0);
    ilDeleteImages(1, &imageID);
    return 0;
}

重要なパラメータを取得する

int const width  = ilGetInteger(IL_IMAGE_WIDTH);
int const height = ilGetInteger(IL_IMAGE_HEIGHT);
int const type   = ilGetInteger(IL_IMAGE_TYPE); // matches OpenGL
int const format = ilGetInteger(IL_IMAGE_FORMAT); // matches OpenGL

テクスチャ名を生成する

GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);

次に、ピクセル ストアのパラメーターを設定します (元のコードでは、その重要なステップが抜けていました)

glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); // rows are tightly packed
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // pixels are tightly packed

最後に、テクスチャ画像をアップロードして ID を返すことができます

    glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, type, data);

次に、便宜上、縮小フィルターを GL_LINEAR に設定して、ミップマップ レベルを指定する必要がないようにします。

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

最後に textureID を返します

    return textureID;
}

ミップマッピングを使用したい場合は、glGenerateMipmap後で OpenGL を使用できます。glTexParameter GL_TEXTURE_MIN_LOD と GL_TEXTURE_MAX_LOD を使用して、生成される画像ピラミッドの範囲を制御します。

于 2012-12-01T15:58:59.300 に答える