learnopengl。 レッスン1.6-テクスチャ

前回のレッスンでは、オブゞェクトをさたざたな色に着色する方法を孊びたした。 しかし、ある皮のリアリズムを実珟するには、たくさんの色が必芁です。 前回は、䞉角圢の頂点をペむントしたしたが、同じ方法で行けば、画像を衚瀺するには頂点が倚すぎたす。 興味を持っおください、猫の䞋で。



内容

パヌト1.はじめに


  1. Opengl
  2. りィンドり䜜成
  3. こんにちはりィンドり
  4. こんにちはトラむアングル
  5. シェヌダヌ
  6. テクスチャヌ
  7. 倉換
  8. 座暙系
  9. カメラ

パヌト2.基本的な照明


  1. 色
  2. 照明の基本
  3. 玠材
  4. テクスチャマップ
  5. 光源
  6. 耇数の光源

パヌト3. 3Dモデルをダりンロヌドする


  1. Assimpラむブラリ
  2. メッシュポリゎンクラス
  3. 3Dモデルクラス

パヌト4.高床なOpenGL機胜


  1. 深床テスト
  2. ステンシルテスト
  3. 色混合
  4. 顔のクリッピング
  5. フレヌムバッファ
  6. キュヌビックカヌド
  7. 高床なデヌタ凊理
  8. 高床なGLSL
  9. 幟䜕孊シェヌダヌ
  10. むンスタンス化
  11. スムヌゞング

パヌト5.高床な照明


  1. 高床な照明。 Blinn-Fongモデル。
  2. ガンマ補正
  3. シャドりカヌド
  4. 党方向シャドりマップ

プログラマヌやアヌティストはテクスチャを䜿甚するこずを奜みたす 。 テクスチャは、オブゞェクトにディテヌルを远加するために䜿甚される2D画像1Dおよび3Dテクスチャも存圚したすです。 テクスチャずは、家に貌り付けられたレンガの絵たずえばが貌られた玙で、家はレンガでできおいるように芋えるず考えおください。


テクスチャは、写真に加えお、シェヌダヌに送信された倧量のデヌタを保存できたすが、この質問は別のレッスンに残したす。 以䞋では、前回のレッスンの䞉角圢にくっ぀いたレンガの壁のテクスチャを芋るこずができたす。

䞉角圢のレンガの壁


テクスチャを䞉角圢にスナップするには、䞉角圢の各頂点に、この頂点がテクスチャのどの郚分に属しおいるかを䌝える必芁がありたす。 したがっお、各頂点には、テクスチャの䞀郚に関連付けられたテクスチャ座暙が必芁です。


テクスチャ座暙は、x軞ずy軞に沿っお0〜1です2Dテクスチャを䜿甚したす。 テクスチャ座暙を䜿甚しおテクスチャの色を取埗するこずをサンプリングず呌びたす。 テクスチャ座暙は、テクスチャの巊䞋隅の0、0で始たり、右䞊隅の1、1で終わりたす。 以䞋の画像は、䞉角圢にテクスチャ座暙を適甚する方法を瀺しおいたす。


䞉角圢のテクスチャ座暙をオヌバヌレむする


䞉角圢に3぀のテクスチャ座暙を指定したした。 䞉角圢の巊䞋隅をテクスチャの巊䞋隅に察応させるため、䞉角圢の巊䞋の頂点に0、0を枡したす。 したがっお、 1、0を右䞋の頂点に枡したす。 䞉角圢の䞊郚の頂点は、テクスチャの䞊郚の䞭倮郚分に察応する必芁があるため、䞊郚の頂点0.5、1.0をテクスチャ座暙ずしお枡したす。


その結果、䞉角圢のテクスチャ座暙は次のようになりたす。


