プログラミング演習3 李 亜民クラス 第2回 ラスタライズ.

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

ファーストイヤー・セミナーⅡ 第13回 2次元グラフィックス(1). 2次元グラフィックス Ultra-C では、これまで利用してきた「標準入出力」 以外に「グラフィックス画面」があり、図形などを 表示できる C 言語のグラフィックスには細かな規定がなく、こ れから学ぶ内容が他の環境、システムでは利用でき.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
初年次セミナー 第13回 2次元グラフィックス(1).
プログラミング 平成24年1月11日 森田 彦.
初年次セミナー 第14回 2次元グラフィックス(2).
GridLayout オブジェクト(省略)
Imageの描画 画像を読み込んで表示すること。 import java.awt.*;が必要。
Applet 岡部 祐典 鈴木 敬幸.
Ex7. Search for Vacuum Problem
第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス- 鷲見政明.
Ex8. Search for Vacuum Problem(2)
Iアプリプログラミング その1  鳥居秀徳.
アルゴリズムとプログラミング (Algorithms and Programming)
CGプログラミング論 平成28年6月1日 森田 彦.
CGプログラミング論 平成28年4月27日 森田 彦.
ゲームプログラミング体験演習
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
コンパイラの解析 (2) GCJのデータ構造 - 1.
Unity, C# 移動するモデルの位置を 指定した位置へ自動修正
基礎プログラミング演習 第10回.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
DirectX 勉強会 第4回.
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
CGプログラミング論 平成28年6月8日 森田 彦.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
第8回 2007年6月15日 応用Java (Java/XML).
暗黙的に型付けされる構造体の Java言語への導入
プログラミング 平成23年12月21日 森田 彦.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
演習1 : インターフェイスを使ってみよう 「10人の客(乗用車、バイク、ストーブのいずれかランダムに決定)に1~100(L)の給油をするガソリンスタンドをシミュレートする実行クラス : RefuelSimulation」を作成する。給油の際には、どの種類の客が何リットル給油したか出力すること。 実行結果例.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
DirectX勉強会 第2回.
プログラミング基礎a 第12回 Java言語による図形処理入門(3) アニメーション入門
プログラミング基礎a 第11回 Java言語による図形処理入門(3) アニメーション入門
アルゴリズムとデータ構造1 2005年7月5日
ポリゴンメッシュ (2) - 変形と簡略化- 東京大学 精密工学専攻 大竹豊 資料および授業の情報は :
ソフトウェア制作論 平成30年11月21日.
Ex7. Search for Vacuum Problem
CGと形状モデリング 授業資料 1,2限: 大竹豊(東京大学) 3,4限: 俵 丈展(理化学研究所)
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
プログラミングⅠ 平成30年10月22日 森田 彦.
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
JAVA GUIプログラミング 第3回 イベント処理① マウスイベント.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
アルゴリズムとプログラミング (Algorithms and Programming)
サブゼミ第7回 実装編① オブジェクト型とキャスト.
アルゴリズムとデータ構造1 2006年6月23日
画面への描画 Graphics オブジェクト 紙 ペン Pen オブジェクト Brush オブジェクト 画面のピクセルをカプセル化
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
フレンド関数とフレンド演算子.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
演算子のオーバーロード.
プログラミング 平成24年12月11日 森田 彦.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
プログラミング 平成28年10月25日 森田 彦.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
CGプログラミング論 平成28年5月11日 森田 彦.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
Presentation transcript:

プログラミング演習3 李 亜民クラス 第2回 ラスタライズ

今回の内容 概念説明 ラスタライズ scan/span 作業 クラスの穴埋め 課題について

概念説明 ラスタライズ scan/span

3Dグラフィックスパイプライン 本日は⑥について解説 3Dモデル構築 :第3回 モデル変換 :第1回 バーテックス処理 :第4回 モデル変換 :第1回 バーテックス処理 :第4回 ビューポート変換 :第1回 バックフェースカリング :第3回 ラスタライズ :第2回 ピクセルシェーディング :第4回 Zバッファ の適用 :第3回

ラスタライズ ポリゴン(ベクトル集合)→ピクセル集合の変換を行う 各ピクセルに座標、色、材質等のパラメータを割り当て、ピク セルシェーダに渡す この講義では、ポリゴンは3つの頂点で構成されるものとする ラスタライズは、各ポリゴンについて処理を行う

