web-dev-qa-db-ja.com

低レベルのグラフィックプログラミングについて学ぶ

グラフィカルアプリケーションを作成するために利用できる抽象化のさまざまなレイヤーについて学ぶことに興味があります。

たくさんの用語が飛び交っています。最高レベルの抽象化では、C#、. NET、pyglet、pygameなどについて耳にします。さらに下では、DirectXとOpenGLについて聞いています。次に、DirectDraw、SDL、Win32 API、およびWxWidgetsなどの他のマルチプラットフォームライブラリがあります。

これらのレイヤーの1つがどこで終わり、次のレイヤーがどこから始まるかをどのように理解できますか? CでWindowsでウィンドウを作成する「最低レベル」の方法は何ですか? C++はどうですか? (コードサンプルは神聖です。)X11ではどうですか? OpenGLおよびDirectXのWindows実装は、Win32 APIの上に構築されていますか?これらのことについてどこから学び始めることができますか?

SO where Programming Windows が推奨されています。Linuxについてはどうですか?同等のそのような本はありますか?

これは非常に低レベルであり、より使いやすいツールがたくさんあることを私は知っていますが、少なくとも水面下で起こっていることの基本を学びたいと思います。すぐにウィンドウやベクターをスリングし始めたいのですが、pygameのようなものから始めるのは私には高すぎます。私は本当にあなたがコンピューターで何かを描く方法の完全な概念的な回路を作る必要があります。

本やリソースの提案は確かにありがたいですが、この質問への回答が、グラフィックプログラミングへのさまざまなアプローチで「Helloworld」に到達するためのさまざまな方法でいっぱいになれば、非常にクールだと思います。 C? C++? OpenGLを使用していますか? DirectXを使用していますか? Windows XPでは? Ubuntuでは?多分私はあまりにも多くを求めます。

42
Max Cantor

MichaelAbrashのグラフィックプログラミング 'Black Book' は始めるのに最適な場所です。さらに、無料でダウンロードできます!

24
Mitch Wheat

最も低いレベルは、グラフィックカードのビデオRAMです。コンピュータが最初に起動したとき、グラフィックカードは通常80x25文字のレガシーモードに設定されています。

この時点で、BIOS提供の割り込みでテキストを書き込むことができます。 16の特徴的な色のパレットから前景色と背景色を変更することもできます。アクセスポート/レジスタを使用して、表示モードを変更できます。この時点で、別のフォントをディスプレイメモリにロードし、80x25モードを使用する(OSインストールでは通常これを行う)か、先に進んでVGA/SVGAを有効にすることができます。それはかなり複雑で、それがドライバーの目的です。

カードが「高次」モードになると、ビデオカードに割り当てられたメモリにアクセスして画面の表示を変更します。これは、ピクセルごとに水平方向に保存され、各行の終わりで画面にマップされていないピクセルの「ダーティ領域」がいくつかあり、補正する必要があります。しかし、そうです。メモリ内の画像のピクセルを直接画面にコピーできます。

DirectX、OpenGLなどの場合。画面に直接書き込むのではなく、コマンドがグラフィックスカードに送信され、画面が自動的に更新されます。 「ねえ、ここ、ここ、ここでVRAMにロードしたこの画像を描画する」や「この変換行列を使用してこれらの三角形を描画する...」などのコマンドは、ピクセルごとに比べてわずかな時間しかかかりません。 CPUはあなたに感謝します。

DirectX/OpenGLは、これらのコマンドをカードに送信するためのプログラマー向けのライブラリであり、スムーズに実行するためのサポート機能をすべて備えています。より直接的なアプローチは非生産的なだけです。

SDLは抽象化レイヤーなので、読み上げるのに煩わされることなく、システムごとに異なる方法で作業できると思います。 1つは、セミダイレクトの画面書き込み、別のDirect3Dなどを使用する場合があります。コードがクロスプラットフォームである限り、最速のものは何でも..可能です。

GDI/GDI +およびXWindowシステム。それらは、ウィンドウを描画するために特別に設計されています。元々はピクセル単位の方法で描画しました(ボタンを押したりウィンドウを移動したときなどに再描画するだけで十分だったので十分でした)が、現在はDirect3D/OpenGLを使用して描画を高速化しています(そして特別な効果)。最適化は、これらのライブラリのバージョンと実装によって異なります。

したがって、最大のパワーとスピードが必要な場合は、DirectX/openGLが適しています。 SDLは、クロスプラットフォーム環境を最大限に活用するのに確かに役立ち、とにかくOpenGLと統合します。ウィンドウシステムは最後に来ますが、それを過小評価しないでください。特に、最近マイクロソフトが考えていることについて。

41
Yes Fish...

