[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 08/16 01:46 / Filesize : 199 KB / Number-of Response : 697
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

OpenGLスレ Part12



1 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 19:28:29 ]
クロスプラットフォーム 3D API OpenGLに関する話題を扱うスレッド。

禁止事項
・「OpenGL終了」系のまず価値否定ありきの主観発言(客観的な懸念要素を挙げた上での建設的議論は可)
・学歴・理系か文系かに関連する差別発言
・その他の荒らし全て
これらは付き合うだけ無駄なので無視しましょう。

- 前スレ -
OpenGLスレ Part10
pc11.2ch.net/test/read.cgi/tech/1141034983/


- 関連サイト -
www.opengl.org/
www.mesa3d.org/

developer.nvidia.com/
www.ati.com/developer/
developer.3dlabs.com/

- 過去スレ -
OpenGLスレ Part11
pc11.2ch.net/test/read.cgi/tech/1177523018/

369 名前:311 mailto:sage [2009/01/02(金) 23:27:13 ]
wglCopyContextが何故かfalseを返しています・・
それ以前にこの方法が使えるのかどうか分かりませんが

wglCopyContext(OrigCt, CopyCt, GL_ALL_ATTRIB_BITS)

370 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 01:37:24 ]
つ wglShareLists

371 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 03:14:15 ]
>349
memcpy使う代わりにメインスレッドと同期を取ってコピー元のポインタを投げてやる、ってのを思いついた
ちゃんと動くかわからんけど試してみる気も無いw

372 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:27:09 ]
>>329 で答え出てるのに、それを実行できないなんてただの無能だろ。
まずはVS std以上を買ってちゃんと勉強すべきだ。
お年玉貰っただろ?

373 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:26:15 ]
ならスレッド毎にコンテキストを作れば。ここらへん参考にならね
ttp://support.microsoft.com/kb/128122
ttp://support.microsoft.com/kb/128122/ja

374 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:52:09 ]
>>373
お前も死ねw

375 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 03:27:54 ]
つまりOpenGLを初期化したスレッドでのみ
glHogehoge()を呼べばいいんでしょ

376 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:07:25 ]
>>373
うん、たしかに参考にならないwww

377 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:18:25 ]
勘違いしてた。>>373はスルーしてください orz



378 名前:311 mailto:sage [2009/01/04(日) 22:31:35 ]
>>369はコピー先でwglCreateContextしていなかった
せいでした・・>>365でもwglShareListsは使っていますが、
ムービー再生前にwglMakeCurrentしてなかったので動きませんでした。

//レンダリングコンテキストを複製
DC = wglGetCurrentDC();
OldRC = wglGetCurrentContext();
HGLRC RC = wglCreateContext(DC);
wglCopyContext(OldRC, RC, GL_ALL_ATTRIB_BITS);
wglShareLists(OldRC, RC);

//ムービー再生前に
wglMakeCurrent(DC, RC);
//DoRenderSample内に
wglMakeCurrent(DC, RC);

ムービー再生前にwglMakeCurrentしたり、古い(というか複製元)
のレンダリングコンテキストでもう1回wglMakeCurrentを呼ばなくて良い理由は
よく分かりませんが動きました。
720x480 30fpsのMPEG2で音が途切れまくりだったのが改善されています。
ビデオを2つ以上にしたら動くかどうかは分かりません。

以前うpしたコードで
memcpyではなく
tmp = pSampleBuffer
のようにしても動くようですがサイズのでかい動画で音が途切れるのは
これでは直りませんでした。なんでだろう?
DoRenderSample()の外でテクスチャへの書き込み処理をしたらいかんのか

379 名前:デフォルトの名無しさん [2009/01/05(月) 00:53:34 ]
質問なのですが、3次元空間内において四角領域にカメラ画像を描写して、
マウスとかでグリグリしていろんな方向から見えるようにしたいなと考えています。

毎フレーム画像を取得して、描画するのは1度きりなので、テクスチャに読み込まなくても、
glDrawPixelsでいいかなって思ってやっていたのですが、不具合が生じます。

とりあえず、glFrustumで視錐体を設定して、glMultMatrixで変換して、
glDrawPixelsで表示するという感じでやってみています。

そうすると、どんな位置に変換してみても表示する画像がウィンドウいっぱいに表示されて
マウスでグリグリして、姿勢を換えるとかができません。

とりあえず、できていると確認しているのは
@ウィンドウいっぱいならglDrawPixelsで表示できる
Aキューブとかオブジェクトなら求める位置に表示することができ、
 マウスでグリグリする部分は完成している。
ということです。

glDrawPixels付近に問題があるのだと思うのですが、これって適当に四角形作って、
そこにテクスチャみたく貼りつけて表示しているのではないのかな?
そもそも3次元上で表示するってのは無理な関数なのかな?
って感じでわからないことが多いです。

テクスチャで読み込めばいいんですけど、画像サイズがVGAサイズなのでめんどいとか、
毎回読み込むのでメリットなかったりとかあって、使うのは微妙なんですがいい方法ないでしょうか?

参考になるサイトとかでも教えていただけるとありがたいです。


380 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:26:52 ]
glDrawPixelsの実装はテクスチャ&ポリゴンだった希ガス。
昔スプライトっぽくglDrawPixelsで描画しようと試行錯誤した経験があるのだが、シェーダーとか色々影響した。
なので、glDrawPixels前にステートやシェーダーの設定をし直す必要がある。
ちなみに画像表示するならテクスチャでやるのがパフォーマンスがよい。

381 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 12:20:53 ]
iPhoneのOpenGL ESについてなんですが、iPhoneアプリ開発スレで聞いても誰も分からなかったようなので、
マルチポストのようですみませんがここでもう一度質問させてください。
iPhoneに載っているバージョンのOpenGL ESではGL_LINE_SMOOTHが利かないようなんですが、
ttp://discussions.apple.com/thread.jspa?threadID=1611394&tstart=120
この場合アンチエイリアスをかけるにはどうすればいいんでしょうか?
他に、座標点列をペシェ曲線みたいに補完してくれるライブラリとかがあったらそっちも教えていただきたいです。
よろしくお願いします。

382 名前:デフォルトの名無しさん [2009/01/06(火) 19:55:33 ]
初めて投稿させていただきます。

初歩的な質問ですみませんが、
・法線情報(ノーマライズ済み)
・原点からの距離
の二つの情報から効率的に平面を描画させる方法はありませんでしょうか?大きさは適当です。
法線から直交する2ベクトルを計算して平面状の適当な4頂点を生成して…とかやっていたのですが、0の例外処理とかがややこしくなり、スマートにいきません。

環境は
WindowsVista
c++
glut
です。

よろしくお願いいたします。

383 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:35:48 ]
適当にax+by+cz=Lを満たす点を選ぶのが効率的な気もするけど

Z軸に垂直で距離Lの平面を描く4点(?,?,L)をZ軸をNに変換する行列で変換すればいい
(0,0,1)とN(a,b,c)との外積T,NとTの外積B
TとBを正規化してT,B,Nで3x3の行列を作って4点を変換するといいかも

384 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:47:10 ]
>>382
「効率的に」の意味が分からないけど。
法線をN、原点からの距離をdとすると・・・
Nとx軸の外積を求めて正規化→Bベクトルとする
NとBの外積を求めて正規化→Tベクトルとする
って作っておけば、位置dNを平面の原点として、BとTで
好きなだけ平面を張れるよ。
ただ、Nがx軸と平行な時(平行に近い時)は、x軸の代わりにy軸を使うとか
みたいな場合分けが必要になるけど。

って、結局、言ってる事は382,383と変わらないなこりゃ。
「0の例外処理」って何だろう?
・Nを球面上で連続に動かした時、平面を張る二つのベクトルも連続して動く
・Nを決めたとき、平面を張る二つのベクトルは一意に決まる
の二つを同時に満たすことは不可能だから、不連続な関数でも使わない限りは
何らかの場合分けが必ず必要になるよ。

385 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:49:59 ]
↑「必ず必要」て。ボケてるね。orz

もう寝る!

386 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 15:37:01 ]
iPhone開発でOpenGL(ES1.1)を初めて触っています。
3Dではなく2D用として作ってるんですが、
2Dの描画したオブジェクト同士が重なっているかを調べる
ようないい方法はあるんでしょうか?
やはり、自力で重なっているか(衝突しているか)を
調べないとだめですよね?


387 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 15:44:33 ]
>>386
「ピックアップ OpenGL」でググると良いよ



388 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 16:37:42 ]
>> 387

なんか難しそうだけどやってみます!
サンクスです!


389 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 18:07:10 ]
>>387
悉皆判定したいので実は向かないと予想

390 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 18:38:33 ]
>> 387

だいたいピックアップの概要は分かったんですが
これって、回転してない矩形領域に対しての判定なので
重なり判定したいオブジェクトが回転してない状態に全体を
回転させて判断しないとだめですよね?

>> 389

どういう意味ですか?


391 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 19:04:31 ]
>>389
ああそうか、ある部位で重複があるかを調べるんじゃなくて、
どこが重なってるかを調べるのでは向かないか。

>>390
? 回転?

392 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 14:39:58 ]
>> 391
ピックアップって特定の矩形(回転なし)の部分にある
オブジェクトを取得できますよね。
調べたいのは矩形A(回転あり)と矩形B(回転あり)が
重なっているかどうかなんです。

なので、ピックアップを矩形Aに合わせて回転させて調べる
ということかなと思ったんです。

393 名前:386 mailto:sage [2009/01/12(月) 18:57:20 ]
ってかOpenGL ES(iPhone)って
セレクションがそもそもないですね。。。
やっぱりスクリーン座標から実際に計算しないとダメな気がしました。


394 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 13:45:46 ]
印刷用に高解像度レンダリングしたいんだけど、そういうときってどうしてる?
TBitmapに描画しようと思ったら激遅らしいし、
BitBltじゃディスプレイ解像度よりあげられないしで、
正直どうしようか迷ってる・・・

395 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 18:54:23 ]
レンダリングする領域を分割して適当に繋げればいいんでないかな

396 名前:394 mailto:sage [2009/01/13(火) 20:35:48 ]
>>395
そりゃそうだ
何で気づかないかな・・・

397 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 20:41:39 ]
3Dだとパースがあるから割とむずいよ



398 名前:394 mailto:sage [2009/01/13(火) 22:31:43 ]
>>397
正射影でやるからパースは割りと考えなくていいかもしれない
そうでもない?

399 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 22:40:48 ]
FBOじゃだめなん?

400 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 23:00:57 ]
GameProgrammingGemsの2と4に高解像度レンダリングについての項目があるので参考までに

401 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 00:17:41 ]
>>397
パースがあるとか関係ないよ簡単だよ。

>>399
FBOだと結局解像度の制限があるよ。


領域分割に対して何も利点無さそうだけど、ジッタドレンダリングした後に
ピクセルを組み替えてもいいかもね。
あ、それだとMIPMAPのレベルが適切にならないか・・・。

402 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 00:43:06 ]
ああglだと行列いじらなくてもビューポートの切り替えだけでできるのか
d3dだと範囲外を指定するとレンダリングされないんで勘違いしてた

403 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 01:09:40 ]
お前どっちもちゃんと仕様を理解してねーだろw

404 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 20:16:52 ]
お絵かきアプリを作ってるんですが、
スペックの低いモバイルマシンだと線が増えてくるとラグくなってきます。
画面更新毎に全ての線を描画し直しているのが問題だと思うのですが、
過去に引いた線はテクスチャとして残しておいて、
一気に書き込んでしまうというようなことはどうすればできるのでしょうか?

405 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 20:43:42 ]
2D上書きならわざわざGL使う必要もないし、テクスチャにレンダリング内容をコピーしたい、またはオフレンダリングしたいならすればいいだけだろう。
FBOでググレカス

406 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 23:53:25 ]
>>404
なんでわざわざOPENGLでやろうと思ったんだ?
要はペイントでいいわけだろ?

