<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="../../../../../css/rss/feedAtom.xsl" media="screen" type="text/xsl"?>

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" version="0.3" xml:lang="utf-8">  
  <title>PSPＳＤＫプログラミング日誌</title>  
  <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp"/>  
  <modified>2006-04-01T20:57:47+09:00</modified>  
  <author>
    <name>pspborder</name>
  </author>  
  <tagline>PSPＳＤＫ試用の日記です</tagline>  
  <generator url="http://www.exblog.jp/">Excite Blog</generator>  
  <link rel="start" href="http://rss.exblog.jp/rss/exblog/pspborder/atom.xml" type="application/rss+xml"/>  
  <entry> 
    <title>【お知らせ】ひさしびりに書き込みしてみたものの</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/3127344/"/>  
    <id>http://pspborder.exblog.jp/3127344/</id>  
    <issued>2006-04-01T20:57:47+09:00</issued>  
    <modified>2006-04-01T21:39:02+09:00</modified>  
    <created>2006-04-01T20:57:47+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>お知らせ</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
こんにちわぁ、ＰＳＰＢＯＲＤＥＲです。<br/>
<br/>
サイト更新しなければと思いつつ、早半年が過ぎ<br/>
（すっかりこのブログ忘れかけてましたが<br/>
...いや、正確にはブログのＩＤとパスワードが<br/>
どうにも思い出せず...＾＾；）<br/>
<br/>
久しぶりにログオンしてみたら、結構アクセス数があったり（＾＾：）<br/>
<br/>
待たせたね、みんな（＾o＾）ノ<br/>
<br/>
これからがんがん、また行くのでヨロシクネ☆<br/>
<br/>
あ、そうそうここのブログ放置してた間なにやってたかと<br/>
いうと、ロリポップで別のバカねたやってたり。<br/>
<br/>
　『うそぴょんブログ!』です。<br/>
<br/>
　　URL: http://blog.usopyon.net/<br/>
<br/>
<br/>
そっちの方もヨロシクおねがいしますよ！<br/>
<br/>
ここをクリックで人気blogランキングへ（ご協力お願いします）<br/>

              
        ]]></content> 
  </entry>  
  <entry> 
    <title>【お知らせ】 土日サイト少しいぢります！</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/406958/"/>  
    <id>http://pspborder.exblog.jp/406958/</id>  
    <issued>2005-08-05T10:42:16+09:00</issued>  
    <modified>2005-08-05T10:42:16+09:00</modified>  
    <created>2005-08-05T10:42:16+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>お知らせ</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
画面が地味で、地味でと評判のこのサイト！<br/>
<br/>
このままではやる気にも関わりますのでサイトの<br/>
修正を行おうかと思います（悲しい事に内容を<br/>
充実という方向には行かないのです！びしっ）。<br/>
<br/>
とりあえず土日、ちょこちょこいぢるので<br/>
その間おかしな動きしたり、妙な記事（てすととか）<br/>
あがるかもです。気にしないようにしてくださいねっ（＞＿＜）ノ<br/>
<br/>
<br/>
<br/>
ここをクリックで人気blogランキングへ（ご協力お願いします）<br/>
<br/>

              
        ]]></content> 
  </entry>  
  <entry> 
    <title>3Dグラフィックス入門（その３） ジオメトリ演算１</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/277536/"/>  
    <id>http://pspborder.exblog.jp/277536/</id>  
    <issued>2005-07-23T22:52:11+09:00</issued>  
    <modified>2005-07-25T15:43:57+09:00</modified>  
    <created>2005-07-23T22:52:11+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>PSP開発</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
PSPSDKの定数追加や若干の仕様変更により、心理的にかなりのダメージ<br/>
を受けた上、PSPのファームウエア・アップグレードでＷＥＢブラウザが<br/>
使えるようになったりとか罠満載で続行も危ぶまれる『PSPＳＤＫプログラミング<br/>
日誌』ですが、それでも、踏ん張って付いて来てくれるものと信じてがんばり<br/>
ます。...ええ、がんばりますとも...無駄に（；＿；）<br/>
<br/>
『3Dグラフィックス入門（その２） ＧＵ描画 』、『3Dグラフィックス入門（その２）<br/>
 ＧＵ描画 』を経て、ＰＳＰのＧＵとＧＥを使用する際の初期化と描画命令に<br/>
ついて簡単に説明してきました。そう、もうあなたはＰＳＰで自由自在に３Ｄ<br/>
グラフィックスをもてあそぶ事ができるでしょう...できる...といいな(・＿・；）<br/>
<br/>
今回はＧＵやＧＥについての説明というより、３Ｄグラフィックスの説明に<br/>
なります（でも難しい事は説明できないので、都合が悪い場合はスルー<br/>
です。お約束です）。<br/>
<br/>
今回も長くなってしまいました。頂点座標についての説明に留まります。<br/>
<br/>
【頂点定義について】<br/>
　ＧＵにポリゴン描画（三角形だけどちゃんと覚えてるかな？）を行う場合<br/>
　まず頂点座標を定義します...がめんどいので次回に回します！といって<br/>
　いた部分ですがＣ言語の構造体で下記の様に定義されています。前回<br/>
　ＳＤＫライブラリ側で定義されていると言いましたが、大嘘です...cubeデモ<br/>
　側で定義されてました（＾＾；）...誰か突っ込んで欲しいと思う今日この頃<br/>
　です（恥ずかしいので、原文こっそり修正しました...鋭意日記捏造中）。<br/>
<br/>
　struct Vertex<br/>
　{<br/>
　float u, v;　// 投影面の座標系を横方向=U, 縦方向＝Ｖと表記する<br/>
　unsigned int color; // 頂点カラー<br/>
　float x,y,z;　// 頂点座標<br/>
　};<br/>
<br/>
　ふふっ、この簡単な定義に３Ｄの基礎がみっちり詰め込まれているではない<br/>
　ですか、せっかくなので、説明用に使わせて貰います。<br/>
　３Ｄポリゴン（三角形）を描画するために頂点を三つ用意してあげます。その<br/>
　個々の頂点は上記Vertex構造体の属性を持ちます。で当然３Ｄ空間という<br/>
　物があって、そこでの座標となります。構造体のメンバでいうとx,y,zがそれに<br/>
　あたります。各値はfloat(小数点型：ここでfloatの精度に関しては気にしない<br/>
　でください、ＰＳＰの場合同じMIPS32でも違うという事になってます...普通に<br/>
　使う分には変わらないはずですから、ああfloat型なんだねと漠然と理解して<br/>
　くれると非常に助かります）で表記されます。でX,Y,Zそれぞれなんですが<br/>
　Xは画面に対して横方向（幼稚な表現でごめん＾＾；）Ｙは縦方向、Zは奥行き<br/>
　となります。座標をX,Y,Zを表す際に右手座標系と左手座標系というのが<br/>
　ありますが、右手座標系です（のはずです...間違ってたらごめん＾＾；）<br/>
<br/>
　右手座標系について（ううっ、図使いたい＾＾；）<br/>
　　親指（Ｘ）、　人差し指（Ｙ）、　中指（Ｚ）<br/>
　　それぞれの値はＸは右に向かって増える、Ｙは上に向かって増える、<br/>
　　Ｚは奥から手前に向かって増えるです。<br/>
<br/>
　　ちなみに、左手座標だとＺだけ逆になります（手前から奥に向かって値が<br/>
　　増える）<br/>
<br/>
　Vertex構造体u, vメンバについてですが、これは透視変換への投影面<br/>
　等に使用されます。何を言っているかというと、せっかく３Ｄの座標をセット<br/>
　して３Ｄ空間をイのままに使えるようになっても、所詮ＰＳＰの液晶画面は<br/>
　２Ｄです（スターウォーズのホログラフィみいに物が浮かぶわけじゃない<br/>
　です）。だから、最終的に２Ｄに投影してあげる必要があります。その際<br/>
　にＰＳＰ画面上のどこにあたるかを表します。当然視点を変えると座標は<br/>
　変わらなくてもＵ，Ｖの値は変わります。あと投影は画面だけではなく<br/>
　描画するオブジェクトに対してのＵ，Ｖに使用したりもします（テクスチャ<br/>
　マッピング）...残念ながら、今回のサンプルではＵ,Ｖを求めるのは<br/>
　ＧＵ＋ＧＥのお仕事なので気にする必要ありません。<br/>
　６面体（cube)なので面は６面で１つの面を２つの３Ｄポリゴンで描画<br/>
　していますので頂点数は6X2=12個です。<br/>
<br/>
　Vertex構造体colorメンバですが、これは頂点色です。今回の例では<br/>
　３Ｄポリゴンごとに同じ頂点色をセットしていますが、これを頂点毎に<br/>
　変える事が出来ます（シェーディングモードがグーローシェーディング<br/>
　なので）<br/>
<br/>
<br/>
==============================================<br/>
　頂点定義例(PSPSDK cubeデモより抜粋）<br/>
==============================================<br/>
　struct Vertex<br/>
　{<br/>
　float u, v;　// 投影面の座標系を横方向=U, 縦方向＝Ｖと表記する<br/>
　unsigned int color; // 頂点カラー<br/>
　float x,y,z;　// 頂点座標<br/>
　};<br/>
<br/>
struct Vertex __attribute__((aligned(16))) vertices[12*3] =<br/>
{<br/>
{0, 0, 0xff7f0000,-1,-1, 1}, // 0<br/>
{1, 0, 0xff7f0000,-1, 1, 1}, // 4<br/>
{1, 1, 0xff7f0000, 1, 1, 1}, // 5<br/>
<br/>
{0, 0, 0xff7f0000,-1,-1, 1}, // 0<br/>
{1, 1, 0xff7f0000, 1, 1, 1}, // 5<br/>
{0, 1, 0xff7f0000, 1,-1, 1}, // 1<br/>
<br/>
{0, 0, 0xff7f0000,-1,-1,-1}, // 3<br/>
{1, 0, 0xff7f0000, 1,-1,-1}, // 2<br/>
{1, 1, 0xff7f0000, 1, 1,-1}, // 6<br/>
<br/>
{0, 0, 0xff7f0000,-1,-1,-1}, // 3<br/>
{1, 1, 0xff7f0000, 1, 1,-1}, // 6<br/>
{0, 1, 0xff7f0000,-1, 1,-1}, // 7<br/>
<br/>
{0, 0, 0xff007f00, 1,-1,-1}, // 0<br/>
{1, 0, 0xff007f00, 1,-1, 1}, // 3<br/>
{1, 1, 0xff007f00, 1, 1, 1}, // 7<br/>
<br/>
{0, 0, 0xff007f00, 1,-1,-1}, // 0<br/>
{1, 1, 0xff007f00, 1, 1, 1}, // 7<br/>
{0, 1, 0xff007f00, 1, 1,-1}, // 4<br/>
<br/>
{0, 0, 0xff007f00,-1,-1,-1}, // 0<br/>
{1, 0, 0xff007f00,-1, 1,-1}, // 3<br/>
{1, 1, 0xff007f00,-1, 1, 1}, // 7<br/>
<br/>
{0, 0, 0xff007f00,-1,-1,-1}, // 0<br/>
{1, 1, 0xff007f00,-1, 1, 1}, // 7<br/>
{0, 1, 0xff007f00,-1,-1, 1}, // 4<br/>
<br/>
{0, 0, 0xff00007f,-1, 1,-1}, // 0<br/>
{1, 0, 0xff00007f, 1, 1,-1}, // 1<br/>
{1, 1, 0xff00007f, 1, 1, 1}, // 2<br/>
<br/>
{0, 0, 0xff00007f,-1, 1,-1}, // 0<br/>
{1, 1, 0xff00007f, 1, 1, 1}, // 2<br/>
{0, 1, 0xff00007f,-1, 1, 1}, // 3<br/>
<br/>
{0, 0, 0xff00007f,-1,-1,-1}, // 4<br/>
{1, 0, 0xff00007f,-1,-1, 1}, // 7<br/>
{1, 1, 0xff00007f, 1,-1, 1}, // 6<br/>
<br/>
{0, 0, 0xff00007f,-1,-1,-1}, // 4<br/>
{1, 1, 0xff00007f, 1,-1, 1}, // 6<br/>
{0, 1, 0xff00007f, 1,-1,-1}, // 5<br/>
};<br/>
==============================================<br/>
<br/>
こんな感じで六面体（cube)を定義します。<br/>
次回は何とか透視変換まで行きたいです（いまだにちゃんと説明できてない）<br/>
<br/>
<br/>
ここをクリックで人気blogランキングへ（ご協力お願いします）<br/>
<br/>
<br/>
　　<br/>
<br/>
<br/>
<br/>

              
        ]]></content> 
  </entry>  
  <entry> 
    <title>【お知らせ】た、大変です！　ＷＥＢブラウザがっ</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/261352/"/>  
    <id>http://pspborder.exblog.jp/261352/</id>  
    <issued>2005-07-22T00:48:09+09:00</issued>  
    <modified>2005-07-25T15:52:14+09:00</modified>  
    <created>2005-07-22T00:48:09+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>お知らせ</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
