OpenGL ESで2D描画してみよう

by K.I
2017/06/25〜

Index


概要

OpenGL ES とは


[top]

OpenGLの描画

クリッピング座標系

Viewport変換

ラスタライザ


1つまり、座標変換が全て完了しているものと同義。

[top]

シェーダについて

バーテックスシェーダ

フラグメントシェーダ

attribute変数

uniform変数

varing変数


2実行時にコンパイルするって、この仕様はちょっと驚いた。中間コード的なものにしても良かったんじゃないかな。

[top]

簡単にOpenGLを使う

バージョン2.0以上の指定

GLSurfaceViewを準備

バッファの準備

GLRendererで描画


3通常はJavaのバッファはヒープ上に作られるが、OpenGLのルーチンはネイティブのメモリ上のバッファを参照するため。バイトオーダーの問題もある。

[top]

三角形の描画

簡単なバーテックスシェーダ

簡単なフラグメントシェーダ

シェーダのコンパイル用メソッド

シェーダプログラムの準備

シェーダプログラムの実行

実行結果


4同次座標系、描画する次元の数+1で計算することで、座標計算がやりやすいらしい。

[top]

アルファブレンディング

アルファブレンドの設定方法

アルファブレンドの確認プログラム

ブレンドモードによる効果

加算とスクリーンの違い

論理演算

glBlendEquation

パラメータ 合成方法
GL_FUNC_ADD 加算(S+D)→デフォルト
GL_FUNC_SUBTRACT 減算(S-D)
GL_FUNC_REVERSE_SUBTRACT 減算(D-S)
GL_MIN 最小
GL_MAX 最大

OR合成もどき


5個人的には描画モードという感じがするが、OpenGLで描画モードというと、頂点情報を描画する順番を指定するものらしい。
6といっても、ほとんど黒だけど。
7自分としては、OR合成が出来るというだけで、OpenGLを使う意味があるかも。

[top]

頂点と線

頂点を描画する

頂点を円形にする

線を描画する

→最大のWidth=8でも、この程度の太さしかない

破線


8ES2.0では、バーテックスシェーダで指定するしかないらしい。
9これが自分的には、OpenGLで一番ガッカリだったことだったりする。
10これがフラグメントシェーダの面白い処だと思う。

[top]

パターンで塗潰し

三角関数によるパターン

2値パターン

パターンを重ねる


11ここらへんは、実際にプログラムして描画速度を確認しないと分かんないかも。

[top]

テクスチャ

テクスチャの生成

四角形にテクスチャを

シェーダでテクスチャ描画

文字の描画


12これはきっと、XYZWはポリゴン座標として使っているので、次はUVということになったんじゃないかなぁ。
13画像形式は、jpg, gif, png に対応している。
14あぁでもこれは速度的にはダメかも。

[top]

FBO

FBOの作成

FBOでオフスクリーン描画


15いろいろ調べてみたけど、やり方がわからん。まぁ、画面全体のテクスチャ貼り付けならシェーダは固定だから、最初に一度作ってしまえば後はそんなに手間は掛からないんだけど。
16FBOとシェーダの管理クラス、GLSurfaceView.Rendererを継承した、FBOのオフスクリーン描画クラスを作っているようだ。

[top]

まとめ


17それが、OpenGLで高速化される肝心なところという気もするけど。

[top]

参考

αブレンド関連参考

図形関連


[top]

メモ

OpenGLの座標

パラメータの確認

GLSL関数のメモ

VBO

カスタムView


[top] [プログラムの部屋に戻る]

comments powered by Disqus