DirectX&OpenGL【シェーダ】プログラミング

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
楽にプログラミングできる
DirectX8のVertex ShaderとPixel Shader
OpenGLのnvparse
これらのシェーダプログラミングの話題を積極的に扱うスレッドです。

DirectX全般に付いての話題はこちら
http://piza.2ch.net/test/read.cgi?bbs=tech&key=966655286&ls=50
OpenGL全般に付いての話題はこちら
http://piza.2ch.net/test/read.cgi?bbs=tech&key=981044659&ls=50

各種情報、リンクは以下をどうぞ。
2デフォルトの名無しさん:2001/06/29(金) 05:00
3デフォルトの名無しさん:2001/06/29(金) 05:00
4デフォルトの名無しさん:2001/06/29(金) 05:00
5デフォルトの名無しさん:2001/06/29(金) 05:21
またゲーム系スレ?

もしかしてここ立てたのと同じ人?
http://piza.2ch.net/test/read.cgi?bbs=tech&key=993662234&ls=50
6デフォルトの名無しさん:2001/06/29(金) 05:31
7デフォルトの名無しさん:2001/06/29(金) 05:32
死んでくれ>1
8デフォルトの名無しさん:2001/06/29(金) 05:36
頂点シェーダコードなり

vs.1.0
;トランスフォーム
dp4 oPos.x, v0, c0
dp4 oPos.y, v0, c1
dp4 oPos.z, v0, c2
dp4 oPos.w, v0, c3
; ディレクショナル ライト
dp3 r0, v1, c4
max r0, r0.x, c6
; ディフューズ
mul oD0, r0.x, c5
; テクスチャ UV のセットアップ
mov oT0, v2
9デフォルトの名無しさん:2001/06/29(金) 05:37
ピクセルシェーダコード例

;texture0とtexture1ブレンド
ps.1.0
tex t0
tex t1
mov r1, t1
lrp r0, v0, t0, r1
10デフォルトの名無しさん:2001/06/29(金) 05:55
頂点シェーダ

; r0=0
slt r0,c0,c0

; r0=1
sge r1,c0,c0

; r0=abs(r0)
max r0,r0,-r0

; r0.z = pow( r1.x, r1.y )
lit r0.z, r1.xxyy

; r0.x = sqrt( r1.x )
rsq r0.x, r1.x
mul r0.x, r0.x, r1.x

; r0 = cross( r1, r2 )
mul r0, -r1.yzxw, r2.zxyw
mad r0, -r2.yzxw, r0

; if-then-else
; r0 = ( r1>=r2) ? r3 : r4
sge r0, r1, r2
add r1, r3, -r4
mad r0, r0, r1, r4
11デフォルトの名無しさん:2001/06/29(金) 06:47
こんな記事もあったよ。
目で見るGeForce3の特殊機能
http://www.vwalker.com/vmag/special/gf3_01/gf3im.html
12デフォルトの名無しさん:2001/06/29(金) 07:06
>>5
そうみたいね
13デフォルトの名無しさん:2001/06/29(金) 07:25
>>5
ゲーム系っちゅーか3D系というか。微妙。
14デフォルトの名無しさん:2001/06/29(金) 08:03
GEFORCE3まだ高いよ
15デフォルトの名無しさん:2001/06/29(金) 08:09
このスレ待ってました。期待age
16デフォルトの名無しさん:2001/06/29(金) 08:49
nvparseの話題も期待age
17デフォルトの名無しさん:2001/06/29(金) 10:54
シェーダーコンテストで何が一番すごかったですか?
18デフォルトの名無しさん:2001/06/29(金) 20:10
毛。
19デフォルトの名無しさん:2001/06/30(土) 00:03
ピクセルシェーダーおもろそうやなぁ。age
20デフォルトの名無しさん:2001/06/30(土) 03:33
シェーバーコンテスト
21デフォルトの名無しさん:2001/06/30(土) 06:06
それは髭。
22デフォルトの名無しさん:2001/06/30(土) 06:11
では質問。
頂点シェーダでConstレジスタへの値の設定なんですけど
頂点シェーダ宣言でD3DVSD_CONSTマクロを使うのと
SetVertexShaderConstantメソッドを使うのとでは何が違うのですか?
どう使い分ければいいですか?
23デフォルトの名無しさん:2001/06/30(土) 06:18
ギャバン
ギャリバン
シェイダー
しぇーだー
24デフォルトの名無しさん:2001/06/30(土) 06:19
シャイダーだった
25デフォルトの名無しさん:2001/06/30(土) 07:46
>>23
昔ギャバンの電子人形東京タワーのお土産に買った
ダイオードで所々光ったりする、20cmぐらいの置物。
26デフォルトの名無しさん:2001/06/30(土) 07:48
ギャバンの主人公の顔は、いまだに覚えてる。
27デフォルトの名無しさん:2001/06/30(土) 20:22
サル顔
鼻の穴が大きい
28デフォルトの名無しさん:2001/06/30(土) 22:41
>>23
× ギャリバン
○ シャリ版
29デフォルトの名無しさん:2001/07/01(日) 02:02
>>22
SetVertexShaderConstant()だと
CreateVertexShader()後にもレジスタに値をセットできるよ。
常にこっちを使うといいと思う。
30デフォルトの名無しさん:2001/07/01(日) 13:55
>>22
本当の意味での定数として使いたい値はシェーダ宣言で、
行列とかマテリアルとか変化する値は
SetVertexShaderConstant()というのが理想。
でも全部SetVertexShaderConstant()でも別に良いと思う。
31デフォルトの名無しさん:2001/07/01(日) 20:26
しぇ〜
32吾輩は名無しさんである:2001/07/01(日) 21:11
>>31
嗚呼……やってしまったか。
この吾輩でさえも躊躇して書き込まなかったネタを。
33デフォルトの名無しさん:2001/07/02(月) 01:10