ぐはぁっ、ファームウエアのアップグレードで<br/>
ＰＳＰでＷＥＢのブラウズできるようになるそうでちゅ（；＿；）<br/>
<br/>
ファームウエアのアップデータダウンロードは７月２７日からなの（；＿；）<br/>
ぐすん...。ついでに白いＰＳＰもでるそうです(白い奴は２００５年９月１５日<br/>
（木）発売にゃ)。<br/>
<br/>
詳細は下記ＵＲＬより<br/>
　http://www.watch.impress.co.jp/av/docs/20050721/scei1.htm<br/>
<br/>
<br/>
でね、皆さんにひとつ警告。<br/>
ファームウエアアップグレードするとね、ＰＳＰＳＤＫで作ったプログラム<br/>
動かなくなっちゃいます...ぐすん。ううっ、痛いとこついてくるなぁＳＣＥ様。<br/>
<br/>
しょうがない、もう一台買うかっ、白いの！<br/>
...をいをい何台買えばいいんだよ＾＾；...もうすでに２台手元にあります。<br/>
あ、新しいやつも動かないからねＰＳＰＳＤＫでつったプログラム（・＿・）ｂ<br/>
しかし、このＢＬＯＧもピンチなのじゃよ...いやいや負けないよー（＞＿＜）<br/>
<br/>
<br/>
ここをクリックで人気blogランキングへ（ご協力お願いします）<br/>
<br/>
<br/>
あ、そうそう皆様の温かいご支援のせいで、ＢＬＯＧランキング<br/>
滅茶苦茶あがってます、本当にありがとうございます（これからも<br/>
よろしくねぇ＾＾）<br/>
<br/>
===========================<br/>
 　７月２２日　00:52 現在<br/>
===========================<br/>
ウェブログ (10%) - 461位<br/>
プログラム (20%) - 61位    (<- ここ前１３６位でした＾＾；）<br/>
プレイステーション (60%) - 30位　<br/>
家庭用ゲーム機 (10%) - 110位　　（＜－ここにいたって<br/>
　　　　　　　　　　　　　　　　　　　　　　は８００位台、快進撃）<br/>
===========================<br/>
<br/>
<br/>
<br/>

              
        ]]></content> 
  </entry>  
  <entry> 
    <title>【お知らせ】人気ＢＬＯＧランキング投票お願いします（＾＾）ノ</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/250774/"/>  
    <id>http://pspborder.exblog.jp/250774/</id>  
    <issued>2005-07-20T22:55:41+09:00</issued>  
    <modified>2005-07-20T23:08:46+09:00</modified>  
    <created>2005-07-20T22:55:41+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>お知らせ</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
恥ずかしながら『人気ＢＬＯＧランキング』様に参加する事にしました。<br/>
<br/>
貴重な一票めぐんでやろうという、やさしい方おられましたら是非下記の<br/>
”ここをクリック...”の部分をクリックしてください。あなたの貴重な１票が<br/>
投票されます（無料です）。何卒ご協力お願いします m(_ _)m<br/>
<br/>
ここをクリックで人気blogランキングへ（ご協力お願いします）<br/>
<br/>
...今、プログラム・カテゴリで１３６位でした（＾＾）<br/>
<br/>
特に締め切り無く、毎日、投票は受け付けられてます。<br/>
気の向いたときで結構ですから（＾＾）ｂ<br/>
<br/>
人気ＢＬＯＧランキング様ＵＲＬ：　http://blog.with2.net/<br/>

              
        ]]></content> 
  </entry>  
  <entry> 
    <title>コラム１　（げげっ、ＧＵ関連異常ありっ）</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/248323/"/>  
    <id>http://pspborder.exblog.jp/248323/</id>  
    <issued>2005-07-20T18:06:46+09:00</issued>  
    <modified>2005-07-20T22:30:13+09:00</modified>  
    <created>2005-07-20T18:06:46+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>PSP開発</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