ラスタライズの流れ(1)データ取得 ラスタライザに頂点データが渡される

ラスタライズの流れ(2)バッファ初期化 右/左端バッファを用意し、それぞれを大きい/小さい値で初期化 左をInteger.MAX_VALUE、右をMIN等(∞である必要は無い)

ラスタライズの流れ(3)Scan(1辺目) y方向に補間してバッファに格納 右端はバッファ値より大きいこと、左端は小さいことを条件に上書き

ラスタライズの流れ(4)Scan( 2辺目) 書き込み条件を考慮しつつ同様に繰り返し

ラスタライズの流れ(5)Scan( 3辺目) 直線の描画と異なり、単純にy軸について補間すれば良い x座標は飛び飛びになりうる

ラスタライズの流れ(5)Span LBuffからRBuffまでx軸方向に補間 補間されて得られたピクセルをピクセルシェーダに送信 本日は、ここで得られた座標をそのまま単色で塗りつぶす

Scan:エッジ方向補間 指定された辺について保管し、左右バッファに格納 擬似コード通りである必要はない。各自工夫を! Scan(v1, v2, LBuff[], RBuff[]) // 繰り返し方向確認 if (v1.y > v2.y) swap(v1, v2) // 水平なら描画しない if (v1.y == v2.y) return // 補間 for y = v1.y to v2.y Pixel p = lerp(…) if (…) LBuff[p.y] = p if (…) RBuff[p.y] = p

Span:x軸方向補間 左右にバッファを用意し、各エッジ(辺)ごとに補間 Span(LBuff[], RBuff[]) // 補間 for y = 0 to Screen Height // 面が存在するか確認し、無ければスキップ if RBuff[y].x <= LBuff[y].x continue for x = Lbuff[y].x to Rbuff[y].x Pixel p = lerp(…); pを塗りつぶし

ラスタライズに関する注意 左右バッファは面ごとに初期化し直す必要がある 上書きの条件や初期化する値など、左右のバッファで処 理が異なる部分をよく確認すること for each face バッファ初期化 Scan(A, B) Scan(B, C) Scan(C, A) Span(LBuff, RBuff)

作業 クラスの穴埋め

Vertexクラス(未完成) メンバ変数 コンストラクタ メソッド Vector v : 変換後座標 Vector ov : 変換前座標 変換前x,y,z指定 (任意に追加して下さい) メソッド Pixel lerp(…) 線形補間(未完成) Vector.lerp(…)同様、x,y,zそれぞれについて補間すれば良い 補間して以後、変換前座標は不要なので、返り値はPixelに

Faceクラス メンバ変数 Vertex A,B,C (頂点) コンストラクタ Vertex3つで指定 メソッド 特になし(追加は任意で)

Pixelクラス(未完成) メンバ変数 コンストラクタ メソッド int x, y, z : 座標 double型x, y, z指定(Math.roundでint型に) メソッド Pixel lerp(…) 線形補間(未完成) Vertex.lerp(…)同様

第2回課題 1. 任意の三角形を作成し、単色で塗りつぶして下さい 2. [発展] ダブルバッファリングを実装して下さい。 クラス:lec02に記述 initに初期化処理を記述 render(), drawFace(),scan(),span()の穴埋め その他、任意にメソッドを追加(setTriangle()等) 2. [発展] ダブルバッファリングを実装して下さい。 Canvasクラスを改変 バッファを用意し、drawPointではバッファに書き込み 書き込み完了後、drawImage(…)でバッファを表示 詳しい方法については、各自で調べる等してください

ダブルバッファリング(Canvasを改変) // インスタンス変数宣言 Image buf; Graphics bufG; public void init (){ … // バッファの初期化処理を追加 buf = createImage(700,700); bufG = buf.getGraphics(); } public void paint (Graphics g){ // バッファをクリア bufG.clearRect(0,0,700,700);   // レンダリング   render();   // バッファから一気に描画 g.drawImage(buf,0,0, this); } public void drawPoint (…){ // バッファに描画するように変更 bufG.setColor(c); bufG.drawLine(x,y,x,y)

課題の実行例