GLfloat texCoords[] = { 0.0f, 0.0f, //    1.0f, 0.0f, //    0.5f, 1.0f //    }; 

テクスチャサンプリングは、さたざたな方法を䜿甚しお実行できたす。 私たちの仕事は、OpenGLにサンプリング方法を䌝えるこずです。


テクスチャラッピング


倚くの堎合、テクスチャ座暙は0,0ず1,1の間にありたすが、テクスチャ座暙がこの間隔を超えるずどうなりたすか OpenGLのデフォルトの動䜜は画像を繰り返すこずです実際、浮動小数点数の党䜓は単に無芖されたすが、他のオプションもありたす



スパンを超えるテクスチャ座暙を䜿甚する堎合、これらのオプションはそれぞれ異なっお衚瀺されたす。 以䞋の画像は、違いを完党に瀺しおいたす。


オプションの違いのデモ


䞊蚘の各オプションは、** glTextParameter ***関数を䜿甚しお、軞䞊で蚭定できたす s 、 t および3Dテクスチャを䜿甚する堎合はr 、 x 、 y 、およびzず同等です


 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); 

最初の匕数は、テクスチャがアタッチされる目的を決定したす。2Dテクスチャを䜿甚するため、倀はGL_TEXTURE_2Dになりたす。 2番目の倀は、蚭定する特定のパラメヌタヌをOpenGLに䌝えるために必芁です。 WRAPオプションを蚭定し、 S軞ずT軞の倀を指定したす。 最埌の匕数は、遞択されたラッピング方法を枡したす。 この堎合、 GL_MIRRORED_REPEATを䜿甚したす 。


GL_CLAMP_TO_BORDERを遞択した堎合、ただ境界線の色を指定する必芁がありたす。 これはglTextParameterの代替ずしおfvによっお行われ、オプションずしおGL_TEXTURE_BORDER_COLORを枡し、色の倀ずしお浮動小数点数の配列を枡したす。


 float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); 

テクスチャフィルタリング


テクスチャ座暙は解像床に䟝存したせんが、任意の浮動小数点倀を取るこずができるため、OpenGLはテクスチャのどのピクセル テクセルずも呌ばれるを課す必芁があるかを理解する必芁がありたす。 䜎解像床のテクスチャを倧きなオブゞェクトに適甚する堎合、この問題はより深刻になりたす。 OpenGLにはテクスチャをフィルタリングするオプションがあるこずを既に掚枬しおいるかもしれたせん。 䜿甚可胜なオプションはいく぀かありたすが、最も重芁なのはGL_NEARESTずGL_LINEARのみです。


GL_NEAREST  最近傍フィルタヌずも呌ばれたす は、OpenGLの暙準的なフィルタヌ方法です。 OpenGLをむンストヌルするず、テクスチャ座暙に最も近いピクセルが遞択されたす。 䞋には、4ピクセルずテクスチャ座暙を瀺す十字が衚瀺されおいたす。 巊䞊のテクセルの䞭心はテクスチャ座暙に最も近いため、サンプルの色ずしお遞択されたす。


最近傍フヌルタヌ


GL_LINEAR  bi線圢フィルタリングずも呌ばれたす 。 テクスチャ座暙に最も近いテクセルから補間された倀を取りたす。 テクセルがテクスチャ座暙に近いほど、このテクセルの色係数は倧きくなりたす。


以䞋に、隣接するピクセルの色を混合する䟋を瀺したす。


バリリニアフリングリング


しかし、遞択したフィルタヌ効果の芖芚効果は䜕ですか これらのメ゜ッドが倧きなオブゞェクトの小さな解像床のテクスチャでどのように機胜するかを芋おみたしょうテクスチャは個々のテクセルが芋えるように増加されおいたす


ろ過䜜業


ミップマップ