407 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 00:36:20 ]
いや、GLを2Dのペイントやドローに使うのも、十分にアリだと思うんだけど・・・。楽だし。
ピクセルごとの細かい制御をしようとすると難しいけど、シェーダ前提なら色々できるし。

>>404
で、405も言ってるけど、FrameBufferObjectというのを使うといいです。
※→FBOに(追加で)描画→画面をクリアした後、FBOの内容を画面に描画→※に戻る

一番単純に考えると、単に画面をクリアするのをやめて、シングルバッファで重ね描きしていけば
いいんだけど・・・VISTAとかみたいなスマートな画面ドライバモデルじゃないと、重なったウィンドウに
内容を破壊されちゃうかな。



408 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 00:56:13 ]
なんとなくiPhoneかなと思った俺

409 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 02:24:57 ]
逆に、OpenGL ESでプログラムできる実機が手軽に手に入るハードって
iPhone/iPod touch以外にあるんかいな

410 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 20:35:37 ]
Visual C++でCRectTrackerを使って画像内にドラッグで大きさ、位置が
変更可能な矩形を描画しようとしてるんですが、
矩形内の色が白に塗り潰されてしまいます。
枠だけ描画というのはどうやったらできるんでしょうか。

画像はrawで、OpenGLで描画されています。

OpenGLを使わずに描画したビットマップ上では枠だけ描画されたので、
OpenGLの問題かと思いこちらで質問させていただきました。

411 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 23:04:22 ]
で、ソースは?
エスパーじゃないんだから「お前の使い方が悪い」としか言えんぞ

412 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 01:09:21 ]
OpenGLの問題というよりOpenGL以前の問題のような

413 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 04:00:14 ]
>>410
塗りつぶされるのは、ポリゴンになってるからだ
矩形の枠だけなら、ラインで引いたほうがいいと思う

414 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 09:49:00 ]
>>410
OpenGLの描画の上にGDIで描画しちゃダメ
枠線もOpenGLで描いてください

415 名前:410 mailto:sage [2009/01/16(金) 13:49:20 ]
>>411-414

コメントありがとうございます。

ソースはこちらにうpしました。
ttp://www1.axfc.net/uploader/File/so/16918

DrawOpenGL()で画像の描画、InitializeOpenGL()で矩形の初期化(m_tracker)、
OnDraw()で矩形の描画の処理で
右クリックで矩形の描画、左ドラッグでトラッキングを行えるようにしています。

OpenGLでCRectTrackerと同様の機能のものを作るのは難しいでしょうか。

416 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 05:16:56 ]
ソース見る気は毛頭ないがSetPixelFormatでGDIフラグたてとけ。

417 名前:410 mailto:sage [2009/01/18(日) 01:51:10 ]
>>416
ありがとうございます。
なんとかやってみます。



418 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 13:58:02 ]
あーもしかしたら…矩形描画時にブラシで上書きしてんだっけか。
NULL_BRUSH選択してから矩形かいてみ。

419 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 19:33:36 ]
それで動いたとしてもVistaではOpenGL描画の上にGDI描画は御法度だからな

OpenGLで描くなら普通にGL_LINESなんかで線描いてglBlendFuncで描画先反転させるかな

420 名前:デフォルトの名無しさん [2009/01/21(水) 01:28:06 ]
ボーン用のウェイトを塗り塗りするアプリを作りたいんだけど、
ぬりぬりするためには、どうしたらいいのでしょうか、
セレクションバッファ使えばできるような気がするけど、
塗り塗りしてるようなサンプルとかってどこかにないですかね、
よろしくおねがいします。


421 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 13:20:32 ]
glTexImage2D() の internalformat 引数に与えた値と、その時生成したテクスチャの
glGetTexLevelParameteriv( ... GL_TEXTURE_INTERNAL_FORMAT ... ) が返す値は
必ず一致するでしょうか?

422 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 06:38:45 ]
必ずしも一致しません

423 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 23:43:14 ]
ちょいと質問

1.
ポリゴンをframebufferに描画し
それをglReadPixelsで配列に読み込む

2.
新しくテクスチャを作って
今読み込んだ配列をglTexImage2Dで関連付ける

んでためしにそのテクスチャでテクスチャマッピングすると
真っ白になるんだけどなぜ?
真っ白というか正確には最後にglColorで設定した値になる

glTexParameterとかglTexEnvfは2でglTexImage2Dの前に設定してるんだけど・・・

読み込んだ配列の中身を書き出してみたら
一応期待した通りの値が入ってるんだ。わけわかめ


424 名前:デフォルトの名無しさん mailto:sage [2009/01/28(水) 00:00:31 ]
配列の中身が正しいなら、1.jは関係無いところでまちがってるってことでしょ
普通にファイルから読んだデータで2.からやってみるとかで確認してみれば

425 名前:デフォルトの名無しさん mailto:sage [2009/01/28(水) 00:06:53 ]
テクスチャがEnableになってないとか
TexGenをEnableにしっぱなしだったとか

426 名前:デフォルトの名無しさん [2009/01/30(金) 10:36:17 ]
オブジェクトがビューポートの中に入っているかどうかを判定する方法はありますか?
視点変更をした際に,対象物が視野から外れてるかどうかを判定したいのですが….

427 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 16:48:33 ]
XPなんだけどデスクトップ上にキャラを書き出すってことは出来る?
例えば3Dモデルのハエを画面じゅう飛び回らせたり



428 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 17:26:45 ]
xroach を思い出したわ

429 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 17:34:52 ]
xroach懐かしい。
groachなんてあるんだな。

430 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 19:07:03 ]
質問があります。

始点から終点に書けてαブレンド値を下げて、透明になっていくような曲線を書きたいのですが、
そういった関数はOpenGLで用意されているでしょうか?



431 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:03:35 ]
uploadr.net/file/5aa0aea5d6

432 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:51:53 ]
glMapBufferって
VRAMにCPUから直接かけるの?

433 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 00:15:50 ]
PBOだっけ?DirectXのロックと同じだ。
で、FBOのほうがパフォーマンスいいよっと。使いやすいし。

434 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 01:27:48 ]
>>426
gluUnproject()をうまく使えばなんとかなる?

>>430
曲線は書けないので細かい直線をつなげていくしか。

435 名前:427 mailto:sage [2009/01/31(土) 19:09:27 ]
自己解決

436 名前:デフォルトの名無しさん mailto:age [2009/02/01(日) 17:56:44 ]
プログラムは分からないユーザー側の質問で申し訳ないのですが、質問させてください。
WindowsXP Intel865G環境で、OpenGLのスクリーンセーバーを使用したいと考えています。
しかしながら、スクリーンセーバーとしてはあまりに重く、カクカク状態です。
通常の実行ファイルとして実行した場合(拡張子.exeに変更、/s起動)は、ある程度高速に動作します。

Windowsのスクリーンセーバー起動の場合は、OpenGLが有効にならないバグ等あるのでしょうか?
原因をご存じの方が、いらっしゃいましたらお答えいただけると幸いです。

437 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 18:33:35 ]
分かるけどスレ違いだから教えない



438 名前:デフォルトの名無しさん [2009/02/01(日) 21:03:37 ]
>>437
Windows環境でOpenGLを使用してスクリーンセーバーを作成しました
しかしハードウェアアクセラレーションが有効になりません
どうすれば改善できるか、教えて頂けないでしょうか?

439 名前:デフォルトの名無しさん [2009/02/01(日) 21:35:16 ]
最近のグラフィックカードはだいたい
どのくらいのテクスチャユニット数ですか。
単純にマルチテクスチャするときの枚数として知りたいんですが。

440 名前:432 mailto:sage [2009/02/01(日) 21:39:00 ]
>>433
それでもあえてPBOを使う!

ところで、マップするって
VRAMからメインメモリに転送するという事?

441 名前:432 mailto:sage [2009/02/01(日) 21:49:45 ]
DirectXのロックと同じというけれど
あれはVRAMに直接書き込んでいるの・・?

442 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 21:56:38 ]
CPUがシステムメモリ以外に直接アクセスする手段はないの。
マップやロックは要するに、VRAM<->システムメモリで転送を行うこと。
読み出しならロック時にVRAMから転送。書き込みならアンロック時にVRAMに転送される感じ。
名前の似ているWindowsのメモリマップドファイルとは別物ね。

443 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 10:55:07 ]
作業用のメモリかと思ってました

444 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 16:52:21 ]
>>439
GeForce GTX280 だと4枚

445 名前:432 mailto:sage [2009/02/03(火) 22:13:32 ]
>>442
なるほど
よくわかった、ありがとう

PBO1の内容を読みながら
PBO2に書き込む方法ってある?
一旦glGetBufferSubDataしないと無理そう

446 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 22:53:34 ]
わかってねーだろw

447 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 12:08:24 ]
PBO1もPBO2もマップすればいいじゃない
と、とても遅レス



448 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 08:56:19 ]
PCによってgluUnProjectの挙動が違うので頭を抱えてたんだが…
グラフィックのアクセラレーションを切ったら正常になった.

コード以外に原因があるときの調査って大変だよねぇ.

449 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 14:03:28 ]
glReadPixelでアルファ値をGL_BRA_EXTで取得してHBITMAPに変換
それをDCに貼り付けてUpdateLayeredWindowで表示してるんだけど
うまく半透明にならない
glClearColorでアルファを0にしといて背景を透明にして
その上に半透明の物体を重ねていく、で最終的に合計のアルファ値で
画面に加算した結果を表示するというようにやりたいんだけど
出来ないの?

450 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 15:26:41 ]
できる
glReadPixelsで取得した値を直接BitmapにしてUpdateLayeredWindowに渡すんじゃなくて
いったんどこかに書き出してちゃんとアルファが取得できてるか確認したらどうかな
あと、描画した物でなくちゃんと透けるような値が入った配列をビットマップにして
ちゃんと透けるか確認する
glReadPixelsではちゃんと取得できてるが、CreateCompatibleDCで作ったDCが
24bitでアルファ無しになってて透けないことがあった

あと関係ないが、Chrome430GTではglReadPixelsがもの凄く重くて使い物にならなかったぜ

451 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 16:42:11 ]
2^nのサイズ以外のバッファに読み込むと何故か遅くなるというバグはRadeon系であったよ

452 名前:449 mailto:sage [2009/02/09(月) 10:32:48 ]
調べたらglReadPixelしたデータのアルファがFFになってた

ピクセルフォーマット定義
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};

これが取得部分
glFinish();
glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadBuffer(GL_BACK);
glReadPixels(0, 0, w, h, GL_BGRA_EXT, GL_UNSIGNED_BYTE, buf);
glReadBuffer(GL_FRONT);
glPopClientAttrib();
何か間違ってる?

453 名前:449 mailto:sage [2009/02/09(月) 11:41:08 ]
自己解決
ピクセルフォーマットのアルファビット数を1にしたら出来た

454 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 08:07:33 ]
生の画像を非圧縮でテクスチャにしてるんだけど
同じサイズのを2枚やると失敗する
メタデータでもせいぜい5MBくらいだと思うけどGeforce上のRAMは1Gある
テクスチャのメモリって制限か何かあるの?

455 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 15:39:26 ]
なんか知らんが俺も似た問題を抱えている。
しかも成功する時としない時がある。
9800GTXだったと思う。

456 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 20:32:07 ]
メタデータ???('ω`)

457 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 23:37:58 ]
失敗の内容を書かないとエスパー能力にも限界があるぜ
glGetErrorでエラーは出てないの?
ドライバでエラーチェックONにするのを忘れずに



458 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:03:03 ]
なんかタイミングの問題みたいだ
描画中のコンテキストに対してユーザー操作の別スレッドで割り込んで
テクスチャを作ろうとするとこけるらしい

459 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 00:11:28 ]
なんだ、ただの馬鹿か

460 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 00:29:39 ]
煽ってるカスはほっといて…

>>458
複数スレッドには対応していないぞ。

