PNG画像の一部をストレッチ描画する(LodePNG)

OpenGLプログラミングメモ内検索 / 「PNG画像の一部をストレッチ描画する(LodePNG)」で検索した結果

検索 :
  • PNG画像の一部をストレッチ描画する(LodePNG)
    PNG画像を読み込んで画像の一部をストレッチ描画します。http //members.gamedev.net/lode/projects/LodePNG/に、ある LodePNGモジュールを使用します。 *(現在の最新版では引数などが変わっているようですので設定の仕方のページから 当サイトで使用しているバージョンをインストールして下さい。) このLodePNGは.cppファイルと.hファイルのみで構成されているので手軽に組み込めます。 zlib も libpng も何も使わずに.cppソースのみでPNG画像が読み込めます。 また、LodePNGは、どのように使ってもよいそうです。再配布も可能です。 作者への連絡も必要ないそうです。素晴らしいですね。 使い方も簡単で LodePNG_loadFile で読み込んで LodePNG_decode で、デコード します。 画像の一部を断片的に描画...
  • 画像の一部をストレッチ描画する(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...
  • メニュー
    ...する(glpng) PNG画像の一部をストレッチ描画する(LodePNG) DDS画像を表示する BMP画像を表示する JPEG画像を表示する 板ポリゴンを表示する 2Dと3Dの描画を切り替える 3Dシーンの設定と立方体の表示 ズームイン・アウト 球を表示して移動する トーラスの表示と回転 円錐の表示と拡大縮小 円柱を表示してみる 直方体を表示してみる 指定座標で円運動 フラットシェーディング ワイヤーフレーム表示 スムースシェーディング マテリアルの設定 カラーマテリアル 固定機能 テクスチャマッピング ミップマップ バイリニアフィルタリング 異方性フィルタリング 視点の回転(クォータニオン) 超簡単に任意軸回転 ビルボード 法線 隠面消去 アルファブレンディング アルファテスト 固定機能 フォグ アンチエイリアシング ステンシルテスト 固定機能 鏡面反射 固定機能 スポットライト...
  • PNG画像を表示する(glpng)
    先の『画像を表示する(GDI+)』では GDI+ を使いましたが、 GdiPlus.h を見ると struct IDirectDrawSurface7; なる表記があります。 内部で DirectX7 を使用しているようです。 OpenGLなのにDirectXは使いたくない!!とか、 WindowsじゃないOSで画像を読み込みたい!!という方のために glpng を 使った方法も記載しておきます。   ファイル main.cpp sample.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #include gl/glpng.h #define WIDTH ...
  • 画像を表示する(glpng)
    先の『画像を表示する(GDI+)』では GDI+ を使いましたが、 GdiPlus.h を見ると struct IDirectDrawSurface7; なる表記があります。 内部で DirectX7 を使用しているようです。 OpenGLなのにDirectXは使いたくない!!とか、 WindowsじゃないOSで画像を読み込みたい!!という方のために glpng を 使った方法も記載しておきます。   #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #include gl/glpng.h #define WIDTH 320 #define HEIGHT 240 pngInfo info; GL...
  • ビルボード
    ビルボードです。 ビルボードというのは常に視点(カメラ)を向く板の事です。 古くは樹木や球のポリゴン数を減らすために用いられました。 現在では火花や雪などのパーティクルとして主に使用されます。 ビルボードにはビュー行列を逆行列にする方法もありますが、 今回はもっと簡単に実装できるやり方がありましたので紹介して おきます。 3D空間のビルボードオブジェクトの中心位置を保存しておき、 glLoadIdentity(); して初期化します。 中心位置から画像サイズ分だけ+-してポリゴンを描画すると 行列計算なしでビルボードができます。   ファイル main.cpp lodepng.cpp lodepng.h tree.png map.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainC...
  • アルファテスト
    アルファテストです。 アルファテストとはイメージデータのアルファ値を調べて描画するか しないかを決めるためのものです。 今回は 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...
  • 異方性フィルタリング
    異方性フィルタリングです。 ミップマップで線形補間を適用するとミップマップの境目から先はフィルタリングにより、 ぼやけてしまいました。 拡張機能の異方性フィルタリングを使うとミップマップの境目を目立たなくする事が できます。 今回のプログラムはスペースキーでON/OFFを切り替えます。   ファイル main.cpp lodepng.cpp lodepng.h maptip.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, glew32.lib ) #include GL/glew.h #include GL/freeglut/freeglut.h #include stdio.h #include strin...
  • ミップマップ
    ミップマップです。 ミップマップは、あらかじめ元のサイズのテクスチャを縮小したものを用意しておき、 小さく表示される時は小さいテクスチャを使用します。 今回のプログラムはスペースキーを押す度にフィルタが切り替わります。   ファイル main.cpp lodepng.cpp lodepng.h maptip.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #include string #include lodepng.h using namespace std; #define WIDTH 640 #define HEIGHT 480 bool f...
  • バイリニアフィルタリング
    バイリニアフィルタリングです。 glTexParameteri に GL_LINEAR を設定するだけで使用できます。   ファイル main.cpp lodepng.cpp lodepng.h maptip.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #include string #include lodepng.h using namespace std; #define WIDTH 320 #define HEIGHT 240 GLuint Tex[2]; void Draw(float x,float y,float w,float h...
  • GLSL:テクスチャマッピング
    GLSLでテクスチャを描画します。 vertex.shader   //フラグメントシェーダーに渡す変数   varying vec3 P;//位置ベクトル   varying vec3 N;//法線ベクトル    void main(void)   {     P = vec3(gl_ModelViewMatrix * gl_Vertex);     N = normalize(gl_NormalMatrix * gl_Normal).xyz;     gl_TexCoord[0] = gl_MultiTexCoord0;     gl_Position = ftransform();   } flagment.shader   //頂点シェーダーから受け取る変数   varying vec3 P;//位置ベクトル   varying vec3 N;//法線ベクトル   uniform...
  • 点を描画する
    ウインドウに任意の大きさのピクセルを描画します。 これさえ出来れば、どんな映像でも作り出せます。多分。 全ての基本です。 青の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;...
  • 画像を表示する(GDI+)
    2D画像を読み込んで表示します。 DirectXは、D3DXという便利なライブラリが .bmp、.dds、.dib、.jpg、.png、.tga 形式の 画像を読み込んでくれましたが、OpenGLには何もありません。 .bmp ですら、自前で読み込み関数を作ったりしなければなりません。 glpng とか libjpeg など、その他諸々のライブラリを用いても良いのですが、一つのライブラリで 一つの画像形式とかでは面倒くさいです。配布する .dll などが増えるのも嫌です。 そこで割と身近にあり、Windows XP/Vista/7/8の4世代で手軽に使える GDI+ という物を発見しました。 Windows Imaging Component なるものもあるようですが、Vista以降標準搭載なので今回は インストールなどせずとも最初からある GDI+ にします。 BMP, GIF, JPE...
  • ステンシルテスト
    ステンシルテストです。 ステンシルバッファの値を調べて描画するかしないかを決める事ができます。 画面の切り抜きができるようになります。   ファイル 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...
  • 床面反射
    床面反射です。 床面を半透明で描画し、オブジェクトを床面を境にして 反対側にも描画する事で疑似的に映り込みを表現しています。 brick.png marble.png  vertex.shader varying vec3 P; varying vec3 N; void main(void) {   P = vec3(gl_ModelViewMatrix * gl_Vertex);   N = normalize(gl_NormalMatrix * gl_Normal).xyz;   gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;   gl_Position = ftransform(); } flagment.shader varying vec3 P; varying vec3 N; uniform sam...
  • VBO(テクスチャ付)
    テクスチャも含めてVBOで描画します。 ファイル main.cpp lodepng.cpp lodepng.h PNG.h sample.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, glew32.lib ) #include gl/glew.h #include GL/freeglut/freeglut.h #include PNG.h #define WIDTH 320 #define HEIGHT 240 GLuint VboId[4];//4つ分 float angle=0.0f; GLuint texID; TEXTURE *texture; //頂点データ 3面を4頂点で作成する 1頂点はx...
  • .Xを読み込んでみる3(読み込み編)
    では実際にXファイルを読み込んでみます。 今回は読み込み編という事で3角ポリゴンのみです。http //www.geocities.co.jp/Playtown-Spade/7188/こちらのデータを使わせて頂いています。 事前にメタセコイアで3角ポリゴンに変換してテクスチャを PNG 形式に変換しています。 Xファイルのテンプレートを除去しないと読み込みできません。 PNG.h #include lodepng.h //テクスチャクラス class TEXTURE{ protected  LodePNG_Decoder decoder;//デコーダ  unsigned char* buffer;//バッファ  size_t buffersize, imagesize;//サイズ public  TEXTURE();  TEXTURE(const char* FileName)...
  • 設定の仕方
    Visual Studio 2022 Community のインストール Visual Studio 2022 Community https //visualstudio.microsoft.com/ja/downloads/ こちらから、Visual Studio 2022 Community をインストールしてください。 デフォルトだと開発環境の背景色が『濃色』になっていて見にくいので『淡色』に変更します。 ツール→オプションの環境→全般の配色テーマを『淡色』にします。 これで昔ながらの見やすい開発環境になりました。 Visual Studio 2012 Express for Windows Desktop のインストール Visual Studio 2012 Express for Windows Desktop http //www...
  • 投影マッピング
    投影マッピングです。 プロジェクターで投影させたようにテクスチャを張れます。 proj.png vertex.shader varying vec3 P; varying vec3 N; void main(void) {   P = vec3(gl_ModelViewMatrix * gl_Vertex);   N = normalize(gl_NormalMatrix * gl_Normal);   gl_TexCoord[0] = gl_TextureMatrix[0] * gl_Vertex;//オブジェクトの座標値との積   gl_Position = ftransform(); } flagment.shader varying vec3 P; varying vec3 N; uniform sampler2D sampler; void main(void) {  ...
  • .MQOを自力で読み込んでみる3(表示編)
    今回は取りあえず、頂点配列で表示してみます。 .MQO の頂点データはインデックスになっていますが UV座標のデータは インデックスにはなっていないので glDrawElements を使うとテクスチャが めちゃくちゃになってしまいます。 仕方が無いので glDrawArrays 用に配列データを作成し直して描画 する事にしました。 今回は取りあえず表示するだけという事で法線やライトなどは省略し、VBOにもしていません。 それとテクスチャに使える画像形式はPNGのみです。今の所。 今後はワイヤーフレーム表示とかにも挑戦してみます。    PNG.h #include lodepng.h //テクスチャクラス class TEXTURE{ protected  LodePNG_Decoder decoder;//デコーダ  unsigned char* buffer;//バッファ  ...
  • 四角形を描画する
    四角形を描画します。 枠線だけの四角と塗りつぶしの機能に分けました。   ファイル 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...
  • GLSL:マルチテクスチャ
    マルチテクスチャです。 今回のプログラムは地球の地表テクスチャと雲のテクスチャを合成し、 地表よりも雲を遅れて回転させています。 マウスの左ドラッグで視点を変更できます。 画像はNASAがフリーで配布している物を縮小して使用しています。 earth.png cloud.png vertex.shader varying vec3 P; varying vec3 N; void main(void) {   P = vec3(gl_ModelViewMatrix * gl_Vertex);   N = normalize(gl_NormalMatrix * gl_Normal).xyz;   gl_TexCoord[0] = gl_MultiTexCoord0;   gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord0;  ...
  • JPEG画像を表示する
    JPEG画像を読み込んで表示します。 フルカラーとグレースケールのみサポートしています。 かなりデータサイズを小さくできるので広く使われています。http //www.ijg.org/こちらのサイトでフリーのJPEGライブラリのソースコードが配布されています。 libjpeg.lib を作成してください。作り方はgoogleなどで検索して作って下さい。 jpeglib.h , jconfig.h , jmorecfg.h , libjpeg.lib をプロジェクトのフォルダに設置して下さい。 これでJPEGを読み込む準備が整いました。   ファイル main.cpp jpeglib.h (配布先サイトから入手して下さい) jconfig.h (配布先サイトから入手して下さい) jmorecfg.h (配布先サイトから入手して下さい) libjpeg.lib (自分で作成して下さい) ...
  • .MQOを読み込んで表示する(GLMetaseq)
    メタセコイアのモデルデータ .mqo を読み込んで表示してみます。 言わずもがなOpenGLはただのグラフィックライブラリ、モデルデータの読み込みなども 全て自分でコードを書かなくてはなりません。 DirectXの .x 形式や .sdkmesh 形式のようなものと読み込みライブラリがあらかじめ 用意されていると楽ですが、そんなものはありません。 ただ、工学ナビ さんのサイトでmqoの読み込みライブラリ GLMetaseq がありますので 手始めに使ってみましょう。http //kougaku-navi.net/ARToolKit/index.html↑のページから GLMetaseq をダウンロードして、ヘッダファイルとソースファイルを プロジェクトに追加します。 GLMetaseq では glut を使用しているので GLMetaseq.h の227行目の#include をコメントア...
  • ズームイン・アウト
    ズームイン・アウトです。 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 }; //ライトの...
  • .Xの階層メッシュアニメーションを読み込んでみる3
    平行移動と同じようにして拡大縮小も線形補間してみました。 新規に作成した sample3.x を表示しています。   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,      ...
  • 線形補間
    さて、前回の「再びキーフレーム」では箱が瞬間移動してしまって いました。 補間がされていないためです。 DirectX SDK 付属のビューワーでは滑らかにアニメーションが 補間されています。 今回はキーフレームとキーフレームの間を線形補間してみようと思います。 ベクトルAとベクトルB間の補間は、求める値をIとすると、 で求める事ができます。 ここでのtは現在のキー位置のパラメーターです。 尚、 0 ≦t≦ 1 で、tが0の時はAと同じ値、tが1の時はBと同じ値に なります。 前回と同じくsample2.xを表示しています。 font.h #pragma once class GLFONT { public  HFONT Hfont;  HDC Hdc;  GLFONT(wchar_t *fontname, int size);  void DrawStringW(int x,in...
  • ディスプレイリスト
    ディスプレイリストです。 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...
  • .FBXを読み込んでみる2(読み込み編)
    それでは実際に FBXSDK を使用してデータを取り出してみようと思います。 まず、fbx20113_fbxsdk_win をインストールして Visual studio にパスを通します。 そして プロジェクトのフォルダに fbxsdk_20113.dll と fbxsdk_20113d.dll を置きます。 使い方は KFbxSdkManager を作成して、 KFbxImporter を作成して、 KFbxImporter にファイルを読み込んで初期化します。 そして、 KFbxScene を作成して、 KFbxScene に KFbxImporter で インポートします。 そして、 KFbxNode を辿って KFbxMesh を探します。 KFbxMesh が見つかったら、そこから各種情報を取り出します。 今回は三角ポリゴンのみでテクスチャ無し、オブジェクト(レイヤー)が一つだ...
  • 色の反転
    色を反転させます。 ファイル main.cpp lodepng.cpp lodepng.h PNG.h GLSL.h vertex.shader flagment.shader sample.png vertex.shader varying vec2 pos; void main(void) {     pos = gl_Vertex.xy;     gl_Position = ftransform(); } flagment.shader uniform sampler2D image; uniform int img_Width, img_Height; varying vec2 pos; void main(void) {     vec2 texCoord = vec2(pos.x / float(img_Width), pos.y / float(...
  • .FBXを読み込んでみる3(表示編)
    前回のプログラムはテクスチャ無しで3角ポリゴンの FBX ファイルしか 読み込めませんでした。 今回のプログラムは3角と4角の両方のポリゴンに対応しています。 テクスチャはレイヤー0しか対応していませんが通常の使用には問題ないと 思います。   PNG.h #pragma once #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);//P...
  • .Xを読み込んでみる4(表示編)
    前回の読み込み編ではテンプレート無しで3角ポリゴンの Xファイルしか 読み込めませんでしたが、今回はテンプレートを読み飛ばし、3角と4角ポリゴンの 両方の Xファイルを読み込めるようにしました。 Xファイルは作成するソフトによって癖がありますので全ての3Dアプリが作る Xファイルに 対応する事はできません。とりあえずメタセコイアが作る Xファイルに対応しています。   PNG.h #include lodepng.h //テクスチャクラス class TEXTURE{ protected  LodePNG_Decoder decoder;//デコーダ  unsigned char* buffer;//バッファ  size_t buffersize, imagesize;//サイズ public  TEXTURE();  TEXTURE(const char* FileName);...
  • .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読み込み ...
  • .OBJを読み込んでみる3(表示編)
    .OBJ ファイルの読み込みプログラムが完成しましたので公開します。 取りあえず、インデックス化はせずに頂点配列で表示しています。 テクスチャはマテリアルで重複しないようにモデルクラスで保持しています。 完全に重複を避けるにはアプリケーション単位で保持する必要が あると思います。 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* FileNam...
  • 固定機能:グレースケール
    グレースケールです。 輝度値 = 0.299 * Red + 0.587 * Green + 0.114 * Blue で変換できます。 ファイル main.cpp lodepng.cpp lodepng.h PNG.h sample.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #include PNG.h #define WIDTH 640 #define HEIGHT 480 GLuint texName[2]; TEXTURE *texture[2]; void display(void) {  glClear(GL_COLOR_BUFFE...
  • 再びキーフレーム
    長らく道を逸れましたが、ここで再びキーフレームに戻ります。 .Xのアニメーションキーのキータイプ情報 0…回転  w,x,y,zの順にクォータニオンデータ 1…拡大縮小 x,y,zの順に拡大縮小データ 2…平行移動 x,y,zの順に平行移動データ 4…合成行列 回転、拡大縮小、平行移動行列が掛け合わされた4×4行列データ まず、最初に知っておかなくてはならない事があります。 それは、当サイトで使用している Cyberdelia は、合成行列タイプの アニメーションデータは階層構造が正しく生成できないという事です。 詳しくは Cyberdelia に付属のヘルプを参照して下さい。 とは言っても、合成行列でないタイプの方は正しく出力されますので、 それを元に合成行列を作成し、単純なキーフレームアニメーションを表示して みたいと思います。 とりあえず、平行移動行列だけに対応したプログラムを作成...
  • .Xの階層メッシュアニメーションを読み込んでみる2
    それでは、実際に階層構造を作って表示してみる事にします。 今回はアニメーションはせずに、ただ単にモデルを表示するだけです。 2分木構造を再帰関数を使ってデータ処理をする場合、return で戻る先を きちんと把握していないとおかしなデータ構造になってしまいます。 再帰関数というのは一つずつネストを深めて行きます。 なので、return すると1階層戻るのではなく 1 NODE 戻ります。 以下の図で説明すると Frame5 から1階層戻る時は 1回の return で 1階層戻りますが、Frame4 から 1階層戻る時は 1回目の return で Frame3 に戻り、2回目の return でFrame2 に戻り、3回目の return で Frame1 に戻って、やっと1階層戻る事になります。 PNG.h #pragma once #include lodepng.h //...
  • コメント板
    簡易掲示板です。 何かありましたらコメントを。 てすと -- 管理人 (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採用の方向になっているようです。 -- 管理人 (...
  • 隠面消去
    隠面消去です。 デプスバッファ(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...
  • 球を表示して移動する
    球を表示して平行移動します。 glTranslatef(x,y,z) に値をセットする事で平行移動の行列を適用できます。 glutSolidSphere(半径,経線の分割数,緯線の分割数) で球を表示できます。   ファイル 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....
  • トーラスの表示と回転
    トーラス、ドーナツ形状を描画します。 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[] = ...
  • 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...
  • 文字列描画
    文字列を描画します。 文字列となるとDirectXでもOpenGLでも普通の方法は用意されていません。 GDIを使うと途端に遅くなるからです。 多くの場合、高速化のために自前の画像ファイルで文字を用意したりしていますが、 英数字ならまだしも日本語となると色々と問題がでてきます。 そこで wglUseFontBitmapsW という、文字をビットマップのディスプレイリスト で作ってくれる関数があるので、それを使います。 ここでいきなりクラスが登場していますが、初心者向けに解り易くしたつもりです。 とても便利なので使い方を覚えておきましょう。 ちなみに解放とかは省略、関数が成功したかどうかは if で調べていません。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStar...
  • .Xの階層メッシュアニメーションを読み込んでみる4
    .xの階層アニメーションを読み込んで再生するプログラムが完成したので公開します。 クォータニオンの符号の判定には皆さん、苦労されたのではないでしょうか。 ネットで広く公開されているサンプルはほとんどがDirectX用で いちいち転置しなければならなかったり。 左手座標用に作成したアニメーションXファイルはクォータニオンのY軸とZ軸を-1倍しないと OpenGLではおかしな表示になるとか。 回転角度が181度とマイナス179度ではクォータニオンの符号が反転してるけど 同じ回転行列になるとか。 いやはや、手間取りました。 最後に親階層から子階層へ脈々と行列を受け継いで完成です。 『固定機能 階層メッシュアニメーション編』の『階層構造』で作成した sample4.xを表示しています。 尚、Cyberdelia で作成したアニメーションXファイルだけに対応しています。    font.h #pr...
  • カラーマテリアル
    カラーマテリアルです。 現在のglColorで設定されている値を使って材質設定します。 SHININESSは設定できません。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdlib.h #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //ライトの位置 GLfloat lightpos[] = { 200.0, 150.0, -500.0, 1.0 }; void display(void) {  glClear(GL_COLOR_BUFFER_BIT | GL_DEP...
  • マテリアルの設定
    glEnable(GL_LIGHTING); でライトを有効にしていない時は、glColor4f(赤,緑,青,アルファ); で色を付けていました。 しかし、3Dモデルをそれでやってしまうとのっぺりした、ただの塗りつぶしになってしまいます。 ライトを有効にしている時に、3Dモデルがどのような光の色を反射するか設定するには glMaterialfv(適用する面,光源の種類,反射する色); で材質を設定してあげます。 今回は一定時間でマテリアルを変更するプログラムを作ってみました。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdlib.h #define ...
  • 法線
    法線ベクトルです。面法線とか頂点法線とかがあります。 法線ベクトルとは、2次元ではある線に垂直なベクトル、3次元ではある面に 垂直なベクトルの事です。 三角ポリゴンは、3つの頂点の並びにより面から垂直に出るベクトルが計算できます。 これが面法線です。 面法線は、光の計算をするときや面の表裏を判定する時に使われます。 今回は三角ポリゴンの面法線を強制的に設定してみました。 するとライトの位置やポリゴンの材質、色や視点など全く変えていないにもかかわらず ポリゴンの色が変化します。 これは固定機能パイプラインが描画で使用する面法線が変化させられているために ポリゴンの向きは全く変わっていないのに別の方向を向いているものとして計算されるからです。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENT...
  • 板ポリゴンを表示する
    ポリゴンを描画すると言っても、実は既に図形描画関連のページや 画像表示関連のページでも使っています。 DirectXとは違い、OpenGLでは三角ポリゴンだけではなく四角ポリゴンも 使用可能です。 三角ポリゴンしか描画できないDirectXでは、3Dモデルファイルなども全て、 四角ポリゴンを三角ポリゴンに分割しなくてはなりませんでした。 すると四角ポリゴンの数だけ変換後のポリゴン数が増えて描画速度に影響します。 当然、ワイヤーフレームで表示したいときも四角ポリゴンが使用できないと 意図する映像が作れなかったりします。 ここだけ見てもOpenGLの方が優れていると言っても過言ではありません。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #inclu...
  • @wiki全体から「PNG画像の一部をストレッチ描画する(LodePNG)」で調べる

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