∧⊂ヽ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  (゚Д゚)ノ <  シェー
  | ⊃|   \__________
  |  |
  ⊂ノ〜
  ∪
34デフォルトの名無しさん:2001/07/02(月) 02:19
つうか、なんでこんなクソスレ上がってんの?
35デフォルトの名無しさん:2001/07/02(月) 02:34
削除依頼はこちら
http://teri.2ch.net/saku/index2.html
36デフォルトの名無しさん:2001/07/02(月) 06:45
>>34
クソスレ?
テーマはくそじゃないんだ。
ただ来ている奴等のレベルが低すぎるだけ。書けてねえし
37デフォルトの名無しさん:2001/07/02(月) 09:30
ったく、スレ立てた奴は最後まで責任取れよな。
38デフォルトの名無しさん:2001/07/02(月) 10:38
あげとこ
39デフォルトの名無しさん:2001/07/02(月) 12:58
苦し紛れにシェーとか言ってるんだもんな。
シェーダは多少のアセンブリ言語の慣れと想像力が必要だが
アセンブラを知ろうとしない奴と、
知ってはいるが想像力のない奴ばかりなんだろうな。
40デフォルトの名無しさん:2001/07/03(火) 04:23
ttp://www.bio100.co.jp/cgi-bin2/3df/flashviw.cgi?mode=set&no=4756
gf3のvertex shaderもストールあり?
41デフォルトの名無しさん:2001/07/03(火) 04:24
追試タノム。
4222:2001/07/03(火) 23:54
>>29-30
お返事遅くなりましてすいません。
とてもよくわかりました。ありがとうございました。

それで、VSのMSの最も簡単なサンプルを触っているのですが、
やっていることは非常に単純なのですが、思った通りの結果が出せません。
これはどこか間違っているでしょうか?