『3Dグラフィックス入門（その３） ジオメトリ演算』<br/>
に行く前に...ちょっと小ネタを（＾＾；）<br/>
<br/>
...やんなきゃ良いのにと思いつつ、ＰＳＰＳＤＫ最新版の<br/>
チエックアウトやっちゃいました。あーあ（－＿－；）<br/>
<br/>
...おもいっきり、変わってるよ、ＧＵ関連...orz<br/>
<br/>
あ、一通り古いバージョンで説明したら、更新の詳細<br/>
説明します（＾＾；）だから、今はこのままなの、これで<br/>
いくの（；＿；）<br/>
<br/>
ざっとみて気づいた事書きます（＾＾）<br/>
<br/>
【おいおい対応すればいい事】<br/>
　　・今まで関数呼ぶときに使用していたパラメータで直値で<br/>
　　　していたものは新たに定数が定義され、それを指定します。<br/>
<br/>
　　　例えば０だった物はGU_ＸＸＸ＿ＸＸＸＸみたいので指定。<br/>
<br/>
　　・初期化系の関数で、今まで暗黙の了解で０を指定すれば<br/>
　　　良かった物が新たにモード追加されています（ハッキ...調査<br/>
　　　が思った以上に進んでます）。とりあえず０のままでも<br/>
　　　良いみたいですが＾＾；<br/>
<br/>
　　・GE_SETREG_VTYPE()というわけのわかんないマクロ<br/>
　　　使わなくても良くなりました...今度は定数の指定にて行います。<br/>
　　　わりと判りやすくなった気がします（このマクロ嫌だったんだよなぁ）。<br/>
<br/>
【ちびし～と思っている事】<br/>
　　・既存で定義されていた定数が変更になった物があります。<br/>
　　　（書き直す必要がありますＴＴ）値は変わってないので<br/>
　　　見なかったことにするという手もありますが...。<br/>
<br/>
　　・ＳＤＫライブリ関数の変更では無いのですが<br/>
　　　matrix_projection()透視変換マトリクス操作関数へ渡す値<br/>
　　　が一部変わってます（＾＾；）...何故だぁ（＞＿＜）ノ<br/>
　　　....どうしてくれよう（・＿・；）<br/>
<br/>
ま、成長中ですからねぇ、想定外の事をばんばんやってくれますＰＳＰＳＤＫ！<br/>
はっきり、いって凄く良くするための変更なのでウエルカムなんですが（＾o＾）<br/>
<br/>
...日誌書き始めるの１ヶ月遅らせればよかった....ぼそっ！<br/>
<br/>
　<br/>
ここをクリックで人気blogランキングへ（ご協力お願いします）<br/>
<br/>
　　<br/>
<br/>
<br/>
<br/>

              
        ]]></content> 
  </entry>  
  <entry> 
    <title>3Dグラフィックス入門（その２） ＧＵ描画</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/236224/"/>  
    <id>http://pspborder.exblog.jp/236224/</id>  
    <issued>2005-07-19T11:17:05+09:00</issued>  
    <modified>2005-07-25T14:09:18+09:00</modified>  
    <created>2005-07-19T11:17:05+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>PSP開発</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
ああ、途中間があいてしまいましたね（＾＾；）<br/>
飽きたわけでわないんです。...違うんですＧ○O2が悪いんです。<br/>
...ええ、もう極悪ですとも。<br/>
<br/>
前回は、物凄い勢いでGU初期化について説明しましたが、如何だったで<br/>
しょうか？正直むずいので、全部理解する必要ないです。こんなもんかな<br/>
程度に押さえといて下さいね。<br/>
<br/>
さて、前回 『3Dグラフィックス入門（その１） ＧＵ初期化』でＧＵに対して<br/>
描画の準備が整いました。今回は、GUのプリミティブ（ＧＵで用意して<br/>
くれている基本図形など）の描画について説明します。<br/>
尚、今回も盛りだくさんなのでデータ表記や、ジオメトリ変換用の関数<br/>
の説明は次回に回します（さぁ、のっけから雲行きが怪しく...＾＾）。<br/>
<br/>
ＰＳＰＳＤＫのcubeデモよりＧＵ描画部分のみ抜粋しました。<br/>
<br/>
==============================================<br/>
　ＧＵ描画の例(PSPSDK cubeデモより抜粋）<br/>
==============================================<br/>
<br/>
　　・・・　中略（関数内のグローバル変数宣言部)<br/>
<br/>
1: struct Vertex __attribute__((aligned(16))) <br/>
　　vertices[12*3] =<br/>
　　・・・　中略（Vertex=頂点座標）のセット（ここにcubeの形状がっ）<br/>
2: };<br/>
<br/>
　　・・・　中略（メイン関数内描画ロジック)<br/>
<br/>
3:    ScePspFMatrix4 projection;<br/>
4.    ScePspFMatrix4 view;<br/>
5:    ScePspFMatrix4 world;<br/>
<br/>
6:    int val = 0;<br/>
<br/>
　　　// 描画用ループ<br/>
7:    for(;;)<br/>
8:    {<br/>
9:        sceGuStart(0,list);<br/>
<br/>
　　　　// 画面クリア<br/>
10:       sceGuClearColor(0xff554433);<br/>
11:       sceGuClearDepth(0);<br/>
12:       sceGuClear(GE_CLEAR_COLOR|GE_CLEAR_DEPTH);<br/>
<br/>
　　　　// cubeのマトリクスをセットする<br/>
13:       matrix_identity((float*)&projection);<br/>
14:       matrix_projection((float*)&projection,<br/>
　　　　　5.0f,16.0/9.0f,0.01f,1000.0f);<br/>
15:       sceGuSetMatrix(GU_MATRIX_PROJECTION,<br/>
　　　　　 &projection);<br/>
　　　　　<br/>
16:       matrix_identity((float*)&view);<br/>
17:       sceGuSetMatrix(GU_MATRIX_VIEW,&view);<br/>
<br/>
18:       matrix_identity((float*)&world);<br/>
19:       matrix_translate((float*)&world,0,0,-3.0f);<br/>
20:       matrix_rotate((float*)&world,<br/>
　　　　　 val * 0.79f * (M_PI/180.0f), <br/>
　　　　　 val * 0.98f * (M_PI/180.0f), <br/>
　　　　　 val * 1.32f * (M_PI/180.0f));<br/>
21:       sceGuSetMatrix(2,&world);<br/>
<br/>
　　　　　・・・　中略（テクスチャーやマテリアルのセット）<br/>
<br/>
　　　　// cubeの描画<br/>
22:       sceGuDrawArray(GU_PRIM_TRIANGLES,<br/>
　　　　　 GE_SETREG_VTYPE(GE_TT_32BITF,GE_CT_8888,<br/>
　　　　　 0,GE_MT_32BITF,0,0,0,0,0),12*3,0,vertices);<br/>
<br/>
23:       sceGuFinish();<br/>
24:       sceGuSync(0,0);<br/>
<br/>
25:       sceDisplayWaitVblankStart();<br/>
26:       sceGuSwapBuffers();<br/>
<br/>
27:       val++;<br/>
28:    }<br/>
==============================================<br/>
<br/>
<br/>
【描画の大まかな流れについて】<br/>
　例によってだらだら書いてますのでわかりにくいです（＾＾；）<br/>
　なのでポイントをまず先に記載しますね。これに沿って説明<br/>
　していきましょう。<br/>
<br/>
　 ・cube頂点座標を用意します。<br/>
　 ・マトリクス演算用変数の宣言。<br/>
　 ・描画用のループを用意します（無限ループ）<br/>
　 ・描画用のコマンドリスト開始宣言をします（終了までが<br/>
　　 描画対象です）<br/>
　 ・ 画面をクリアします（描画前に必ずクリアします）<br/>
　 ・透視変換用マトリクスをセットします。<br/>
　 ・ビュー用マトリクスをセットします。<br/>
　 ・ワールド座標用マトリクスをセットします。<br/>
　　　（描画ループ内でcubeの形状、透視変換、ビューともに<br/>
　　　　毎回固定ですがワールド座標用のマトリクスに回転を<br/>
　　　　加える事でcubeを回転させています）<br/>
　 ・ＧＵプリミィティブ描画にてcubeの描画を行います。<br/>
　 ・描画用のコマンドリスト終了宣言をし、GUに実行要求を行います。<br/>
　 ・次の描画の準備をします。　<br/>
　 ・描画用のループに戻ります。<br/>
<br/>
<br/>
<br/>
【cube頂点座標について】<br/>
　ううっ、cube形状を定義するための重要な情報ですが詳細<br/>
　次にまわします（その方が説明に都合が良いので）。ここは<br/>
　Vertexという頂点定義の型があってそれをDMA転送のきり<br/>
　の良い形で頂点の情報を定義するんだなぁと思ってください。<br/>
　1行目から3行目がそうです。ここでセットされている頂点座標<br/>
　がcubeの形（大きさや位置も含めた）になります。<br/>
 <br/>
