簡易輪郭線描画

OpenGLプログラミングメモ内検索 / 「簡易輪郭線描画」で検索した結果

検索 :
  • 簡易輪郭線描画
    ...teWindow( 簡易輪郭線描画 );   glutReshapeFunc(resize);   glutDisplayFunc(display);   glutMouseFunc(mouse);   glutMotionFunc(motion);   glutIdleFunc(idle);   init();   glutMainLoop(); }  
  • メニュー
    ... 秒間60フレーム 簡易輪郭線描画 固定機能 トゥーンレンダリング 固定機能 グレースケール ▲▲▲▲▲ ▼ 固定機能 スタティックメッシュ編 .MQOを読み込んで表示する(GLMetaseq) .MQOを自力で読み込んでみる1(解析編) .MQOを自力で読み込んでみる2(読み込み編) .MQOを自力で読み込んでみる3(表示編)] .MQOローダ(ワイヤーフレーム表示編) .OBJを読み込んでみる1(解析編) .OBJを読み込んでみる2(読み込み編) .OBJを読み込んでみる3(表示編) .Xを読み込んでみる1(解析編) .Xを読み込んでみる2(解析編2) .Xを読み込んでみる3(読み込み編) .Xを読み込んでみる4(表示編) .FBXを読み込んでみる1(解析編) .FBXを読み込んでみる2(読み込み編) .FBXを読み込んでみる3(表示編) ▲▲▲▲▲ ...
  • スムースシェーディング
    スムースシェーディングです。 とは言っても、OpenGLではデフォルトでスムースシェーディングをする設定に なっているので何も設定せずともスムースシェーディングで描画されるのですが フラットシェーディングやワイヤーフレーム表示と切り替えるには glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); でポリゴンを塗りつぶし設定にして glShadeModel(GL_SMOOTH); を設定します。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //青 GLfloat aqua[...
  • 文字列描画
    文字列を描画します。 文字列となるとDirectXでもOpenGLでも普通の方法は用意されていません。 GDIを使うと途端に遅くなるからです。 多くの場合、高速化のために自前の画像ファイルで文字を用意したりしていますが、 英数字ならまだしも日本語となると色々と問題がでてきます。 そこで wglUseFontBitmapsW という、文字をビットマップのディスプレイリスト で作ってくれる関数があるので、それを使います。 ここでいきなりクラスが登場していますが、初心者向けに解り易くしたつもりです。 とても便利なので使い方を覚えておきましょう。 ちなみに解放とかは省略、関数が成功したかどうかは if で調べていません。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStar...
  • 点を描画する
    ウインドウに任意の大きさのピクセルを描画します。 これさえ出来れば、どんな映像でも作り出せます。多分。 全ての基本です。 青の2ピクセルの点と赤の10ピクセルの点を描画しています。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 void Point(int x,int y,float size){  glPointSize(size);  glBegin(GL_POINTS);  glVertex2i(x , y);  glEnd(); } void display(void) {  glClear(GL_CO...
  • 線を描画する
     線を描画します。太さも設定できます。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 void Line2D(int x1,int y1,int x2, int y2,float size){  glLineWidth(size);  glBegin(GL_LINES);  glVertex2i(x1,y1);  glVertex2i(x2,y2);  glEnd(); } void display(void) {  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_B...
  • 円を描画する
    円を描画します。 OpenGLには円を描く機能はありませんので関数を自作します。 楕円も描画できるようにしておきました。 ここから再描画用にIdleコールバック関数とチラつき防止のために ダブルバッファリングが登場します。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include math.h #define WIDTH 320 #define HEIGHT 240 #define Pai 3.1415926 void Circle2D(float radius,int x,int y) {  for (float th1 = 0.0;  th1 = 360.0;...
  • 四角形を描画する
    四角形を描画します。 枠線だけの四角と塗りつぶしの機能に分けました。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 void Square2D(int x1,int y1,int x2, int y2,float size){  glLineWidth(size);  glBegin(GL_LINE_LOOP);  glVertex2i(x1,y1);  glVertex2i(x2,y1);  glVertex2i(x2,y2);  glVertex2i(x1,y2);  glEnd(); } void Sq...
  • 2Dと3Dの描画を切り替える
    2Dと言っても、今では3Dを平面的に扱って表示しています。 その方が高速だったからです。 そして、なんと言っても2Dを3Dの一部として扱うと、移動、回転、 拡大縮小が自由自在に行える利点もあります。 そこで2Dと3Dを同時に描画しようとした場合、工夫が必要になります。 上手く切り替えてやらないと3Dも2Dも同じように移動、回転、拡大縮小 してしまいます。 それには、まず3Dを描画してから glPushMatrix(); で階層を降ります。 そして2Dを描画して glPopMatrix(); で階層を上がります。 これを繰り返します。 つまり3Dを親階層として2Dを子階層とします。 なので、子階層で何をしようが、親階層には影響が無いのです。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENT...
  • MESH VIEW(メッシュビューア)
    MESH VIEW (OPENGL プログラミングメモ) ver1.16 ダウンロードはこちら MeshView ver1.16.zip //////////////////////////////////////////////////////////////////////////// MeshView [OPENGL プログラミングメモ] ver1.16 作者 OPENGLプログラミングメモ ホームページ(OPENGLプログラミングメモ) https //w.atwiki.jp/opengl/ ホームページ2(MeshView) http //www.meshview.jp/ ///////////////////////////////////////////////////////////////////////...
  • 簡易シャドウイング
    平面上に影のように見えるオブジェクトを描画します。 vertex.shader  //フラグメントシェーダーに渡す変数  varying vec3 P;//位置ベクトル  varying vec3 N;//法線ベクトル   void main(void)  {    P = vec3(gl_ModelViewMatrix * gl_Vertex);    N = normalize(gl_NormalMatrix * gl_Normal);    gl_Position = ftransform();  } flagment.shader  //頂点シェーダーから受け取る変数  varying vec3 P;//位置ベクトル  varying vec3 N;//法線ベクトル   void main(void)  {    vec3 L = normalize(gl_LightSource...
  • 画像の一部をストレッチ描画する(LodePNG)
    PNG画像を読み込んで画像の一部をストレッチ描画します。http //members.gamedev.net/lode/projects/LodePNG/に、ある LodePNGモジュールを使用します。 このLodePNGは.cppファイルと.hファイルのみで構成されているので手軽に組み込めます。 zlib も libpng も何も使わずに.cppソースのみでPNG画像が読み込めます。 また、LodePNGは、どのように使ってもよいそうです。再配布も可能です。 作者への連絡も必要ないそうです。素晴らしいですね。 使い方も簡単で LodePNG_loadFile で読み込んで LodePNG_decode で、デコード します。 画像の一部を断片的に描画するようにするにはST座標(DirectXではUV座標)を指定して あげれば良いです。 『画像を表示する』のチュートリアルでは、glTexC...
  • PNG画像の一部をストレッチ描画する(LodePNG)
    PNG画像を読み込んで画像の一部をストレッチ描画します。http //members.gamedev.net/lode/projects/LodePNG/に、ある LodePNGモジュールを使用します。 *(現在の最新版では引数などが変わっているようですので設定の仕方のページから 当サイトで使用しているバージョンをインストールして下さい。) このLodePNGは.cppファイルと.hファイルのみで構成されているので手軽に組み込めます。 zlib も libpng も何も使わずに.cppソースのみでPNG画像が読み込めます。 また、LodePNGは、どのように使ってもよいそうです。再配布も可能です。 作者への連絡も必要ないそうです。素晴らしいですね。 使い方も簡単で LodePNG_loadFile で読み込んで LodePNG_decode で、デコード します。 画像の一部を断片的に描画...
  • アルファブレンディング
    アルファブレンディングです。 アルファブレンディングで注意しなければならない事があります。 いかなるグラフィック描画でも基本的には一番最後に描画したものだけが表示されて、 それまでにあった描画は全て上書きされてしまいます。 ですが、3D描画ライブラリにはデプスバッファやZバッファがあり隠面消去を使うと手前のものは 上書きされないようにすることができます。 しかし、透明度のある物体を描画するときに隠面消去を使用すると本来は色が合成されて 表示されるはずのものが隠面消去により、まるまる描画されなかったりします。 それを解決するには、 1.不透明なオブジェクトを描画 2.半透明オブジェクトをZソート(視点からの奥行き順) 3.半透明オブジェクトの、奥にあるものから描画 という手順を踏む必要があります。 今回のプログラムではスペースキーを押す度にブレンディング係数を切り替えます。   ファイル ...
  • 隠面消去
    隠面消去です。 デプスバッファ(DirectXではZバッファ)と呼ばれるもので視点からの奥行き情報 を持っているものです。 今回は、これをON/OFFするプログラムを作りました。 最初に黄色のポリゴンが描画されて次に紫のポリゴンが描画されます。 デプスバッファが有効な時は後から描画された紫のポリゴンがきちんと隠れています。 デプスバッファが無効な時は描画の順番通りに描画されます。 右の画像は紫のポリゴンが奥にあるにもかかわらず手前の黄色のポリゴンを覆っています。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 24...
  • 板ポリゴンを表示する
    ポリゴンを描画すると言っても、実は既に図形描画関連のページや 画像表示関連のページでも使っています。 DirectXとは違い、OpenGLでは三角ポリゴンだけではなく四角ポリゴンも 使用可能です。 三角ポリゴンしか描画できないDirectXでは、3Dモデルファイルなども全て、 四角ポリゴンを三角ポリゴンに分割しなくてはなりませんでした。 すると四角ポリゴンの数だけ変換後のポリゴン数が増えて描画速度に影響します。 当然、ワイヤーフレームで表示したいときも四角ポリゴンが使用できないと 意図する映像が作れなかったりします。 ここだけ見てもOpenGLの方が優れていると言っても過言ではありません。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #inclu...
  • 固定機能との違い
    固定機能とプログラマブルシェーダーでは何がどう違うのでしょう。 固定機能ではフラットシェーディングやグーローシェーディング(スムースシェーディング)、 ワイヤーフレーム表示程度しかありませんでした。 擬似的にトゥーンシェーディングっぽく表示する事もできますが、トゥーンシェーディング とは全然品質が違います。 固定機能というのは、あらかじめ用意された範囲内で簡単手軽に機能を切り替えたり 描画に関する事を全て 『用意された中から選んで設定する』 という物でした。 簡単手軽ですが、グラフィックスで表現できる幅が文字通り固定されています。 そこで、より幅広いグラフィックスを表現するためにプログラマブルシェーダーが登場しました。 ここでは、シェーダー使用の描画とシェーダー未使用の描画をしてみました。 左が固定機能パイプラインで描画、右がシェーダーで色を反転させて描画した物です。 シェーダーファイルの...
  • 3Dシーンの設定と立方体の表示
    『2Dと3Dの描画を切り替える』では3Dシーンの設定をしていませんでした。 何も設定しないとライトや視点などは反映されません。 gluPerspective で視野角とアスペクト比、描画範囲を設定し、 gluLookAt で視点を設定、 glLightfv でライトの設定、 glMaterialfv でライトの反射を設定します。 glutSolidCube(size) で立方体を表示します。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //赤 GLfloat red[] = { 1.0, 0.0, 0...
  • VBO
    VBOです。 頂点配列はPC本体のRAM(メモリ)にデータを置いておいて、 描画する時にビデオカードにデータを転送し、それを使って描画していました。 データの少ない物を描画する分には問題ありませんがポリゴン数の多いモデルを 大量に描画したりする時に一々毎回データを転送していてはかなりの無駄が 生じています。 そこで描画を高速化する為にビデオカードのRAMに予めデータを置いておき PC本体から毎回データを転送しなくても良いようにするのがVBOです。 今回のプログラムは頂点配列の解説で使ったプログラムをVBOにしています。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, glew32.lib ) #inclu...
  • トーラスの表示と回転
    トーラス、ドーナツ形状を描画します。 glRotatef(回転角度,X軸の影響度,Y軸の影響度,Z軸の影響度) で回転行列を適用し、 glutSolidTorus( 内側の半径,外側の半径,断面の分割数,リングの分割数) でトーラスを描画します。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //オレンジ GLfloat orange[] = { 1.0, 0.6, 0.0, 1.0 }; //ライトの位置 GLfloat lightpos[] = ...
  • C++/CLI:オーナードロー
    オーナードローとは、項目の描画をプログラムで変更する事を 言います。 今回はリストボックスの項目を偶数行と奇数行で背景色を 変えてみました。 MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace Project1; [STAThreadAttribute] int main(){  MyForm ^form1 = gcnew MyForm;  form1- ShowDialog();  return 0; } MyForm.h #pragma once namespace Project1 {  using namespace System;  using namespace System Componen...
  • 考察
    大まかな歴史 DirectX 名称 登場日 概要 WinG、Display Control Interface Windows 3.1時代 DirectX 1.0 1995年10月 ゲーム作成用のAPI集GameSDKとして発表された。 DirectX 2.0 1996年6月 Direct3D (Immediate Mode, Retained Mode) の登場。 DirectX 3.0 1996年9月25日 DirectSound3D登場、DirectInputの統合。Windows NT 4.0ではSP3以降に同梱。 DirectX 4.0 登場予定だったが、DirectX 3.0からはわずかな変更であり、既にDirectX 5.0がロードマップ上にあったため、ベンダーの要望によりキャンセルされた。 DirectX 5.0 1997年8月4日 Direct3D に DrawPr...
  • フラグメントシェーダー
    フラグメントシェーダーです。DirectXではピクセルシェーダーと呼ばれる物です。 フラグメントシェーダーではピクセル単位で色々な処理ができます。 今回は頂点シェーダーで描画位置をずらし、フラグメントシェーダーで色を反転させます。 全く同じ位置で、全く同じ色で描画するプログラムがシェーダーによって変化させられています。   頂点シェーダー(vertex.shader) void main(void) {  gl_Position = gl_ModelViewMatrix * gl_Vertex + gl_ModelViewMatrix * vec4(150.0,0.0,0.0,0.0);//頂点座標の出力  gl_FrontColor = gl_Color;//そのままフラグメントシェーダーへ } フラグメントシェーダー(flagment.shader) void main() {  gl...
  • 円柱を表示してみる
    円柱を描画します。 GLUTには、そのような機能はありませんので自作します。 円柱と言っても、上の面の円(正多角形)と側面の長方形と 下の面の円(正多角形)の組み合わせに過ぎません。 上面は上方向に、側面部分は中心から面の方向に、下面は下方向に 法線を設定してあげます。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include math.h #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //青 GLfloat Blue[] = { 0.0, 0.0, 1.0, 1.0 }; //ライト...
  • ステンシルテスト
    ステンシルテストです。 ステンシルバッファの値を調べて描画するかしないかを決める事ができます。 画面の切り抜きができるようになります。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //平行移動用 float x = 0.0f; bool flag = false; //緑 GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 }; //ライトの位置 GLfloat lightpos[] = { 200.0, 150.0, -500.0, 1.0 }; void SquareF...
  • 頂点シェーダー
    頂点シェーダーは、頂点情報を受け取り色々と処理をしてフラグメントシェーダーに 情報を渡します。 頂点シェーダーでは頂点の位置を操作したり、受け取った頂点カラーを変化させたり 光源計算を頂点単位で計算したりします。 ここでは、固定機能と頂点シェーダーで全く同じ位置で四角形を描画します。 ところが、頂点シェーダーに渡された頂点位置は  + gl_ModelViewMatrix * vec4(150.0,0.0,0.0,0.0) によって、X方向に150ずれて表示されます。   頂点シェーダー(vertex.shader) void main(void) {  gl_Position = gl_ModelViewMatrix * gl_Vertex + gl_ModelViewMatrix * vec4(150.0,0.0,0.0,0.0);//頂点座標の出力  gl_FrontColor = ...
  • アニメーションとは
    3Dのアニメーションには『階層メッシュアニメーション』と『スキンメッシュアニメーション』が あります。 『階層メッシュアニメーション』はロボット的なアニメーションで、それぞれのパーツ(スタティックメッシュ)が 移動、回転、拡大縮小するのをスタティックメッシュの親子関係を管理して描画する物です。 『スキンメッシュアニメーション』は生物的なアニメーションでボーン(骨)があるものとして、 スキン(皮膚)が動いているかのような滑らかなメッシュの変形を表現する物です。 『階層メッシュアニメーション』は 固定機能 スタティックメッシュ編 で解説したスタティックメッシュを 複数使って、それを親子関係を作り管理するだけなので比較的簡単です。 親子関係の階層管理は再帰関数を使います。 再帰関数とは関数が自分自身を呼び出す物です。 ではまず、階層構造を作ってシンプルなアニメーションを表示してみたいと思います。...
  • 頂点配列
    頂点配列です。 今までは glBegin() と glEnd() で囲んで glVertex3d や glTexCoord2f を 記述してきました。 わかりやすいですが、これでは何度も何度も関数を呼び出し、機能を切り替えて 値を設定している事になり、少ないポリゴン数であれば問題ありませんが、大量の ポリゴンを描画する時には描画速度に影響します。 頂点は頂点でまとめ、法線は法線、マテリアルはマテリアルというようにデータが まとまっていた方が機能切り替えが最小限になり効率が良くなります。 頂点配列はすべてCPUが処理します。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #def...
  • 直方体を表示してみる
    直方体を描画します。 少し冗長なコードになりましたがこの方が解りやすいと思います。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //回転用 float angle = 0.0f; //ピンク GLfloat Pink[] = { 1.0, 0.5, 0.5, 1.0 }; //ライトの位置 GLfloat lightpos[] = { 200.0, 500.0, 0.0, 1.0 }; //直方体 void cuboid(float width,float height,float depth) {...
  • 法線
    法線ベクトルです。面法線とか頂点法線とかがあります。 法線ベクトルとは、2次元ではある線に垂直なベクトル、3次元ではある面に 垂直なベクトルの事です。 三角ポリゴンは、3つの頂点の並びにより面から垂直に出るベクトルが計算できます。 これが面法線です。 面法線は、光の計算をするときや面の表裏を判定する時に使われます。 今回は三角ポリゴンの面法線を強制的に設定してみました。 するとライトの位置やポリゴンの材質、色や視点など全く変えていないにもかかわらず ポリゴンの色が変化します。 これは固定機能パイプラインが描画で使用する面法線が変化させられているために ポリゴンの向きは全く変わっていないのに別の方向を向いているものとして計算されるからです。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENT...
  • ズームイン・アウト
    ズームイン・アウトです。 gluPerspective(視野角,アスペクト比, 描画する範囲(最も近い距離,最も遠い距離)); の 視野角を増減させるとズームインとズームアウトと同じ効果があります。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //オレンジ GLfloat orange[] = { 1.0f, 0.6f, 0.0f, 1.0f }; //赤 GLfloat red[] = { 1.0, 0.0, 0.0, 1.0 }; //ライトの...
  • コメント板
    簡易掲示板です。 何かありましたらコメントを。 てすと -- 管理人 (2010-03-22 11 30 06) directXのホウノライブラリは開発中止になったんですか? -- 人間 (2010-09-26 23 25 06) OpenGL最近勢いづいてていい感じですね。C#+OpenTKの開発のしやすさもなかなかすごいし、ゲーム業界もOpenGLにシフトしないかな。 -- shocker (2010-09-29 02 37 52) カンリニンサァァアアーーーン -- 人間 (2010-10-05 21 44 33) DX Wrapperライブラリの開発は無期限停止状態です。 -- 管理人 (2010-10-10 19 40 54) ゲーム業界でもPC、XBOX、DC以外はOpenGL採用の方向になっているようです。 -- 管理人 (...
  • タイマーイベント
    タイマーイベントです。 コールバック関数として登録した後、関数自身が次のタイマーイベントを 設定する事で持続的にイベントが発生します。 条件判断文でイベントを終了させたり次のタイマーイベントの発生間隔を 変えたりできます。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #define WIDTH 320 #define HEIGHT 240 int time=0; wchar_t buf[255]; class GLFONT { public  HFONT Hfont;  HDC Hdc;  GLFONT(wchar_t *fontna...
  • C++/CLIでOpenGLを簡単に表示する
    こちらに OpenGL Simple Adapter があるので使わせてもらいます。 nursの日記http //d.hatena.ne.jp/nurs/20080315/1205598655 使い方は OpenGL Simple Adapter.h をインクルードして OpenGLSimpleAdapter のインスタンスを作成して GLAdapter- BeginRender(); と GLAdapter- EndRender(); の間に いつもの OpenGL のコードを記述するだけです。 OpenGL Simple Adapter.h #pragma once #pragma comment( lib, opengl32.lib ) #pragma comment( lib, glu32.lib ) #pragma comment( lib, gdi32.lib ...
  • ディスプレイリスト
    ディスプレイリストです。 OpenGLのコマンドをハードウェアが理解できる形に保存しておく機能です。 コンパイルされた状態でディスプレイリストが作成されるのでかなり高速に 処理できます。 ただし、ディスプレイリストに出来ない関数もありますので注意が必要です。 パラメータなどは定数となりますので何回も描画する物でパラメータが変化 しない物の描画に適しています。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 float angle=0.0f; GLuint ListID=0; GLuint Model[5...
  • .midを再生する(mciコマンド)
    mciコマンドを使用して midi を再生します。 他にも様々な音声ファイルや動画なども再生できますが、 今回は midi だけです。 ファイル main.cpp sample.mid (自分で用意して下さい) main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, winmm.lib ) #include windows.h #include mmsystem.h #include GL/freeglut/freeglut.h #include stdio.h #define WIDTH 320 #define HEIGHT 240 MCI_OPEN_PARMS mop; class GLFONT { public  HFON...
  • アルファテスト
    アルファテストです。 アルファテストとはイメージデータのアルファ値を調べて描画するか しないかを決めるためのものです。 今回は GL_GREATER を指定しているので glAlphaFunc(GL_GREATER, alpha); の alpha より透明度が大きいピクセルを描画します。 今回のプログラムはしばらくするとアルファ値に応じて画像が切り抜かれていきます。   ファイル main.cpp lodepng.cpp lodepng.h test.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include lodepng.h #define WIDTH 320 #defin...
  • LibSynth++ 解析編
    では、早速 LibSynth++ の使い方を探ってみたいと思います。 http //www5.atpages.jp/~my04337/ tomoteruの生成物倉庫 の 初代LibSynth++ のページにある *LibSynth++ AlphaTest Rev.18 LibSynth++ – Header,Lib(Visual Studio2008用) から LibSynthPP.cab をダウンロードします。 解凍して Include フォルダにある LibSynth++.h を見てみましょう。   ざっと見た所、 ~90行まで 定数定義 ~296行まで メッセージ制御系 ~484行まで バッファ処理系 ~601行まで 双二次フィルタ系 ~636行まで WaveTable ~709行まで オシレータ ~931行まで midiパーサ系 ~1163行まで オシレータ系 ~165...
  • .wavを再生する(win32API)
    Win32API の PlaySound を使用して .wav を再生します。 glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS); を 指定すると freeglut の場合、 glutMainLoop(); から戻ってくる事が可能です。 いつも解放はOSまかせにしている管理人ですが、今回は解放コードも記述しました。 ファイル main.cpp sample.wav (自分で用意して下さい) main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, winmm.lib ) #include windows.h #include mmsystem...
  • GLSLとの変数のやり取り
    GLSL に値を渡すには glGetUniformLocation を使用して シェーダー側の変数のIDを取得します glUniform1f 等でそのIDの変数に値をセットします。 vertex.shader  //OpenGLから受け取る変数 uniform float factor; vec4 v4 = vec4(0.0, 0.0, 0.0, 0.0);   void main(void) {  v4.x=factor;  gl_Position = gl_ModelViewMatrix * gl_Vertex + gl_ModelViewMatrix * v4;//頂点座標の出力  gl_FrontColor = gl_Color;//そのまま出力 } flagment.shader   //OpenGLから受け取る変数 uniform float flagment; vec4 ...
  • 3D:球と球
    バウンディングスフィアです。 3Dの当たり判定では最も計算コストが少なく、簡単に実装できるため 多用されます。 仕組みですが、まず、球の中心位置と球の半径を設定します。 そして、球と球の中心間の距離が互いの半径の合計値以下であれば 接触していると判断できます。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #include math.h #define WIDTH 320 #define HEIGHT 240 //平行移動用 float x = 0.0f; bool flag = false; //3つのベクトル struct Vector3f{  float x;  float y; ...
  • マウスイベント
    マウスイベントです。 glut ではマウスホイールは対応していませんでしたが freeglut ではマウスホイールのスクロールを検出できます。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdlib.h #include string using namespace std; wstring wstr=L ; wchar_t buf[255]; #define WIDTH 400 #define HEIGHT 320 int MouseX,MouseY; bool M_left=false; bool M_right=false; bool ...
  • ODE:箱の自由落下と地面との衝突判定
    箱が上から落ちてきて、地面でバウンドします。 値を設定するだけで、後は勝手にシミュレーションしてくれます。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, ode_doubled.lib ) #include GL/freeglut/freeglut.h #include ode/ode.h #include vector using namespace std; #define WIDTH 320 #define HEIGHT 240 #define ODE_MAX_CONTACTS 1024 //ライトの位置 GLfloat lightpos[] = { 2.0, 4.0, 1.0, 0.0 }...
  • 環境光
    現実世界では、太陽や照明からの光が様々な物体に反射して光が直接当たらない場所でも 間接的に反射してきた光によってある一定の明るさになっています。 この空間に溢れる光を環境光といいます。 CGでこれを再現するにはラジオシティやグローバルイルミネーションなどがありますが、 計算コストが非常に高く、ゲームなどのリアルタイムな画面更新が求められるプログラムでは とても使う事はできません。 そこで、一般的には割とそれらしく見せるためにシーン全体に影響する一定の色を環境光として 使います。 vec4 ambient = gl_FrontLightProduct[0].ambient; で、OpenGLからアンビエント情報を受け取ります。 これを紐解いていくと、 glLightfv(GL_LIGHT0, GL_AMBIENT, Light); で設定したライトの光の範囲内で glMaterialfv(G...
  • ワイヤーフレーム表示
    ワイヤーフレーム表示です。 それっぽくするために白を割り当てました。 本当であればライトの効果を切ると正にワイヤーフレームとなるのですが 今回は球をわかりやすくするためにライトはそのままです。 DirectXと違い、四角ポリゴンのワイヤーが描画できます。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //白 GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; //ライトの位置 GLfloat lightpos[] = { 200.0, 1000.0, -500.0, 1....
  • 拡散照明
    環境光だけではのっぺりとした図にしかなりません。 立体的に見せるには陰影を付けてやらなければなりません。 拡散反射光は光源から入ってくる光を全ての方向に均一に反射します。 紙のようにざらざらとした光沢の少ないものの表現に適しています。 反射する光の量は、入射する光の量に応じて変化し、入射する光の量は 光のあたる場所によって異なるので、物体の形に陰が付きます。 左の画像は頂点シェーダーのみで陰影を付けたものですが、ハイライトの部分に何やら 線のようなものが見えます。これは頂点単位で色の補間が行われているためです。 右の画像は頂点シェーダーで位置ベクトルと法線ベクトルを計算しておき、フラグメントシェーダーに 渡してフラグメントシェーダーで光の計算をしています。 こうするとピクセル単位で色の計算(補間)が行われるので非常に綺麗な結果が得られます。 フラグメントシェーダーに渡す変数は varyin...
  • 鏡面反射
    プラスチックや金属など、よく磨きこまれた反射率の高い物体に光が当たると 表面が光り輝いているように見えます。 そのハイライトを表現するのが鏡面反射です。   vertex.shader //フラグメントシェーダーに渡す変数 varying vec3 P;//位置ベクトル varying vec3 N;//法線ベクトル void main(void) {   P = vec3(gl_ModelViewMatrix * gl_Vertex);   N = normalize(gl_NormalMatrix * gl_Normal);   gl_Position = ftransform(); } flagment.shader //頂点シェーダーから受け取る変数 varying vec3 P;//位置ベクトル varying vec3 N;//法線ベクトル void main(void)...
  • バンプマッピング
    バンプマッピングです。 右はバンプマップ無しで左がバンプマップ有りの状態です。 バンプマッピングは見る角度によっては思ったような効果は出ません。 brick128.png bump128.png vertex.shader //フラグメントシェーダーに渡す変数 varying vec3 P;//位置ベクトル varying vec3 N;//法線ベクトル varying vec3 T;//接線ベクトル varying vec3 B;//従法線ベクトル attribute vec3 tangent;//OpenGLから void main(void) {   P = vec3(gl_ModelViewMatrix * gl_Vertex);   N = normalize(gl_NormalMatrix * gl_Normal);   T = normalize(gl_NormalM...
  • 3D:OBBとOBB
    OBBです。 バウンディングスフィアの応用で中心位置と半径を使い、 内積と外積を駆使して当たり判定を行います。 font.h #pragma once class GLFONT { public  HFONT Hfont;  HDC Hdc;  GLFONT(wchar_t *fontname, int size);  void DrawStringW(int x,int y,wchar_t *format, ...); }; //コンストラクタ フォント作成 GLFONT GLFONT(wchar_t *fontname, int size) {  Hfont = CreateFontW(         size,      //フォント高さ         0,       //文字幅         0,       //テキストの角度         0,       ...
  • .MQOローダ(ワイヤーフレーム表示編)
    ワイヤーフレーム表示です。 最初、 glDrawArrays を使って描画したら遅くて実用的ではありませんでした。 そこで色々、思考錯誤して glMultiDrawArrays を使ったら、割りとそれなりの 速度で描画できるようになったので公開します。   PNG.h #include lodepng.h //テクスチャクラス class TEXTURE{ protected  LodePNG_Decoder decoder;//デコーダ  unsigned char* buffer;//バッファ  size_t buffersize, imagesize;//サイズ public  TEXTURE();  TEXTURE(const char* FileName);//コンストラクタ  void LOAD_PNG(const char* FileName);//PNG読み込み ...
  • @wiki全体から「簡易輪郭線描画」で調べる

更新順にページ一覧表示 | 作成順にページ一覧表示 | ページ名順にページ一覧表示 | wiki内検索