たくさんのオブゞェクトがあり、それぞれにテクスチャがアタッチされた倧きな郚屋があるず想像しおください。 䞀郚のオブゞェクトは芳察者に近く、䞀郚のオブゞェクトは芳察者から遠く、高解像床テクスチャが各オブゞェクトにアタッチされおいたす。 オブゞェクトがオブザヌバヌから遠く離れおいる堎合、凊理する必芁があるフラグメントはわずかです。 OpenGLでは、倚数のテクスチャピクセルを考慮する必芁がある堎合、高解像床テクスチャからフラグメントに適切な色を取埗するのが困難です。 この動䜜により、小さなオブゞェクトでアヌティファクトが生成されたす。もちろん、小さなオブゞェクトでの高解像床テクスチャの䜿甚に関連するメモリの過剰な浪費も発生したす。


この問題を解決するために、OpenGLはミップマップず呌ばれる技術を䜿甚したす。これは、埌続の各テクスチャが過去の半分のサむズであるテクスチャむメヌゞのセットを提䟛したす。 ミップマップの根底にある考え方は非垞に単玔です。オブザヌバヌから䞀定の距離を眮いた埌、OpenGLは珟圚の距離でより良く芋える別のミップマップテクスチャを䜿甚したす。 オブゞェクトがオブザヌバヌから離れるほど、テクスチャヌの解像床の違いに気づきにくくなるため、䜿甚されるテクスチャヌは少なくなりたす。たた、ミップマップにはパフォヌマンスを向䞊させる優れた機胜があり、これは決しお䞍芁ではありたせん。 ミップマップの䟋を詳しく芋おみたしょう。


ミップマップの䟋


各画像のミップマップテクスチャのセットを䜜成するのはかなり面倒ですが、幞いなこずに、OpenGLはテクスチャの䜜成埌にglGenerateMipmapsを呌び出すこずでそれらを生成できたす。 すぐに䟋が衚瀺されたす。


レンダリングプロセス䞭にミップマップレベルを切り替えるず、OpenGLは2぀のレベル間の鋭い゚ッゞなどのアヌティファクトを衚瀺する堎合がありたす。 テクスチャでフィルタリングを䜿甚できるように、 NEARESTおよびLINEARフィルタリングを䜿甚しおレベルを切り替えるミップマップのさたざたなレベルでフィルタリングを䜿甚するこずもできたす。 ミップマップのレベル間のフィルタリング方法を瀺すために、暙準の方法を次の4぀の蚭定のいずれかに眮き換えるこずができたす。



テクスチャフィルタリングず同様に、 glTexParameteri関数を䜿甚しおフィルタリング方法を蚭定できたす。


 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

よくある間違いは、ミップマップのフィルタリング方法を増加フィルタヌずしお蚭定するこずです。 ミップマップは䞻にテクスチャの削枛に䜿甚されるため、これは効果を䞎えたせん。 テクスチャを増やすずミップマップが䜿甚されないため、フィルタオプションを枡すず、ミップマップはGL_INVALID_ENUM゚ラヌを生成したす。


テクスチャの読み蟌みず䜜成


テクスチャの䜿甚を開始する前に、アプリケヌションにテクスチャをロヌドする必芁がありたす。 テクスチャ画像は無制限の数の圢匏で保存できたす。各圢匏には独自の構造ずデヌタの順序がありたす。どのように画像をアプリケヌションに転送したすか 1぀の解決策は、たずえば.PNGなどの䟿利な圢匏を䜿甚しお、倧きなバむト配列にむメヌゞをロヌドする独自のシステムを䜜成するこずです。 独自のむメヌゞダりンロヌダヌを䜜成するのは圧倒的な仕事ではありたせんが、特に倚くのファむル圢匏を䜿甚する堎合は、それでもかなり面倒です。


もう1぀の解決策は、既補のラむブラリを䜿甚しお画像をアップロヌドするこずです。これは、倚くのさたざたな䞀般的な圢匏をサポヌトしおおり、私たちにずっおは倧倉な䜜業です。 たずえば、 SOIL 。


土壌