　 1: struct Vertex __attribute__((aligned(16))) <br/>
　 　　vertices[12*3] =<br/>
　　・・・　中略（Vertex=頂点座標）のセット（ここにcubeの形状がっ）<br/>
　 2: };<br/>
<br/>
<br/>
【マトリクス演算用変数について】<br/>
　 詳細は次回参照ですが、マトリクスとは行列の事を指します。<br/>
　 色んな行列を用意していますが、今回は透視変換用マトリクス、<br/>
　　ビュー用マトリクス、ワールド座標用マトリクスがあります。<br/>
　　凄い乱暴な言い方をしますが（次回説明するから＾＾；）<br/>
　　透視変換用マトリクスは3DからＰＳＰの２Ｄ画面への置き換え<br/>
　　（レンダリングとかラスタライズとかいいます）で使います。ビュー<br/>
　　用マトリクスは３Ｄ空間の見える部分の切り出し、ワールド用<br/>
　　マトリクスはオブジェクトを配置している空間の操作を行うために<br/>
　　使用します（cubeしか配置してないのでワールドを回転させると<br/>
　　cubeが回転してみえるでしょ）。変数はScePspFMatrix4（４<br/>
　　列の行列からなるマトリクス）型で宣言します（3行から5行目まで）。<br/>
<br/>
　 3:    ScePspFMatrix4 projection;<br/>
　 4.    ScePspFMatrix4 view;<br/>
　 5:    ScePspFMatrix4 world;<br/>
<br/>
<br/>
【描画用のループを用意します（無限ループ）について】<br/>
　GUに何か描画させるためにはひっきりなしに描画コマンドを送り<br/>
　つづける必要があります（Windows見たいに他のアプリが画面を<br/>
　更新する事はないので、別に画面変わんないなら止めてていいじゃん<br/>
　と思うでしょうが、パッドとかのボタン押したかどうか判定も必要なので...）。<br/>
　で、必ず描画を行うループが必要になります。ループ自体は無限ループ<br/>
　で、これを抜けルためにはＰＳＰ本体のHOMEキーを押します（そのために<br/>
　プログラム開始時点で割り込み用スレットの定義を行っていますが、３Ｄ<br/>
　プログラミングとは何にも関係無いし定型的な処理なので割愛させて<br/>
　いただきます）。HOMEキーを押すとループを抜けcubeプログラムは<br/>
　終了し、PSPのブラウザへ戻ります。描画ループは7行目から28行目<br/>
　までです。<br/>
<br/>
　意外に重要なのが6行目で宣言されているvalという整数の変数ですが<br/>
　これはループを繰り返すごとに１づつカウントされていきます（27行参照）。<br/>
　じゃ、valは何に使ってるのか？というとcubeの回転に使われてます。<br/>
　27行をコメントアウトして無効化すると判りますが、cubeが回転しない<br/>
　とてもつまらないプログラムになります。あと、valは無限にカウントしつづ<br/>
　けますのでいつか(符号付３２bit整数なので2の(32-1)乗-１まで<br/>
　カウントしたところで何チャラオーバーフローでプログラム自体がストップ<br/>
  すると思います。時間的にはさらに60で割ると秒数がでます。かなり<br/>
  長い事頑張ります)。あくまでもサンプルなのでこういう作り方をしていますが<br/>
  こういうのは見習わないようにね（＾＾；）<br/>
<br/>
　 6:    int val = 0;<br/>
　 7:    for(;;)<br/>
　 8:    {<br/>
　　・・・　　　中略（描画の要求が入ります）<br/>
　 27:       val++;<br/>
　 28:    }<br/>
<br/>
<br/>
【ＧＵコマンドリスト開始と終了について】<br/>
　前回の『3Dグラフィックス入門（その１） ＧＵ初期化』で説明したのと<br/>
　全く一緒なのでそちらを見てください。cubeの描画はsceGuSync()<br/>
　実行時に行われます。<br/>
<br/>
　 9:        sceGuStart(0,list);<br/>
<br/>
　　　　　・・・　ＧＵに送る要求（今回は計算済のマトリクスと<br/>
　　　　　　　　プリミティブ描画）<br/>
<br/>
　 23:       sceGuFinish();<br/>
　 24:       sceGuSync(0,0);<br/>
<br/>
<br/>
【 画面クリアについて】<br/>
　 毎回描画を始める前に画面全体をクリアします（正確には描画バッファ<br/>
　　の内容を指定カラーで埋めるだけです）。10行目のsceGuClearColor()<br/>
　 で画面消去のための色を指定します。今回、描画バッファは<br/>
　 GE_PSM_8888(24Bitフルカラー）で指定しているので色は24bitです。<br/>
　 頭ｆｆは固定です。<br/>
　 微妙に違うんですが、背景色としてsceGuClearColor()を考えてもいいかも<br/>
　 です。<br/>
<br/>
　　あと被写界深度バッファ（これも前回説明しましたね）もクリアするので、<br/>
　　それも指定します。11行目のsceGuClearDepth()がそれにあたり<br/>
　　ます。<br/>
　<br/>
　　実際に描画バッファや被写界深度バッファを指定値でクリアするのは<br/>
　　12行目のsceGuClear()のお仕事です。ここら辺は10行目の指定色<br/>
　　値以外は固定でいいです。<br/>
<br/>
　 　　　　// 画面クリア<br/>
　 10:       sceGuClearColor(0xff554433);<br/>
　 11:       sceGuClearDepth(0);<br/>
　 12:       sceGuClear(GE_CLEAR_COLOR|GE_CLEAR_DEPTH);<br/>
<br/>
<br/>
【各マトリクスのセットについて】<br/>
　 詳細は次回に回しますがジオメトリのマトリクス演算に関しては<br/>
　 GEでは無くＣ言語のプログラムで行う事になります（理由は前回<br/>
　 説明しました）。matrix_XXXX（）という関数がそれを行ってくれます。<br/>
　 大体パターンは下記の流れです。<br/>
　　　　・matrix_identity()でマトリクス変数の初期化<br/>
　　　　・マトリクスの変換<br/>
　　　　　　　matrix_projection()で透視変換作成とか<br/>
　　　　　　　matrix_translate()で移動とか<br/>
　　　　　　　matrix_rotate()で回転とか<br/>
<br/>
　　　　・マトリクス値のＧＵへのセット<br/>
　　　　　　　sceGuSetMatrix()で行います（正確にはGE経由だと<br/>
　　　　　　　思われ...)<br/>
　　　　　　　変換が必要の無い物はこれで直に渡すですよ。<br/>
<br/>
　　　　例によって使えないコメント付記しておきますね（＾＾）   <br/>
<br/>
　　　　// 透視変換用マトリクスをセットします。<br/>
　　　　13:       matrix_identity((float*)&projection);<br/>
　　　　14:       matrix_projection((float*)&projection,<br/>
　　　　　 　　　　　5.0f,16.0/9.0f,0.01f,1000.0f);<br/>
　　　　15:       sceGuSetMatrix(GU_MATRIX_PROJECTION,<br/>
　　　　　 　　　　　 &projection);<br/>
<br/>
　　　　// ビュー用マトリクスをセットします。　　<br/>
　　　　16:       matrix_identity((float*)&view);<br/>
　　　　17:       sceGuSetMatrix(GU_MATRIX_VIEW,&view);<br/>
<br/>
　　　　// ワールド座標用マトリクスをセットします。<br/>
　　　　//   ほら、変数valを使用して回転させてるでしょ！<br/>
　　　　18:       matrix_identity((float*)&world);<br/>
　　　　19:       matrix_translate((float*)&world,0,0,-3.0f);<br/>
　　　　20:       matrix_rotate((float*)&world,<br/>
　　　　　 　　　　　 val * 0.79f * (M_PI/180.0f), <br/>
　　　　　 　　　　　 val * 0.98f * (M_PI/180.0f), <br/>
　　　　　 　　　　　 val * 1.32f * (M_PI/180.0f));<br/>
　　　　21:       sceGuSetMatrix(2,&world);<br/>
<br/>
<br/>
【ＧＵプリミィティブ描画について】<br/>
　 既に頂点座標として定義してある変数を（cubeの頂点座標群である<br/>
   vertices）使用してプリミティブの描画要求を行います。22行目の<br/>