v0.w = w0.x * 0.0f + w0.y * 0.0f + w0.z * 0.0f + w0.w * 1.0f
という計算なので、計算前後で何も値は変わらないはずなですが表示される画像が
グチャグチャになってしまいます。
//***********************************************************************************
// Simple vertex shader0
// Constants
// reg c0 = (0,0.5,1.0,2.0)
// reg c4-7 = WorldViewProj matrix
// reg c8 = constant color
// Stream 0
// reg v0 = position ( 4x1 vector )
// reg v5 = diffuse color
const char SimpleVertexShader0[] =
"vs.1.0 //Shader version 1.0 \n"\
"def c10, 0.0f, 0.0f, 0.0f, 1.0f \n"\
"mov r0, v0 \n"\
"dp4 r0.w, v0, c10 \n"\
"m4x4 oPos, r0, c4 //emit projected position \n"\
"mov oD0, c8 //Diffuse color = c8 \n";
4322:2001/07/03(火) 23:56
訂正
v0.w = v0.x * 0.0f + v0.y * 0.0f + v0.z * 0.0f + v0.w * 1.0f
44デフォルトの名無しさん:2001/07/05(木) 13:40
VSではdef命令は使えません
def c10
をSetVertexShaderConstantに変えればうまくいくはずです
45デフォルトの名無しさん:2001/07/05(木) 15:32
NVASMはエラーメッセージ親切
46デフォルトの名無しさん:2001/07/06(金) 01:08
>>44
使えるよ。
定数宣言を引数に渡し忘れたとかじゃないの?
SetVertexShaderConstant()に変えるのでもいいと思うけど。
47デフォルトの名無しさん:2001/07/06(金) 11:57
>>46
今のNVAsmではVSのdefはエラーになった
48デフォルトの名無しさん:2001/07/07(土) 01:23
>>47
げほ。そうでしたか。
そりは失礼しました。
49デフォルトの名無しさん:2001/07/07(土) 04:04
DirectX9 の事で MS と nVidia がなんか喧嘩してるらしいんだけど。
シェーダは一体どうなるんだ?

情報ソースは出先で見た英語のニュースサイト・・・。
50デフォルトの名無しさん:2001/07/07(土) 04:45
MSにはハードの値下げ交渉を期待する・・・
51デフォルトの名無しさん:2001/07/07(土) 13:36
ピクセルシェーダの話題が少ないねぇ
52デフォルトの名無しさん:2001/07/07(土) 15:55
Geforce3を持ってる人に質問。
テクスチャシェーダを使った内積系の処理(DOT_PRODUCT_2D)とか
TEXKILLとかって普通のTEXTURE_2Dとかに比べてどれ位性能低下が
あります?ほとんど同じくらいのスピードだったらすごく使えそう。
53デフォルトの名無しさん:2001/07/07(土) 21:37
>>52
気にするほどの差はないよ。
内積系はガンガンつかてーな。
54デフォルトの名無しさん:2001/07/07(土) 22:10
>>53
そうだったんですか。というのも、
http://partners.nvidia.com/Marketing/Developer/DevRel.nsf/pages/90EEF4A5CEF8D6C588256A180066D598
をみると、Dot Product系のパフォーマンスが1/5以下のグラフになって
いたので…。
55デフォルトの名無しさん:2001/07/08(日) 13:17
シェーダの命令数増やしても
フレームレートの落ちが少ないのは
やっぱりメモリがネックなのでしょうね
メモリの負荷を減らすような最適化すれば
また変わってくるでしょうけど
56デフォルトの名無しさん:2001/07/09(月) 08:11
新しいエフェクトのアイディアないですか?
57デフォルトの名無しさん:2001/07/10(火) 01:22
シェーダというと何かデモっぽいエフェクトしなくちゃならないみたいだけど
行列パレットスキニングとか、地道に重要です
58デフォルトの名無しさん:2001/07/10(火) 01:43
vertex shader系エフェクトって

(1)変形
(2)内積でエッヂ検出

この2種類の応用かも

pixel shaderの方は、

(1)内積でテーブル引く

テーブルの内容が問題
59デフォルトの名無しさん:2001/07/11(水) 23:58
誰も使ってない?
60デフォルトの名無しさん:2001/07/12(木) 00:32

   ,―――-、
  /  /~~~~~~~\
  | /  /  \|
  (6   (・) (・) |
  も     つ |   いや〜っ
  |    lll|||||||||ll |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | |    \_/ /  < ぴくせるしぇーだ ってほんっとにいいものですね〜
/| \____/\   \________

ttp://www5.tok2.com/home/IF/prog14.html
61デフォルトの名無しさん:2001/07/14(土) 01:10
シャーデー
http://www.sade.com/
62デフォルトの名無しさん:2001/07/15(日) 19:25
      ∧_∧
      ( 冫、 )  <あっそー
      ( `   )
     | | |
      (_(__)    
63デフォルトの名無しさん:2001/07/17(火) 08:48
64デフォルトの名無しさん:2001/07/17(火) 23:55
      ∧_∧
      ( 冫、 )  <あっそー
      ( `   )
     | | |
      (_(__)   
65 :2001/07/19(木) 04:41
nvasm 実行できないよ 鬱。win2k&98と2台のマシンで実行したけど
エラーではじかれて立ち上がりさえしない

そんな悲惨な人いない?
66デフォルトの名無しさん:2001/07/19(木) 04:43
      ∧_∧
      ( 冫、 )  <あっそー
      ( `   )
     | | |
      (_(__)  
67デフォルトの名無しさん:2001/07/19(木) 04:44
誰も使ってない
68デフォルトの名無しさん:2001/07/19(木) 08:33
みんな使ってるがノウハウをライバルに知られたくない
69これから触る人:2001/07/19(木) 11:27
それってX箱? 一時スゲェ とか思ったけど
すげぇ煩雑?

PointLight 対応はどうしたいいんだ?
使用個数分だけ、専用にシェーダー書かないといけないわけでしょウザッ

ある程度の個数分レジスタ確保ておくと、最適化とか、やれる事がDX7と大差なくなってくるよねぇ?
70デフォルトの名無しさん:2001/07/19(木) 20:07
>>69
ヌビディアのnvlink使えばシェーダーを組み合わせられるらしい
71デフォルトの名無しさん:2001/07/19(木) 20:08
レジスタもうまく調整してくれるらしい
72デフォルトの名無しさん:2001/07/19(木) 20:51
OpenGLなmasaさんもシェーダー100個なんてすぐ といってるね(´д`)
73これから触る人:2001/07/20(金) 17:21
はぁ、結局固定シェーダーと同じ物を実装しても速度半減らしいし。
その固定シェーダーのエミュソースも不完全だつーし、萎え、、、、
よほど面白いもの使わないと意味ねぇ〜

スキニングは旧来の方法でいいんじゃねぇのか、、、
74デフォルトの名無しさん:2001/07/20(金) 17:45
>>73
>スキニングは旧来の方法でいいんじゃねぇのか、、、
バーテックスシェーダーが付いてるのに
ハードウェアパレットスキニングがサポートされてないのには萎えた。>Ge3
絶対後者の方が喜ばれると思う。
75 :2001/07/20(金) 20:11
NVidiaの話だと行列パレットのオーバーヘッドが大きいので
あえて使用不可にしてるらしいぞ。ホントか?

使用禁止にすることはないと思うのだけど、、、VS使わせる陰謀?
スキンのサンプルがSoftWareに比べて激遅いのはなぜ?
76デフォルトの名無しさん:2001/07/20(金) 23:04
固定は将来なくなるかもしれないのれす。
互換性のために回路を残してるのれす。
行列パレットはVSで書くとよいのれす。
固定で行列パレットするとレジスタがたくさんいるので
パレットが少なくなるのれす。
固定の行列パレットはメイトロックスさんのテクなので
それが気に入らないという説もあるのれすが。
77デフォルトの名無しさん:2001/07/22(日) 02:47
age
78デフォルトの名無しさん:2001/07/22(日) 15:55
しっかしピクセルシェーダーはまたころころ変わりそうだなあ。
いらんよこんなの。
79デフォルトの名無しさん:2001/07/26(木) 07:46
あげ
80デフォルトの名無しさん:2001/07/30(月) 04:32
どっかでシェーダスクリプト用高級言語作ろうとかやってるやつ居ないかな?
81デフォルトの名無しさん:2001/07/30(月) 04:38
ハァ?
82デフォルトの名無しさん:2001/07/30(月) 10:22
>>80
あれはアセンブラだからいいんだよ。
せっかくだから楽しもうぜ
83デフォルトの名無しさん:2001/07/30(月) 11:46
たしかに高級言語じゃなきゃ辛いってな大規模なものなんか
書かないだろうけどね(藁
84デフォルトの名無しさん:2001/08/01(水) 23:36
Vmag/Onlineでみた火種のサンプルが良かった。
ライフゲームアルゴリズムを使ってちかちかする感じをうまく出していました。
なんかこういうの見ると本当にアイデア勝負な感じだなぁ。

まあ昔のIMとRMみたいにわかりやすいのもあったほうがいいかな。
みんながみんな使いこなせないだろうしね。

それより日本語でこの辺り解説しているサイトとか本とかってない?
自分で書かないと駄目?
85デフォルトの名無しさん:2001/08/01(水) 23:40
プ
86デフォルトの名無しさん:2001/08/02(木) 11:24
>>81,85
なんかこのスレって無意味に執拗粘着な茶々が入るね。
よっぽどシェーダが嫌いなのかね。
87デフォルトの名無しさん:2001/08/03(金) 16:54
茶々入れてるのは約1名のX箱叩きクンです
88デフォルトの名無しさん:2001/08/03(金) 23:33
シェーダー初心者です。
CEDECの「DirectX 頂点シェーダ、ピクセルシェーダの詳細」を受講しようと
思っていますが。この本とかこのサイトとか読んで予習しとけ!
みたいなのないでしょうか?普段コンシューマゲームのプログラムしか
書いてないのでDirectXそんなに詳しくないのですよ。
89デフォルトの名無しさん:2001/08/03(金) 23:39
>>88
>>2-6
90デフォルトの名無しさん:2001/08/04(土) 00:34
ああクサイクサイ
91デフォルトの名無しさん:2001/08/04(土) 11:41
age
92デフォルトの名無しさん:2001/08/04(土) 13:37
age
93デフォルトの名無しさん:2001/08/04(土) 18:38
シェーダで差をつけよう!と考える愚かなゲームメーカーが
情報交換の邪魔をしてるって噂があるのだけれど本当?
まさかそこまで愚かじゃないよね・・
94デフォルトの名無しさん:2001/08/04(土) 19:40
>>93
その噂とやらのソースを出せ
95デフォルトの名無しさん:2001/08/04(土) 20:37
XboxやNvidiaは粘着アンチが多いだけ。
96デフォルトの名無しさん:2001/08/04(土) 20:55
PS2に歯が立たないNVが別路線に敗走するのも無理ないだろ。
ピクセルシェーダでライフゲームさせて何が楽しい?
あんなんでnVidiaテクニカルメモとして表に出す気がわからん。
かといってPS2も別の意味でドキュソだけどな。
97デフォルトの名無しさん:2001/08/05(日) 00:47
あのサンプルの目的がライフゲームだとでも思っているのか?
98デフォルトの名無しさん:2001/08/05(日) 02:38
何を言うんだ。ハードウェアにライフゲームやらせるなんて
萌えてこないか? いやちがう、燃えてこないか?
99デフォルトの名無しさん:2001/08/05(日) 13:05
あのlifeは単に「こんなこともできるよ」というアイデアジョークでしょう。
この板に来てる人なら面白さがわかると思うのだがね。

>>98
GPUをコプロとして使っているんだね
100デフォルトの名無しさん:2001/08/05(日) 13:46
コンピュータにライフゲームは定番だから
geforce3がコンピュータだってことを見せるために
とりあえず作ってみただけだろう
101デフォルトの名無しさん:2001/08/06(月) 00:17
あのライフゲームってある意味、ダマシ入ってるとみたね。
geforce3がコンピューターだってことをだまくらかすための。
いぜん、ピクセルシェーダには「分岐」はできない。
コンピュータらしい重要な要素が抜けてる。
ライフゲームは実は「分岐」がない機械でも可能。
あのデモも間違いなく、テーブル参照で次の世代のON/OFFを決定している。

だから、あのデモは確信犯的にまぎらわしー
102デフォルトの名無しさん:2001/08/06(月) 00:42
>>100-101
一体何を力説しているのだ?
103デフォルトの名無しさん:2001/08/06(月) 01:40
ビデオカードにソケット付けて
ズロンでも載っけられるようにした方が良いと思われ。
動作周波数を400MHzぐらいに落とせば、ファンレスでもいけるだろ。
104デフォルトの名無しさん:2001/08/06(月) 01:40
>>100-101
アンチか?
アンチなのか?
105デフォルトの名無しさん:2001/08/06(月) 04:05
>103
そう、それなんだよね。
ライフゲームできて、汎用コンピュータ搭載をにおわせる半端な
手間かける暇あったら、多少遅くてもいいから汎用コンピュータを
ビデオカード側に乗せちゃえ!って感じで。
って、これって結局、PS2になっちゃうけど。
いや、実行部隊1はその理想のなりそこないで、現実には
煮ても焼いても食えない代物になってはしまったが。
106デフォルトの名無しさん:2001/08/06(月) 11:57
version2.0から分岐が入るって話じゃん。
またGeForce買いなおさないといけないのか(鬱
107デフォルトの名無しさん:2001/08/06(月) 17:25
けど、現行DirectXのアセンブラでは分岐はサポートされてない。
てことは、近々、DirectXのメジャーバージョンアップがあるってことかな?
VU1はまがりなりにも、分岐はあったからねー。
108デフォルトの名無しさん:2001/08/06(月) 19:21
とりあえず、DirectX 8.1とDirectX 9の情報はボチボチ出ているぞ。
お探しあれい。
109デフォルトの名無しさん:2001/08/06(月) 19:24
結局、ビデオ側にプログラマブルな機構を入れる理由って
何なんだろうね?
メインメモリとローカルメモリに別れていて、CPUからのアクセスは遅い
ってのは、XboxのUMAで帳消しになっちゃたしなあ。
ピクセルの方はわかるけど、バーテックスの方はほんといらない気がする。
110デフォルトの名無しさん:2001/08/06(月) 19:31
HT&Lで考えれば、まともな光源計算とか負担でしょ
もっと端折ったインチキ計算使いたい場合とかさ

セルシェード用に 頂点色をテクスチャ座標に変換するような
用途も必要

色々な表現をサポートする為にRenderStateを増やしていくと
切りがないつー感じの事言ってたような
111デフォルトの名無しさん:2001/08/06(月) 20:23
Pixel shader 2.0 の資料って web にもう上がってるの?
112デフォルトの名無しさん:2001/08/07(火) 00:57
>>109
頂点シェーダ―と同じ計算をCPUで真似してみれば、
どれだけ無駄に時間取られるか判るっしょ。
今更HT&Lの無い時代に戻りたくないっす。
113デフォルトの名無しさん:2001/08/08(水) 05:07
GPU側をプログラマブルにしておくことの大きなメリットの一つとして
レンダリングの自由度をソフト屋に任せることが可能になる点が挙げられると思う。
もちろんある程度の自由度ではあるけど。
114デフォルトの名無しさん:2001/08/11(土) 05:38
定期あげ
115デフォルトの名無しさん:2001/08/11(土) 06:06
ha?
116デフォルトの名無しさん:2001/08/11(土) 13:03
>>115
うざー
117デフォルトの名無しさん:01/08/27 17:57 ID:GUDCzTCo
結局シェーダーの問題点は>>69に尽きるよねえ。
パイプラインそのものを挿げ替えるんじゃなくて
元々あるD3Dのステート群に
自分オリジナルのステートを追加出来る方がよかったんじゃないかなあ。
118_:01/08/28 22:46 ID:8Aiut6Zs
ちょっと使ってみて、もう一つ気に入らない点が。
それはconstレジスタへの値の設定。
例えば、単純に頂点シェーダーで頂点のトランスフォームをしたい場合
レジスタに設定する行列は、ワールド x ビュー x 射影となる。
こんな感じでconstレジスタに渡す値は、
自前である程度加工しなければならない場合が多々ある。
FPUの変わりとして出来たHWTLのくせに、FPU演算の力をある程度借りなければ
成り立たないのは駄目だと思う。可搬性も下がるし。
これの解決案としては、メインのシェーダープログラムが呼ばれる前に
1回だけ呼ばれるシェーダーステージがあれば良いと思う。
constレジスタに値を設定→演算→constレジスタに再設定
みたいな。
だれかMSに言ってやって。
119118:01/08/29 02:34 ID:CQyVlKtU
SDKヘルプの頂点シェーダ宣言子マクロ項の
D3DVSD_REGの説明は間違ってる。注意すべし。
正しい値はソースを見るべし。
120デフォルトの名無しさん:01/08/29 03:20 ID:lSCsyAWs
>>118
OpenGLのNvidia拡張ならまさにそういうのが使えるよん。
頂点シェーダやピクセルシェーダって、
OpenGLのNvidia拡張の方が数段優れてる。
121デフォルトの名無しさん
みんなCEDEC行った?
Kilgardさんのヤツ勉強になりました。

日本語のOpenGLの資料もっと増えないかな