461 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 23:04:46 ]
マルチスレッドで操作するなら1スレッド1コンテキスト
共有コンテキストにすれば別コンテキストで作ったテクスチャも使えるしな
描画中のテクスチャをいじったらどうなるか知らん

462 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 20:14:01 ]
ステンシルを作るときにあるポリゴンの外側を1にするとかって出来る?
全部1にして中を0にするとかは無しで

463 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 20:59:43 ]
つ 両面ステンシル

464 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 18:53:36 ]
glutCreateWindowで作ったウィンドウのタイトルバー消すのはどうやるんですか?

ttp://groups.yahoo.co.jp/group/opengl-jp/messages/851?viscount=-15&expand=1
ぐぐって出てきたこの方法やろうと思ったんですがウィンドウハンドルの取得が
「glutCreateWindowから返ってくるint値がウィンドウハンドル」ではないみたいで。

465 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 19:04:17 ]
FindWindowでやるしかないんじゃ

466 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 23:08:26 ]
どこぞでDCFromWindowとか使うやり方みた気がする。
DCはHGLRCから取得。

467 名前:デフォルトの名無しさん [2009/02/16(月) 19:59:04 ]
上でスレッド関係の話が出てましたが便乗で質問。
あるスレッドで作ったテクスチャを別スレッドで描画することはできますか?
現状うまくいってないんですが、それがwglCopyContextの使い方が悪いのか、
あるいはそもそもレンダリングコンテキスト間でテクスチャの共有ができないのか、
よく分かっていないのです。



468 名前:467 mailto:sage [2009/02/16(月) 20:00:10 ]
>>458を見落としてました。>>467はいったんなかったことに…。
もう少し考えます。

469 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 00:02:04 ]
ウィンドウの端っこに座標軸(X軸Y軸Z軸)を描画したいんだけど、どうしたらいい?
オブジェクトを回転させたらいまいちうまくいかなくて困ってる・・・

470 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 00:35:29 ]
オブジェクトを書くときは
glPushMatrixで微分を退避してglPopMatrixで戻すといいよ
というかそうしないとオブジェクトが複数重なったら計算がめんどいだけだ

471 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 01:03:25 ]
>>468
それは描画しながらテクスチャを作ろうとした場合の話であって
最初にまとめて作られたテクスチャを別々のスレッドで利用するのはまた別の話だぞ

472 名前:468 mailto:sage [2009/02/17(火) 02:35:26 ]
>>471
自分の用途に関しては以下のような感じでうまくいきました。

描画用スレッド内では↓こんな感じでテクスチャロード用スレッドを起動
HDC hdc = wglGetCurrentDC();
HGLRC hrc_for_loading_texture = wglCreateContext(hdc);
wglShareLists(hrc_for_rendering, hrc_for_loading_texture);
shared_ptr<ThreadObject> th(new ThreadObject(hdc, hrc_for_loading_texture);
boost::thread(*th);

テクスチャロード用スレッドは↓こんな感じ
ThreadObject::ThreadObject(HDC hdc, HGLRC hrc) : hdc_(hdc), hrc_(hrc) {} // コンテキストを受け取って
void ThreadObject::operator()(void) { // スレッド実行部
 wglMakeCurrent(hdc_, hrc_);
 ・・・テクスチャのロード(glBindTextureとか)・・・
}
ThreadObject::~ThreadObject() {
 wglMakeCurrent(hdc_, NULL);
 wglDeleteContext(hrc_);
}



473 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 19:04:22 ]
openGL +

474 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 19:05:01 ]
すみません、途中投稿しました
openGL + GLUTでプログラムを組んでいるのですが、
起動中に表示されるコマンドプロンプトを表示させないようにする方法はないのでしょうか?

475 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 19:40:02 ]
>>474
それは開発環境の問題じゃないの?

476 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 19:52:42 ]
コンソールでビルドしてんだろw

477 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 20:00:36 ]
>474
vcなら
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")




478 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 02:15:37 ]
OpenGLで使えるDXF読み込みとかが出来るライブラリでお勧めのものとかありませんか?


479 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 15:41:14 ]
>>478
Delphi2005プログラミングテクニックVol10にそのまんまなコードがあるよ
ライブラリではないけど

>>469の続きなんだけど、特定のウィンドウ座標にオブジェクトの表示はできたけど、
-Z方向のオブジェクトが描画されない・・・どうしたらいいか教えて欲しい
いまはglOrthoで視体積を取って、gluUnProjectでウィンドウ隅に対応するワールド座標を取得、
取得した座標分だけglTranslarefでオブジェクトを移動してる
オブジェクトを移動してみたりしたけどいまいち上手くいかない

480 名前:479 mailto:sage [2009/02/19(木) 15:42:00 ]
>>478
失礼
勝手にDelphiだと思い込んでた

481 名前:480 mailto:sage [2009/02/19(木) 16:04:32 ]
おk
自己解決した

取得した座標分じゃなくて係数かけて減らしたら見えるようになった
無理やりな気がしないでもないけど

482 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 22:38:18 ]
PixelBufferObject使うと本当にテクスチャの更新速度上がるの?

483 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 23:37:28 ]
ARB_pixel_buffer_objectの仕様のOverviewによると
通常テクスチャ更新には最低1個のコピーが必要だけどそれが消せるので速いという理屈らしい
俺にはいまいちよくわからない

484 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 00:52:58 ]
PBOにテクスチャじゃなく座標情報を渡して
その情報を元に一括で描画をさせると早いということでしょ

485 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 02:32:04 ]
テクスチャ画像を生成する関数Fがあったとして、
glTexImg2DとかだとFを実行した結果をメモリに格納しておかないといけない。
けど、PBOだとglMapBufferでゲッツしたアドレスに対してFを実行すればメモリに画像を保存しなくても直接buffer objectに書き込めるという事だと思う。
本当にglMapBufferでGPUのメモリに直接読み書きできるような実装があるかどうかは知らないが、
仕様書によると
If the GL is able to map the buffer object’s data store into the client’s address space, MapBuffer returns the pointer value to the data store.
って書いてあるぽ。



486 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 02:38:16 ]
>>484
Buffer objectをvertex buffer objectとして頂点情報を書き込んでレンダリングして結果をテクスチャに書き込むって事?
それだとPBOが無くてもVBOで事足りるじゃん。

487 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 03:17:40 ]
www.songho.ca/opengl/gl_pbo.html
イメージをmallocしたバッファなんかに一端格納するんじゃなくて、直接PBOに入れとけば
そこからVRAMへはOpenGLがノンブロッキングのDMA転送で送ってくれるということらしい。

ただ、さらに下のダブルバッファリングの例はOpenGLのレンダリングが最大何フレーム
遅延するかはわからないと思うから毎回新しいバッファを割り当ててやらないと
やっぱりブロッキングされる気がする



488 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 06:18:35 ]
ドライバの実装方法次第だと思うけど
PBOのDMA転送というのをGPUが実装してないと意味がない
そのくらいだったらドライバで偽装してCPUでやってる可能性のが高いけど

489 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 14:58:14 ]
あんまり適当な知識で語るなよお前ら。見てて恥ずかしい。

490 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 16:29:49 ]
あんまり適当な知識で語るなよお前。見てて恥ずかしい。






491 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 19:08:29 ]
茶化すだけのレスをつける人間がいるな・・・NGするからIDつけてくれ

492 名前:491 mailto:sage [2009/02/20(金) 19:11:16 ]
IDじゃなかったコテハンかトリップ

493 名前:デフォルトの名無しさん [2009/02/21(土) 19:02:43 ]
int i = 1;
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
glLineWidth( i );
glBegin(GL_LINE_STRIP);
glEnd();

iが10以上だとi=10と認識されて描画されてしまう。
この限界値ってどうやって変更するんです?
スペックによるの??

494 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 19:17:14 ]
ググッて5秒でわかることを何故調べない?

495 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 21:15:47 ]
>>493
限界値は限界値なので、それ以上は無理なのですよ。
ビデオカードorドライバによって決まるます。

496 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 10:50:37 ]
質問。
OpenGLで、ボーンアニメーション(スキンアニメーション)を扱うライブラリというのはありますか?
自前で作る前に、まずは実績のあるライブラリを探せ。とよく言われていたもので。

>>38の人が自前で実装していたのをみるに、「これ!」といったライブラリはまだないのでしょうか?

497 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 12:21:48 ]
>>496
D3DX



498 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 12:43:50 ]
何故にDirectX?

499 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 12:55:40 ]
実績のあるライブラリだろ?

500 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 12:59:05 ]
実績があるのは知ってるけど,OpenGLから呼び出してちゃんと使えるの?


501 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 13:29:44 ]
D3DXで頂点座標を計算→OpenGLで描画

502 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 17:04:54 ]
無駄が多すぎるなw
俺は使ったこと無いんだけどソースも公開されてるOgreはどうよ。

503 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 18:56:26 ]
>>496
FBX SDK

504 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:22:47 ]
ttp://developer.download.nvidia.com/SDK/10/direct3d/samples.html
Stencil Routed K-BufferってOpenGL2.1でも出来る?
シェーダー書くときは何を使うべき?

505 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:37:34 ]
あくまで推測だけど、d3d10のサンプルなら独自拡張を使わない限りgl3じゃないとおそらく無理だと思う
その世代だとシェーダは基本的にglsl一択、nVidiaのグラボならCgもアリ

506 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:40:40 ]
MSAAの個別サンプルを取得する必要があるらしいからOpenGL2.1標準じゃ無理
3.0標準でもたぶん無理
GeForceでGL_NV_explicit_multisample拡張使えばいけそうな気がする

シェーダはとりあえずNVIDIAなGPUで動けばいいというならCg
Radeonでも動いて欲しいならGLSL
制限ついてもいいからIntelやちょっと古いGPUでも動いて欲しいならCgでarbvp1/arbfp1プロファイル
CgはランタイムDLLが必要だが、GLSLはドライバ依存でドライバがアレだと酷いことになる
一長一短だな

507 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 17:27:48 ]
OpenGLって、スキニングアニメーションすら全部自前実装しなきゃならんのか?
いまどきすごいな



508 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 17:34:54 ]
D3D以外でAPI側が提供してくれる環境ってあるの?

509 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:49:37 ]
描画APIの仕事じゃないし何らおかしくないだろ
Direct3DでもD3DXとして分けてるくらいだ

510 名前:504 mailto:sage [2009/02/25(水) 23:14:08 ]
OpenGL Extensions Viewerで見てみたら、
OpenGLのバージョンは2.1と表示されている・・。3.0は使用不可?

multisampleって名前に入っている拡張は
GL_ARB_multisample
GL_EXT_framebuffer_multisample
WGL_ARB_multisample
の3つだけだった。

>Radeonでも動いて欲しいならGLSL
RADEON HD 2600XT,Windows XPだからGLSLじゃないと無理なのか・・
シェーダーの記述は何を使う?RenderMonkey市か使ったこと無いんだが

511 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:33:14 ]
OpenGL3.0だとglBeginとかglEndとかも使えなくなっちゃうらしいから
gl2.1と書いたのだけど・・
(そもそもどうやって移行するのか分からない)

512 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:38:42 ]
>>510
OpenGL Extensions Viewerで表示されるバージョンは
通常のコンテキストでのGL_VERSIONだから2.1になってしまう。
9.1だとプログラムが落ちたけど、Catalyst 9.2からは3.0コンテキストを
カレントコンテキストにしてからGL_VERSIONを見ればちゃんと3.0になるよ。
もっともHD2xxxがOpenGL 3.0に対応してるかどうかは知らないけど。

513 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:48:18 ]
>>511
前方互換コンテキストでなければ非推奨になった機能も使える。

int attribs[] = {
  WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
  WGL_CONTEXT_MINOR_VERSION_ARB, 0,
  // 前方互換コンテキストを作るときはコメントを外す
  // WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
  0, 0
};
HDC hdc = wglGetCurrentDC();
HGLRC hglrc = bShareData == GL_TRUE ? wglGetCurrentContext() : 0;
HGLRC hglrc3 = wglCreateContextAttribsARB(hdc, hglrc, attribs);
BOOL bCtx = wglMakeCurrent(hdc, hglrc3);
printf("OpenGL Version : %s\n", glGetString(GL_VERSION));