　　sceGuDrawArray()がそれで、さらにGU_PRIM_TRIANGLES<br/>
　　を指定してますがこれは三角形（これこそが俗にいうポリゴンで<br/>
　　あります）です...やりました、ポリゴン描画まで行き着きました。<br/>
　　ううっ、思えば永い旅路でした（Ｔ＿Ｔ）。<br/>
　<br/>
　 // cubeの描画<br/>
　 22:       sceGuDrawArray(GU_PRIM_TRIANGLES,<br/>
　 　　　　　 GE_SETREG_VTYPE(GE_TT_32BITF,GE_CT_8888,<br/>
　 　　　　　 0,GE_MT_32BITF,0,0,0,0,0),12*3,0,vertices);<br/>
<br/>
　 当然、色んなプリミティブをsceGuDrawArray()で描画できますが<br/>
　 違うプリミティブ（例えば線）とか描画するんなら、別の頂点座標変数<br/>
　 の用意が必要です（表記も微妙に違います）<br/>
　　<br/>
　　sceGuDrawArray()のリファレンスはこんな感じで<br/>
<br/>
　　　　　PARAM1: prim - 描画するプリミティブのタイプ<br/>
　　　　　　 現在PSPSDKで使用できるＧＵプリミティブ<br/>
　　　　　　　（ＯｐｅｎＧＬとかのプリミティブもこんな感じです）<br/>
　　　　　　 　GE_PRIM_POINTS<br/>
　　　　　　 　GE_PRIM_LINES<br/>
　　　　　　 　GE_PRIM_LINESTRIPS<br/>
　　　　　　 　GE_PRIM_TRIANGLES<br/>
　　　　　　 　GE_PRIM_TRISTRIPS<br/>
　　　　　　 　GE_PRIM_TRIFANS<br/>
　　　　　　 　GE_PRIM_SPRITES<br/>
<br/>
　　　　　PARAM2: vtype - 頂点タイプ<br/>
　　　　　　　GE_SETREG_VTYPE（)マクロを指定して指定<br/>
　　　　　　　します（pspgu.h参照）特に描画バッファのモード<br/>
　　　　　　　変えないならこのままでも（＾＾；）<br/>
<br/>
　　　　　PARAM3: count   - 　頂点情報の数（頂点の数じゃないよ）<br/>
　　　　　　　　　　　　　　　　　　　　 頂点情報vertices[12*3] と宣言<br/>
　　　　　　　　　　　　　　　　　　　　　されてますので、ここで指定する数は<br/>
　　　　　　　　　　　　　　　　　　　　　12*3です。<br/>
<br/>
　　　　　PARAM4: indices - 　頂点情報を他のプリミティブと兼用する<br/>
　　　　　　　　　　　　　　　　　　　　わけではないので先頭の０でいいです。<br/>
　　　　　　　　　　　　　　　　　　　　兼用するなら配列内でのインデックスを<br/>
　　　　　　　　　　　　　　　　　　　　指定してください。<br/>
<br/>
　　　　　PARAM5: vertices - 　頂点情報が格納されている変数のポインタ<br/>
　　　　　　　　　　　　　　　　　　　　　今回はverticesを使用しますので、<br/>
　　　　　　　　　　　　　　　　　　　　　verticesを指定します。<br/>
<br/>
<br/>
<br/>
【次の描画について】<br/>
　 描画が行われましたので次の描画の準備をします。<br/>
　 ・次のVBlank割り込を待ちます（25行）<br/>
<br/>
　 ・作業用バッファと描画用バッファを切り替えます（26行）。毎回描画用<br/>
　　バッファと作業用バッファを切り替えて使います。<br/>
<br/>
　 25:       sceDisplayWaitVblankStart();<br/>
　 26:       sceGuSwapBuffers();<br/>
<br/>
<br/>
ぬおおおっ、今回も物凄い勢いで詰め込みましたがいかかだったでしょうか？<br/>
たかだか２７行のプログラムにこんな説明が入るなんて...何て効率の悪い<br/>
...私ってば頭が悪いんでしょうか？（Ｔ＿Ｔ）...既に日記じゃないし！<br/>
<br/>
あ、次回で何とかジオメトリ変換とかマトリクスの救済をしたいです（＾＾；）<br/>
<br/>
<br/>
ここをクリックで人気blogランキングへ（ご協力お願いします）<br/>

              
        ]]></content> 
  </entry>  
  <entry> 
    <title>3Dグラフィックス入門（その１） ＧＵ初期化</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/169406/"/>  
    <id>http://pspborder.exblog.jp/169406/</id>  
    <issued>2005-07-11T18:49:21+09:00</issued>  
    <modified>2005-07-20T22:29:22+09:00</modified>  
    <created>2005-07-11T18:49:21+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>PSP開発</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