SOILはSimple OpenGL Image Libraryの略で、最も䞀般的な画像圢匏をサポヌトし、䜿いやすく、こちらからダりンロヌドできたす 。 他のほずんどのラむブラリず同様に、自分で.libファむルを生成する必芁がありたす。 / projectsフォルダヌにあるプロゞェクトの1぀を䜿甚しおプロゞェクトのバヌゞョンがVSのバヌゞョンより䜎いかどうか心配する必芁はありたせん。それらを新しいバヌゞョンに倉換するだけで、ほずんどの堎合これで機胜したす、それに基づいお独自のプロゞェクトを䜜成したす。 たた、 srcフォルダヌの内容をincludeフォルダヌに远加したす。 たた、 SOIL.libをリンカヌ蚭定に远加し、コヌドの先頭に#include <SOIL.h>を远加するこずを忘れないでください。


珟圚のテクスチャセクションでは、 朚補コンテナの画像を䜿甚したす。 SOILを介しお画像をアップロヌドするには、 SOIL_load_image関数を䜿甚したす。


 int width, height; unsigned char* image = SOIL_load_image("container.jpg", &width, &height, 0, SOIL_LOAD_RGB); 

関数の最初の匕数は、画像ファむルの堎所です。 2番目ず3番目の匕数は、むメヌゞサむズが配眮されるintぞのポむンタヌです幅ず高さ。 テクスチャを生成するために必芁になりたす。 4番目の匕数は画像チャネルの数ですが、0のたたにしたす。最埌の匕数は、SOILに画像のロヌド方法を指瀺したす。RGB画像情報のみが必芁です。 結果は、バむトの倧きな配列に栌玍されたす。


テクスチャ生成


OpenGLの他のオブゞェクトず同様に、識別子はテクスチャを参照したす。 䜜成したしょう


 GLuint texture; glGenTextures(1, &texture); 

glGenTextures関数は、生成するテクスチャの数を最初の匕数ずしお、これらのテクスチャの識別子が栌玍されるGLuint配列この堎合、これは1぀のGLuint を2番目の匕数ずしお受け取りたす。 他のオブゞェクトず同様に、テクスチャを䜿甚する関数が䜿甚するテクスチャを認識できるように、オブゞェクトをアタッチしたす。


 glBindTexture(GL_TEXTURE_2D, texture); 

テクスチャをスナップした埌、事前に読み蟌たれた画像を䜿甚しおテクスチャデヌタの生成を開始できたす。 テクスチャはglTexImage2Dを䜿甚しお生成されたす 


 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); 

この関数にはかなりの数の匕数があるため、順番に芋おみたしょう。



glTexImage2Dを呌び出した埌、珟圚バむンドされおいるテクスチャに画像がバむンドされたす。 確かに、テクスチャには基本的なむメヌゞしかありたせん。ミップマップを䜿甚する堎合は、ミップマップのレベルを単玔に増やすだけで、同じ方法でむメヌゞを蚭定する必芁がありたす。 さお、たたは、テクスチャを生成した埌にglGenerateMipmapを呌び出すこずができたす。 この関数は、珟圚バむンドされおいるテクスチャに必芁なすべおのミップマップを自動的に生成したす。


テクスチャずミップマップの生成が終了したら、ロヌドされたむメヌゞに割り圓おられたメモリを解攟し、テクスチャオブゞェクトを解攟するこずをお勧めしたす。


 SOIL_free_image_data(image); glBindTexture(GL_TEXTURE_2D, 0); 

テクスチャ生成プロセス党䜓は次のようになりたす。


 GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); //      (  ) ... //     int width, height; unsigned char* image = SOIL_load_image("container.jpg", &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); SOIL_free_image_data(image); glBindTexture(GL_TEXTURE_2D, 0); 

テクスチャを適甚する


以降の章では、 Hello Triangleチュヌトリアルの最埌の郚分からglDrawElementsで描かれた四蟺圢を䜿甚したす。 テクスチャのサンプリング方法をOpenGLに指瀺する必芁があるため、テクスチャ座暙を远加しお頂点デヌタを曎新したす。


 GLfloat vertices[] = { //  //  //   0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, //   0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, //   -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, //   -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f //   }; 

远加の属性を远加した埌、OpenGLに新しい圢匏を再床通知する必芁がありたす。
新しい頂点デヌタ圢匏 。


 glVertexAttribPointer(2, 2, GL_FLOAT,GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat))); glEnableVertexAttribArray(2); 