514 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:51:51 ]
glx拡張は使ったことないんで誰かよろしく。

515 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 06:25:36 ]
NV_explicit_multisample拡張はGeForceでも最近の物なのでRadeonでは対応なさそうだな
Extentions Viewerは3.0対応してれば3.0って返してくれるんじゃなかったっけ
最近のRadeonのドライバで3.0対応したからHD2400以上ならドライバ更新すればいけるはず

516 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 09:56:05 ]
GLX だとこんな感じ

int nelem;
int fbattribs[] = {
  GLX_RENDER_TYPE, GLX_RGBA_BIT, GLX_DOUBLEBUFFER,
  GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None
};
GLXFBConfig *fbconf = glXChooseFBConfig(display, DefaultScreen(display), fbattribs, &nelem);
XVisualInfo *visual = glXGetVisualFromFBConfig(display, fbconf[0]);

...

int attribs[] = {
  GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
  GLX_CONTEXT_MINOR_VERSION_ARB, 0,
  //GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
  0
};
GLXContext context = glXCreateContextAttribsARB(display, *fbconf, 0, 1, attribs);
glXMakeCurrent(display, window, context);

らしいよ

517 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 11:13:43 ]
>>515
> Extentions Viewerは3.0対応してれば3.0って返してくれるんじゃなかったっけ
2.1コンテキストでGL_VERSIONやGL_[MAJOR/MINOR]_VERSIONを取っても2.1にしかならない。
そして既存のプログラムでは2.1コンテキストしか貰えないことが規格に明記されている。

The OpenGL® Graphics System: A Specification (Version 3.0 - August 11, 2008)
Appendix N
> Calling the older context creation commands will return an OpenGL 2.1 context.

現状では3.0コンテキスト作ってバージョン取得するソフトは皆無。
GPU Caps Viewerは1.7.0で対応予定。



518 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 21:53:02 ]
GLSLで質問なんですが、バーテックスシェーダーから
フラグメントシェーダーにvaryingで値を渡すと
補間がかかって値が変わりますよね?
値を全く変えないでバーテックスシェーダーから
フラグメントシェーダーに値を渡すにはどうすればよいでしょうか?

519 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 22:24:16 ]
変わらないならuniform変数で

520 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 22:47:48 ]
全点通して変えないなら>>519だが
補間して欲しくないということなら宣言にflatをつければよい
ただしOpenGL3.0(GLSL1.3)の機能だ

521 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 00:46:01 ]
お二人ともレスどうもありがとうございます。

>>519
uniformでVS→FS出来たんですね。
uniformはアプリからVSやFSに値を渡すものだと思ってました。
今環境が無いので試せないので今度試してみます。

>>520
書いてませんでしたが今使ってるのは2.1です。
OpenGL3.0ではflatなんてのがあるんですね。

522 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 01:48:56 ]
>>511
どっちかというと、赤本がどうなるのかが気になる。
いきなりVBOから始まるんじゃ入門者にとって敷居が高すぎるし…

523 名前:sage [2009/02/28(土) 02:15:19 ]
OpenGLのソースコードって公開されてないのかな?

524 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 03:07:26 ]
mesa3d

525 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 07:11:38 ]
>>518-521
uniform変数でVertexShader→FragmentShaderは無理だろ
そもそもuniform変数はShaderではread-onlyなんだし。

526 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 09:44:54 ]
flatはVBOの最初の頂点の値がずっと有効になるってことなのかな。
それじゃ全点通して変わらないのと一緒=unformでアプリから渡すのと同じだから
三角形ごとに切り替わるのかな

527 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:13:16 ]
glBegin(GL_TRIANGLES);
for (int i = 0; i < num_triangles; ++i) {
  glNormal3fv(normals[i]);  // トライアングル一つにつき
  glVertex3fv(vertex[i][0]); // 法線を一つ指定
  glVertex3fv(vertex[i][1]);
  glVertex3fv(vertex[i][2]);
}
glEnd();

とか、

glBegin(GL_POINTS);
for (int i = 0; i < num_points; ++i) {
  glColor4ubv(color[color_index[i]]);  // 色と頂点で別の
  glVertex3fv(vertex[vertex_index[i]]); // インデクスを使う
}
glEnd();

みたいな描画って、頂点配列でできますか?
今は困ってないけど、GL3で頂点配列しか使えなくなると、
この辺の柔軟性が無くて困るような・・・。



528 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:13:50 ]
あ、GL2.1でもShadeModelをGL_FLATにすれば
gl_Colorとかでパラメータ渡せば補間無しにできるわ
GL3ではShadeModelがDeprecateだからflat使えということになるんだあ

529 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:16:49 ]
>>527
そういう頂点配列をいちいち作ればいい
glBegin/glEndの中ではそういうことやってるんだろうな

530 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 23:50:31 ]
>>527
GL_ARB_instanced_arrays / GL_EXT_bindable_uniform / Vertex Texture Fetch+GL_ARB_texture_float
/ GL_EXT_transform_feedbackで前処理 / CPUで前処理

お好きなのをどうぞ。そもそも3.0フルコンテキストならImmediateも使えると何度(ry

531 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 10:35:05 ]
ゲームで一定のアニメーションをさせる時にPCによって性能が違うから
FPSが変わってくるけどアニメーションは一定の速度にしたいのだけど
60FPSなら1000/60msでタイマーで割り込みを掛けると約16msで
割り込み速度が追いつかなくてのろのろになるんだけど
普通はどうやってやるの?
スレッドでループさせて16ms間隔のSleepをさせるとか?

532 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 11:09:11 ]
>>531
ゲームはFPSを一定にする必要は無いんじゃないか?


533 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 11:10:31 ]
フルスクリーンにしてリフレッシュレートをAPIで変更する

534 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 11:44:46 ]
1. 前のフレームから16ms経ったか調べる
2. Sleep(0)で一瞬寝る
3. 1に戻る
OpenGL関係ないやん

535 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:03:06 ]
>>534
sleep時間ゼロだと、ビジーループにならないか?


536 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:12:55 ]
WindowsではSleep(0)だと一旦他のプロセスに渡しはする
必要以上にCPU時間をとりはするけど思う程多くはないし
ゲームだったら多少無駄に喰うくらい問題ないだろう

537 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:19:39 ]
vsync割り込みに描画関数を設定するのが正攻法なんだろうけどね。
WinAPIを良く知らないので的確なアドバイスができない。

さすがに、ここまで低レベルの処理はGLUTには無いだろうし。




538 名前:531 mailto:sage [2009/03/01(日) 12:21:31 ]
FPSはアニメーションのフレーム数の意味
実際の描画フレームはもっといく
1秒間に60フレーム分の動作をさせて
描画は完全に独立したフレームにするから30だったり100だったりする
つーかゲームって普通そうだろ

>>ゲームだったら多少無駄に喰うくらい問題ないだろう
そうか?

539 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:25:14 ]
vsyncつかうとリフレッシュレートが60じゃない場合に面倒じゃない?
リフレッシュレートが85とかだとゲームが速くなるってのも同人ならよくあるが…

540 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:26:16 ]
フルスクリーンでリフレッシュレートをAPIで設定してvsync割り込みに同期して描画する
これが一番単純

541 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:32:07 ]
>>538
画面同期しなくていいなら、自分が良く使う方法は

long FRAME=20; // ゲーム周期(ミリ秒)
long prev; // 一つ前の時刻

// ゲームループ
game(){
  :
 ゲーム処理;
  :
 long now=その環境のミリ秒単位現在時刻取得関数();
 long wait=FRAME-(now-prev);
 if(wait<0) wait=0; // 処理落ちした場合ウェイトなし
 sleep(wait); // 指定したゲーム周期を待つ
 prev=now; // 直前の時刻を更新
}

こんな感じ。

542 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 13:18:17 ]
>>541
とりあえずそれでやってみる

543 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:36:24 ]
>>540
最近のノート用ゲフォ等では、低電力モード時にリフレッシュレート変更や
vsync同期非同期切替が出来なかったりする。

544 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:41:57 ]
そんなものは動作保障外にすればよいのだ

545 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:52:01 ]
オブジェクトの移動処理を
全てタイマーをもとにして行えばvsyncとか問題ない!

546 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 23:14:38 ]
なんか、ゲーム製作板みたいな内容になってきたな。
OpenGLの話題となると、ゲームの話が多くなるのは当然といや当然かもしれないが。

547 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 13:26:45 ]
compizみたいなのもあるっちゃあるがねえ



548 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 22:36:20 ]
ゲームの流れになってるから便乗して聞いてしまう。

ゲームを作るときは飛行機とか車とかをオブジェクトにするのが普通だと思うけど、
表示するモデルの座標を保持するときって、同次行列にしてる?
それともxyz+クォータニオンにしてる?

同次行列を持っていたほうが柔軟で応用が効きそうな気はするんだが、そうなると
回転処理のときにクォータニオンを自分で実装しなきゃいけないからやや面倒で。


549 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 18:15:50 ]
構造体または配列 [ x, y, z ]のメモリ配置が
列ベクトルないし純虚数のメモリ配置に直接マップできる状態なら、
どちらでも同じかなという気がする。
C99で<complex.h>が入ってたり、新言語でも複素数サポートが充実してるんで、
2次元の回転処理を大半複素数でやるようになってきたのだが、
ガウス平面上の回転も重視されるようになったのは最近とかなんとか。
まあ20世紀前半は物理学で線形代数が花盛りだったしなあと思うと、そんなものかもしれない。

550 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:42:28 ]
>>549
サンクス。
548だが、考えた結果行列で持つことにした。
OpenGL自体との相性がいいしね。

551 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:51:54 ]
>>550
四元数を自前実装するときに[ i, j, k, 1 ]にすれば、
そのメモリ配列そのままで四元数にできると思うよ

552 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 17:36:09 ]
質問です
glTexSubImage2Dを使ってテクスチャ画像をアップデートできるみたいなんですが
gluBuild2DMipmapsで作成したテクスチャにglTexSubImage2Dをやるとうまくいかないんでしょうか?

gluBuild2DMipmapsで最初に読み込まれた画像から全然変化しないのです

553 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 19:04:49 ]
全部のミップマップレベルを更新しないとだめよ
自前でやるのが面倒なら
GL_SGIS_generate_mipmap拡張があれば、テクスチャをバインドしたあとに
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
で自動ミップマップ生成が有効になる
あとはglTexSubImage2Dで全てのミップマップが更新されるんじゃないかな

554 名前:552 mailto:sage [2009/03/07(土) 20:38:47 ]
すいません自己解決しました、根本的な解決ではありませんが

gluBuild2DMipmapsをglTexImage2Dに置き換えたら成功するようになりました
最近のglTexSubImage2Dはピクセル数が2のべき乗じゃなくても成功するんですね

555 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 22:31:19 ]
>>553
前々から言われてるけど、RadeonはGL_GENERATE_MIPMAPもglGenerateMipmapも効かなくて困る。
うまくいってるって人の書き込みを参考にしてみたけどどれも駄目だった。
うまい次善策はないものだろうか。

>>554
つ GL_ARB_texture_non_power_of_two

556 名前:デフォルトの名無しさん [2009/03/10(火) 22:26:00 ]
手っ取り早くジオメトリシェーダーを使うにはどうすればいいですか?

XP+RADEON HD 2600XTで以前glewinfoで調べたときは、
GL_EXT_gpu_shader4はありましたがGL_ARB_geometry_shader4がありませんでした。
Catalyst 9.2にした後はビデオカードが壊れてしまい調べられませんでした。

XP + RADEON HD 4830 + 最新Catalystでは使えるんでしょうか?

557 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 00:11:24 ]
手っ取り早くはGeForce買え
Catalyst 9.2でもジオメトリシェーダはまだっぽい