とりあえず、ヘルプを入手できたので<br/>
先に『３Ｄグラフィックスが動いた日』で取り上げた”cube”デモで<br/>
解説していきます（途中で飽きたら止めます）。<br/>
<br/>
今回は、ＧＵ（グラフックス・ユニットの略でPSPのググラフィッフックスチップ<br/>
を指します）の基本的な使用方法と、初期化まで説明します。編集の都合上<br/>
おかしなところで改行してたりしますが、気にしないで下さい（サンプルには<br/>
動く物がちゃんと入ってますから）<br/>
<br/>
ＰＳＰＳＤＫのcubeデモよりＧＵ初期化部分のみ抜粋しました。<br/>
<br/>
==============================================<br/>
　ＧＵ初期化の例(PSPSDK cubeデモより抜粋）<br/>
==============================================<br/>
 1: static unsigned int __attribute__((aligned(16))) <br/>
　　　　　　　list[262144];<br/>
 <br/>
・・・ 省略<br/>
<br/>
 2: sceGuInit();<br/>
 3: sceGuStart(0,list);<br/>
 4: sceGuDrawBuffer(GE_PSM_8888,(void*)0,BUF_WIDTH);<br/>
 5: sceGuDispBuffer(SCR_WIDTH,SCR_HEIGHT,<br/>
　　　　　　　(void*)0x88000,BUF_WIDTH);<br/>
 6: sceGuDepthBuffer((void*)0x110000,BUF_WIDTH);<br/>
 7: sceGuOffset(2048 - (SCR_WIDTH/2),2048 - <br/>
　　　　　　　(SCR_HEIGHT/2));<br/>
 8: sceGuViewport(2048,2048,SCR_WIDTH,SCR_HEIGHT);<br/>
 9: sceGuDepthRange(0xc350,0x2710);<br/>
10: sceGuScissor(0,0,SCR_WIDTH,SCR_HEIGHT);<br/>
11: sceGuEnable(GU_STATE_SCISSOR);<br/>
12: sceGuDepthFunc(GE_TEST_GEQUAL);<br/>
13: sceGuEnable(GU_STATE_ZTE);<br/>
14: sceGuFrontFace(GE_FACE_CW); // NOTE: not CCW<br/>
15: sceGuShadeModel(GE_SHADE_GOURAUD);<br/>
16: sceGuEnable(GU_STATE_CULL);<br/>
17: sceGuEnable(GU_STATE_TEXTURE);<br/>
18: sceGuFinish();<br/>
19: sceGuSync(0,0);<br/>
<br/>
20: sceDisplayWaitVblankStart();<br/>
21: sceGuDisplay(GU_DISPLAY_ON);<br/>
<br/>
・・・ 省略<br/>
==============================================<br/>
<br/>
<br/>
【ＧＵシステムの初期化について】<br/>
　　ＧＵを使用するにあたって必ず１回だけ、初期化を行います。<br/>
　　必ず、何らかの要求をＧＵに対して行う前に初期化を行って下さい。<br/>
　　3行目がそれにあたります。パラメータはありません。<br/>
<br/>
　　3: sceGuInit();<br/>
<br/>
<br/>
【ＧＵコマンドリストについて】<br/>
　　ＧＵに送信するＧＵアセンブリ（コマンドみたいの）はコマンドリスト<br/>
　　として事前に用意したコマンドリスト配列変数にGU用のライブラリ<br/>
　　関数経由でセットします。描画の直前にコマンドリスト変数はＤＭＡ<br/>
　　転送でＧＵに送られます。そこで注意なのが、ＤＭＡ転送に都合の<br/>
　　よい境界サイズでこのコマンドリスト配列を用意するのがポイントです。<br/>
<br/>
　 1: static unsigned int __attribute__((aligned(16))) <br/>
　　　　　　　list[262144];<br/>
<br/>
　　1行目のこの部分がそうです。以降、配列変数listはずーっと使われる<br/>
　　重要な変数です。覚えておきましょう。__attribute__((aligned(16))) <br/>
　　というのがＤＭＡ転送に都合のよい境界サイズです（とりあえずコマンドリスト<br/>
　　変数はこのままで良いです...少し配列のサイズがサンプル用としては<br/>
　　大きすぎる気がしますが...）。あと、何かGU（ＧＥもですが...）に間する<br/>
　　ライブラリ関数sceXXXX()と関数を実行するたびに実際にＧＵに送られる<br/>
　　ＧＵアセンブリがこの配列変数listに蓄えられていきます。<br/>
<br/>
<br/>
【ＧＵコマンドリスト開始と終了について】<br/>
　　じゃぁ、無限に配列変数listを蓄えるだけなのかというと、そういうことでは<br/>
　　なくていつかは完了になります。ＧＵコマンドリストの開始と終了は下記の<br/>
　　用に行います。今回は初期化の部分を抽出してみましたが、ポリゴンの<br/>
　　描画を行う際にも、ＧＵコマンドリスト開始と終了を繰り返します。<br/>
<br/>
　　3: sceGuStart(0,list);<br/>
<br/>
　　　　　・・・　ＧＵに送る要求<br/>
<br/>
　　18: sceGuFinish();<br/>
　　19: sceGuSync(0,0);<br/>
<br/>
　　3行目のsceGuStart()はこれからコマンドリスト（配列変数list）を使います<br/>
　　よという宣言です。当然、第2引数には配列変数listの先頭アドレスが指定<br/>
　　されていますので、この時点以降のＧＵに対する要求はこの変数の先頭<br/>
　　から順に積み上げられていきます。第1引数の0は気にしないで下さい。<br/>
　　今のPSPSDKでは0で必ずセットする事になっています（調査が進んで<br/>
　　いないのと、実装が特に無いため）　注：将来的には変わる可能性あります。<br/>
<br/>
　　18行目のsceGuFinish()でコマンドの完了を宣言します。<br/>
<br/>
　　19行目のsceGuSync（）にて一括でコマンドを実行します。これも第1、第2<br/>
　　引数共に0でセットしてください。　注：将来的には変わる可能性あります。<br/>
   <br/>
　　　<br/>
　　毎回、何かＧＵに要求するたんびに、これの繰り返しです。<br/>
<br/>
<br/>
<br/>
【ＧＵに送る初期化情報について】<br/>
　　...多いです。ちゃんと説明するべきなんでしょうが大変なのでコメント<br/>
　　のみ付加しときます。多分画面モード変えないなら殆ど使いまわし<br/>
　　ができるはずなので。あと、各種バッファに割り当てられているアドレス<br/>
　　ですが詳細の記載がヘルプにないのでしばらく暗黙の了解としてそのまま<br/>
　　同じ値を使用します。<br/>
<br/>
　　4: sceGuDrawBuffer(GE_PSM_8888,(void*)0,BUF_WIDTH);<br/>
　　　　ＧＵが使用する描画バッファについて設定を行います。<br/>
　　　　<br/>
　　　　パラメータ<br/>
　　　　　PARAM1: psm  - レンダリングや 表示を行う際のピクセル深度<br/>
　　　　　PARAM2: fbp  - VRAMのどこから描画バッファに使うかを指定<br/>
　　　　　　　　　　　　　　　　します。（オフセット値）<br/>
　　　　　　　　　　　　　　　特に理由が無い限り。0=VRAM原点から描画バッファ<br/>
　　　　　　　　　　　　　　　として使用します。  <br/>
　　　　　PARAM3: fbw  - フレームバッファの幅 (ブロックの並び)<br/>
　　　　　　　　　　　　　　　フレームバッファの幅をブロックの並びで<br/>
　　　　　　　　　　　　　　　指定します。BUF_WIDTHは定数として<br/>
　　　　　　　　　　　　　　　プログラム側で定義している物で値は512です。<br/>
  <br/>
　　 5: sceGuDispBuffer(SCR_WIDTH,SCR_HEIGHT,<br/>
　　　　　　　　　　　　 (void*)0x88000,BUF_WIDTH);<br/>
　　　　ＧＵが使用する描画バッファについて設定を行います。<br/>
　　　　　PARAM1: width  - 描画バッファ幅（ピクセルサイズ）<br/>
　　　　　　　　　　　　　　　SCR_WIDTHは定数として<br/>
　　　　　　　　　　　　　　　プログラム側で定義している物で値は480です。<br/>
　　　　　PARAM2: height  - 描画バッファ高さ（ピクセルサイズ）<br/>
　　　　　　　　　　　　　　　SCR_HEIGHTは定数として<br/>
　　　　　　　　　　　　　　　プログラム側で定義している物で値は272です。<br/>
　　　　　PARAM3: dispbp  - 描画バッファが割り当てられるVRAMアドレス<br/>
　　　　　　　　　　　　　　　0x88000番地のアドレスを固定で割り振っています。<br/>
　　　　　PARAM4: dispbw  - 描画バッファの幅 (ブロックの並び)<br/>
　　　　　　　　　　　　　　　描画バッファの幅をブロックの並びで<br/>
　　　　　　　　　　　　　　　指定します。BUF_WIDTHは定数として<br/>
　　　　　　　　　　　　　　　プログラム側で定義している物で値は512です。<br/>
<br/>
　　 6: sceGuDepthBuffer((void*)0x110000,BUF_WIDTH);<br/>
　　　　ＧＵが使用する被写界深度バッファについて設定を行います。<br/>
　　　　被写界深度バッファ(デプスバッファ）は視点から見た物体の<br/>
　　　　前後関係を把握するための領域です。この被写界深度範囲外の<br/>
　　　　物体は描画されない。<br/>
　　　　ので奥行きのカリングとして考えても良いです。<br/>
　　　　　PARAM1: zbp  - 被写界深度バッファが割り当てられるVRAMアドレス<br/>
　　　　　　　　　　　　　　　0x110000番地のアドレスを固定で割り振っています。<br/>
　　　　　PARAM2: zbw  - 被写界深度バッファの幅 (ブロックの並び)<br/>
　　　　　　　　　　　　　　　被写界深度バッファの幅をブロックの並びで<br/>
　　　　　　　　　　　　　　　指定します。BUF_WIDTHは定数として<br/>
　　　　　　　　　　　　　　　プログラム側で定義している物で値は512です。<br/>
<br/>
　　 7: sceGuOffset(2048 - (SCR_WIDTH/2),2048 - <br/>
　　　　　　　　　　　　　　　(SCR_HEIGHT/2));<br/>
　　　　仮想空間のオフセット座標について設定を行います。<br/>
　　　　　PARAM1: x  - X座標のオフセット (範囲0-4095)  <br/>
　　　　　PARAM2: y  - Y座標のオフセット (範囲0-4095)  <br/>
<br/>
<br/>
　　 8: sceGuViewport(2048,2048,SCR_WIDTH,SCR_HEIGHT);<br/>
　　　　ビューポートについて設定を行います。<br/>
　　　　　PARAM1: cx  - ビューポート水平方向のセンターＸ値 <br/>
　　　　　PARAM2: cy  - ビューポート水平方向のセンターＹ値 <br/>
　　　　　PARAM3: width  - ビューポートの幅 <br/>
　　　　　PARAM4: height  - ビューポートの高さ<br/>
<br/>
　　 9: sceGuDepthRange(0xc350,0x2710);<br/>
　　　　被写界深度バッファの範囲設定を行います。<br/>
　　　　　PARAM1: near  - 被写界深度範囲手前（10進数で50000を指定）<br/>
　　　　　PARAM2: far  - 被写界深度範囲奥（10進数で10000を指定）<br/>
<br/>
　　10: sceGuScissor(0,0,SCR_WIDTH,SCR_HEIGHT);<br/>
　　　　ビューポートの表示面を設定します。<br/>
　　　　　PARAM1: x  - 表示領域X(0)<br/>
　　　　　PARAM2: y  - 表示領域Y(0)<br/>
　　　　　PARAM3: w  - 表示領域幅（480)<br/>
　　　　　PARAM4: h  - 表示領域高さ(272)<br/>
<br/>
　　11: sceGuEnable(GU_STATE_SCISSOR);<br/>
　　　　GUの状態設定を行います。<br/>
　　　　　PARAM1: GE_STATE_SCISSOR - ビューポート指定領域の表示<br/>
<br/>
　　12: sceGuDepthFunc(GE_TEST_GEQUAL);<br/>
　　　　被写界深度テスト機能使用時のテスト内容選択を指定します。<br/>
　　　　　　GE_TEST_GEQUAL: ピクセル値が規定以上ならテストを通過<br/>
　　　　　　　　　　　　　　基本的に何をやってくれるか判らないので<br/>
　　　　　　　　　　　　　　しばらく固定で使います。<br/>
<br/>
　　13: sceGuEnable(GU_STATE_ZTE);<br/>
　　　　GUの状態設定を行います。<br/>
　　　　　PARAM1: GU_STATE_ZTE - 被写界深度テスト機能を使用します。<br/>
<br/>
　　14: sceGuFrontFace(GE_FACE_CW); // NOTE: not CCW<br/>
　　　　描画面の設定を行います。<br/>
　　　　　注意：sceGuEnable(GU_STATE_CULL);が設定されていなければ<br/>
　　　　　　　　本設定は無効です。<br/>
　　　　　　　　指定できるのは２種類です。<br/>
　　　　　　　　GE_FACE_CW - 裏面を描画しない（表面は頂点座標の<br/>
　　　　　　　　　　　　　　指定が時計回りであるもの）<br/>
　　　　　　　　　　　　　　通常は、こちらの方で良いです。<br/>
<br/>
　　　　　　　　GE_FACE_CCW - 裏面を描画する。<br/>
<br/>
<br/>
　　15: sceGuShadeModel(GE_SHADE_GOURAUD);<br/>
　　　　プリミティブオブジェクトのシェーディングモードを指定します。<br/>
　　　　　　　　指定できるのは２種類です。<br/>
　　　　　　　　GE_SHADE_FLAT - フラットシェーディング<br/>
　　　　　　　　GE_SHADE_GOURAUD  - グーローシェーディング<br/>
<br/>
　　16: sceGuEnable(GU_STATE_CULL);<br/>
　　　　GUの状態設定を行います。<br/>
　　　　　PARAM1: GU_STATE_CULL - プリミティブオブジェクト描画時の<br/>
　　　　　　　　　　　　　　　　　カリングを行う（これひょっとすると<br/>
　　　　　　　　　　　　　　　　　デフォルトのカリング方法でカリング<br/>
　　　　　　　　　　　　　　　　　を行う事かもしれませんがよく判<br/>
　　　　　　　　　　　　　　　　　らないです。気にしないことにした）。<br/>
<br/>
　　17: sceGuEnable(GU_STATE_TEXTURE);<br/>
　　　　GUの状態設定を行います。<br/>
　　　　　PARAM1: GU_STATE_TEXTURE - テクスチャマッピングを使用<br/>
　　　　　します。<br/>
<br/>
<br/>
【描画開始について】<br/>
　　ＧＵ初期化が済みましたので、実際に描画を開始するための準備です。<br/>
　　20行目と21行目がそれにあたります。<br/>
<br/>
　　20: sceDisplayWaitVblankStart();<br/>
　　21: sceGuDisplay(GU_DISPLAY_ON);<br/>
<br/>
　　20行目のsceDisplayWaitVblankStart()はVBlank割り込待ちを<br/>
　　行います。<br/>
　　VBlank割り込とは画面書き換えのハードウエア的なイベントのよう<br/>
　　な物で、実際には画面描画を描画する際に垂直走査線の数分描画を<br/>
　　終えた後、垂直復帰が行われる（原点に返る事）直前にこの割り込<br/>
　　みが発生します。<br/>
　　垂直走査線には奇数ラインと偶数ラインがあります。１秒間に<br/>
　　奇数偶数合わせて６０回発生します（実際には1/60秒以上待たされ<br/>
　　ている気がするのは気のせいでしょうか？<br/>
　　あまり、リアルタイムのタイマー的には使用できないと思います）。<br/>
　<br/>
　　難しかったら、次の描画更新を待つ関数と覚えておいてください。<br/>
<br/>
　　sceDisplayWaitVblankStart()が戻り、VBlank割り込待ちになったら<br/>
　　21行目のsceGuDisplay(GU_DISPLAY_ON)でＧＵへの描画要求は<br/>
　　画面に表示されるようになります。<br/>
<br/>
　　sceGuDisplay(）でセットできる値は<br/>
　　　　GE_DISPLAY_ON (1) - 表示ＯＮ<br/>
　　　　GE_DISPLAY_OFF (0) - 表示ＯＦＦ<br/>
　　の２種類です。<br/>
<br/>
<br/>
　　これで、いよいよＧＵに対して描画要求ができるようになりました。<br/>
　　基本的にＧＵの初期化は毎回同じです（画面モードとか変えない場合<br/>
　　ですが...）　　<br/>
<br/>
<br/>
　　では続きは次回『3Dグラフィックス入門（その２）』で（＾o＾）<br/>
<br/>
ここをクリックで人気blogランキングへ（ご協力お願いします）
              
        ]]></content> 
  </entry>  
  <entry> 
    <title>とりあえず、オンラインヘルプをっ！</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/167037/"/>  
    <id>http://pspborder.exblog.jp/167037/</id>  
    <issued>2005-07-11T11:39:18+09:00</issued>  
    <modified>2005-07-20T22:32:12+09:00</modified>  
    <created>2005-07-11T11:39:18+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>PSP開発</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