本当に下から始めたい場合は、線を引くことが最も基本的な操作です。コンピュータグラフィックスは、単にグリッド(画面)上のピクセルを塗りつぶすだけなので、(x0、y0)から(x1、y1)に向かう線を取得するには、どのピクセルを塗りつぶすかを決める必要があります。

Bresenhamのアルゴリズム をチェックして、何が関係しているかを感じてください。

6
Rob Walker

優れたグラフィックスおよび画像処理プログラマーであるためには、この低レベルの知識は必要ありませんが、私が使用しているものの内部について無知であることは嫌いです。これを追跡するには、高レベルのダウンと最下位レベルのアップの2つの方法があります。

トップダウンは、アクションが円の描画などの高レベルのグラフィックス操作からハードウェアまでどのようにトレースされるかを追跡することです。 OpenGLについてよく理解してください。次に、Mesaへのソース(無料!)は、OpenGLをソフトウェアに実装する方法のピークを提供します。 Xorgへのソースは次に、最初に、アクションがAPI呼び出しからクライアント側を経由してXサーバーにどのように移動するかを確認します。最後に、ハードウェアとインターフェイスするデバイスドライバーに飛び込みます。

ボトムアップ:独自のグラフィックハードウェアを構築します。コンピュータに接続する方法を考えてください-いくつかのバイトサイズのレジスタを介して大量のピクセルを処理する方法、DMAが機能する方法。デバイスドライバを作成し、グラフィックライブラリを設計してみてくださいこれはアプリプログラマーにとって役立つかもしれません。

ボトムアップの方法は、何年も前に遅い8ビットマイクロプロセッサで可能性があったときに、私が学んだ方法です。回路とハードウェアとソフトウェアのインターフェースを直接体験したことで、難しい設計決定をよく理解できました。巧妙なハードウェア、デバイスドライバー、またはそれ以上のレベルを使用して長方形をペイントします。これはどれも実用的な日常の価値はありませんが、新しいテクノロジーを理解するための知識の基礎を提供しました。

5
DarenW

[GPUドキュメントを開く]セクションを参照してください: http://developer.AMD.com/documentation/guides/Pages/default.aspx

HTH

3
plan9assembler

MSWindowsでは簡単です。標準のWindowsプログラミングAPIまたはDirectX-family APIのどちらであっても、APIが提供するものを使用します。それが使用するものです。十分に文書化されています。

Xウィンドウ環境では、提供されるX11-librariesを使用します。 Xでのウィンドウ処理の背後にある原則を理解したい場合は、これを行うことをお勧めします。他の多くの人がそうしないように言ってください。Xでのグラフィックスとウィンドウ処理を理解するのに非常に役立ちます。Xプログラミングに関するドキュメントを読むことができます。 (それのためのグーグル)。 (この演習の後は、高レベルのライブラリに感謝します!)

上記とは別に、あなたが行くことができる絶対に最低のレベル(チップレベルを除く)では、利用可能なさまざまなグラフィックモードに切り替わる割り込みを呼び出して(いくつかあります)、画面バッファに書き込みますが、これにはあなたがアセンブラを使用する必要があり、それ以外は遅すぎます。この方法で移動すると、まったく移植できなくなります。

別の投稿はAbrash's Black Bookについて言及しています-優れたリソース。

編集:Linuxのプログラミングに関する本に関しては:それはコミュニティのものであり、周りには多くのハウツーがあります。また、フォーラムを見つけて参加してください。文明を行動している限り、必要なすべての支援を受けることができます。

3
slashmais

すぐに、私は「あなたがあまりにも多くを求めている」と言います。少しの経験から、いくつかのチュートリアルを読むか、DirectXまたはOpenGLのいずれかで本を入手することをお勧めします。それより低くすることはかなり複雑です。私がOGLまたはDXで見た本のほとんどには、関数/クラスが何をするかを説明するかなり良い紹介があります。

これらのいずれかのコツをつかんだら、いつでもライブラリを掘り下げて、ライブラリが低くなるために何をしているのかを正確に確認できます。

または、もしあなたが本当に、最低レベルを絶対に学ばなければならない...上記の投稿で本を読んでください。

2
ZCHudson

libX11は、X11の最低レベルのライブラリです。 opengl/directxはドライバー/ハードウェアと直接通信する(またはサポートされていないopsをエミュレートする)ので、それらは最低レベルのライブラリになると思います。

very低レベルプログラミングから始めたい場合は、VGA用のx86アセンブリコードを探して、dosboxなどのコピーを起動します。

2
Draemon

Vulkan apiは、gpuのすべてではないにしてもほとんどの機能への非常に低レベルのアクセスを提供するAPIであり、計算およびグラフィカルであり、AMDおよびNvidia gpus(すべてではない)で動作します

cUDAを使用することもできますが、これはNvidia gpusでのみ機能し、計算機能にのみアクセスできます。ビデオ出力はありません。

1
user10780898