でらうま倶楽部

バカってゆうか、ゲームを作る事しか能の無いプログラマの、面白おかしな日々を綴ってみる実験。

フルスクリーン

iPhoneではたぶん最速であろう、レンダリング結果をテクスチャとして利用する実装(OpenGL版)

photoタイトル長っ!

知ってると何かと便利なオフスクリーンレンダリング。レンダリング結果をテクスチャとして使えれば画面演出の幅も広がりんぐ。

で、試行錯誤の末、iPhoneでのオフスクリーンレンダリング(でいいのか?)はこんな感じで実装しました。

// 初期化
GLuint fboTexture;
GLuint fbo;

glGenTextures(1, &fboTexture);
glBindTexture(GL_TEXTURE_2D, fboTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, FBO_WIDTH, FBO_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

glGenFramebuffersOES(1, &fbo);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, fbo);
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, fboTexture, 0);
glBindTexture(GL_TEXTURE_2D, 0);


// レンダリング時の実装
[EAGLContext setCurrentContext:context];

glBindFramebufferOES(GL_FRAMEBUFFER_OES, fbo);
glViewport(0, 0, FBO_WIDTH, FBO_HEIGHT);

/* ここで好きなようにレンダリング */

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glViewport(0, 0, 320, 480);

glBindTexture(GL_TEXTURE_2D, fboTexture);

/* 以降、先にレンダリングした内容をテクスチャとして使える */

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];


元ネタはDeveloperForums。
これで、不要なテクスチャ転送無くオフスクリーンレンダリングの結果をテクスチャとして利用できます。ただしオフスクリーンレンダリングでハードウェアアクセラレーターが効いているかどうかは調査中。
サンプルとして提供されているGLSpriteを元にしてますので、フレームバッファの初期化その他諸々はそちらを参考にしてください。

これでiPhone上に実装されてる OpenGL ES を使った実験はとりあえず一段落。
さてさて、以前作ってたOpenGLライブラリをiPhoneへ移植しましょうかね…。


Carbon Emacsフルスクリーン設定その後

やっぱタイトルバーが無いと落ち着かん!結局マクロを自作して事無きを得ました。

部長の環境だと幅177でちょうど画面ピッタリだったので、縦サイズだけ最大化する機能を利用。これだとタイトルバーは表示されたままで最大化します。少々泥臭いですが趣味レベルならこんな感じでしょう。
関数を実行する度に、最大化と通常モードをトグルします。

