プログラミング(C++)

OpenGL ESにゅう門

専門的なことはともかく、C++ NDK OpenGL ESの資料を探してみる。
洋書で、
OpenGL ES 3.0 Programming Guide

ってのがある。うわ、でけえ。どうしてこうなった。

ともかく、お金があればこれを買えばいいのだが、最近買う本は、最初の数ページだけ読んで、結局は読まずにプログラミングしていることが多いので・・・更にいうと洋書だし・・・。

んま、俺は英語はよう読めへんけど、プログラミングは読めるので、この書名で検索してみる。

http://opengles-book.com/samplecode.html


さて・・・ここにNDK C++ OpenGL ESのサンプルがある。これが教科書となるのである。

あとは不明な点を補足するために定番の

https://www.khronos.org/opengles/

を閲覧する。

また、

http://www.learnopengles.com/

こういったサイトも有るようだ。しかし日本語のサイトはないのだろうか・・・

あ、凹みの人のページが引っかかった。

http://tips.hecomi.com/entry/20130226/1361886948

あと、全体的な話はここかな

http://www.slideshare.net/yosyda/android3dopenglndk?next_slideshow=1

最近はSlideShareで論文的なものを公開している人が多いので助かるよ。

あと、モチベのために

http://ramemiso.hateblo.jp/entry/2014/06/21/150405

で、OpenGLを利用しようとするわけだが、実際なんかglutは使いたくないのだが、Webで探してもglut系サンプルしかないんだよね・・・そんなに難しいのかな。DirectX11でMMDを動かせるプログラマであっても難しいのかな。

なんで嫌かというと、中で何やってんのかじぇんじぇん分からんってのと、なんか最近は更新されてないとか言うのと、何より、cocos2d-xで使用されていないっぽいのだ・・・時代遅れライブラリなんじゃねーかと。

ということで、cocos2d-xのなかを見てると、glewだのglfwだのが多発ヒットするので、

http://blog.livedoor.jp/tek_nishi/archives/7836153.html

こういうサイトを見つけた。うん、これだよこれ!!とか言ってみる。あとはCCApplication.cpp見ながら、OpenGLを勉強していけば何とかなるでしょ。

| | コメント (0) | トラックバック (0)

スマータボインちゃん

ニコニコで、http://www.nicovideo.jp/watch/sm8099018
とか
http://www.nicovideo.jp/watch/sm3452591
とか
http://www.nicovideo.jp/watch/sm9260335
とか見てたら、何か触発されて、何か作りたくなってきた。

というわけで部品作りから。…そっからかよ。

まずはスマートポインタ。MoreEffectiveC++では「生ポインタをくるんでポインタのように扱えるもの」
とあったような気がするので、そんな感じで書いてみる


class Sample
{
 ///サンプルですが何か
};
template<class T>
class SmartPtr<T>
{
 public:
  //別にNULLって書いてもいいのよ
  SmartPtr(T* body=0) : _body(body){}
  ~SmartPtr(){
   //なんかしらの後始末
  }
  void Reset(T* body=0){
   _body = body;   
  }

  //->演算子定義。これによって、メンバ変数、メンバ関数を呼び出せる
  T* operator->()const{
   return _body;
  }
  T& operator*() const{
   return *_body;
  }
 private:
  T* _body;
  //コピーと代入
  SmartPtr(const SmartPtr& smptr);
  SmartPtr& operator=(const SmartPtr& smptr);
  void Swap(SmartPtr<T>& sm){
   T* tmp = sm._body;
   sm._body = _body;
   _body = tmp;
  }
};


ひとまずこれがスコープドポインタやシェアードポインタの元になるのよん。
で、このスマートポインタって奴をポインタのかわりに使用することはProxyパターンでもあるのよね。
こんなもん作って何が楽しいのかと言うと、上にも書いたけど、ポインタの代わりに使う。
これは値クラスなので、非ポインタとして使用することができる→ポインタを安全に使用することもできるのよね。
まぁ危険に使おうと思えばなんだってできるけど…いつ実体がなくなったのかとか全然分からない状態で使うよかマシなんじゃないだろうかとか…
素直にBoost使えよって感じですが。

次回はこれからスコープドとシェアードを作っていこうと思います。

| | コメント (0) | トラックバック (0)

前置インクリメント

しばらく仕事でC++使っていると、大抵前置インクリメントを使うものだ。何の本だったか(More Effective C++ だか、C++ Coding Standards だか)に

「前置、後置どっちでもいいときには前置インクリメントを使おう」的なことを書いてあった気がする。