558 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 00:33:14 ]
ようやく仕様が公開されたGL_AMD_vertex_shader_tessellatorの中に
GL_EXT_geometry_shader4との関係が書いてあるから早晩実装されるでしょう。

559 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 23:53:12 ]
最初に2乗じゃないとだめだと決めた奴ってきっと馬鹿だ

560 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 01:05:27 ]
>>559
そういうことは、テクスチャフェッチ/フィルタリングユニットのマイクロコードを書いてから言えw

561 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 18:04:23 ]
計算機資源が豊富になったあとから後出し文句を言うのはフェアじゃない。
つか文句自体カッコ悪い。

562 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 12:35:41 ]
windowsでインストールされているopenglのバージョンを知るにはどうしたらいいでしょう?

563 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 14:18:02 ]
>>561
計算機資源豊富な今でも、2^nから外れるとパフォーマンスは急激に劣化するしなあ。


564 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 14:19:28 ]
>>562
OpenGLのバージョンはGPUとそれのドライバで決まる
OpenGL Extensions Viewerとかどうぞ

565 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 18:04:49 ]
>>560
その仕様が出来た頃はマイクロコードどころかFPGAとかで
実装していたわけで。テクスチャユニットが8個ならチップの
集まりが8組基盤の上に並んでいる。そういう時代。
物理的にロジックが実装されている以上柔軟性を持たせる
のにも限度があるから、2^nの制限もやむを得ないところ。

RealityEngine辺りの現物と論文を比べると結構面白い。
論文に書かれているブロックダイアグラムそのままにチップ
が大きな基盤に綺麗に並んでいるので非常に分かりやすい。

566 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 18:32:38 ]
openglってbmp画像を読み込む命令ってないんすか

567 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 19:21:22 ]
無いよ。全部自前でやるか、他の適当なライブラリ使って。



568 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 23:12:27 ]
>>564
無事opengl3.0がフルに使えるようになりました。
ありがとう。

569 名前:デフォルトの名無しさん [2009/03/16(月) 19:13:49 ]
とりあえず、初心者は2.0の赤本を買っておけば大丈夫ですよね?。



あと、皆さんはどんな開発環境を使ってますか?。

570 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 00:08:08 ]
赤本があればいいが、それで初心者でも安心かはよくわからない

開発環境は主にiMacでgccとVIM
OpenGL Profilerが非常に便利だ
WindowsマシンはVistaでGeForceとRadeonとChromeを適宜差し替え
WindowsでもgccとVIM、たまにデバッグ用にVisual Studio
gDEBuggerが欲しいけど高い

571 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 10:34:24 ]
ははは

572 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 12:15:03 ]
ひひひ

573 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 13:06:00 ]
拡張機能を使い始めると赤本だけでは不十分な気がするのですが
(例えば、赤本に wglChoosePixelFormatARB() って載ってましたっけ…?)
拡張機能の学習にお勧めの書籍はありますでしょうか。
今のところ OpenGL Superbible あたりを買ってみようかと考えています。


574 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 00:20:20 ]
Superbibleはサンプルが多めでちょっと範囲が広い赤本という感じだったな
拡張もある程度載ってるけど、応用的なものは少ない
基本的なものを知りたいならいい本だけどね
洋書いけるならMore OpenGL Game Programmingが結構面白かった
ちょっぴり古いけどまだ参考にはなると思う

575 名前:573 mailto:sage [2009/03/20(金) 20:56:45 ]
>>574
ありがとうございます。そちらも入手してみます。

576 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:34:59 ]
Visual C# 2008EEでC# OpenGL Framework(OpenGL v1.2.1)を使っています。今回行列演算の順序の確認や、挙動を理解するために以下のコードを書きました。
起動時にgl.Frustum(-client_aspect, client_aspect, -1.0, 1.0, 1.0, 100.0);で視体積を設定し、あとは描画のみです。(gl.Frush()など省略している部分もあります。)

gl.Translated(-1.0, 0.0, -3.0);
gl.Rotated(45, 0.0, 1.0, 0.0);
gl.PushMatrix();
gl.Rotated(-90, 0.0, 1.0, 0.0);
gl.Translated(2.0, 0.0, 0.0);
gl.Begin(gl.POLYGON);
{
gl.Vertex3d(-1.0, -1.0, 0.0);
gl.Vertex3d(-1.0, 1.0, 0.0);
gl.Vertex3d(1.0, 1.0, 0.0);
gl.Vertex3d(1.0, -1.0, 0.0);
}
gl.End();
gl.PopMatrix();
gl.Begin(gl.POLYGON);
{
gl.Vertex3d(-1.0, -1.0, 0.0);
gl.Vertex3d(-1.0, 1.0, 0.0);
gl.Vertex3d(1.0, 1.0, 0.0);
gl.Vertex3d(1.0, -1.0, 0.0);
}
gl.End();

これで視線に対し、y軸を中心に45度傾いた四角形が2つ左右対称に描画されると思うのですが、実際には右の四角形が手前に来ている感じになってしまいます。
どこが間違っているのでしょうか。
OpenGLを始めて日が浅く質問内容に不備があったり、意味不明なことをしていたりするかもしれませんが、よろしくお願いします。

577 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:37:02 ]
>>570
すいません、ありがとうございます。

gccとvimですか、coolですね。



578 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 01:13:25 ]
>>576
Matrix演算順の問題だね。移動のベクトルが回転の影響を受ける場合、
Translate->Rotate と Rotate->Translate は結果が違ってくる。

上記のコードだと、2つのglTranslateがY軸回転の前後にあるので、まさにその状況。
Modelview Matrixを取得して値を見てみながら動作を確認すれば理解しやすいかも。


579 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 10:12:30 ]
>>578
ありがとうございます。行列確認しつつ試してみます。

580 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 19:54:06 ]
>>576
今実際に逐次行列を確認しながら、実行してみたところ挙動を理解することができました。
TranslatedやRotatedはワールド座標ではなくモデル座標で動作するんですね。Rotatedがワールドでもモデルでも差があまりないためTranslatedもつられて勘違いしていました。
ありがとうございました。

581 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 08:07:51 ]
モデル座標系とかワールド座標系とかの区別はOpenGL自体にはないよ
そこはどこからどこまでがモデル座標系なのかワールド座標系なのか自分で管理しないとだめ

そしてOpenGL 3.1 Released
ttp://www.khronos.org/opengl/

582 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 00:33:33 ]
182.47
ttp://developer.nvidia.com/object/opengl_3_driver.html

583 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 16:24:14 ]
立方体を作成し、それぞれの面に別々のテクスチャを貼り付けるプログラムを作成しました。
立方体は頂点配列や法線配列、テクスチャ座標配列を有効にして作成しています。
また6面のテクスチャは確認しやすいように、レッド、シアン、グリーン、マゼンタ、ブルー、イエローの順番でテクスチャ画像配列に格納しています。

gl.VertexPointer(3, gl.DOUBLE, 0, Cube_vertex);
gl.NormalPointer(gl.DOUBLE, 0, Cube_normal);
gl.TexCoordPointer(2, gl.DOUBLE, 0, Cube_TexCoord);
for (int i = 0; i < 6; i++)
{
gl.BindTexture(gl.TEXTURE_2D, textureName[i]);
gl.DrawArrays(gl.QUADS, i * 12, 12);
}

これで描画処理を実行してみたところ、レッド3面とシアン3面でコの字を組み合わせたような状態になってしまい、他の色のテクスチャが反映されていません。
この描画処理が入る直前でテクスチャの中身を確認してみても、しっかり各色のテクスチャが格納されていました。
何が間違っているのでしょうか。お願いします。

584 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 17:53:53 ]
自己解決しました。単にDrawArraysの引数が間違っていただけでした。スレ汚しすみませんでした。

585 名前:デフォルトの名無しさん [2009/03/27(金) 11:56:22 ]
質問です。

MaterialのGL_SHININESSの値(0〜128が範囲だそうです)についてなのですが、
これはライティング計算式においてどう扱われるのでしょうか。

Direct3Dと同等の描画になるように移植しているのですが、
Direct3DのMaterialのPowerにあたるものが、GL_SHININESSだと考えています。

Direct3DのPowerについては、下記のサイトに計算式がありました。
msdn.microsoft.com/ja-jp/library/cc373089.aspx
ただ、こちらでは値の範囲が0〜正の無限大 となっているため、この値をそのままGL_SHININESSに入れても期待通りになりそうもありません。


586 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 12:52:07 ]
赤本のライティング(照明処理)の章に計算式載ってる。パッと見、同じに見える

587 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 14:32:47 ]
ありがとうございます。
ついでなので赤本も買ってみます



588 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 19:20:04 ]
kissho.xii.jp/1/src/1jyou69631.png
マウスのドラッグにより物体を見たままに回転させたいのですが、上記のような動作をさせている良いサンプルなどはないでしょうか。

589 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 20:28:09 ]
この画像では若干説明不足でした。現状例えば立法体なら、6面中4面では初期状態からマウスを下に動かせば上の画像における2番が見え、上に動かせば反対側、右に動かせば3番が、といった具合に回転させられます。
しかし3番においてマウスを下に動かすと2番の面が見えるわけではなく、視線(その時点でのモデルのx軸)を軸として回転する形になってしまいます。

590 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 20:33:00 ]
四元数とか使う奴だな

591 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:13:39 ]
marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040321
こことかどーだろ

592 名前:デフォルトの名無しさん [2009/03/27(金) 21:17:56 ]
スレッド間でのテクスチャの共有について質問があります。
描画用のスレッドAで以下のようにリストを共有して、

 HGLRC hrc = wglCreateContext(hdc);
wglShareLists(hrc_old, hrc);
 // hdcとhrc_oldはあらかじめ作っておいたものです

スレッドBで以下のようにテクスチャを作っています。

 wglMakeCurrent(hdc, hrc); // hdcとhrcはスレッドAから渡されたコンテキスト
 〜ここでテクスチャを生成〜
 wglMakeCurrent(hdc, NULL);
 wglDeleteContext(hrc);
 スレッドB終了

で、スレッドBで作成したテクスチャはきちんと描画されるのですが、
CPU負荷が上がりっぱなしになります。
解放を忘れているコンテキストがあるのかもと思うのですが、
なにか間違えていますか?
ちなみに、スレッドBの最初のwglMakeCurrentを呼ばなければ
テクスチャも描画されない代わりに負荷も上がりません。

593 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:50:46 ]
>>588-589
ttp://zoome.jp/kontonsoft/diary/3/
このビデオでやってるみたいな回転をしたいってことですか?
これはタッチパネル操作だけど

594 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:54:21 ]
>>588
視界の右方/上方ベクトルを、適宜視点位置ベクトルに加え続ければいいよ

595 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:00:13 ]
皆さんありがとうございます。クオータニオンを勉強してみたいと思います。
>>593
そんな感じですね。グーグルアースは画面上で渦状の回転も入りますがあんな感じというとわかりやすいでしょうか。
どの方向から見ていても横にドラッグすれば画面上で横向きに回転、縦にドラッグすれば縦向きに回転といった感じです。

596 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:00:02 ]
>>594
申し訳ありません。まだまだ経験が浅くよく理解できないのですが、視界の右方、上方ベクトルというのはPROJECTION_MATRIXの中でしょうか。

597 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:53:27 ]
>>592
新しいコンテキストはスレッドBで作った方がいいんじゃないだろうか



598 名前:592 mailto:sage [2009/03/28(土) 01:07:33 ]
>>597
なるほど。元のレンダリングコンテキストをスレッドBに渡して、
スレッドBでwglCreateContextとwglShareListsを呼ぶわけですね。
今ソースが手元にないので明日試してみます。ありがとうございます。


599 名前:592 mailto:sage [2009/03/28(土) 17:29:16 ]
>>597
うまくいきました!

スレッドB
 hdc = wglGetCurrentDC();
 hrc = wglCreateContext(hdc);
 wglShareLists(hrc_base, hrc); // hrc_baseはスレッドAから受け取ったコンテキスト
 wglMakeCurrent(hdc, hrc);
 〜テクスチャ生成〜
 wglMakeCurrent(hdc, NULL);
 wglDeleteContext(hrc);

