2013年9月10日火曜日

OpenGLESGLSLSGLEELSEG

いまAndroid上でOpenGL ES 1.0を使ってグラフィックの試作をしているのですが,何をするにも実機に流し込んで動作させてやる必要があって少し面倒.

ちょっとした描画やエフェクトのテスト程度のものは,開発環境(Mac OS XのDesktop画面)上で適当にできたりすると楽だなーと思いはじめました.

一般的なデスクトップPC環境で「JavaでOpenGLをやろう」と言いはじめる際にそれっぽくまとまってそうなのは,JOGLというOpen GLのラッパー.
JOGLは,2009年に開発が終了したver.1.1.1と現行バージョンの2.0が存在しますが,なんか2.0がうまく動かなかったのでとりあえず1.1.1のほうを使いはじめました.



参考にしたのはこのあたり.
A Tutorial on JOGL 1.1 with Nehe Port

(JOGLは開発キットというより自主制作プラグインみたいな感じで,パッケージの内容が散乱してるわりにどれがどの機能に対応するのか不明だったり何気にさらっとリンク切れしてたりドキュメントのpkgも無かったりと,色々とビミョーな空気を感じたので,無理して最新版を使うのは前途多難かもと個人的に判断)

さて,モバイル向けのOpenGL ESは,OpenGLのサブセット的存在.
テスト環境という意味では,Mac上でもOpenGL ESが走ってくれるとありがたいんですが,所謂PC向けのOSやGPUはOpenGL ESに対応していません.
OpenGL ESのエミュレータをPC上で動かして云々という方法もあるようですが,そもそもJOGLとAndroid SDKの間でAPIの体系やら仕様やらと違いがあるので,どちらにしてもコードの移植にはそれなりに労力がかかりそう.

Macのマシンパワーにもあんまり余裕がないので(Eclipse単体でも結構モタモタです…),本当に必要になるまでは,JOGLでOpenGLを使ってグラフィックのテストを書き,Android SDKのOpenGL ESに逐一移植するという方法を採ろうと思います.

冒頭で書いたとおり,全くのシロートなのでOpenGL ES 1.0で手を付け始めたんですが,自分がやろうとしてる事を実現するには,OpenGL ES 2.0以上が必要な雰囲気.
というのも,基本的に2Dゲームを想定していて3Dグラフィックには興味がないものの,エフェクトを多用してイルミネーション的な演出を多用しようと考えているので,プログラマブルシェーダを使えたほうが夢が広がるなーという話.
ただし,GLSL(シェーダのプログラミング)はC言語で書く必要があって,JavaからCのネイティブコードを呼んでやる必要があるなど,まだ何もしてないのに面倒なことになりそうな予感…

早くも買った本の内容から逸れはじめてきましたが…
まぁ何とかなるかな.
…なるのか?

OpenGL 2.0とOpenGL ES 2.0が対応関係にあって,
それらをサポートしてる言語はGLSL 1.1とGLSL ES 1.0だとかなんとか
GL SL ESと紛らわしい2文字とバージョン番号の組み合わせがマジでカオス…
OpenGL, OpenGL ES, WebGL, GLSL, GLSL ES API Tables


GLEL Sandbox

面白い!しかも便利!!
ということでちょっとコーディングしてみた.
GPUってDSPみたいなもんだろと思ってたんけど,
2次元の信号処理に対する感覚が全くなくて頭が働かない!w
座標のインデックスを指定して値を入れ込んでいくんじゃなくて,全ピクセルがひたすらぶん回される中で適切な処理を施していく感じなんですかね.

シェーダってポリゴンにテクスチャ貼ったりするもんなんじゃないの?と思ってたんですが,表示領域全面に1枚の四角形を置いて,そこに本来テクスチャを貼るためのフラグメントシェーダのプログラマブルなところを利用して,色々と関数を入れて図形を生成するというのが原理みたい.

だから用意されている関数も低次のベクトル演算のようなジオメトリ関係のもので,距離とか三角関数,内積・外積みたいな数値計算をうまく使ってお絵かきをするわけですな.

「方眼紙上に正弦波の絵を描く」コードは?というだけでも
かなり考え込んでしまった.

とりあえず作ってみました.


#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
uniform sampler2D backbuffer;void main( void ) {
 vec2 pos = gl_FragCoord.xy / resolution;
 float amnt = 0.0;
 float nd = 0.0;
 vec4 cbuff = vec4(0.0);

 for(float i=0.0; i<5 data-blogger-escaped-.0="" data-blogger-escaped-1.0="" data-blogger-escaped-amnt="" data-blogger-escaped-cbuff="" data-blogger-escaped-dbuff="" data-blogger-escaped-float="" data-blogger-escaped-for="" data-blogger-escaped-gl_fragcolor="cbuff" data-blogger-escaped-i="" data-blogger-escaped-nd="sin(3.14*2.0*pos.y" data-blogger-escaped-pos.x="" data-blogger-escaped-pos.y="" data-blogger-escaped-pre="" data-blogger-escaped-sin="" data-blogger-escaped-time="" data-blogger-escaped-vec4="">

0 件のコメント :

コメントを投稿