で、これも手元にリソースがないのだが、確か、

前置インクリメントは、インクリメント後に評価を行う。
後置インクリメントは、インクリメント前に評価を行う。

つまりこう

int a=0,b=0;
int c=++a;//インクリメントしてcに代入
int d=b++;//dに大乳代入された後にインクリメント

とした場合、a=1,b=1,c=1,d=0となる。で、このときに、後置インクリメントの際には代入の後にインクリメントという仕様を満たすためだかなんだか、コピーが作成されてしまう。

そう、コストが少しだけかかってしまうのだ。

また、確かMore Effective C++ だったと思うが、後置は前置を用いて実装されているということだ。

ただし「あなたがユーザー定義型を使う場合」と言う風に書いているらしいので、そこまで気にするほどのことではないのかもしれない。

ただ気になるのは、いくつかの入門書や、C++そのものを主題にしているわけではない(グラフィックスプログラミング等)本では、後置インクリメントが多用されているのである。

どちらでもいいのだし、どちらかといえば前置を用いたほうがいいにもかかわらず、このような傾向がある。好みの問題と言えば好みの問題だけれども、インクリメントと言えば、自動的にi++とか書いている人も多いと思う。なぜならば初心者は本のとおりにコードを書き写し、実行して動作すれば「正しい」と思ってしまうからである。

で、C++においては後置が明らかに適切ではないときもある。にもかかわらず、クセなのか、後置しか選択肢を持たない人が多いようです。

これって、質の悪い入門書の罪ではないでしょうか?そりゃ、初心者は前置とか後置とか言っても聞きゃあしないでしょう。でもそうならばサンプルコードは前置インクリメントに、今からでも改訂版出す際にでも前置にすべきではないでしょうか?

と、思うんですが。おそらくC言語で当たり前のように後置なのは何か事情があるのでしょう。(グーグル先生を探してみても事情を教えてくれるリソースは見当たらないのですが)

少なくともC++の入門書において、特にforループのカウンタを前置にしていないものは買わないほうがいいんじゃないでしょうか。

| | コメント (0) | トラックバック (0)

テンプレート1

Modern C++ Design をだいぶ理解できてきました。これというのもウチのプログラマボスのおかげです。いやー
昨年までテンプレートのテの字もわかんなかった僕が…。タイプリストまで理解しました。ていうかタイプリスト
の発想のすごさに脱帽。
テンプレートを再帰させるなんて…普通考えつかないって。
まあ、昔どこかでコンパイル時に「フィボナッチ数列」の計算を行うサンプルを見たので、それを考えれば
不可能ではないのかもしれないけどとにかくすごい。

複数の型を持つテンプレートクラスの作り方は普通

template<typename T1,typename T2>
struct Foo
{
    T1 t1;
    T2 t2;
};

んで特殊化すると

template<typename T1>
struct Foo<T1,double>
{
    T1 t1;
    double t2;
};


template<typename T2>
struct Foo<char,T2>
{
    char t1;
    T2 t2;
};

template<>
struct Foo<char,int>
{
    char t1;
    int t2;
};

ってな感じです。ここまでは僕でもわかります。アンドレイアレキサンドレスク氏のすごいのはここからで

template<typename U , typename L >
struct TypeList
{
    typedef U Head;
    typedef L Tail;
};

アッーーーー!

typedefを使うなんて…。
さらに

typedef TypeList< char , TypeList<int,double> > TripleList;

とすれば、型の並びを表現できます。ただしいちいち書いていくのは面倒なので
次のようなマクロを用意します。

#define TYPELIST_1(T1) TypeList<T1,NullType>
#define TYPELIST_2(T1,T2) TypeList<T1,TYPELIST_1(T2)>
#define TYPELIST_3(T1,T2,T3) TypeList<T1,TYPELIST_2(T2,T3)>

とはいえ、このマクロを書くのも面倒なので、僕はAWK言語を用いて32まで
用意しました。そう、メタプログラミングを他言語を用いて記述!まさにメタメタプログラミング!!

「で、どこで使うのよ」と言われそうなので、一例。
通常可変長引数をとる関数は、それぞれの型がわかりません。

void Sample(...)
{
    ?
}

ところが、タイプリストを一緒に渡してあげれば、順順に方がわかるのですよ。奥さん!
この他の使い方も検証してみるつもりですが、それはもうちょっとModern C++ Design を読んでから。
難しいことに変わりはないので…。

| | コメント (0) | トラックバック (0)