以上

600 名前:592 mailto:sage [2009/03/28(土) 17:42:32 ]
すみません。やっぱり駄目でした…。
負荷は上がらなかったものの、肝心のテクスチャが描画されていませんでした。
wglShareListsは元のスレッドで呼ばないといけないということはないでしょうか。
今日は時間切れなので、後日もう少し試してみます。


601 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 21:08:16 ]
透過ありのテクスチャを各面に貼り付けた立方体を描画したのですが、ある面から見ると背景の別の画像がひとつも見えず透過できていない一方、またある面では別の画像が1枚だけ見え、さらに他の面では2面(ry
といった感じに半端な透過処理になってしまっています。挙動を見た感じでは恐らく原因は、テクスチャ座標か各面のポリゴン座標の配置が時計廻りかそうでないかにあると思うのですがどうなんでしょう。

602 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:09:24 ]
描画順序じゃね?

603 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:18:53 ]
>>601
その状況からして、Depth TestでFailになっているからだね。
半透明の物体は、奥から手前にソートして描画しないとうまくいかないというのは認識してる?

604 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:47:49 ]
>>602-603
ありがとうございます。奥から描画しないといけないとは知りませんでした。
ソートは面倒になりそうですね。

605 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:28:19 ]
>>600
スレッドBでテクスチャを書き換え、スレッドAで表示するプログラム
作ったことあるけどこうしてた。>>599だとwglCopyContext使ってなくね。

OldRC:複製元のレンダリングコンテキスト
RC:複製先の〃
DC:デバイスコンテキスト

スレッドB
//コンテキストを複製、ShareLists
RC = wglCreateContext(DC);
wglCopyContext(OldRC, RC, GL_ALL_ATTRIB_BITS);
wglShareLists(OldRC, RC);

//テクスチャを書き換え
wglMakeCurrent(DC, RC);
{...} //テクスチャの書き換え処理

//あと片付け
wglMakeCurrent(NULL, NULL); //不必要?
wglDeleteContext(RC);

606 名前:592 [2009/03/29(日) 13:57:10 ]
>>605
同じようにしてみたんですが駄目でした。
605に挙げていただいたやり方は、下に上げた4つの組み合わせの中だと1番に該当すると思います。
ちなみに2番の例だとwglCopyContextを呼ばなくても描画はされました。

スレッドBでテクスチャ生成前にwglMakeCurrent(hdc, hrc)し、
生成後にwglMakeCurrent(NULL, NULL)とwglDeleteContext(hrc)を呼んでいます。
このwglMakeCurrentに渡すhdcとhrcの組み合わせについて結果を調べてみました。


1. hdcはAから引数で渡されたもの + hrcはBでwglCreateContext(とwglShareLists) ⇒ 描画NG + 負荷NG(高)
2. hdcはAから引数で渡されたもの + hrcはAでwglCreateContext(とwglShareLists)して引数で渡されたもの ⇒ 描画OK + 負荷NG
3. hdcはBでwglGetCurrentDCして得たもの + hrcはAでwglCreateContext(AでwglShareLists)して引数で渡されたもの ⇒ 描画NG + 負荷NG
4. hdcはBでwglGetCurrentDCして得たもの + hrcはBでwglCreateContext(BでwglShareLists) ⇒ 描画NG + 負荷OK(低)

描画がきちんとされるのは2番、ただし高負荷になります。
負荷が変に高くならないのは4番、ただし描画されません。(>>599に挙げた例です)

うーん…。

607 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:52:45 ]
>>606
うーん

>hrcはAでwglCreateContext(とwglShareLists)
>>329によると、OpenGLはコンテキストを生成したスレッドでAPIを呼ばないといけないらしいので
少なくともwglCreateContextはスレッドBでやらないといけないと思います。

>hdcはBでwglGetCurrentDCして得たもの
スレッドBでいきなりwglGetCurrentDCしても無効なハンドルが返るのでは。

とりあえずwgl*の関数の戻り値がエラーになっていないか調べてみてはどうでしょうか。
それでも分からなければ問題を再現できる最小限のソースコードのうpを

私のプログラムの場合だと
スレッドAでテクスチャを作成(glGenTextures)、
テクスチャの名前(というか番号)を関数でスレッドBに渡し
スレッドBで(wglMakeCurrent後)glTexSubImage2Dしています。
別にテクスチャを作成するのはAでもBでもどっちでも良さそうですが。

スレッドAでwglMakeCurrentして
複成元のレンダリングコンテキストに戻すのを忘れずに。
(でもGLUT使用時は描画前に勝手にやってくれるので必要ない?)



608 名前:592 mailto:sage [2009/03/30(月) 00:50:15 ]
>>607

>>606の3番と4番が駄目な理由は>>607で指摘された「スレッドBでいきなりwglGetCurrentDCしても無効なハンドルが返る」という理由でした。初歩的な間違いですみません。
つまり4番で負荷が高くならなかったのは、単にスレッドBでのwglCreateContextが失敗していたからでした。
それで>>606の1番が描画されない理由は、wglShareLists(hrcA, hrcB)を呼んだときにリソース(hrcA)が使用中というエラーが原因でした。
試しにスレッドAでいったんwglMakeCurrent(hdc, NULL)として、
スレッドBでwglShareLists(hrcA, hrcB)を呼んでみたら、
リソースが使用中というエラーの替わりにハンドルが無効というエラーが出ましたが、
テクスチャはきちんと描画されました(描画前にスレッドAでwglMakeCurrent(hdc, hrcA)と戻しています)。
2番のやり方だとテクスチャは描画され、何もエラーは出ませんでした。

ところで>>329の「OpenGLはRCを生成したスレッドでAPIを呼ばないといけない」というのは、
例えばwglの場合は「wglMakeCurrentを呼んでRCをアクティブにしたスレッドでAPIを呼ばないといけない」だったりしないでしょうか。
つまりRCを作るのは別のスレッドでもいい気がするのですが。

とりあえず別スレッドでテクスチャがきちんと生成できる条件はだいたいわかりました。
あとは負荷の問題…。



609 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 01:16:24 ]
素朴な疑問なんだけど、wglのcontextはスレッドセーフなの?

610 名前:デフォルトの名無しさん [2009/03/30(月) 01:21:04 ]
C# で OpenGL を使うクラス作ってる人って結構いるけど
あれってどうやって.NETの窓につっこむようにできてるの?

611 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 01:29:06 ]
.NETの窓でもHWNDとかHDCが取得できたと思う

612 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 01:47:55 ]
>>609
例えば「スレッドセーフではない」というのはどういう状況ですか?
1つのレンダリングコンテキストに対して複数スレッドがwglMakeCurrentを呼ぶとまずいということですか?



613 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 13:39:50 ]
>>612
GL自体が激しくステートマシンなので、
同じコンテキストに対し、あっちのスレッドでglBeginしてglEndする前にこっちのスレッドからglBeginしたりすると困ったことになる。
だからこういうのは、異なるスレッドが一つのコンテキストを共有できたりしないように規制したりするんだが、
wglの動作はよく知らん。

614 名前:612 mailto:sage [2009/03/30(月) 20:54:34 ]
例えば異なるスレッドが同じRCに対してwglMakeCurrentを呼ぶと
要求されたリソースは使用中というエラーが返るけど、そういうことならスレッドセーフなのではないかな。
あるスレッドでアクティブなRCのリソースを異なるスレッドが共有するために
wglShareListsがあるわけだし。

615 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:09:22 ]
WinのOpenGLはスレッドごとにコンテキストが分かれてるから、それぞれのスレッドに別のレンダリングコンテキストを与えればいい

616 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 10:24:08 ]
二つのContext間で目的のテクスチャなりバッファなりが共有できてるのかが、残る疑問かなぁ

617 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 21:20:16 ]
>>608

>(描画前にスレッドAでwglMakeCurrent(hdc, hrcA)と戻しています)。
wglMakeCurrentの設定はスレッドごとに保持されるみたい・・(MSDNより)
msdn.microsoft.com/en-us/library/dd374387(VS.85).aspx

>wglMakeCurrent(hdc, NULL)
どうでもいいことだけど
第2引数HGLRCをNULLにするとhdcの方は無視されるらしい。

負荷の問題は良く分からない・・

参考URL
the best is yet to be: テクスチャを異なるレンダリングコンテキスト間で共有するにはなどなど・・・
corvette.blogzine.jp/blog/2005/08/post_f3c1.html



618 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 21:27:55 ]
またマルチスレッドか
もう誰かテンプレ用にまとめ作っちゃいなYO!

619 名前:592 mailto:sage [2009/03/31(火) 23:56:13 ]
テンプレになるかどうかわからないけれど、これまでの自分なりの理解。

・OpenGLの関数(glBegin等)はカレントのレンダリングコンテキストに対して実行される。
・OpenGLではスレッドごとにカレントのRC(レンダリングコンテキスト)を与えないといけない(例えばwglMakeCurrent)。
・異なるスレッドが同じRCに対してwglMakeCurrentを呼ぼうとするとエラー(GetLastErrorは「リソース使用中」と返す)。
・別のスレッド(つまり別のRC)で作成したテクスチャやディスプレイリストは使えない。
・使いたい場合には複数のRCでリソースを共有しないといけない(例えばwglShareLists)。
・別のスレッドでカレントなRCをwglShareListsに渡そうとするとエラー(GetLastErrorは「リソース使用中」と返す)。
 例えばhrc1がスレッド1でカレントとして、スレッド2がwglShareLists(hrc1, hrc2)を呼んだらエラー。
・解決方法としては、wglShareListsに渡したいRCを一旦カレントからはずせばOK?
 例えばスレッド1でwglMakeCurrent(NULL, NULL)→スレッド2でwglShareLists(hrc1, hrc2)→スレッド1でwglMakeCurrent(hdc, hrc1)
 ↑実はこれをしたらハンドルが無効のエラーが出た(でも一見してまともに動いてる風)
 あるいはスレッド1でwglShareLists(hrc1, hrc2)→スレッド2でwglMakeCurrent(hdc, hrc2)
 ↑これはエラーもなくまともに動いている風
・wglCreateContextはどのスレッドで呼んでもいい(wglMakeCurrentが重要)?


620 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 08:16:17 ]
Windowsはmutexの替わりに何使うんだろ

621 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:12:37 ]
>>619
おつ。
個人的には最後の項目が良くわからんなぁ。

さらにvistaだと、また別問題が幾つか残ってそうだけど。
例えば、vistaだと同じスレッドでもDCごとにRCを作ってやらなきゃならない気がする。
BeginPaintとGetDCで帰ってくるhDCが異なることがあるようで、ここも怪しいが。

俺の知識不足かもしれん。

622 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:22:37 ]
米シリコン・グラフィックス、連邦破産法11条の適用を申請
jp.reuters.com/article/domesticFunds/idJPnTK834789220090401

ワロタ


623 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:36:01 ]
またか。
景気が底を打つまで
そのまま冬眠させておいた方がいいな。

624 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:41:39 ]
>>622
OpenGLは債権者のところに譲渡されるのかな?
無料のままだといいね

625 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:57:38 ]
N+で見境無くコピペしてるやつがいるけど
あれは何が目的なんだろ

626 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:49:22 ]
お前ら素人はSGIなんてしらねーだろ、俺知ってるからショックだぜ。
とかかなぁ。

627 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:31:08 ]
SGIは有名だろ
ttp://www.sgi.org/



628 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 22:33:53 ]
既出だけど

1日、米シリコングラフィックス(SGI)は、連邦破産法11条の適用を申請し、経営破綻したことが
裁判所への提出文書で明らかになった。

提出文書によると、同社は総資産3億9050万ドルに対し、5億2650万ドルの負債を抱えている。

