前回のHelloWorld表示だけのものを本に従って少しずつ改良。
「ゲストブック」ページの作成にチャレンジ。
まずは新規のHttpServletクラスを継承したクラスを作成。
本に従ってテンプレートは使わずにHTML直書き。
GETリクエスト時の処理を記述。
war/WEB-INF/web.xmlを修正。
/guestbookというパスでのGETリクエストに対してのサーブレットクラスを定義。
実際に起動して「http://localhost:8888/guestbook」をブラウザで表示。
ん〜いい感じ♪。
次は送信した際の処理を追加。POSTリクエストに対応する実装。
入力された内容を取得しコンソール出力。
すぐさま、/guestbookへリダイレクトを行う。
コンソール出力結果。
2014年6月22日日曜日
2014年6月21日土曜日
Cent OSでOpenGL 5 - 描画処理 -
今回でやっとOpenGLのメイン部分を解読。
全体像は以下。
上から順に・・・
全体像は以下。
void DrawAQuad() {
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1., 1., -1., 1., 1., 20.);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0., 0., 10., 0., 0., 0., 0., 1., 0.);
glBegin(GL_QUADS);
glColor3f(1., 0., 0.); glVertex3f(-.75, -.75, 0.);
glColor3f(0., 1., 0.); glVertex3f( .75, -.75, 0.);
glColor3f(0., 0., 1.); glVertex3f( .75, .75, 0.);
glColor3f(1., 1., 0.); glVertex3f(-.75, .75, 0.);
glEnd();
}
上から順に・・・
void glClearColor( GLclampf red , GLclampf green , GLclampf blue , GLclampf alpha );
バッファを初期化する色情報を設定する。float型で0.0〜1.0で指定する。void glClear(GLbitfield mask);実際のバッファを初期化。以下定数の組み合わせで初期化対称を設定。
定数 | 解説 |
---|---|
GL_COLOR_BUFFER_BIT | カラー バッファ |
GL_DEPTH_BUFFER_BIT | デプス バッファ |
GL_ACCUM_BUFFER_BIT | アキュムレーション バッファ |
GL_STENCIL_BUFFER_BIT | ステンシル バッファ |
※ステンシルバッファ
・・・ステンシルは型板という意味。塗料を塗る時に型板で塗らない箇所を作る
ように、OpenGLでも点を描画するかしないかのマスクを設定する
※アキュムレーションバッファ
void glMatrixMode(GLenum mode);
OpenGLには3つの変換行列があり、操作対称の行列を指定
定数 | 解説 |
---|---|
GL_MODEVIEW | モデルビュー変換行列 |
GL_PROJECTION | 投影変換行列 |
GL_TEXTURE | テクスチャ行列 |
void glLoadIdentity(void);
行列の初期化。
void glOrtho(GLdouble left, GLdouble right, GLdouble bottom
GLdouble top, GLdouble near, GLdouble far);
現在の行列と正射影行列の乗算を行う。
void gluLookAt(///);
以下サイト参照。void glBegin(GLenum mode);頂点データの指定開始。モードは以下定数を指定。
定数 解説 GL_POINTS 各頂点を単独の点として扱う 頂点 n は、点 n を意味し n この点が描画される GL_LINES 2つの頂点をペアとし、それぞれのペアを独立した線分として扱う GL_LINE_STRIP 最初の頂点から最後の頂点まで、線分を連結して描画する GL_LINE_LOOP すべての頂点を線分で連結する GL_TRIANGLES 3つの頂点をペアとし、それぞれ独立した三角形として扱う GL_TRIANGLE_STRIP 連結した三角形のグループを描画する GL_TRIANGLE_FAN 最初の頂点を軸に、連結した三角形のグループを描画する GL_QUADS 4つの頂点をペアとし、それぞれ独立した四角形として扱う GL_QUAD_STRIP 連結した四角形のグループを描画する GL_POLYGON 単独の凸ポリゴンを描画する 参考URL
GAEと戯れる 1 - 環境設定 & デプロイ -
以前から興味があったGAEに挑戦!!
以下の書籍を参考に進めていこうと思います。開発環境の構築
何はともあれ、開発環境の構築。本を見ながらEclipseのプラグインをインストール。
※使用するEclipse
新規ソフトウェアのインストール -> 作業対称に以下URLを設定
https://dl.google.com/eclipse/plugin/4.2
インストール完了->再起動。
とりあえずお約束のhello worldでもと思っていたら、色々エラーが?
どうやら、Javaのバージョンが6ではなく、7を使用するようにとの事でした。
JDK 7をインストール。
改めて、新規プロジェクト作成。
無事作成できました(^o^)/
フォルダ階層の説明
[src]
Javaのソースコードやリソース類(propertiesファイル、XMLファイル)
[war]
Webアプリケーション用のリソース類(HTML, JavaScript, 画像ファイルなど)
実行時に必要なライブラリ、App Engine用の設定ファイル
[war/WEB-INF/lib]
GAE用のライブラリ
起動と停止
さっそく起動してHello Worldを表示させてみる。・起動
プロジェクト右クリック->実行->Webアプリケーションで
localhost:8888で起動されます。
ブラウザで確認
無事ブラウザ上で動作できている事を確認。
・停止
停止方法はConsoleビューのツールバー上の赤い四角いアイコンをクリック。
デプロイ
実際にGAE上にデプロイしてみる。。がまずは準備(--;)
アプリケーション領域の作成。
今度はEclipseでデプロイする為の編集を行います。
war/WEB-INF/appengine-web.xmlを修正。<application>要素に
作成したアプリケーションIDを設定。
プロジェクト名を右クリック->Google->Appエンジンへデプロイ
とりあえずデプロイまで完成(^^)/
2014年6月12日木曜日
Cent OSでOpenGL 4 - XLib調査2 -
前回の続き・・
XMapWindow
Xサーバーとウィンドウとのマッピング
XStoreName
Window名の設定
ここからOpenGLの初期化
glXCreateContext
概要:GLXレンダリングコンテキストの作成
引数:Display* Xサーバー
XVisualInfo* コンテキストが利用可能なフレームバッファリソースの定義
GLXContext 共有するコンテキスト
Bool レンダリングをグラフィックシステムと直接接続で行う(GL_TRUE)か
サーバー経由で行うか(GL_FALSE)
glXMakeCurrent
概要:GLXコンテキストをウィンドウ又はGLXピックスマップ(Bitmap)に割り当てる
引数:Display* Xサーバー
GLXDrawable XウィンドウIDかGLXピックスマップID
GLXContext コンテキスト
glEnable
概要:有効な描画方法を設定
参考:http://www.westernvillage.co.jp/openglprogram.htm
XNextEvent
概要:イベントを型によって選択
参考:http://xjman.dsl.gr.jp/man/man3/XNextEvent.3x.html
XGetWindowAttributes
概要:ウィンドウの現在の属性を取得
参考:http://xjman.dsl.gr.jp/man/man3/XGetWindowAttributes.3x.html
glViewport
概要:ビューポートの設定
参考:http://wisdom.sakura.ne.jp/system/opengl/gl13.html
glXSwapBuffers
概要:ブッファの入れ替え
参考:http://manpages.ubuntu.com/manpages/gutsy/ja/man3/glXSwapBuffers.3x.html
cmap = XCreateColormap(dpy, root, vi->visual, AllocNone);
これは一体何をしているのか?
概要:カラーマップと色構造体の生成
引数:Display * ・・・ Xサーバの接続を指定
Window ・・・ カラーマップを作るスクリーンに属するウィンドウ
Visual * ・・・ スクリーンがサポートするVisual
int ・・・ 割当られるカラーマップのエントリー
XSetWindowAttributes swa;
swa.colormap = cmap;
swa.event_mask = ExposureMask | KeyPressMask;
win = XCreateWindow(dpy, root, 0, 0, 600, 600, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa);
XCreateWindow
概要:ウィンドウの生成
XMapWindow(dpy, win);
XStoreName(dpy, win, "VERY SIMPLE APPLICATION”);
XMapWindow
Xサーバーとウィンドウとのマッピング
XStoreName
Window名の設定
ここからOpenGLの初期化
glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);
glXMakeCurrent(dpy, win, glc);
glEnable(GL_DEPTH_TEST);
glXCreateContext
概要:GLXレンダリングコンテキストの作成
引数:Display* Xサーバー
XVisualInfo* コンテキストが利用可能なフレームバッファリソースの定義
GLXContext 共有するコンテキスト
Bool レンダリングをグラフィックシステムと直接接続で行う(GL_TRUE)か
サーバー経由で行うか(GL_FALSE)
glXMakeCurrent
概要:GLXコンテキストをウィンドウ又はGLXピックスマップ(Bitmap)に割り当てる
引数:Display* Xサーバー
GLXDrawable XウィンドウIDかGLXピックスマップID
GLXContext コンテキスト
glEnable
概要:有効な描画方法を設定
参考:http://www.westernvillage.co.jp/openglprogram.htm
while(1) {
XNextEvent(dpy, &xev);
if(xev.type == Expose) {
XGetWindowAttributes(dpy, win, &gwa);
glViewport(0, 0, gwa.width, gwa.height);
DrawAQuad();
glXSwapBuffers(dpy, win);
}
else if(xev.type == KeyPress) {
glXMakeCurrent(dpy, None, NULL);
glXDestroyContext(dpy, glc);
XDestroyWindow(dpy, win);
XCloseDisplay(dpy);
exit(0);
}
} /* this closes while(1) { */
} /* this is the } which closes int main(int argc, char *argv[]) { */
概要:イベントを型によって選択
参考:http://xjman.dsl.gr.jp/man/man3/XNextEvent.3x.html
XGetWindowAttributes
概要:ウィンドウの現在の属性を取得
参考:http://xjman.dsl.gr.jp/man/man3/XGetWindowAttributes.3x.html
glViewport
概要:ビューポートの設定
参考:http://wisdom.sakura.ne.jp/system/opengl/gl13.html
glXSwapBuffers
概要:ブッファの入れ替え
参考:http://manpages.ubuntu.com/manpages/gutsy/ja/man3/glXSwapBuffers.3x.html
2014年6月2日月曜日
Cent OSでOpenGL 3 - XLib調査 -
前回のサンプルプログラムを紐解いてみる
まずはメイン関数で最初に呼び出される以下関数。
dpy = XOpenDisplay(NULL);
名前からしてXLibの関数だな。
詳細:Xサーバーへの接続。
引数:char *display_name
ハードウェアのディスプレイ名を指定。
NULLの場合は環境変数DISPLAYの値を使用。
戻り値:Display構造体(Xlib.hで定義)
typedef struct
#ifdef XLIB_ILLEGAL_ACCESS
_XDisplay
#endif
{
XExtData *ext_data; /* hook for extension to hang data */
struct _XPrivate *private1;
int fd; /* Network socket. */
int private2;
int proto_major_version;/* major version of server's X protocol */
int proto_minor_version;/* minor version of servers X protocol */
char *vendor; /* vendor of the server hardware */
XID private3;
XID private4;
XID private5;
int private6;
XID (*resource_alloc)( /* allocator function */
struct _XDisplay*
);
int byte_order; /* screen byte order, LSBFirst, MSBFirst */
int bitmap_unit; /* padding and data requirements */
int bitmap_pad; /* padding requirements on bitmaps */
int bitmap_bit_order; /* LeastSignificant or MostSignificant */
int nformats; /* number of pixmap formats in list */
ScreenFormat *pixmap_format; /* pixmap format list */
int private8;
int release; /* release of the server */
struct _XPrivate *private9, *private10;
int qlen; /* Length of input event queue */
unsigned long last_request_read; /* seq number of last event read */
unsigned long request; /* sequence number of last request. */
XPointer private11;
XPointer private12;
XPointer private13;
XPointer private14;
unsigned max_request_size; /* maximum number 32 bit words in request*/
struct _XrmHashBucketRec *db;
int (*private15)(
struct _XDisplay*
);
char *display_name; /* "host:display" string used on this connect*/
int default_screen; /* default screen for operations */
int nscreens; /* number of screens on this server*/
Screen *screens; /* pointer to list of screens */
unsigned long motion_buffer; /* size of motion buffer */
unsigned long private16;
int min_keycode; /* minimum defined keycode */
int max_keycode; /* maximum defined keycode */
XPointer private17;
XPointer private18;
int private19;
char *xdefaults; /* contents of defaults from server */
/* there is more to this structure, but it is private to Xlib */
}
#ifdef XLIB_ILLEGAL_ACCESS
Display,
#endif
*_XPrivDisplay;
次にXOpenDisplayで取得したDisplay構造体を使って何やら行っている模様。
root = DefaultRootWindow(dpy);
Xlib.hに以下のマクロとして定義されていました。
#define DefaultRootWindow(dpy) (ScreenOfDisplay(dpy,DefaultScreen(dpy))->root)
#define ScreenOfDisplay(dpy, scr)(&((_XPrivDisplay)dpy)->screens[scr])
#define DefaultScreen(dpy) (((_XPrivDisplay)dpy)->default_screen)
Screen構造体定義
typedef struct {
XExtData *ext_data; /* hook for extension to hang data */
struct _XDisplay *display;/* back pointer to display structure */
Window root; /* Root window id. */
int width, height; /* width and height of screen */
int mwidth, mheight; /* width and height of in millimeters */
int ndepths; /* number of depths possible */
Depth *depths; /* list of allowable depths on the screen */
int root_depth; /* bits per pixel */
Visual *root_visual; /* root visual */
GC default_gc; /* GC for the root root visual */
Colormap cmap; /* default color map */
unsigned long white_pixel;
unsigned long black_pixel; /* White and Black pixel values */
int max_maps, min_maps; /* max and min color maps */
int backing_store; /* Never, WhenMapped, Always */
Bool save_unders;
long root_input_mask; /* initial root input mask */
} Screen;
XサーバーのルートバックグラウンドのWindow(X.h内でXID(unsigned long)として定義されている)を返している。
次はGLっぽい。
vi = glXChooseVisual(dpy, 0, att);
詳細:グラフィックに必要な能力を要求する。GLサーバーはこれによって必要なVisualを選定する。
以下が必要な要件。
GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None };
結構指定できるものが多数あるので詳しくは以下サイトを参照http://lmb.informatik.uni-freiburg.de/people/reisert/opengl/doc/glXChooseVisual.html
typedef struct {
Visual *visual;
VisualID visualid;
int screen;
int depth;
#if defined(__cplusplus) || defined(c_plusplus)
int c_class; /* C++ */
#else
int class;
#endif
unsigned long red_mask;
unsigned long green_mask;
unsigned long blue_mask;
int colormap_size;
int bits_per_rgb;
} XVisualInfo;
2014年6月1日日曜日
Cent OSでOpenGL 2 - GLX拡張 -
前回はとりあえずウィンドウを表示してみたが、今回は真面目にOpenGLについて勉強。
まずは公式サイトを見てみる。
OpenGLの公式サイトはこちら
公式サイトのGetting Started 〜を見てみる。
主要なOSにはOpenGLが既に入っているが、ドライバーは最新に〜という内容が書かれてあるっぽい。
以下それぞれのプラットフォーム毎の説明
・Linux
Linuxのグラフィックスはほぼ "X Window”だ。LinuxでOpenGLをサポートするという事は
X WindowのGLX拡張を使用する事になる。
Direct Rendering Infrastructure(DRI)は簡単にハードウェアアクセラレーションを使える
ドライバーのフレームワーク。
DRIはXFree86の4.0からのサポートされているが、現在はXFree86からXorgが
主流となっている。
コンパイル時にはOpenGLのライブラリをリンクする為に「-lGL」を指定する必要がある。
・Windows
コンパイルする際は「OpenGL32.lib」をリンクする必要がある。
実際のプログラミング
1. 初期化
各プラットフォールで異なった書き方で初期化する必要がある。
初期化には2つのフェースがある。
1) OpenGL Context の作成
2) OpenGLを使用する為に必要な機能をロード
GLXContext glXCreateContext( | Display * | dpy, |
XVisualInfo * | vis, | |
GLXContext | shareList, | |
Bool | direct) ; |
上記関数を使用しContextを作成。
以下簡単なウィンドウ表示サンプル
// -- Written in C -- // #include<stdio.h> #include<stdlib.h> #include<X11/X.h> #include<X11/Xlib.h> #include<GL/gl.h> #include<GL/glx.h> #include<GL/glu.h> Display *dpy; Window root; GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None }; XVisualInfo *vi; Colormap cmap; XSetWindowAttributes swa; Window win; GLXContext glc; XWindowAttributes gwa; XEvent xev; void DrawAQuad() { glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1., 1., -1., 1., 1., 20.); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0., 0., 10., 0., 0., 0., 0., 1., 0.); glBegin(GL_QUADS); glColor3f(1., 0., 0.); glVertex3f(-.75, -.75, 0.); glColor3f(0., 1., 0.); glVertex3f( .75, -.75, 0.); glColor3f(0., 0., 1.); glVertex3f( .75, .75, 0.); glColor3f(1., 1., 0.); glVertex3f(-.75, .75, 0.); glEnd(); } int main(int argc, char *argv[]) { dpy = XOpenDisplay(NULL); if(dpy == NULL) { printf("\n\tcannot connect to X server\n\n"); exit(0); } root = DefaultRootWindow(dpy); vi = glXChooseVisual(dpy, 0, att); if(vi == NULL) { printf("\n\tno appropriate visual found\n\n"); exit(0); } else { printf("\n\tvisual %p selected\n", (void *)vi->visualid); /* %p creates hexadecimal output like in glxinfo */ } cmap = XCreateColormap(dpy, root, vi->visual, AllocNone); swa.colormap = cmap; swa.event_mask = ExposureMask | KeyPressMask; win = XCreateWindow(dpy, root, 0, 0, 600, 600, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa); XMapWindow(dpy, win); XStoreName(dpy, win, "VERY SIMPLE APPLICATION"); glc = glXCreateContext(dpy, vi, NULL, GL_TRUE); glXMakeCurrent(dpy, win, glc); glEnable(GL_DEPTH_TEST); while(1) { XNextEvent(dpy, &xev); if(xev.type == Expose) { XGetWindowAttributes(dpy, win, &gwa); glViewport(0, 0, gwa.width, gwa.height); DrawAQuad(); glXSwapBuffers(dpy, win); } else if(xev.type == KeyPress) { glXMakeCurrent(dpy, None, NULL); glXDestroyContext(dpy, glc); XDestroyWindow(dpy, win); XCloseDisplay(dpy); exit(0); } } /* this closes while(1) { */ } /* this is the } which closes int main(int argc, char *argv[]) { */
コンパイル
gcc -o test test.c -lX11 -lGL -lGLU実行すると以下のグラフィックが表示される。
登録:
投稿 (Atom)