• 締切済み

GDIとDIRECT-X

partsの回答

  • parts
  • ベストアンサー率62% (6364/10149)
回答No.1

Win-GってのはGAME-SDKかなこれはいわゆるDirectX1,0かその前の世代ですね。 (DirectXAPI群とほぼ同じで機能が少ないだけです) さて、描画での違いですが、まず独自のGDIを使った場合はご存じでしょうけど、プログラムが肥大化して大変です。 そこでGDIでは、Win32アプリ→GDI→デバイスドライバ(DDI)→グラフィックハード(逆方向のやりとりもあり)の順で処理していき画一された手法を使うことでプログラム開発を容易にしますが、欠点は処理が遅くなるということでした。 GDIの欠点はアプリからビデオボードのメモリに直接アクセス制御できないこと結局は能力を使いこなせず、パフォーマンス的に弱い。 それに対して、DirectXはWin32アプリ→DirectGraphics→HAL(介さないこともある)→DDI→ハード(逆方向のやりとりもあります) の順でデータのやりとりがされます。 HALデバイスとHELデバイスの処理がありますから、 HAL(Hardware Abstraction Layer)ではDirectX対応ハードでより高速に直接的にハードに命令を渡し処理できるだけではなくHEL(Hardware Emulation Layer)による非対応のハードでも機能をエミュレートすることができるよう工夫されています。それにGDIのプログラムの容易性も含まれて最新のグラフィックス技術、直接的な命令、DirectXSDKによるサポートでソフト開発が容易、DirectXのアップデートのみでの最新処理機能の追加などが可能になります。 特にSDK(Software Development Kit)が配布されてますから、プログラム制作者にはこの上のない制作環境が整います。

参考URL:
http://www.microsoft.com/japan/directx/