とりあえず、いい加減な解説始める前に<br/>
オンラインヘルプ（ＨＴＭＬベース）を読もうと思ったら<br/>
...無いですよ（Ｔ＿Ｔ）<br/>
<br/>
たしか、ベータ１の時はあったはず...一応バックアップ<br/>
取っておいたので探してみる...ありましたよ。<br/>
　/usr/local/pspdev/psp/sdk/doc/html/以下に<br/>
ごっそりと（＾o＾）<br/>
<br/>
おかしいなと思い、ＰＳＰＳＤＫをチェックアウトしたディレクトリ<br/>
上にあるREADMEを読む...doxygenを使ってヘルプドキュメント<br/>
作成してくださいとの事！...ああ、またわけの判らないままに<br/>
得体の知れないプロダクトを入れなくてはなら無いのだね（；＿；）<br/>
...うちのFedraたんがどんどん汚くなっていくよう。<br/>
<br/>
でもってdoxygenですが、よく判りません...必殺、yumコマンド<br/>
一発でインスト...れれエラーが、何ぃ、もう入ってますだとう...あ、<br/>
確認してなかったよ（＾＾；）...いや、その、doxygenがドキュメント<br/>
生成ツールである事くらいは判りますが...インストールするのに<br/>
また色々と...。<br/>
<br/>
<br/>
...気を取り直してヘルプファイルを生成します。以下参考（＾o＾）<br/>
<br/>
　ＰＳＰＳＤＫをチェックアウトしたディレクトリに移動して<br/>
　下記コマンド実行<br/>
<br/>
    ./configure　　　　<- 必要かどうか判りませんが＾＾；<br/>
    make doxygen-doc<br/>
<br/>
<br/>
　　[ＰＳＰＳＤＫをチェックアウトしたディレクトリ]/pspsdk/doc/html<br/>
　　  にちゃんとＨＴＭＬファイルが出来ます。<br/>
<br/>
　　ｈｔｍｌディレクトリ以下をWindowsに持っていけばその中のindex.htm<br/>
    をブラウザで開けばちゃんと読めます（＾o＾）<br/>
<br/>
とりあえず、ベータ１のヘルプと比べてみました。鬼のように増えてる<br/>
グラフィックスだけじゃないよ（＾＾；）...凄い遊べるなぁＰＳＰＳＤＫ。<br/>
頑張りすぎの気がします。<br/>
<br/>
ここをクリックで人気blogランキングへ（ご協力お願いします）<br/>
<br/>
　　<br/>
　<br/>
<br/>
<br/>
<br/>

              
        ]]></content> 
  </entry>  
  <entry> 
    <title>３Ｄグラフィックスが動いた日</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/155105/"/>  
    <id>http://pspborder.exblog.jp/155105/</id>  
    <issued>2005-07-10T00:10:24+09:00</issued>  
    <modified>2005-07-20T01:10:19+09:00</modified>  
    <created>2005-07-10T00:10:24+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>PSP開発</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