(defvar my-mac-frame-top)
(defvar my-mac-frame-left)
(defvar my-mac-frame-width)
(defun mac-fullscreen-switch-frame()
  "フルスクリーン切り替え"
  (interactive)
  (if(frame-parameter nil 'fullscreen)
      (progn
        (set-frame-parameter nil 'fullscreen nil)
        (modify-frame-parameters nil (list
                                      (cons 'top my-mac-frame-top)
                                      (cons 'left my-mac-frame-left)
                                      (cons 'width my-mac-frame-width))))
    (setq my-mac-frame-top (frame-parameter nil 'top))
    (setq my-mac-frame-left (frame-parameter nil 'left))
    (setq my-mac-frame-width (frame-parameter nil 'width))
    (set-frame-parameter nil 'fullscreen 'fullheight)
    (modify-frame-parameters nil '((left . 0) (width . 177)))))

ここまでくると、今すぐにでもMac環境へ移行したい気持ちでいっぱいですよ。手持ちの開発系アプリがWindows縛りじゃなきゃね…。BootCampはいちいち再起動せにゃならんのでメンドクサイ!

ま、スッキリ!

一見MacとWindowsの区別がつかないかも。拘りのEmacsプチ設定集。

iPhoneアプリの方は只今絶賛 OpenGL ES 導入中。
第二弾アプリに向けてネタを仕込んでます。

にしても。OpenGL ES、確かに描画処理は速いねぇ。
うんうん。これはかなり使える。

ゲームコンソールはXbox360以外はOpenGL系だし、これをきっかけに一般化するかな?して欲しいなぁ。


んで、Objective-C初心者というのもあって、最初のアプリは設計がイマイチ(じぶんでゆうか)。ので、現在はMVCモデルを参考に描画部分をきちんと分離。

胴体着陸でもなんでも、とにかくアプリを完成させないとね。それでようやく次に進めるってもんだ。

Chipmunkを使ったデモもかなりいい感じに動き始めてるらしいよ。
あと初詣!(まだいけてない)


screen6さてさて。前回の続きになりますが、Macで使っとるEmacs、Carbon Emacs
こいつをWindowsと見た目も操作も一緒にしてしまおう!という無謀な試み。
ようやく設定がこなれてきたのでその中間報告だよ。


Windowsと動作を揃える為に余計なマクロを捨てる
アプリのアイコンをCtrl+クリック(右クリック)。「パッケージの内容を表示」で、中身を表示する。んで、Contents/Resources/site-lisp/ の中身をsubdirs.el  以外全部削除。Windowsとの互換性が第一なので追加機能は全部外しちゃう(開発者の方、スミマセン)
ちなみに、起動時間が一瞬になるという嬉しい副作用付き(笑)


Infoディレクトリの追加指定
ふとinfo(C-hi)を眺めてたら…なんか寂しくね?と思って Info-directory-list の中身を表示してみたら…Emacsのinfoを参照する為のパスが…無い?部長の環境に問題があるのか?とりあえず追加。

(setq Info-directory-list
      (append
       Info-directory-list (list "/Applications/Emacs.app/Contents/Resources/info/")))

Windowsと共通の設定もあるので、控え目に設定。そうそう、info画面ってそーだよね。的な。org-modeのinfoもちゃんと表示されたて。


最大化
Mac版にもあったよ、フルスクリーン化。

(global-set-key "\C-x\C-a" 'mac-toggle-fullscreen)
;;(setq mac-autohide-menubar-on-fullscreen nil)
;; Spacesとか使うと動作が怪しくなる
(defun mac-toggle-fullscreen()
  "フルスクリーン切り替え"
  (interactive)
  (set-frame-parameter nil
                       'fullscreen
                       (if (frame-parameter nil
                                            'fullscreen)
                           nil 'fullboth)))

;; 起動時に最大化
(defun window-setup-hook()
  (mac-toggle-fullscreen))
(add-hook 'window-setup-hook 'window-setup-hook)

およそMacとは思えない、メニューバーもタイトルバーも無い画面。スッゲェ!でもなぁ…出来ればタイトルバーは残ってて欲しいなぁ…。という訳で現在調査中。できるんか?

さて、何でしょう。

photoわからん人には「なんのこっちゃ」画像だね。これでもWindowsXPなんだけど。

Emacsを全画面表示にしてメニューを消してスクロールバーも消した状態。

こんな感じで仕事してまーす。みたいな。

まぁとにかく、余計な物がなーんにもないから作業にも没頭できるっちゅーもんです。マウス?そんなものは使いませーん。


仕事中はだいたいこんな感じの画面を睨みつつ(笑)、ガチャガチャとキーボードを叩いとる訳なんだけど…こんな意味不明な文字の羅列から、世の中を動かすようなサービスを生み出したりもしてるんだから、プログラムって不思議。


そろそろ帰るて(名古屋弁)

Emacs22(Win)でフルスクリーン

テキストエディタはおろか、ブラウザもメーラーもVisualStudioも、フルスクリーンで使う部長です。や、だって、空いとる場所が勿体ないし。
ちまちまとウインドウを画面に配置して使うのって、なんかせせこましいんだよね。なんとなくだけど。ま、何事も効率よく。

で、当然Emacsもフルスクリーンで…って。あれ?
なんか、そーゆーコマンドが見あたらない?マジで?!

初期化時の位置を左上にして、ウインドウのサイズ調整でなんとか…いやいや。なんかビミョーに隙間が。どーにもいい感じにEmacsが画面全体を覆ってくれへん。

でもタイトルバーをダブルクリックすると、部長の求めとる最大化になるんだよね。つまりそれでいいよね?って事か。
毎回立ち上げ時にタイトルバーをダブルクリックするのはプログラマとして負けた気分。何より効率的じゃなーい!

と、調べる事30分。ありました!わりとあっさりと(笑)
やっぱ先人の知恵はスゴイよ。


(defvar w32-window-state nil)

(defun w32-fullscreen-switch-frame ()
  (interactive)
  (setq w32-window-state (not w32-window-state))
  (if w32-window-state
      (w32-fullscreen-restore-frame)
    (w32-fullscreen-maximize-frame)
    ))
 
(defun w32-fullscreen-maximize-frame ()
  "Maximize the current frame (windows only)"
  (interactive)
  (w32-send-sys-command 61488))

(defun w32-fullscreen-restore-frame ()
  "Restore a minimized/maximized frame (windows only)"
  (interactive)
  (w32-send-sys-command 61728))

若干アレンジを加えたマクロをご紹介。.emacsに、こんな感じに追加して、w32-fullscreen-switch-frame を実行すると、最大化と現在の状態を交互に切り替えます。そんで、ここでピンと来た人はするどい。
単純に、専用関数でウインドウ最大化メッセージを送ってるだけなので、タイトルバーをダブルクリックすると…そのあと正しく動かなくなるので気をつけて。

ウインドウの現在の状態を判定して振る舞いを決める…ってのがお上品だとは思うんです。まぁ今後の課題という事で。


(add-hook 'window-setup-hook
          '(lambda () (w32-fullscreen-maximize-frame))
          )

そして当初の目的「起動時に最大化」はこれを.emacsに書いて達成!

あ~スッキリ。
記事検索
電子書籍発売中

「チュートリアル形式で始めるOpenAL」
サウンド怖くない。C++による8つのチュートリアルで始めるOpenALプログラミング。さああなたも、自作アプリに魅力的な音効を添えてみませんか??
⇒Kindle版 ⇒iBooks版


「iPhoneアプリ『ういろう』のレシピ」
ゲームってどうやって作ってるの?? 拙アプリ『ういろう』の製作過程を本にまとめました。もちろんソースコードつき
⇒Kindle版 ⇒iBooks版


『チュートリアル形式で始めるOpenGL[2D編]』
OpenGL怖くない。C++による16のチュートリアルで始めるOpenGLプログラミング[2D編]。さああなたも、ゲーム作りを始めてみませんか?
⇒Kindle版 ⇒iBooks版
自作ゲーム配信中

『Puzzle & Monarch』
「君主候補となって国作り!! ただし制限時間は90秒。」森を作って道をつないで...あなただけの国を作ってみませんか??
⇒AppStore


『BRICK & TRIP』
咄嗟の判断に、あなたの指先はついてこれるか?! 爽快フリックアクション!! 様々な難関をくぐり抜けて旅の終着点を目指そう!!
⇒AppStore


『ういろう』
名古屋土産ういろうがiPhoneで大活躍?! 白ういろうを守れるのはあなただけ。ひゅーん、ぼよよーん!!
⇒AppStore ⇒LITE版


『こなへん』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒AppStore ⇒LITE版


『GEOSPOT』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒Windows ⇒Mac


『TieGunner』
マウス片手に大宇宙へ飛び立とう!『しっぽシューティング』というジャンルを作って頂きました^^; WinでもMacでも動きます。ソースもあるでよw
⇒Windows ⇒Mac
QRコード
QRコード
  • ライブドアブログ