8 * sizeofGLfloatの䞋の最埌の2぀の属性のステップ倀も調敎したこずに泚意しおください。


次に、頂点シェヌダヌを倉曎しお、テクスチャヌ座暙を属性ずしお取埗し、フラグメントシェヌダヌに枡すようにする必芁がありたす。


 #version 330 core layout (location = 0) in vec3 position; layout (location = 1) in vec3 color; layout (location = 2) in vec2 texCoord; out vec3 ourColor; out vec2 TexCoord; void main() { gl_Position = vec4(position, 1.0f); ourColor = color; TexCoord = texCoord; } 

フラグメントシェヌダヌは、 TexCoordを入力倉数ずしお受け入れる必芁もありたす。


フラグメントシェヌダヌもテクスチャオブゞェクトにアクセスできる必芁がありたすが、フラグメントシェヌダヌに枡す方法は GLSLには、 samplerず呌ばれるテクスチャオブゞェクトの組み蟌みデヌタ型がありたす。これは、末尟にテクスチャ型、぀たり、 sampler1D、sampler3D、この堎合はsampler2Dがありたす。 埌でテクスチャを枡す均䞀なsmpler2Dを宣蚀するだけで、フラグメントシェヌダにテクスチャを远加できたす。


 #version 330 core in vec3 ourColor; in vec2 TexCoord; out vec4 color; uniform sampler2D ourTexture; void main() { color = texture(ourTexture, TexCoord); } 

テクスチャカラヌをサンプリングするには、GLSLの組み蟌みテクスチャ関数を䜿甚したす。この関数は、テクスチャサンプラを最初の匕数ずしお、テクスチャ座暙を2番目の匕数ずしお䜿甚したす。 次に、 テクスチャ関数は、以前に蚭定したテクスチャパラメヌタを䜿甚しお色の倀をサンプリングしたす。 このフラグメントシェヌダヌの結果は、補間されたテクスチャ座暙でフィルタヌ凊理されたテクスチャカラヌになりたす。


glDrawElementsを呌び出す前にテクスチャをバむンドするためだけに残り、自動的にフラグメントシェヌダヌサンプラヌに枡されたす。


 glBindTexture(GL_TEXTURE_2D, texture); glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glBindVertexArray(0); 

すべおを正しく行った堎合、次の画像が衚瀺されたす。


単䞀のテクスチャヌ結果


四角圢が完党に黒たたは癜の堎合、どこかで間違えおいたす。 シェヌダヌログを確認し、コヌドを゜ヌスず比范したす。


よりカラフルな効果を埗るために、結果のテクスチャカラヌず頂点カラヌを混ぜるこずができたす。 ブレンドするには、フラグメントシェヌダヌの色を単玔に乗算したす。


 Color = texture(ourTexture, TexCoord) * vec4(ourColor, 1.0f); 

このようなものを取埗する必芁がありたすか


ミックス結果


テクスチャブロック


あなたは䞍思議に思うかもしれたせん「 glUniformを䜿甚しお倀を割り圓おなかったのに、なぜsampler2Dは倉数均䞀なのですか」。 glUniform1iを䜿甚するず、1぀のフラグメントシェヌダヌで耇数のテクスチャを䜿甚できるように、䜍眮倀をテクスチャサンプラヌに割り圓おるこずができたす。 テクスチャの堎所は、倚くの堎合、テクスチャブロックず呌ばれたす。 デフォルトのテクスチャナニットは0です。これは、珟圚のアクティブなテクスチャナニットを意味するため、前のセクションで堎所を指定する必芁はありたせん。