すごいです。びっくりです。<br/>
<br/>
ＰＳＰで３Ｄグラフィックスが動きました（＾o＾）<br/>
ばんざーい！（...いや、私が作ったわけじゃ<br/>
ないんだけど）<br/>
<br/>
PSPSDK(ベータ１じゃなくて、開発中のやつね）のサンプル<br/>
にはＧＵ（ＰＳＰのグラフィックスチップの事です）のものも<br/>
含まれています。その中に”cube"というのがあります。<br/>
<br/>
この"cube"は６面カラフルな立方体に各面にバンプマップ<br/>
（わかんない人はお父さん、お母さんに聞いてみよう）を施した<br/>
ものをくるくる回すでものです。<br/>
<br/>
...それが何？っていうなかれ、今までＰＳＰのＧＵに関しては<br/>
ハッキン...いや、調査が進んででおらず、訳の判んないもの<br/>
として利用されていませんでした。ＰＳＰＳＤＫが出るまでの<br/>
プログラミングってビデオラム（ＶＲＡＭ）の先頭アドレスを<br/>
取得してそこに、画像データを書き込むという事しかできず<br/>
（たいがいそれでいいんですが...）。ＰＳＰの無駄に強力な<br/>
ハードウエアは利用できなかったんです。これからは、みんな<br/>
ＧＵの機能を使ったソフトを作るんだろうなぁ...楽しみです。<br/>
<br/>
で、このサンプル弄んでわかった事書きますね（＾o＾）<br/>
<br/>
・　テクスチャーに使用される画像ファイルは.ROWファイルです<br/>
　　フォトショップで編集できるよ（＾o＾）<br/>
<br/>
・　.ROWファイルはbin2cコマンドでＣ言語の配列データとして<br/>
　　変換する事が可能です。サンプルのMakefaile見れば使い方<br/>
　　わかります。<br/>
<br/>
・　ＧＵに送信するＧＵアセンブリ（コマンドみたいの）はコマンドリスト<br/>
　　として事前に用意したコマンドリスト配列変数にGU用のライブラリ<br/>
　　関数経由でセットします。描画の直前にコマンドリスト変巣はＤＭＡ<br/>
　　転送でＧＵに送られます。そこで注意なのが、ＤＭＡ転送に都合の<br/>
　　よい境界サイズでこのコマンドリスト配列を用意するのがポイント！<br/>
<br/>
・　ＧＵに対して、座標やベクトルの計算を行うためのＧＥ（ジオメトリ<br/>
　　エンジン）というものがＧＵとセットでＰＳＰにはありますが、この<br/>
　　ＧＥに関しては未実装の物があるみたいです。というのはローテ<br/>
　　ート（回転）などに使う行列の変換...いわゆるジオメトリ演算は<br/>
　　ＧＥを使わず、Ｃ言語のプログラム側でやっています。ま、関数<br/>
　　用意してくれるからそれを使えばいいんですが、パフォーマンスは<br/>
　　どうなんでしょうかねぇ？<br/>
<br/>
・　ジオメトリ演算に使うデータの型はfloatが使用されています。<br/>
　　（多分u32等の整数が必要なライブラリ関数もあると思いますが<br/>
　　　floatが普通に使えるのはありがたいですす。ＴｏｏｌＣｈａｉｎの成果<br/>
　　　というのもあるんでしょうが...）<br/>
<br/>
・　cubeで使用される立方体のＶｅｒｔｅｘ（頂点情報）はプログラム内に配列<br/>
　　として用意されています。こんな感じで定義していけば良いんだというのが<br/>
　　判ります。数少ないからグッドです。但し、数増やしたりサイズ変えるんなら<br/>
　　Projection(透視変換）とかＷｏｒｌｄView（ワールドビュー）とか変える必要<br/>
　　あるかもです。カメラ固定なんだ、このサンプル。逆にここら辺を変えて<br/>
　　試してみるのが勉強になりますね。<br/>
<br/>
<br/>
・　ＧＵの初期化が思いっきりむずいです。画面モードとか変えなければこの<br/>
　　ままでいけそうですが...。多分、ここら辺は、SCEの純正SDKとかなり<br/>
　　互換性が確保できている気がします（ＳＣＥ純正のＳＤＫ持ってないので<br/>
　　あくまで想像ですよ＾＾；）。<br/>
<br/>
<br/>
<br/>
<br/>
<br/>

              
        ]]></content> 
  </entry>  
  <entry> 
    <title>凄い、凄すぎるよ！ＰＳＰＳＤＫ</title>  
    <link rel="alternate" type="text/html" href="http://pspborder.exblog.jp/143692/"/>  
    <id>http://pspborder.exblog.jp/143692/</id>  
    <issued>2005-07-08T17:11:25+09:00</issued>  
    <modified>2005-07-20T22:32:44+09:00</modified>  
    <created>2005-07-08T17:11:25+09:00</created>  
    <author> 
      <name>pspborder</name> 
    </author>  
    <dc:subject>PSP開発</dc:subject>  
    <content mode="escaped" type="text/html" xml:lang="utf-8"><![CDATA[ 
             
ついに、ＰＳＰＳＤＫを導入してみました。<br/>
このＢＬＯＧではそれを使ってみての日記を書いていこうと<br/>
思います。<br/>
<br/>
まず、ＰＳＰＳＤＫとは何かというと、pspdev.orgコミュニティで<br/>
開発・配布を行われているオープンソース・ベースのライブラリー群です。<br/>
今までは、これといった標準のライブラリが無かったので、ＷＥＢサイト<br/>
で公開されている情報元に、各自機能を実装していたのですが<br/>
これから、プログラムを始めてみようという方はこのＰＳＰＳＤＫを<br/>
使う事も考慮されてみてはいかがでしょうか。<br/>
<br/>
<br/>
これだけではプログラムをコンパイルできないので、同じくpspdev.org<br/>
コミュニティが配布されているPSP ToolChain(コンパイラ＋バイナリ<br/>
ユーティリティ群）が必要です。<br/>
<br/>
あと、非常に残念な事に現在公されているＳＤＫはPSPSDK 1.0 ベータ<br/>
と呼ばれているものでは、３Ｄの機能やグラフィックプロセッサ機能<br/>
（ＧＵ＋ＧＥ）の実装がありません。あと、最新版にはサンプルが豊富<br/>
にあります。ですので、このＢＬＯＧで扱うのはPSPSDK 1.0 ベータ<br/>
では無く、現在開発中のソースサーバからダウンロードしてきたもの<br/>
を対象とします。最新版のＳＤＫを入手できない方、ごめんなさい。<br/>
<br/>
ＷＥＢ上で入手できる情報としてはcygwinベースの開発環境を<br/>
元に説明されているところが殆どですが、LINUXの方がコンパイル<br/>
が以上に早いので大きなプログラムを作られる方はこちらをお勧<br/>
めします。<br/>
<br/>
うちでは環境はLINUX Fedracore2です。<br/>
必要な事書いておきます  （余裕ができたらどこかに<br/>
ホームページ作ります。今、ＰＳＰＳＤＫで遊ぶ方が<br/>
最優先なので...）。<br/>
<br/>
・ＳＤＫの最新ソースはsubversionというソースコード管理サーバ（ＣＶＳ<br/>
　みたいの）からダウンロードします（subversionは以降ＳＶＮと記載します）。<br/>
　あとPSP ToolChainを導入する際にＳＶＮが必要になります。<br/>
<br/>
・うちのＬＩＮＵＸはワークステーション構成で何にも考えず導入しているもの<br/>
　なのでＳＶＮが入っていません（Ｔ＿Ｔ）。ＳＶＮを入れるためにはバークレー<br/>
　ＤＢ４とかが必要になります。結構めんどくさくて、よくわかんなかったので<br/>
　yumコマンド１発でＳＶＮインストールしました（凄い便利です）<br/>
<br/>
・ＳＶＮがインストールできたら次はpspdev.orgコミュニティからPSP <br/>
　ToolChainの最新版ソースコードを取ってきます(2005/07/05版<br/>
　でしたのでこれから扱うのはしばらくこのバージョンです）<br/>
<br/>
・PSP ToolChainのソースコードを解凍展開し、toolchain.shというのを実行<br/>
　するとインターネットを通じて勝ってにソースコードを取得し､ビルドしてくれます<br/>
　（凄い便利です）。あ、当然、開発環境はインターネット接続が出来る事が必須<br/>
　です。<br/>
<br/>
・PSP ToolChainをビルドするとPSP用のクロスコンパイラが出来るので、それ<br/>
　が使えるように環境変数ＰＡＴＨをセットします。<br/>
<br/>
　psp-gccというコマンドで、psp-gcc -vとやるとgccのバージョン４という表記<br/>
　が出力されます。うちのどのgccよりも新しいバージョンです。びっくりです。<br/>
<br/>
　あと、この作業がcygwinだと凄い遅いです。かなり大量のソースコードを<br/>
　コンパイルしますので。<br/>
<br/>
・ＰＳＰＳＤＫお最新版のソースコードをＳＶＮを使ってダウンロード（正確には<br/>
　チエックアウト）します。<br/>
<br/>
・PSP ToolChainでＰＳＰＳＤＫをメークします。autoconf関連のファイルが<br/>
　ありますがこれは罠なので直接コマンドたたかないようにっ！　<br/>
　bootstrapというフルビルド用のシェルを使いメークします。<br/>
<br/>
　cygwinだと数時間かかりましたがＬＩＮＵＸでは２０分くらいで全部おわり<br/>
　ました。（あ、比較するマシンのスペックがＬＩＮＵＸとcygwinで違います<br/>
　のでなので余り参考になりません。決してcygwinがダメだとは思わない<br/>
　で下さい。本当に素晴らしいツールです）<br/>
<br/>
　後、どちらでやっても結果は同じなのでcygwinが好きな方はcygwinで<br/>
　やるべきです。<br/>
　<br/>
よーし、ＰＳＰＳＤＫで遊ぶぞ！<br/>
<br/>
<br/>
注意：<br/>
　・PSP ToolChainもPSPSDKもＳＣＥ様認可の物ではありません、また<br/>
　　これらの物は、先程流出されたＳＣＥ様認可の元、提供されるＰＳＰ純正<br/>
　　の開発キットとは一切関係ありません。PSP ToolChain、PSPSDK<br/>
　　を使用する場合自己責任にてお願いいたします。<br/>
<br/>
　・間違っても、PSP ToolChainとPSPSDKに関するお問い合わせはＳＣＥ<br/>
　　様に行わないようお願いします。<br/>
<br/>
　・PSP ToolChainとPSPSDKにより作成されるプログラムは、現時点では<br/>
　　ファームウエアVer1.0か1.5を搭載したPSP実機でしか動作しません。<br/>
　　こちらに関するするお問い合わせもＳＣＥ様に行わないようお願いします。<br/>
<br/>
<br/>
ここをクリックで人気blogランキングへ（ご協力お願いします）<br/>

              
        ]]></content> 
  </entry> 
</feed>