シリコングラフィックスは、OpenGLの開発元であり、「Open」と冠しているもののあくまで「オー
プン仕様」であり、またクロノスグループという団体に管理を移管しているものの特許などの
権利は全て同社が保有しており、同技術を採用しているPLAYSTATION3への影響が懸念される。
gamerbook.net/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9:2009/04/01:%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%81%8C%E7%B5%8C%E5%96%B6%E7%A0%B4%E7%B6%BB

629 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:17:02 ]
てっきりエイプリルフールネタだと思ってたんだが

630 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 00:11:49 ]
>>628
これで買収した会社がOpenGLから収益をあげようとして
第二のSCO訴訟が起こったら、また盛大な祭りになるんだろうなあ。


631 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 00:29:02 ]
OpenGLの特許って何かあったっけ?
商標ならSGIだったと思うけど

632 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 00:43:18 ]
glEnable(・・・・)等は必要になったときに指定するのか、それとも使用する場合には最初にまとめて指定するのか、どちらがいいのでしょうか。お願いします。

今回FBOでテクスチャを関連付けてオフスクリーンレンダリングを行う際に、glEnable(GL_TEXTURE_2D)を指定する位置によって生成されるテクスチャが違うもの(妙に明るさが違う)になってしまったもので。
・テクスチャの事前設定やFBOの生成前にglEnable(GL_TEXTURE_2D)を指定し、オフスクリーンレンダリングでテクスチャを生成後、オブジェクトに貼り付け画面に描画。→貼り付けられているテクスチャが妙に暗い。
・上記の設定、オフスクリーンレンダリングでテクスチャを生成後、glEnable(GL_TEXTURE_2D)を指定し、オブジェクトに貼り付け画面に描画。→恐らく正しいテクスチャが貼り付けられる。

633 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 09:10:34 ]
オフスクリーンでレンダリングしたい絵にテクスチャが必要なら
enableするべきだし、必要ないならdisableするべきってだけの話では?

634 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:18:05 ]
FBOにはglEnable(GL_TEXTURE_2D)は関係ないよ
glEnable(GL_TEXTURE_2D)は
テクスチャを今から行う描画に使うかどうかを指定するだけ

635 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 12:37:41 ]
>>633-634
ありがとうございます。では明確に画面描画に使用する直前に指定したほうが問題はなさそうですね。

636 名前:592 mailto:sage [2009/04/05(日) 02:26:02 ]
マルチスレッドのテクスチャ共有で負荷が高くなる理由がおそらくわかりました。
自分の環境はVista+SonyのVaioZ(GPUがintelオンボードとnVidiaを切り替え可能という機種)なんですが、
GPUをnVidiaからオンボードに切り替えたら負荷が高くなるという現象は出なくなりました。
nVidiaのチップとVistaのドライバー関連の問題のような気がします。

ちなみに負荷が高くなる条件は以下でした。
メインスレッドをT1、テクスチャ作成用スレッドをT2、
T2でカレントとするレンダリングコンテキストをRC2と書きます。

・T2でRC2を作成する(wglCreateContext)と負荷発生
・T1でRC2を作成(まだ負荷は発生しない)→T2に渡す→T2でRC2に対してwglMakeCurrentすると負荷発生

結局T2でRC2をカレントにしようとすると負荷が発生するわけで、
つまり別スレッドでgl関数を使えないという状況です(使えるけどなんか気持ち悪い)。
ちなみにT1でRC2を作成した場合、T2側でwglDeleteContext(RC2)したら
T2でカレントにしない場合でも負荷が高くなりました。
なので、RCの作成と削除はやはり同じスレッドで行った方がいいみたいです。
逆に言えば、T1で作成したRCをT2でカレントにしても、最終的にT1側で削除すれば問題ないようです。
仕様上どうなのかはよくわかりませんが。

637 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 17:53:08 ]
質問です

投影テクスチャーシャドウをやろうと思っていて問題がでました。
環境はOpenGLES1.1です。早い話がiPhoneです。

単に描画結果をテクスチャにし、平面の四角ポリゴンに映して影とするのはうまくいきました。
そこで、その発展形で、影を落としたいモデルのUVを自動生成しようとしました。
これだと影が落ちる側のモデルが凸凹していても、きれいに影がでますので。

最初は
glMatrixMode(GL_TEXTURE);
で光源の位置にカメラを置いた場合の行列を・・・とやっていたのですが、詳しく調べたところこれは
「UV座標を変換する行列を設定できる」というものらしく、合致しません。

次に、頂点座標をテクスチャ座標として使うための
GL_OBJECT_LINEAR
を使おうとしましたが、どうもES1.1には見当たらないようです。

OpenGLES1.1では、影が落ちるモデルのUV座標を自動生成するタイプの影は不可能なのでしょうか?





638 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:45:11 ]
>>636
バイナリでもいいのでテストツールあげてくれたら、こちらでも検証するよ。
こちらはtypeSZで、同様にオンボintel&ゲフォ7400Mの切り替え式です。

639 名前:592 [2009/04/07(火) 20:47:31 ]
>>638
かたじけない。
アップロードするのは初めてでちょっと不安ですが、↓に置いてみました。
DLキーはgl、ソース付きのzipファイルです。
uproda.2ch-library.com/lib117505.zip.shtml

起動するとブルーのテクスチャが見えるはずですが、
スペースキーを押すとテクスチャを更新します(見た目は変わりません)。
このときに負荷が高くなります。
nVidiaのGPUが載ったデスクトップ(Vista64)でも試してみましたが、やはり負荷が高くなりました。

640 名前:592 mailto:sage [2009/04/07(火) 21:12:43 ]
連続ですみません。ATIのGPU+Vista64の環境で試せました。
テクスチャ更新後の負荷は高くなりませんでした。
やっぱりnVidiaのドライバーかなぁ…。

641 名前:デフォルトの名無しさん [2009/04/07(火) 22:13:56 ]
スキンメッシュとか簡単に表示できる?

642 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:22:49 ]
>>641
自前で実装です^^

643 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:20:42 ]
>>639
638ではないがChrome 430GTとGeForce 9500GTで試してみた。どちらもVista32bit
Chromeの方は特に問題なく動いた
スペース連打すると当然それなりのCPUは使うがそれ程ではない
GeForceの方は最初起動した時は何度かスペース押したら100%どころかアプリが応答しなくなった
しかし強制終了して3回目以降はこちらも全く問題なく動くようになったので、うちの環境が怪しいだけかも
ドライバはちょっと古めの180.48
ドライバ設定のスレッドした最適化が怪しいかと思ったがオンでもオフでも自動でもかわらなかった

あんまり参考にならない情報ですまん

644 名前:592 mailto:sage [2009/04/07(火) 23:58:42 ]
>>643
ありがとうございます!
稀にアプリが応答しなくなる原因ですが、描画用スレッドとテクスチャ生成用スレッドで、
テクスチャの読み書きを排他制御していないせいだと思います。
アップロード用に修正したときに省略しました。気にしないでください。
こちらで試せした結果は↓です。Vista32だと問題なく動くとすれば、Vista64のNVIDIAドライバーの問題かなぁ。
Vista64+NVIDIA Quadro FX1700(driver 7.15.11.6255)で×
Vista64+NVIDIA GeForce 9300M GS(driver 7.15.11.7449)で×
Vista64+ATI Radeon HD 4800(driver 8.522.1.1000)で○
Vista64+Intelオンボード4500MHDで○

もしドライバーの問題ならそれはそれで開発の方は進められるので幸いではあります。



645 名前:638 mailto:sage [2009/04/08(水) 00:05:00 ]
>>639
テストしてみました。
typeSZ, OS:VistaSP1HOME, 表示モードは「Windows Vista ベーシック」

Mobile Intel(R) 945(オンボ)の場合
起動するだけでタスクマネージャーの表示(1秒更新)が固まるほどの負加。
CPU負荷というより描画だけが妨害されている感じ。

GeForce7400GM
スペースを数回押すだけでは負荷は特に無し。
1秒くらい押し続けると、test.exeがフリーズ。しかしCPU使用率は低いまま。
この場合はタスクマネージャーへの影響はなし。

ご参考になれば幸い。

646 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 00:06:49 ]
追記Vistaha32bitです。
う〜ん、intelオンボの動作見てると、なんとなくドライバ以外の問題な気もするなぁ。

お節介でなければ今後もテスト付き合いますので。

647 名前:638 mailto:sage [2009/04/08(水) 00:15:57 ]
更に追記。
素朴な疑問なんだけど、WM_PAINTでなぜBeginPaintしないの?
これだと無効領域がクリアされずにWM_PAINTが発生し続けないか?
単にそれで負荷になってる気もするんだけど。

コンパイルして確認していないので無責任な発言です。すまそ



648 名前:592 mailto:sage [2009/04/08(水) 02:11:16 ]
>>647
描画はタイマーイベントで10msec間隔(main.cpp:76行目)で
InvalidateRectすることでWM_PAINTを発生させています。
しょぼいPCだと負荷になるかもしれませんが、今時のPCであれば無視できる程度かと。

>>645
スペースを押し続けると固まるのは、テクスチャ生成スレッドがわさわさ作られて、
各スレッドでのテクスチャ書き換えと元スレッドでのテクスチャ描画のタイミングが
ぶつかりやすくなる(変な表現ですが)ためだと思います。
ここは実際には排他制御してますので無視してください。

>>638さんの環境はやはりVista32なのですね。
Vista64+NVIDIAで大丈夫だったという人がいると一気に不安になれるのですが…。

649 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 02:17:46 ]
サイドバイサイド構成がうんたらかんたら

650 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 03:50:43 ]
>>648
>InvalidateRectすることでWM_PAINTを発生させています。
>しょぼいPCだと負荷になるかもしれませんが、今時のPCであれば無視できる程度かと。

いやいやそうじゃなくて、
WM_PAINTってのは無効領域が存在するときに繰り返し発生し続けるメッセージなんだよ。
すなわちWM_PAINTを一度で止めるためには無効領域をクリアしなきゃならない。
BeginPaintってのはそのクリアを担当する関数でもあるんだよ。

651 名前:592 mailto:sage [2009/04/08(水) 10:11:52 ]
>>650
丁寧にありがとうございます。誤解してました。
つまり今のやり方だと10msecごとにWM_PAINTが呼ばれる+
無効領域を有効にしようと頻繁にWM_PAINTが呼ばれる、
という状況なわけですね。
OpenGLから離れちゃって申し訳ないですが勉強になりました。

652 名前:638 mailto:sage [2009/04/08(水) 14:54:40 ]
>>651
どういたしまして。
修正後のテストも付き合いますのでどうぞ

653 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:32:29 ]
まさかこのスレでS3スレ住民と出会うとは思わなかった

654 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 23:32:35 ]
cygwinでglfwのサンプルをコンパイルするとwarningが出ます。
g++ lesson01.cpp -o lesson01 -lglfw -lglu32 -lopengl32
Warning: resolving _glClear by linking to _glClear@4
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups
どうすれば解決できるでしょうか。

655 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 11:15:15 ]
>654
>Use --enable-stdcall-fixup to disable these warnings
では解決しないのか?

656 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:54:36 ]
頂点のインデックス指定について悩んでいます。
ややこしい話なのでうまく伝わるかどうか自信が無いのですが、
たとえば、6面体のサイコロを描画したいときを考えます。

頂点は8つありますので、glBufferData()を使って8頂点を登録しました。
ところが、サイコロの場合、同じ頂点座標でも同じ法線や同じテクスチャ座標とは限りません。
どの面に所属する頂点かによって、テクスチャの参照座標や法線は変わってきます。

そのため、頂点インデクスは12三角面*3頂点で36頂点分を設定しました。
同じ頂点座標が何度も参照されるということです。
法線やテクスチャ座標も、頂点インデクスの分だけ設定しました。

で、glDrawElementsで描画したところ、形状は正常に表示できたのですが、
テクスチャと法線が見事に化けて、まともに表示できませんでした。

しばらく考えた末に、テクスチャや法線のパラメータは頂点インデクスではなく
頂点座標に所属してしまっていることに気が付き、
頂点インデクスの数だけ頂点座標を重複して登録するようにしたところ、正常な表示が可能となりました。