関連するQ&A

  • GDI+のDrawStringを使って文字を滑らかに描画したいのですが。。。

    GDI+のDrawStringを使って文字を滑らかに描画したいのですが。。。 環境は、VC++のWin32プロジェクトです。 WindowのデバイスコンテキストからGraphicsオブジェクトを生成し、DrawStringとすると滑らかに描画されます。 しかし、BitmapオブジェクトからGraphicsオブジェクトを生成し、DrawStringを行うとビットマップフォントのようです。 Graphics g(hdc); g.DrawString(......); -> この場合はなめらか(画像の下の方) しかし、 Bitmap bmp(w, h, PixelFormat32bppARGB); Graphics g (&bmp); g.SetSmootingMode(SmoothingModeHighQuality); g.DrawString(...); -> ジャギが目立つ。(画像の上の方) ビットマップ(メモリ)にスムーズなテキストを描画することはできないのでしょうか? ちなみにフォントはメイリオです。

  • CDC(LineTo)で描画した線を透過したい

    タイトルのままで恐縮です。 ソースは、以下のような感じです。 描画の所で線を描いているのですが、例えば、SetBkModeなどで、背景を透過(TRANSPARENT)等は、やった事があるのですが、文字そのものの透過がわかりません。透過率は適当で構いません。ご存知の方、ご教授願います。 宜しくお願い致します。 (中略) // 描画した線自体を透過させたいです。 CDC* dc; // 実際は、関数のパラメータです // ペンの作成 CPen Pen; CPen* pOldPen = NULL; if ( Pen.CreatePen( PS_SOLID, 2, color ) == FALSE ) { return false; } pOldPen = dc->SelectObject( &Pen ); // 描画(線を描く) // widht, height は関数パラメータ dc->MoveTo( x, y ); // この線を透過したい dc->LineTo( x + width, x + height ) ); dc->MoveTo( x + width, y ); // この線を透過したい dc->LineTo( x, y + height ); // ペンを元に戻す dc->SelectObject( pOldPen );

  • X Window上でのOpenGLの使用

    お世話になっております. C++で書いたOpenGLを用いたプログラムをlinux上で演算させ, x WindowでWindowsのPC上に3次元描画をするために, 現在,試行錯誤をしております. (3次元描画と格好いい文言ですが,所詮,点列や辺の描画なんですが・・・) そのプログラムの実行過程で, 描画関数において,エラーが出ていて,それに関する質問です. 現在の状況として, プログラムのコンパイルは出来ております.一応,コンパイラはicpcを使ってます. で,実行エラーとして, freeglut (./a.out): OpenGL GLX extension not supported by display '***.***.***.***:0.0' と出ております. このエラーは,glCreatWindow()という関数でエラーが返されており, X Windowを用いて表示するためには,他のライブラリが必要であると考えました. そこで,調査したところ, XGLというライブラリの存在を知りました. 私の理解では, XGLとは,X WindowでOpenGLを使用するためのドライバー的なライブラリだと理解しております. そこで,使い方を調査しているのですが, ネット検索の段階で,全く掲載ページがない, (書籍の調査は明日以降かなと・・・) ということで,ここに質問させていただきました. 具体的なプログラミングの仕方,参考Webページ,書籍等 や, そもそも,XGLなんて間違っていて,他に使用すべきライブラリがある, とか... 出来れば,C++で書いた現在のプログラムに, 少しだけの変更で収められるようなモノが良いな...と欲張りなことも思っています... ご存じであれば,教えていただきたく,お願い申し上げます. ソースコードは... 数千行のプログラムなので,ちょっと勘弁願いたく...

  • 上辺は位置固定しつつ、四角を描く!

    上の辺の位置は変えずに下の辺が下がりながら透明度50の四角をフレーム毎に(EnterFrameで)描画したいです。 どなたか教えていただけないでしょうか。 ※以下のASでは四角が移動してしまいます。 onClipEvent(load){ _yscale_max=100; _yscale = 5; _root.abc.beginFill (0x000000, 50); _root.abc.moveTo (100, 100); _root.abc.lineTo (300, 100); _root.abc.lineTo (300, 300); _root.abc.lineTo (100, 300); _root.abc.endFill (); } onClipEvent(EnterFrame){ _yscale += 5; if(_yscale < _yscale_max){ _root.abc._yscale =_yscale; } if(_yscale > _yscale_max){ _yscale =_yscale_max; } }

    • ベストアンサー
    • Flash
  • EPS形式でのファイル書き出しについて

    Illustratorなどで開くことができるEPS形式でファイルを書き出すプログラムを作っています。 PostScriptのフォーマットについて調べ、 newpath,moveto,lineto,arc などの記述で直線や円弧を描画できることはわかりました。 さて、実現したいことは複数の直線などをグループ化することなのですが、Web上を探しても情報が見つかりません。EPSファイルではどのように記述すればよいかご存知の方はご教授いただけますと幸いです。なお、ここでのグループ化とはIllustratorで「グループ」「グループ解除」の機能で行える、複数の要素を1つにまとめあげることを指しています。

  • 「関数ポインタとして評価されない式」?(sin波)

    知っている(ある程度のプログラミング知識がある)方にはばかばかしい内容かもしれませんが・・・。 sin波とcos波を描くものをC++でプログラミングしている途中です。 いざ実行!と思ってコンパイルすると、「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。」と出たのですが、何が原因かわかりません。 プログラム内容↓ #include <stdio.h> #include <math.h> #define PAI 3.14 (中略・ペン設定など) double j=0.0, sinwave[400]; int x0=50, y0=50, i=0; while(i<400){   for(j=0.0; j<=PAI; j=j+0.1){ sinwave[i]=sin(j); ●ここが原因らしい   }   i++; } (後略・ペンdeleteなど) math.hもあるし、特に変なところはないと思います。 また、そのあとにMoveTo,LineToでsin波を描きたいのですが、 for文で繰り返し MoveTo(x0+sin[i],?) LineTo(x0+sin[i+1],?) の、はてなの部分に何を入れればよいかわかりません。(x0:勝手にきめた原点)x0+sin[i]も、これで良いのか「?」です・・・。 お願いします。

  • 透視投影図形の回転

    C言語で透視投影の図形(3次元)を作成しました。 プログラムは下のような感じになりました。 static struct {int f; double x,y,z;}a[] ...(略) for(j=0; a[j].f!=-999; j++){//-999が来るまで描画  h=-a[j].x*sin(ay)/vp+a[j].z*cos(ay)/vp+n/vp+1;  px=(a[j].x*cos(ay)+a[j].z*sin(ay)+1)/h;  py=(a[j].y+m)/h;   if(a[j].f==-1) //-1が先頭にあるなら    pDC->MoveTo(px+200,-py+200);//描画の始点   else //そうでないなら    pDC->LineTo(px+200,-py+200);//線の終点 } これに、わかっているx軸まわり・y軸まわりの回転変換マトリックスを掛け合わせた、統合変換マトリックスの式 x=x*cosθ-z*sinθ y=x*sin^2θ+y*cosθ+z*sinθcosθ z=x*sinθcosθ-y*sinθ+z*cos^2θ を使用して図形を回転させたいのですが、プログラム中にはpDC->MoveTo(px+200,-py+200);のようにxとyしか出力がなく、z=をどう出力しようかと悩んでいます。また、回転を表示させるのに、 描画→回転させたx,y座標の算出→一度画面を白く塗りつぶす→描画 ということをfor文でやっていこうと思うのですが、画面がとてもちらついてしまいます。ちらつかない方法があれば教えてください。

  • actionscript3.0ものすごく初心者です

    周辺見かけたプログラムを解読(?)しながら勉強しています。 以下のプログラムをflash cs5(actionscript3.0)にて入力すると パッケージはネストできません。と出ます。 どなたかが、ASじゃないとダメなのかなぁ.....とつぶやいていたのを見かけたのですが 当方何のことか全くわかりません。どのようにそれば以下の内容をflash cs5にてうち込む ことができるでしょうか?またできました、なぜ以下のパッケージが受け付けられないのかも教えていただきますと助かります。(packageは既に含まれているという記述を見ましたが 当方何のことか全くわかりません。)よろしくお願いします。 package { import flash.display.Sprite; [SWF(width="240",height="80",frameRate="24")] public class GraphicsSample extends Sprite { public function GraphicsSample() { var sp1:Sprite = new Sprite(); sp1.x = 30; sp1.y = 20; sp1.graphics.lineStyle(5,0xFF0000,1); sp1.graphics.moveTo( 0, 0); sp1.graphics.lineTo(10,45); sp1.graphics.lineTo( 0,20); sp1.graphics.lineTo(45,60); addChild(sp1); } } }

    • ベストアンサー
    • Flash
  • X window systemの仕組みについて

    LinuxやFreeBSDのX Window systemについて教えてください。 "X.Org Foundation"前提で構いません。 1)Xはネットワーク通信を介して使われることを前提として設計されている。 2)クライアントサーバ型システムをとっている 3)つまり、たとえばKNOPPIXやPC-BSDなどのLIVE CDを起動して表示されるGUIシステムは、  自分で立てたXサーバ(127.0.0.1)に対して自分がクライアントとして接続しに行っているに過ぎない。 4)よってその気になればMS-Windowsや漢字Talk上でも、クライアントさえあればKNOPPIXのXサーバに  接続してデスクトップを引っ張ってこれる この理解は正しいですか。 これは目的から外れる質問ですが、可能でしたら教えて下さい 4)Windowsシリーズもこのシステムを採用しているのか、あるいは直接入出力デバイスの描画なり入力なり を管理しているのか 5)後者であればWindowsXP sp2のリモートデスクトップシステムの仕組みはX.Orgとはまったく異なる仕組みなのか

  • 十進BASICのグラフィック表示についてなのですが・・・

    グラフィック画面にy=sqr(1-x^2)のグラフとy=-sqr(1-x^2)のグラフを描くプログラムを作りなさい。ただし、 set window -1.5,1.5,-1.5,1.5 としなさい という問題で 私が書いたプログラムは SET WINDOW -1.5,1.5,-1.5,1.5 DRAW axes DEF f(x)=SQR(1-x^2) DEF g(x)=-SQR(1-x^2) LET h=0.01 SET LINE COLOR 9 FOR x=-1 TO 1 STEP h PLOT LINES:x,f(x);x+h,f(x) NEXT x SET LINE COLOR 10 FOR x=-1 TO 1 STEP h PLOT LINES:x,g(x);x+h,g(x+h) NEXT x END なのですが、 DEF g(x)=-SQR(1-x^2) のところでエラーが出ます。 どうすれば、改善されるか思いつかないで教えてください。 よろしくおねがいします。