Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OpenGL ESの3D描画の章をレビューしました #36

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions articles/graphics-03.re
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ OpenGL ESの「奥行き機能」を"深度バッファ(Depth Buffer)"と呼び

ちなみに、逆に機能を無効化する場合は"glDisable"というコマンドが用意されています。

[2]では、glClearコマンドの引数に対して"GL_DEPTH_BUFFER_BIT"を「追加して」います。glClearコマンドの引数は1つしかありませんが、このコマンドは引数を"|"でビット演算行うことで、「フラグを複数同時に伝える」ということができます。
[2]では、glClearコマンドの引数に対して"GL_DEPTH_BUFFER_BIT"を「追加して」います。glClearコマンドの引数は1つしかありませんが、このコマンドは引数を"|"でビット演算することで、「フラグを複数同時に伝える」ということができます。

Androidに限らず、公開されているAPIにはこのように「ON/OFFの状態を"|"演算子で組み合わせて送る」という引数が、たびたび登場します。1bitに付き1つの「ON/OFF」を管理できますので、int型(32bit)では最大32個のON/OFF組み合わせを保持できます。頭の片隅に覚えておくとよいでしょう。

Expand All @@ -223,7 +223,7 @@ GL_DEPTH_BUFFER_BITは「深度バッファを再度使用できる状態にす

=== 課題:インデックスバッファで描画する

ですが速度の向上にはまだ不十分です。なぜなら、この頂点データには大量の「不要データ」が含まれているからです。たとえば、3DCGとは関係なく立方体の「頂点」を数えた場合、たった8個しかありません。
先の2つの課題で正しい深度を持った立方体が描画できました。しかし速度の向上にはまだ不十分です。なぜなら、この頂点データには大量の「不要データ」が含まれているからです。たとえば、3DCGとは関係なく立方体の「頂点」を数えた場合、たった8個しかありません。

前述の課題で作成していた大量のデータの中には、重複したデータが存在してしまっています。

Expand All @@ -239,7 +239,7 @@ GPUは"頂点バッファ"と"インデックスバッファ"を与えられる

また、インデックスが同じであれば、同じ頂点を読み込みに行きます。そのため、インデックスバッファは重複した頂点を表現する@<fn>{インデックスバッファのキャッシュ}ことを得意としているのです(@<list>{Chapter03_03})。

//footnote[インデックスバッファのキャッシュ][一度処理した頂点はキャッシュが保持されるため、重複した頂点に何度も頂点シェーダー計算を行うことも避けられます。便利ですね]
//footnote[インデックスバッファのキャッシュ][一度処理した頂点はキャッシュが保持されるため、重複した頂点に何度も頂点シェーダー計算を行うことも避けられます。便利ですね]

//listnum[Chapter03_03][Chapter03_03.java]{
public class Chapter03_03 extends Chapter03_02 {
Expand Down Expand Up @@ -313,7 +313,7 @@ public class Chapter03_03 extends Chapter03_02 {

その代わり、「インデックス何番の頂点を示すか」を表すためのインデックスバッファはちゃんと36個存在しなければなりません。[2]では12ポリゴン(2ポリゴン×正六面体)分のインデックスバッファを用意しています。

最後に、[3]では"glDrawElements"コマンドを使用して描画を行います。描画コマンド名が違うことに注目してください。インデックスバッファを使用する場合はこのglDrawElementsコマンドで描画を行います
最後に、[3]では"glDrawElements"コマンドを使用して描画を行います。描画コマンド名が違うことに注目してください。インデックスバッファを使用する場合は、このglDrawElementsコマンドで描画を行います

第1引数は今までどおりGL_TRIANGLESです。

Expand All @@ -327,7 +327,7 @@ public class Chapter03_03 extends Chapter03_02 {

=== 課題:バッファオブジェクトで描画する

さらなる高速化・効率化のためには、この頂点をVRAMに格納することが重要です。今まで使用していたBufferオブジェクトはもともとCPUが効率よくデータを読み書きするためのクラスです。ですが、それはあくまでCPUにとって都合がよいというだけで、GPUにとって都合がいいとは限りません。
さらなる高速化・効率化のためには、この頂点をVRAMに格納することが重要です。今まで使用していたBufferオブジェクトは、もともとCPUが効率よくデータを読み書きするためのクラスです。ですが、それはあくまでCPUにとって都合がよいというだけで、GPUにとって都合がいいとは限りません。

それだけでなく、CPU用のメモリ(RAM)はGPUから物理的に切り離されている場合があるため、効率のよいアクセスが行えない場合があるのです。そこで、頂点バッファやインデックスバッファを予めVRAMにアップロードし、GPUにとって都合がいいメモリ配置を行うことができます。

Expand Down Expand Up @@ -470,7 +470,7 @@ public class Chapter03_04 extends Chapter03_02 {

最後に、データのアンバインドです。アンバインド処理はglBindBufferコマンドの第2引数に"0"を指定するだけで済みます。

[4]はインデックスバッファのアップロードですが、各コマンドの第1引数が"GL_ELEMENT_ARRAY_BUFFER"に変化している以外に違いはありませんので、問題なく行えるでしょう。
[4]はインデックスバッファのアップロードですが、各コマンドの第1引数が"GL_ELEMENT_ARRAY_BUFFER"に変化している以外に違いはありませんので、問題なく行えるでしょう。

これでVRAMへのアップロードは完了しました。

Expand Down