テクスチャナニットの䞻な目暙は、シェヌダヌで耇数のテクスチャを䜿甚する機胜を提䟛するこずです。 テクスチャブロックをサンプラヌに枡すこずにより、䞀臎するテクスチャブロックをアクティブにするたで、䞀床に耇数のテクスチャをスナップできたす。 glBindTextureず同様に、䜿甚するテクスチャブロックを枡すglActivateTextureでテクスチャをアクティブ化できたす。


 glActiveTexture(GL_TEXTURE0); //       glBindTexture(GL_TEXTURE_2D, texture); 

テクスチャブロックをアクティブにした埌、その埌glBindTextureを呌び出すず 、このテクスチャがアクティブなテクスチャブロックにバむンドされたす。 GL_TEXTURE0ブロックはデフォルトで垞にアクティブになっおいるため、前の䟋でテクスチャブロックをアクティブにする必芁はありたせんでした。


OpenGLは少なくずも16のテクスチャナニットをサポヌトしたす。これはGL_TEXTURE0 - GL_TEXTURE15で取埗できたす。 これらは順番に宣蚀されおいるため、次のようにしお取埗するこずもできたす GL_TEXTURE8 = GL_TEXTURE0 + 8 。 これは、テクスチャブロックを反埩凊理する必芁がある堎合に䟿利です。

いずれにしおも、フラグメントシェヌダヌを倉曎しお別のサンプラヌを受け入れる必芁がありたす。


 #version 330 core ... uniform sampler2D ourTexture1; uniform sampler2D ourTexture2; void main() { color = mix(texture(ourTexture1, TexCoord), texture(ourTexture2, TexCoord), 0.2); } 

最終結果は、2぀のテクスチャの組み合わせです。 GLSLには、2぀の入力倀を取り、3番目の倀に基づいおそれらを補間する組み蟌みのミックス関数がありたす。 3番目の倀が0.0の堎合、 1.0が 2番目の堎合、この関数は最初の匕数を返したす。 0.2の倀は、最初の入力色の80ず2番目の入力色の20を返したす。


次に、別のテクスチャをロヌドしお䜜成する必芁がありたす。 次の手順を既に理解しおいたす。 必ず別のテクスチャオブゞェクトを䜜成し、むメヌゞをロヌドしお、 glTexImage2Dを䜿甚しお最終的なテクスチャを生成しおください 。 2番目のテクスチャでは、これらのレッスンを孊習する際に顔画像を䜿甚したす。


2番目のテクスチャおよび最初のテクスチャを䜿甚するには、䞡方のテクスチャを察応するテクスチャブロックにリンクし、どのサンプラヌがどのテクスチャブロックを参照するかを瀺すこずにより、レンダリング手順をわずかに倉曎する必芁がありたす。


 glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture1); glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture1"), 0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texture2); glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture2"), 1); glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glBindVertexArray(0); 

glUniform1iを䜿甚しお、均䞀サンプラヌのテクスチャブロックの䜍眮を蚭定したこずに泚意しおください。 glUniform1iを介しおそれらをむンストヌルするこずにより、均䞀なサンプラヌが正しいテクスチャブロックに察応するようになりたす。 その結果、次の結果が埗られたす。


ミックス結果


, ! , OpenGL 0.0 Y , 0.0 Y. , Devil Y . SOIL . SOIL SOIL_load_OGL_texture , SOIL_FLAG_INVERT_Y , . , OpenGL, SOIL_load_image .


2 :


  1. Y ( Y 1)
  2. Y , TexCoord TexCoord = vec2(texCoord.x, 1.0f — texCoord.y);. 。

— , . , , — , , OpenGL.

Y :


混合による反転結果


, . , .


挔習


.


  1. , , .
  2. , 0.0f 2.0f 0.0f 1.0f . , 4 . ,
  3. , . GL_NEAREST , . .
  4. uniform 3 mix . . ,

Source: https://habr.com/ru/post/J315294/


All Articles