ただ、この場合だと重複頂点が大量に発生してしまい、同じ座標に対して何度も行列演算が行われているはずです。
サイコロくらいならいいのですが、表示するポリゴンが数万とかのオーダーになった場合、
GPUにかかる無駄な負荷が無視できなくなってくると考えられます。

テクスチャ座標や法線データを、頂点座標ではなく頂点インデックスに所属させる方法というものがあれば
教えて頂きたく、よろしくお願いいたします。

657 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 00:58:26 ]
サイコロなら基本6x4の24頂点必要。ポリゴン間の法線やテクスチャ座標の共有が
頂点と同じであると判定できる場合のみ8頂点で済ませることができる。



658 名前:656 mailto:sage [2009/04/12(日) 01:02:51 ]
>>657
やっぱりそうか…
ありがとうございます。
場合分けして展開するのもかなり面倒なので、頂点重複で持つことにします。

しかし、OpenGL初期のころのハードでは行列演算のコストがそんな安いわけではなかったのに、
こういう仕様になっているのが意外といえば意外です。
フラットシェーディングのときには、頂点が共有できないってことですし。

659 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 03:52:28 ]
3DCGプログラミングの手法や概念の勉強をしたいのですが
OpenGLで低位の表現から始めるほうが有効でしょうか?
それとも3DCGエディタツールの仕様書を眺めて使うほうがいいでしょうか?

660 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 12:13:46 ]
>>659
両方並行というがよいのではないでしょうか。
たとえば、OpenGLの赤本を読みながら、メタセコイアのmqoファイルのフォーマットを理解してみましょう。
別にVRMLでもDXFでも構わないですが、テクスチャやシェーディングなどをサポートしているほうがいいでしょう。

そのファイルフォーマットを画面に表示するにはどうすればいいのか考えてみましょう。
頂点座標や法線をどう保持すべきか、ポリゴンの概念を明示的に扱うべきかどうか、考えるべき点はたくさんあります。
文献やウェブサイトを最大限に活用しましょう。
この試行錯誤の過程で、対象のライブラリに関するノウハウを急速に蓄えることができます。
>>659に数年以上のプログラムの経験があれば、ファイルを読み込んで形状を画面に表示するところまでは、
比較的短期間に到達するでしょう。

では、パフォーマンスを出すにはどうすればいいか考えてみましょう。
できるだけ処理をGPU側にやらせるにはどうすればいいか考えてみましょう。

ファイルフォーマットを読み込んで画面に表示するプログラムを作ることで、
そのAPIセットのエッセンスをかなりの程度理解することができます。

661 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 19:04:05 ]
>>660
丁寧な返答ありがとうございます.
あなたの提案に則った勉強をしようと思います.
さきほどMetasequoiaをインストールしてmpoファイルを見てみましたが
ずいぶんと可読性の高いフォーマットですね.
ありがとうございました.


662 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 00:13:58 ]
>660
659ではないけど、すげーさんくす
さっそくやるわ。テンプレに入れて欲しいぐらい良い解答だった、おれにとって。

663 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 12:09:49 ]
デプスについて質問なんですが
glDepthRangeには-1〜1の範囲の値しか設定できないのでしょうか?
絶対値で1以上の値を設定したら1になってしまうって事であってますか?


664 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 12:39:43 ]
ttp://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/depthrange.html

glDepthRange specifies a linear mapping of the
normalized depth coordinates in this range
to window depth coordinates.

Regardless of the actual depth buffer implementation,
window coordinate depth values are treated as though
they range from 0 through 1 (like color components).


ttp://oshiro.bpe.es.osaka-u.ac.jp/people/staff/imura/computer/OpenGL/coordinates/disp_content
OpenGL では、glViewport で x, y 座標の、glDepthRange で z 座標のマッピング先を指定する。glDepthRange は普通指定する必要はない。


665 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 08:23:35 ]
>>663
0<=zNear<=zFar<=1 でしょう。
zNearとzFarは逆転できるのかなぁ? やったことないや。
manpageには
 Thus, the values accepted by glDepthRange are
 both clamped to this range before they are accepted.
と書いてあるので、範囲外の値を指定しても0〜1にクランプされちゃうでしょうね。


666 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 07:23:00 ]
[OpenGL] シェーダでポインタ
ttp://www.kumaryu.net/cgi-bin/diary/?date=20090428#p02
DX11の機能一部先取りした形なんだろうか

667 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 13:07:10 ]
OpenGLの初期化なんですけど、やたらと時間がかかる気がします。
大体15秒ほど掛かります(流石にこれはちょっと困る・・・)

SDLの初期化がOpenGLを使うフラグを建てたときだけ遅くなったり
MetasequoiaもOpenGL切り替えだけが偉い遅かったりするので
やっぱりこれってOpenGLを使う場合の問題なんではないか、と認識してます。

これの対策で考えられるのってどんなのがありそうですか?
もしや皆我慢して使っている?それともうちの環境だけなのかな?



668 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 16:08:13 ]
・どのよびだしが遅いのか
・どの環境でも遅いのか
を調べる気概が欲しい

669 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 23:00:38 ]
>>668
SDLですが

SDL_SetVideoMode(xResolution, yResolution, bitsPerPixel, SDL_OPENGL);

この関数が遅いところまでは分かってます。ここで固まるようです

670 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 00:17:36 ]
GPUが対応してないとかいうオチ?

671 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 10:47:37 ]
ウインドウ内ではなく画面内の自由な場所に対して描画がしたく、現在はアプリケーションのウインドウの後ろとなる部分をキャプチャしたものを背景画像として使うことで擬似的に再現しています。
しかし現在の方法ではPBOに転送した背景画像を毎フレームDrawPixelsで描画しているので、内容の割には無駄に負荷が高くなってしまいます。
何かもっと画期的な方法は存在するのでしょうか。よろしくお願いします。

672 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 12:49:00 ]
アルファ付でオフスクリーンでレンダリングしたものを、レイヤードウィンドウに描画すればいいよ。
そんでもってPBOは使うな。

673 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 13:08:53 ]
>>672
即レスありがとうございます。
レイヤードウインドウ試してみます。

674 名前:デフォルトの名無しさん [2009/05/06(水) 18:19:59 ]
OpenGL ESのいい参考書や参考になる定番サイトってないですか?

675 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 08:23:02 ]
メモ
Quaternion C++ class
www.programmersheaven.com/download/17059/download.aspx

676 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 21:05:21 ]
OpenGLプログラミングガイドの3.0対応版はいつ頃でるかなあ。

677 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 22:14:39 ]
>>671ですが、レイヤードウインドウを用いて、それに対してオフスクリーンレンダリングの結果を描画することでスクリーンにダイレクトに描画することができました。
y座標を逆にして考える必要がありますが、テクスチャの読み込みや、最終的なレンダリング結果の画像出力の際に画像の上下反転を省くことができますね。
Vista T7500 2.2GHz 8600M GT、オフスクリーンレンダリング解像度256x256において、上限反転の有無でCPU使用率には15%ほどの差がありました。



678 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 00:19:29 ]
openGLESでmqoを自前で読み込んで描画しているのですが

glDrawElementsで一括描画すると
頂点をインデックスで指定するので
1頂点=1UV座標となってしまいます、

同じ頂点で、違うUV指定のたくさんのポリゴンを描画するには、
glDrawArraysを複数回呼ぶしか無いのですか?

679 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 00:27:26 ]
>>678
>>656-657

680 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 00:39:31 ]
>>679
ありがとうございます。

forで、indexを何度も参照するぐらいだったら
高速化のために最初から
インデックスの数だけDirectXで言うTLVERTEXみたいなものを作るべきなのかもですね


681 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 18:32:46 ]
FBOでデプスアタッチメントをDepthComponent32にするとデプスバッファは1ピクセルあたり32ビットになりますよね?
しかし、後でUnsignedByteで内容を配列に取得してみると256x256の解像度なのにも関わらず、65535までしかデータが埋まりません。
カラーバッファはUnsignedByteでもRGBA32ビット取得されますが、デプスバッファはUnsignedByteだと8ビット分しか取得されないのでしょうか。
また、UnsignedIntで取得してみると今度は262144まで、つまり32ビット分埋まりますが、内容を見てみると4バイトのうち2バイトは同じ値で残り2バイトは妙な値になっています。
これはつまりUnsignedByteで取得すると大体の深度値が返されるということなんでしょうか。

682 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 02:19:36 ]
>>669
ピクセルフォーマットの設定値とグラボの相性でそうなる場合がある。
アルファブレンド使う場合でも24bitにしとくと上手く動いたりする。

683 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 20:49:31 ]
32bitの深度値を指定しても内部では24bitってこともあるだろうしね
あとUNSIGNED_BYTEとかの指定はコンポーネント毎に何ビットか
RGBA8に対してUNSIGNED_BYTEなら1ピクセル4コンポーネントで32bitになるが
DEPTH_COMPONENTに対してUNSIGNED_BYTEなら1ピクセル1コンポーネントで8bitになってしまう
精度良く深度を扱いたいならDEPTH_COMPONENT32Fなんかの浮動小数点深度バッファを使うのがいいんじゃなかろうか

684 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:47:42 ]
>>682-683
返事が遅くなりまして申し訳ありません。お返事ありがとうございます。
UnsignedIntで取得すると1ピクセル1コンポーネントでもIntが32bitであるため、しっかり262143まで埋まったんですかね。
で、4バイトのうち3バイトが深度値を表していて、残り1バイトは実際には24ビットで処理されているためにとりあえず3バイト目と同じ値で埋まっていると。
勝手にこういう解釈しましたが、間違いがありましたらご指摘よろしくお願いします。

685 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 01:14:09 ]
>>684
何らかのアドバイスしたいけど、
正直グラボに依存する問題のような気がしてならないです。
テストツールとかをうpしてくださればうちの幾つかの環境で試してみますよ。

686 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 22:52:13 ]
>>685
ありがとうございます。テスト用のファイルアップしました。
senduit.com/c88099
Display関数の最後にあるReadPixelsでデプスバッファの内容を取得しています。
OSはVistaでGPUは8600M GTで、ForceWareは185.85です。この環境ではバイト配列を渡してUnsignedIntで取得すると1バイト目と4バイト目が一緒の値になります。

687 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 23:34:14 ]
>>686
あ、うん。
VC#使ってないので、せめてバイナリでテストできるもの頼むよ。



688 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 00:09:55 ]
>>687
senduit.com/0e0c03
かなり適当に作ったので取得押してからが少し時間かかります。
取得を押すと128x128の解像度で描画した結果のデプスバッファの内容を取得します。
動かなかったりしたら申し訳ありません。その際は一人で頑張りますw

689 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 00:48:11 ]
>>688
テキストファイルに貼り付けておきました。
テスト環境はVista32, GeForce7400Goです。
senduit.com/8ffae7

Intelのオンボードでも試してみたかったけど、
FBO非対応だったのですみません。

690 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 23:45:49 ]
>>689
実験ありがたいのですが、文字化けしちゃってますね。
機会があれば再度別のところにでもあげてもらえれば幸いです。すみません。

691 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 00:06:20 ]
図々しい

692 名前:デフォルトの名無しさん [2009/05/13(水) 02:04:26 ]
馬が一番小回りが利くからね。

693 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 02:27:18 ]
>>690
なぜ文字化けしたんだろうか
www.dotup.org/uploda/www.dotup.org23789.zip.html

694 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 02:50:13 ]
まともな開発環境も持っていないのに必死にならんでいいよ

695 名前:デフォルトの名無しさん mailto:sage [2009/05/14(木) 00:05:13 ]
>>693
実験ありがとうございました。Go 7400でも実際には24bitのようですね。

696 名前:デフォルトの名無しさん mailto:sage [2009/05/14(木) 00:21:18 ]
ttp://developer.nvidia.com/object/nv_ogl_texture_formats.html
NVIDIAの全部のGPUで32bit Depthを指定しても24bitになるね






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<199KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef