21. テクスチャ・マッピング

21.010 テクスチャ・マッピングのための基本手順はどういうものですか?

裸の最小で、テクスチャーマップは指定されなければならず、テクスチャー・マッピングは可能でなければならず、適切なテクスチャー座標は個々の頂点で設定されなければなりません。 これらのステップがテクスチャーマッピングプリミティブを生産する間、一般に、それらはほとんどのOpenGL1.2アプリケーションの要件を満たしていません。 代わりに、以下のステップを使ってください。

21.020 テクスチャ・マッピングを使用しようとしているのですが、うまくいきません。何がいけないのでしょう?

以下をチェックしてください

21.030 テクスチャ・マッピングを利用すると、ライティングが機能しなくなるのはなぜでしょう?

テクスチャー環境をGL_DECALまたはGL_REPLACEに設定したウェブで入手可能な多くの善意のテクスチャーマップデモがあります。 これらの環境モードは原色をテクスチャー色と効果的に交換します。 テクスチャー・マッピング(点火は/頂点操作である一方、テクスチャー・マッピングは/破片操作です)、テクスチャー色によって、点火することによって計算する色が代わる前に点火値が故意なので。 結果は、テクスチャー・マッピングが可能な時に、点火が、働くのをやめるようであることです。

デフォルトテクスチャー環境はGL_MODULATEであり、それは、原始的な(または点火)色をテクスチャー色に乗算します。 OpenGL点火とテクスチャー・マッピングを使うほとんどのアプリケーションは、GL_MODULATEテクスチャー環境を使います。

コードにおいて以下のラインを捜してください

glTexEnv(GL_TEXTURE_ENV、GL_TEXTURE_ENV_MODE、GL_DECAL); /*また
はGL_REPLACE*/

GL_DECALからGL_MODULATEまでを変更するか、またはラインを完全に単に削除するべきです(GL_MODULATEがデフォルトであるので)。

21.040 ライティングとテクスチャ・マッピングはうまくいきます。しかし、スペキュラーのハイライトがでないのはなぜでしょう?

それが、マッピングされたテクスチャーではない時と突然不白いテクスチャーを適用する時に幾何学が良い白いspecularハイライトを持つことができる たとえ幾何学がまだ点火されていても、ハイライトは立ち去ります。 GL_MODULATEがプリミティブの点火色コンポーネントを増加させるので、これはテクスチャー色コンポーネントにあります。 例えば、赤いテクスチャーマップのため白いspecularハイライトが増加していると想定してください。 最終的な色は、その時(1.0*1.0、1.0*0.0、および1.0*0.0)(1.0、0.0、および0.0)であるか、または赤い。 白いspecularハイライトは見えません。

OpenGL1.2は、テクスチャー・マッピングの後にspecularハイライトを適用してこの問題を解決します。 この別個のspecular点火モードは、過ぎてつけられます:

glLightModel(GL_LIGHT_MODEL_COLOR_CONTROL、GL_SEPARATE_SPECULAR_COLOR
);

デフォルトで、それはGL_SINGLE_COLORに設定し、それはOpenGL1.1およびより早さによって互換性を後ろに維持します

もしOpenGL1.2を使っていないならば、他の解決策が入手可能です。 多くのベンダは、所有権を主張した拡張を、テクスチャーマップの後にspecularハイライトを適用することを可能にすることに提供します。 どのようにHPシステムのこれをするかので、この例コードを見てください多くのOpenGLベンダはan the EXT_separate_specular_color拡張 を決定しました

別の方法はどのようなOpenGLインプリメンテーションにでも取り組みます。なぜなら、それは規則的なOpenGL1.0機能を使うだけで、拡張に依存しないからです。 幾何学を2つのパスに表現する必要があります: そして、2番目のパスは、specularハイライトを、 可能な正常な点火とテクスチャー・マッピングを持つ1番目 します。 どのようにそれをするかという証明のためにこの例コードを見てください

21.050 テクスチャ・コーディネイトを自動で生成するには?

glTexGen()機能を使ってください

21.060 ディスプレイ・リストにテクスチャ・マップを入れておくべきでしょうか?

ディスプレイにおいて、この問題がセクションをリストしたのを見てください

21.070 テクスチャ・オブジェクトはどのように機能するのでしょうか?

テクスチャーオブジェクト店テクスチャーマップおよびそれらの、関連したテクスチャーパラメータ状態。 それらは、テクスチャーの間で単一の呼び出しによってglBindTexture()に切り替えることを許します。

テクスチャーオブジェクトはOpenGL1.1において導入されました。 それ〈glTexImage*()を呼ぶことによるアプリケーション交換組織〉に先がけて 少し高価な操作 。 いくつかのOpenGL1.0インプリメンテーションが、ディスプレイリストに蓄えられたテクスチャーマップのためのテクスチャーオブジェクト機能をシミュレーションしました

ディスプレイリストのように、テクスチャーオブジェクトはGLuint識別子を持っています(glBindTexture()へのtextureNameパラメータ)。 アプリケーションがglGenTextures()を呼ぶ時には、OpenGLはテクスチャーオブジェクト名をアプリケーションに供給します。 また、ディスプレイリストのように、テクスチャーオブジェクトは文脈を横切って共有できます

ディスプレイリストと違って、テクスチャーオブジェクトは移り気です。 テクスチャーオブジェクトが縛られた時には、オブジェクト状態を織る変化は、変化をテクスチャーマップ自身に含むテクスチャーオブジェクトに蓄えられます。

以下の機能はテクスチャーオブジェクトにおいて状態に影響し、蓄えます: glTexImage*()、glTexSubImage*()、glCopyTexImage*()、glCopyTexSubImage*()、glTexParameter*()、およびglPrioritizeTextures()。 mipmap角錘を築くためのGLUルーチンがglTexImage*()を最終的に呼ぶので、それらはテクスチャーオブジェクト状態にも影響します。 目立って、glTexEnv*()とglTexGen*()がこのリストを休みます; それらは状態をテクスチャーオブジェクトに蓄えません。

ここには典型的なテクスチャーオブジェクト用法の要約があります

21.080 違ったレンダリングのコンテクスト間で、テクスチャを共有するには?

もしはい、テクスチャーオブジェクトを使うならば。 テクスチャーオブジェクトは同じ方法 ディスプレイリスト缶 で共有できます。 もしマイクロソフトWindowsを使っているならば、wglShareLists()が機能するのを見てください。 GLXプラットフォームのために、glXCreateContext()にシェアパラメータを見てください。

21.090 表面に複数のテクスチャを適用するには?

EXT_マルチテクスチャーおよびSGIS_マルチテクスチャー両方が時代遅れであることに注意してください。 好まれたマルチ織っている拡張は、ARB_マルチテクスチャーです。

ARB_マルチテクスチャースペックはOpenGL1.2.1スペックに含められていますhttp://www.opengl.org/Documentation/Specs.html

例はマイケル金のWebページにあります

有益な断片はhttp://reality.sgi.com/blythe/sig99/advanced99/notes/node48.htmlで入手可能です。 それは、高度グラフィックスプログラミングテクニック使用OpenGLという表題を付けられるより広いプレゼンテーションの一部です。 一般にOpenGLと3Dグラフィックスを始めることが、誰にでも有益な補足です。

21.100 ライト・マッピングをするにはどうしたらよいですか?

軽いパターンをまねするテクスチャーマップを作成すること、およびテクスチャーとして、点火された表面にそれを適用することによって点火することをシミュレーションできます。 軽いテクスチャーマップを作成した後に、どのようにそれを表面に適用するかについて特別な何もありません。 それはどのような他のテクスチャーマップにでもちょうど似ています。 この理由のために、この問題はOpenGLに本当は特有ではありません。

GLUT 3.7配布は、呼ばれるprogs/advanced97/lightmap.cに点火することをシミュレーションするためにテクスチャー・マッピングを用いる例を含んでいます

21.110 GIF, JPG, BMP のようなファイルをテクスチャ・マップで使用するには?

OpenGLはサポートをこれに提供しません。 どのような ライブラリ またはファイルを読み取るために要求する自家製のコード そして glTexImage2D呼び出し、変化を使うこと 容認できる何かへのピクセルデータ 、およびどのような他のテクスチャーマップのようにそれを使うことでの でも。

TGAファイルによってこれをするためのソースコードは、ここで見つけられえます

読み書き2Dについての情報のための雑多なセクションがファイルをイメージするのを見てください

21.120 どのようにテクスチャーマップに与えることができますか?

OpenGL1.1によって、この仕事を補助するために、glCopyTexImage2D()またはglCopyTexSubImage2D()機能を使用できます。 glCopyTexImage2D()はframebufferの内容を取り、それを現在のテクスチャーマップと取り決める一方、glCopyTexSubImage2D()は現在のテクスチャーの一部をframebufferの内容と交換するだけです。 これをするmultispheremap.cと呼ばれるGLUT 3.7例があります。

21.130 自分のデバイスによってハードウェアアクセラレーションされるテクスチャ・マップの最大サイズは?

よいOpenGLインプリメンテーションは可能な時に、いつでもハードウェア加速によって与えます。 しかし、インプリメンテーションは、自由に、加速されたハードウェアをしません。 OpenGLは、アプリケーションがハードウェア加速を使っていることを保証し、問うために、メカニズムを提供せず、それはハードウェア加速を使っています。 精神でこの情報がである時に、以下はまだ有益であるかもしれません:

以下の呼び出しによって最大のテクスチャーサイズの見積りにインプリメンテーションサポートを得させることができます

texSizeをきらめかせてください;
glGetIntegerv(GL_MAX_TEXTURE_SIZE、&texSize);

もしテクスチャーが、まだ GL_MAX_TEXTURE_SIZEにより戻されたサイズ制限の 、ハードウェア 加速されるけれども ではないならば、それはまだ正しく与えているでしょう

これは、見積り glGet*()機能が知らない 何 フォーマット 、internalformatタイプ、およびどのような与えられたテクスチャーのためにでも使っているであろう他のパラメータ であるだけです。 OpenGL1.1およびより大きいことは、テクスチャープロキシを許してこの問題を解決します。

ここには、テクスチャープロキシを使うことの例があります

glTexImage2D(GL_PROXY_TEXTURE_2D、レベル、internalFormat 、
        
幅、高さ、境界、フォーマット、タイプ、NULL)

目標パラメータがGL_PROXY_TEXTURE_2Dである時にOpenGLがtexelデータをロードしないので、ピクセルパラメータがNULLであることに注意してください。 代わりに、OpenGLは、単に、それが、指定されたサイズと記述のテクスチャーを適応できるかどうかを考慮します。 もし指定されたテクスチャーが適応できないならば、幅と高さテクスチャー値は、0に設定されるでしょう。 テクスチャー代理人を電話させた後に、これらの価値を次の通り問いたい:

幅をきらめかせてください;

glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D、0、GL_TEXTURE_WIDTH、&width)
;

ならば(width==0)
   そのテクスチャー*/}を使うことができません

21.140 球体、円柱、その他複数の断面のあるオブジェクトにテクスチャ・マップするには?

マップ これらのオブジェクトが断片的なテクスチャー座標を使う を織ってください。 近づかれた表面またはオブジェクトの個々の小面は、テクスチャーマップの1つの小さい部分を示すだけです。 断片的なテクスチャー座標は、テクスチャーマップのどんな部分が適用されるか に どの 小面 を決定します。