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/
116 名前:デフォルトの名無しさん [2008/10/29(水) 18:53:19 ] シェーダーってのが何なのか簡潔に教えてください>< 調べてみたんですが、サンプルから入っていくのでよく分からない。 シェーダーを使うことによって得られる利点ってのは何なんですか? CPUを使わないでGPUで演算?わけわかからん
117 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 19:06:02 ] この連載を最初から順番に読めば分かる ttp://journal.mycom.co.jp/column/graphics/001/index.html
118 名前:デフォルトの名無しさん [2008/10/29(水) 19:08:26 ] >>117 ありがとう。記事にバーチャ載ってて少しテンション上がった。
119 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 19:35:49 ] あまりに正直な感想でちょっと笑ってしまった でもまぁ大抵そういうところから入っていくんだよね
120 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:18:16 ] 普段は調子こいて「今シェーダーが熱い!」 とかいってるけど本当はよくわかってない俺にちょうどいい記事があるときいて
121 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 00:11:30 ] >>115 ようやくかよw まだあきらめてなかったんだな
122 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 10:28:30 ] >>117 すばらしいまとめ。最初は歴史だけだったが、 後半から3Dのシェーダーがらみのパイプラインの詳しい解説。 ちと長いがw
123 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 10:33:13 ] >>117 >>116 じゃないけど、>>117 を一通り読んだ俺にオススメのシェーダー本を教えてください
124 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 10:49:49 ] 個人的にはシェーダに関してはネットがあれば本を買う必要は全く感じないな 強いて言えば赤本でGLSLの解説が日本語で読める位か
125 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 12:55:47 ] red book
126 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 06:53:08 ] 赤本は最近のだとシェーダーの説明してるの? スゲーな… オレンジ本って言うの? OpenGL Shading Language 英語だし、内容が古いけど、これが一番詳しい気がする 後、More OpenGL Game Programmingは持って無いが気になる
127 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 09:28:39 ] >>124-126 ありがとう 本が好きなんですw 過去スレ除いたら同じような質問が出てたので、それも参考にできました。 テンプレに入れといていい気がする。 赤本の英語版がPDFで読める?という情報も過去レスにあったのですが、 見つからない・・・ ■書籍 ・赤本(OpenGL1.5と2.0を網羅。シェーダーに関しても少し載っている) Amazon.co.jp: OpenGLプログラミングガイド 原著第5版: OpenGL策定委員会, 松田 晃一: 本 www.amazon.co.jp/dp/4894717239 images-jp.amazon.com/images/P/4894717239.09.MZZZZZZZZZ.jpg ・古い赤本が無料で読める(英語) www.opengl.org/documentation/red_book/ (1.1) www.glprogramming.com/red/ (1.1) ・オレンジ本(シェーダー、GLSLに関して。英語。少しふるい) Amazon.co.jp: Open Gl Shading Language: Marc Olano, Randi J. Rost, John M. Kessenich, Barthold Lichtenbelt: 洋書 www.amazon.co.jp/dp/0321197895 images-jp.amazon.com/images/P/0321197895.09.MZZZZZZZZZ.jpg ・Cgの本(Cgを使ったシェーダー入門本) Amazon.co.jp: 3D‐CGプログラマーのためのリアルタイムシェーダー 理論と実践―「古典的ライティング・モデル」から「グローバル・イルミネーション」まで (I・O BOOKS): 金谷 一朗: 本 www.amazon.co.jp/dp/4777510875 images-jp.amazon.com/images/P/4777510875.09.MZZZZZZZZZ.jpg
128 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 09:30:46 ] > 個人的にはシェーダに関してはネットがあれば本を買う必要は全く感じないな 具体的にはどの辺をよめばいいんでしょうか? 仕様書?
129 名前:デフォルトの名無しさん [2008/10/31(金) 21:59:21 ] OpenGLのプログラミングをこれからはじめようとしている初心者です(・・;) 質問があります。 WindowsVistaに対応しているGLUTは存在しないのでしょうか? また,GLUTが使えない場合は,Win32を使ってプログラムするのが無難でしょうか? よろしくお願いします。
130 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 22:32:38 ] >>128 おいらはOpenGLで調べたいことがあったら、まずは仕様書読むようにしている。 仕様書読んでもよくわからんかったらググるか、それもでもわからんだらここで聞けばいいんでない。 >>129 まずはお手元のglutがvistaで動くか試す。 それが駄目ならfreeglut使うとかglfw, gluxとか使ってみてはどうだろうか。 Win32apiの勉強もしたいのなら、glut系のラブライブラリを使わずにやればいいけど 結構大変だと思う。
131 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 23:53:27 ] おいらはOpenGLで調べたいことがあったら、まずはここで聞くようにしている。 ここで聞いてもよくわからんかったらググるか、それもでもわからんだら仕様書読めばいいんでない。
132 名前:デフォルトの名無しさん [2008/10/31(金) 23:58:50 ] 最低の人間ですね
133 名前:デフォルトの名無しさん [2008/11/01(土) 00:46:26 ] >>130 ありがとうございます。m(_ _)m やはり、公式にvistaまで対応しているglutは、ないんですかね。 windowsXPまで対応しているglutが動くか試してみます。
134 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 16:32:41 ] 俺はGLUT使ってないけど、SDLとかglfw使ったプログラムもVistaで問題無く動いてるよ 多分GLUTも動くはず
135 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 03:58:37 ] 赤本のためにglutが書かれる ↓ glutがメンテされなくなったので openglut, freeglut開始 ↓ glut互換なapiでは物足りないのでglfw開始 ↓ glut系がほとんどメンテされてないのでglux開始←今ここ ↓ ??
136 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:14:30 ] 約2年放置されてんじゃん ttp://www-sop.inria.fr/reves/Sylvain.Lefebvre/glux/ ・・・と思ったらこっち?Ogreの人らが作ってるのか ttp://code.google.com/p/glux/
137 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:56:12 ] OpenGL で Fetch4 使えたんで日記投下・・・と思ったけど日記にもならないほど簡単だった。 単に GLSL で vec4 texture4( sampler2D, vec2 ) を使うだけ。 左下基準で r g a b の順番で4つ読んでくれる。 internalformat は DEPTH かつ FLOAT である必要はなくて、ALPHA4 とか1要素ものはなんでもおkだった。 3850、4850で動作確認。GPUSAによると2xxx以下じゃ動かないらしい。 GL_AMD_texture_texture4のドキュメントが出ないとわからないけど、ひょっとしたら2xxx以下は DirectXみたいにglTexParameteri辺りで設定するとtexture2Dでいけるようになったりするのかもしれない。 2要素以上の internalformat に無理やり使うと一応テクスチャから読んではくれる。 但し読んでくれるのは1つだけで、テクスチャの内容を xy [ z [ w ] ]、vec4 を rgba であらわすと ・2要素 g = b = x r = a = y ・3要素 r = y g = z b = x a = 1 ・4要素 r = y g = z b = x a = w ま、意味はないなw
138 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:42:13 ] GLの色の丸め方について質問です。 浮動小数点値で色を指定してmビット深度のバッファにレンダリングする場合、 その丸め方について定式化された方法はあるのでしょうか。 灰色(L=0.5)を出そうとするとき、8bitバッファでは127/255になるか128/255になるかは決まっているのでしょうか。 ttp://www.opengl.org/registry/doc/glspec21.20061201.pdf 2.14.9 Final Color Processing
139 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:24:49 ] そこを見る限りでは決まってはなさげ 大抵は切り捨てで127/255になりそうな気はするが どうしても一致させたいなら整数テクスチャとか使った方がいいかもな
140 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 10:38:59 ] ありがとうございます。 ATIだけ微妙な動作をしたので、 差を吸収するためにCPU側で整数化することにしました。
141 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:53:57 ] VBで使ってみようと思ったら滅茶簡単でワロタ
142 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:51:15 ] glut以外に、glutSolidCubeのような 物体を関数化してくれているライブラリとかありませんか?
143 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 13:33:54 ] glDrawPixels() APIを使用して画像データを転送するとき、 次のような画像データを直接送ることができるのでしょうか? RRRRR.... ........................ GGGGG.... ........................ BBBBB.... ........................
144 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 18:28:26 ] 画面じゃなく、テクスチャに描画して 保存したいのですが、何かよいサンプルとかありますか?
145 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 19:35:32 ] 画面じゃないところに描画したりする方法まとめ ・PFD_DRAW_TO_BITMAP ・glReadPixels ・pbuffer拡張 ・FBO(Frame Buffer Object)拡張 他にある?
146 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 20:03:42 ] PBO
147 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 21:19:41 ] ・PFD_DRAW_TO_BITMAP ・glReadPixels ・glCopyTex[Sub]Image2D ・pbuffer拡張 ・render texture拡張 ・FBO(Frame Buffer Object)拡張 ・PBO(Pixel Buffer Object)拡張
148 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 22:24:43 ] たくさん出てきて涙目
149 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 22:33:24 ] 決定打はないのかよw
150 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 00:37:01 ] 決定打ねぇ。 PFD_DRAW_TO_BITMAPはWindowsべったりな上にアクセラレーション効かないし、 glReadPixelsはシステムメモリへの転送でCPU喰うしレンダリングパイプライン止まるし、 glCopyTex[Sub]Image2Dもパイプライン止まるしFBからテクスチャへの転送は大抵変換が必要で遅いし、 pbufferは多少古いIntelオンボも対応してるおかげで使える環境は多いけどコンテキスト切り替えとか不便&コスト高いし、 render textureは単にpbufferからテクスチャにコピーせずに済むだけだし、 FBOは比較的最近の環境を仮定するなら決定打だろうけど未だにノートPCだと使えない場合が多いし、 PBOは単にコピーのお手伝い拡張だし。 まぁ、選ぶならFBOだな。
151 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 00:52:40 ] 概要サンクス
152 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:58:50 ] glutで「3Dオブジェクトを2Dとして変形」したいんですが方法あるでしょうか? たとえばこんな例。 ・オブジェクトは空き缶 ・まずは空き缶を3Dオブジェクトとして回転量(Rotated)や視点(LookAt)を指定して 見え方を決める。この結果空き缶を真上から見た絵になったとする ・次にこの「真上から見た空き缶の絵」を「2D一枚絵として」 回転・拡大縮小したい
153 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:13:13 ] 描画結果をテクスチャにして描画
154 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:47:21 ] 回転はカメラのロールで、拡縮はglViewportで
155 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:07:19 ] 初心者です。セレクションモードに切り替えると座標系がズレて変になってしまうのですが、 自分の理解が足りなくて変な座標変換を間に挟んでいるのだと思います。 セレクションモードとレンダモードの切り替えにおける内部の動作を流れ図で教えてもらえませんか。
156 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 12:36:22 ] >>155 内部動作とかよくしらんけど、関数呼び出し順序は、 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPickMatrix(...); gluPerspective(...); or glOrtho(...); とかしとけば、セレクションうまくいくと思うよ。 はずしてたらすまん。
157 名前:名無し [2008/11/13(木) 13:51:45 ] 質問がございます。 1辺の長さが10の箱の中に直径がBの球(中心座標:x,y,z)がM個存在するとします。 3次元上で考え、箱の端では周期境界条件を採用しています。 球の中心の座標は箱内でS回の移動を繰り返すとします。 例えば球の中心の座標は次のように変化します。 座標はファイルQにまとめて書いてあるとします。 ※(S+1)個のブロックが存在。(スペースで区切り)1個のブロックにM個のxyz座標が存在。 <ファイルQ> 1 2 3 2 3 4 ・ ・ ・ 1 3 4 1 9 5 ・ ・ ・ ・ ・ ・ 球が箱からはみ出ると周期境界条件によって、はみ出た部分だけ反対側から出てくるとします。 このようなM個の球のS回の移動の様子をOpenGLで表示することは可能でしょうか? (表示するもの:球、箱) 可能ならばその方法について教えてもらえませんか? (ファイルQの読み込み方法、球の直径もしくは半径の指定方法、周期境界条件を考慮した球の表示方法など) ちなみにプログラムの記述言語はできればFortran77を使用したいと考えています。
158 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 14:38:55 ] > はみ出た部分だけ反対側から出てくるとします。 この部分だけがGL的に面白い部分なので、 まずはただの球に衝突判定をつけて作ってみなさい。
159 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 14:50:10 ] あとOpenGLはCで定義されていたはずだが、 Fortranだとマングリングを合わせればCの関数も呼べたと思う まあ調べてみて
160 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 15:20:29 ] これは凄い。 一見すると親切かつ丁寧な風に見えて、その実は回答の先送り投げっぱなしジャーマン。 宿題丸投げに対するパーフェクトな回答の見本だな。 久しぶりに職人の仕事を見た。
161 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:41:16 ] 危ねぇ…俺もシンセツダナーとか思いそうだった
162 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 23:38:04 ] ワロタww
163 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 23:56:03 ] 3次元ベクトルの正規化をするような関数とかあります? DXならD3DXVEC3DNORMALIZEとかいうのです
164 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 01:19:10 ] ないから自分で書け
165 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 01:19:16 ] ないので自分で作ってください
166 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 01:22:51 ] 質問するより自分で書いた方が早い
167 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 01:24:13 ] d3dxのをそのまま使えばいい
168 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 03:10:09 ] void DXならD3DXVEC3DNORMALIZEとかいうのです( vector3* vec ) { float scalar = sqrt( vec->x * vec->x + vec->y * vec->y + vec->z * vec->z ); if( scalar == 0.0 ) return; vec->x /= scalar; vec->y /= scalar; vec->z /= scalar; }
169 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 08:46:24 ] OpenGL使うのにD3DX使うのもなあ まあ、俺も音鳴らすのにDirectSoundとか使ってるがw マジレスすると、言語用に大抵、geometry関係のライブラリがフリーのがあるから それを探してみたらどうかな?
170 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 12:46:07 ] 探すくらいなら自分で作ったほうがいいと思う派だが、あえて探すなら 信頼性の高い高速なgeometry関係のフリーのライブラリ = D3DX
171 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 13:02:48 ] GLM(OpenGL Mathematics)とかいいんじゃない?
172 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 13:11:51 ] NASMで実装します
173 名前:172 mailto:sage [2008/11/15(土) 17:30:06 ] 1677万回呼んでも差は0.7秒程度でした 確かに大体3分の1程度にはなりましたけど 骨折りですね global fun section .text fun: mov eax, [esp+4] mov ebx, [esp+8] movups xmm0, [ebx] movaps xmm2, xmm0 mulps xmm0, xmm0 movaps xmm1, xmm0 shufps xmm0, xmm1, 0x4e addps xmm0, xmm1 movaps xmm1, xmm0 shufps xmm1, xmm1, 0x11 addps xmm0, xmm1 rsqrtps xmm0, xmm0 mulps xmm2, xmm0 movups [eax], xmm2 ret
174 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 18:13:02 ] SSE化で1/3縮んだのなら成功の部類じゃないか そのコードだとむしろ遅くなりそうなものだけど・・・
175 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 18:40:20 ] >そのコードだとむしろ遅くなりそうなものだけど・・・ そうなんすか? とりあえず改良できると所あれば指摘してくださいな
176 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 18:54:28 ] データのアラインメントを変えてmovupsを消す(可能なら4要素にする) intrinsic関数で組んでインライン展開できるようにする ループごと取り込んで関数呼び出しを消す 新しいSSE命令を使う(haddps/dpps) 特に関数呼び出しを消すのが重要。
177 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 19:49:49 ] >>176 解答ありがとうございます イントリンシック!そういうのもあるんですな 慣れないアセンブリより楽かも… SSE3命令はCPUが対応してないから試せそうにありません オンボロCPU乙ですねハハハ
178 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 16:21:32 ] すごく初歩的な質問と思われるかもしれませんが 行列スタックでレンダリングしたものを どのようにしたら色をつけることができますか? glClearでは線に色が付くだけなってしまいます
179 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 16:46:53 ] 日本語でおk glClearは画面消去だぞ glClearじゃなくてglColor4fとかでは?
180 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 17:36:47 ] >>179 うはぁ、ミスった glClearじゃなくてglColor3fでした
181 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 18:14:33 ] 質問の意味がまったくわからないので勝手に妄想 色がついていないのではなく、表示されていないのだろう PROJECTIONマトリックスが不適切で線に見える部分意外はクリッピングされているのでは near/farの設定、MODELVIEWとのへの切り替え部分のチェック
182 名前:デフォルトの名無しさん [2008/11/16(日) 21:11:52 ] はじめまして、質問させていただきます。 glGenTexturesでテクスチャを2個作って、 二つのテクスチャを画面に表示しようとしたのですが、 最初に表示したテクスチャが消えてしまいますorz OpenGLで二つのテクスチャを一度に表示することは可能なのでしょうか? もしくは、方法を教えていただけないでしょうか。
183 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 21:12:21 ] 基本立体を塗りつぶしたいんです 本やサイト読んでもイマイチ分からなくて 日本語下手ですみません
184 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 21:26:25 ] >>182 glBindTextureの第二引数
185 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 21:34:43 ] >>183 glColor まずはlightingをしないで射影変換の正しさを確認して、光源を作るならそのあと
186 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 22:05:11 ] >>184 ありがとうございます。 一応、glBindTextureの第2引数に別々のテクスチャ名を与えてるのですが、 それでも消えてしまいますorz どうやら表示するときに消えてるのではなく、 2個目をBindしたときに消えてしまってるみたいです。 (glBindTextureを呼ぶだけで1個目のテクスチャが消えました)
187 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 23:14:22 ] >>186 カプセル化してかなり忘れてたが、見直してみたら glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, ...); glBegin(...); glEnd(); glDisable(GL_TEXTURE_2D); を逐一繰り返す構造になってた glPushAttrib, glPopAttrib のテクスチャ関係も参考に もし関数化してたら、一度関数化してないmainのみのストレートフォワードなテストコードを書くといいかも カプセル化しない状態で人力コーディングするとスタックの積み下ろしを忘れてることがよくあるから
188 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 00:07:07 ] >>187 ありがとうございます。 自己解決できました OpenGLをはじめてほとんど時間が立ってないにもかかわらず、 カプセル化に挑戦したところ行き詰っていました。 原因に関してですが、 ぶっちゃけて簡単に言うと、 glBindTextureでテクスチャを切り替えた際に、 いくつかの設定が初期化されてしまうのと、 モードによって複数のテクスチャを同時に使えなくなってしまうことが原因でした。
189 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 09:00:14 ] >>183 それだと線にしか色が付かないですよ 書く位置が悪いんですかね?
190 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 10:07:49 ] glPolygonMode GL_QUADS
191 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 11:30:17 ] 日本語が下手ならコードを晒せ
192 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 13:38:13 ] ttp://sky.geocities.jp/freakish_osprey/opengl/opengl_wireframe.htm
193 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:36:33 ] ブラウザ上でOpenglを動かす方法教えれ
194 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:51:31 ] プラグインを自分で書く これしかない
195 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 20:17:55 ] >>193 Unity3d
196 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 15:56:33 ] VRAMの使用状況を取得するAPIは無いのでしょうか?
197 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 00:23:11 ] 無いよ 見るだけならNVPerfKit入れたりとかして見ることはできる ATIなら普通にドライバ入れた時点でパフォーマンスカウンタ見れるのかな? そうでなくどの環境でもプログラムから残り容量取るって話なら大分難しいと思う
198 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 12:28:44 ] GL_ATI_meminfo は仕様が公開されていないの?
199 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 12:49:36 ] 俺もglATI.hを読んで見たが壮絶に意味不だった…
200 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 18:25:03 ] DirectXならVRAM使用量見れるのにねー
201 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 23:53:55 ] VRAMみたいな特定のハードに依存したインターフェースはおかしいだろ、GL的に考えて…
202 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 03:41:20 ] >>200 IDirect3DDevice9::GetAvailableTextureMem ? これは、VRAMじゃなくテクスチャに使える容量だお
203 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 15:10:06 ] glTexImage2D で作ったテクスチャに 直接アクセスしたいのですが、どうしたらいいでしょうか?
204 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:27:22 ] >>202 DirectDraw::getAvailableTotalMemのことじゃね?
205 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 13:12:20 ] >>203 テクスチャの中身ってこと? それは無理なので書き換えるにはglTexSubImage2Dを呼んで下さい 読み出すならglGetTexImage PixelBufferObjectを使えば比較的高速にやりとりできるはず >>204 DirectDrawってVistaとかでもちゃんとそれ使えるのか? Direct3DでエミュレーションとかになっててAvailableTextreMemと同じような気がする
206 名前:デフォルトの名無しさん [2008/11/21(金) 14:09:22 ] openglで描画した画像を、見え方はそのままで描画される角度のみを変更したいのですが、どうしたらよいでしょうか? glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 0.001f, 150.0f); gluLookAt(a1,a2,a3,b1,b2,b3,c1,c2,c3); を、 d1=b1-a1 d2=b2-a2 d3=c3-a3 として glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 0.001f, 150.0f); glTranslatef(a1,a2,a3); glRotatef(30,d1,d2,d3); glTranslatef(-a1,-a2,-a3); gluLookAt(a1,a2,a3,b1,b2,b3,c1,c2,c3); と変更しました。 本来はc1、c2、c3を変更するところなのですが、 視点の位置、注視点の位置、視野の上方向が毎回変わるので、 できればそれらの設定によらず画像だけの回転を行いたいと思っています。
207 名前:206 mailto:sage [2008/11/21(金) 14:12:47 ] 失礼しました、206の glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 0.001f, 150.0f); glTranslatef(a1,a2,a3); glRotatef(30,d1,d2,d3); glTranslatef(-a1,-a2,-a3); gluLookAt(a1,a2,a3,b1,b2,b3,c1,c2,c3); のように変更したところ、ちんちくりんな軸を中心に回転しているようで、 確認したい目標のオブジェクトの形まで変わってしまいます。 上記でまずいところがありましたらご指摘をお願いします。
208 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 14:34:38 ] glOrthoの直後にgluLookAtを持ってくる これじゃだめかな?
209 名前:206 mailto:sage [2008/11/21(金) 14:41:37 ] >>208 ( д ) ゜ ゜ うわぉ ありがとうございます 行列の順番を勘違いしてました 本当にありがとうございます
210 名前:デフォルトの名無しさん [2008/11/22(土) 01:38:06 ] 任意の座標(例えば重心)をとおる軸を中心として回転させるにはどうやればいいですか。 重心座標が(3,4,5)としたらx=3を中心としてy軸周りに回転させるようにとか
211 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 01:43:36 ] x方向に-3だけ平行移動して、原点中心の回転をして、x方向に+3だけ平行移動する、ってのはどう?
212 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 01:50:39 ] 回転軸を頻繁に変えるというのでなければ、 メインメモリ側に構造体を保持しておいて、 必要に応じてCPUで平行移動させてからディスプレイリストを作るのもよい
213 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 06:45:30 ] 9600GT+WGL_ARB_multisampleを使ってアンチエイリアシングをやってて glDisable(GL_MULTISAMPLE)で一時的に無効にしようとしてもなぜか効かないんだけど原因わかる人いる? 同じことをD3D9でやったらちゃんと期待通りに動くから ハードウェアの仕様じゃないみたいだけどよくわからん
214 名前:213 mailto:sage [2008/11/22(土) 08:20:37 ] 自己解決? x8以下だとちゃんと機能してx16,x32だと効かないぽい 意味不
215 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 12:24:06 ] MSAAx32とか設定できんのか? それはともかく単なるドライバのバグではないかと 暇があったらNVIDIAに文句言ってやるといいかもしれない
216 名前:デフォルトの名無しさん [2008/11/23(日) 11:24:39 ] >>211 ,212 どうもありがとうございました。
217 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:54:26 ] 複数枚の画像を合成したいと思っています。 例えばプリクラで顔写真の周りをハート型で縁取ったりしていますが、 ああいう感じである画像の上に透過pngを表示したいということです。 最終的には画像の上にフリーハンドで線を引けるようにして、 教科書の上に落書きするみたいな機能を実装しようと思っています。 テクスチャの上で2枚合成すればいけるだろうと思って、 透過pngと普通の画像と2枚用意してプログラムを組んでみたのですが、 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData2); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData); ← 透過png としているのですが、spriteDataのみが表示されてspriteData2は完全に上書きされてしまいます。 これはspriteDataのデータがきちんと透過データとして読み込めていないのでしょうか? そもそもやり方が間違っているのでしょうか? もしやり方が間違っている場合、本来どういう方法で実装すべきなのか、 ググるキーワード位でもいいので教えていただけると幸いです。
218 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:01:58 ] つ マルチテクスチャ、glActiveTexture でもこの場合、テクスチャ切り替えて2回描画すればおkな気もする
219 名前:217 mailto:sage [2008/11/26(水) 13:47:16 ] >>218 教えてくださってありがとうございます。 調べてみます(・∀・)
220 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 12:55:35 ] pixel to pixelの合成だから、実時間で変動させたり市内なら アルファ値つき重ね合わせくらいはCPU側で実装するのも手だな
221 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 22:30:59 ] >217 まだテクスチャの基本的な使い方からわかってないみたいだから 床井先生のサイトを見てみるといいと思う
222 名前:デフォルトの名無しさん [2008/11/30(日) 11:10:48 ] 超初心者です 床井先生のサイトが落ちてるので。。。 上のサンプル使わせていただくと glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData2); この3引数”GL_RGBA”internalFormatとtypeで何が違うんでしょう bmpをOpenCVで読み込んだとき読み込んだファイルの形式がtypeなのはわかるのですが internalFormatって何奴でしょう。ここが間違えていると画面が真っ白で表示されない…理由を知りたいのです。 馬鹿な質問なのは重々承知しております、 解説webとか知っていたら教えてください。
223 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 11:23:46 ] formatとtypeはメモリの中に画像がどのように格納されてるか internalformatはそれを元にどんなテクスチャを作るか を指定するんだよー。
224 名前:デフォルトの名無しさん [2008/12/01(月) 11:05:05 ] 画面に三角形や四角形を書いてライトを当てているのですが、 glScaleで拡大すると暗くなって、glScaleで縮小すると明るくなります。 法線ベクトルも頂点ベクトルと共に拡大縮小されるのなら、まだわかるのですが、 法線ベクトルだけ逆になっているようでよくわかりません。 これはOpenGLの仕様ということなのでしょうか?
225 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 13:59:06 ] そーです 例えば物体をX方向だけに2倍拡大するとき、法線も同じようにX方向に2倍拡大したら、向きが変になるでしょう まぁ何も考えず glEnable(GL_NORMALIZE) しておけばわりと幸せ
226 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 14:00:38 ] つ glEnable(GL_NORMALIZE); 逆になるのは、たとえば平面をY軸に縮小すると頂点は小さくなるけど、法線ベクトルは起つため 法線は転地逆行列変換(かも)
227 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 14:04:49 ] >>224 仕様です。 法線ベクトルはモデルビューの逆行列が掛けられます。 仕様書のNormal Transformationのとこに書いてあります。
228 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 20:34:28 ] >>225 >>226 >>227 ありがとうございます。 よく考え直したらその通りでしたね。仕様もわかりました。
229 名前:デフォルトの名無しさん [2008/12/02(火) 05:05:36 ] >>223 ありがとうございます。 するとinternalformatはglutInitDisplayMode(GLUT_RGB); で指定した値に矛盾してはいけないという理解でよろしいでしょうか 他に制限事項とかございましたら、ご教授してくださいませ
230 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 09:43:08 ] ディスプレイモードとテクスチャフォーマットは何の関係もない
231 名前:デフォルトの名無しさん [2008/12/02(火) 21:27:06 ] "OpenGL 2.0 専用スレ"にも書いたんだが、 OpenGLnのmain関数をスレッドで呼び出して使おうと思っているのだが、display()関数のオブジェクトカラーを引数で渡した値で更新したいんだ。 マルチスレッドで値を渡すことはできるのだが、OpenGL側でどうやって、display()関数に値を綿したらいいのかわらかない。 つまり、 プログラム1 --> OpenGLプログラム(スレッドで生成) ▼ ▼ 値の更新 色変更 ▼ ▼ 値の更新 色変更 … … ってことをしたいんだ。 ↑ これはできないのか?
232 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 21:30:15 ] 意味が分からん グローバル変数使えばいいんじゃね
233 名前:デフォルトの名無しさん [2008/12/02(火) 21:53:32 ] >232 使いたくないんだよ。
234 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 22:40:46 ] openGL関係なしに排他制御してスレッド間で変数共有できてるなら、それを使えばいいんじゃない display()ってGLUTの話?
235 名前:デフォルトの名無しさん [2008/12/02(火) 23:06:09 ] >234 スレッドには、ポインタを引数として渡してる。 それじゃ具合悪い? >display()・・・のくだり え?GLUT?おれが使ってるのってOpenGLじゃなかったのか。。。 確かに、ヘッダで、glut.hってのを読み込んでるが、OpenGLとばかり思ってた。
236 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 23:31:20 ] >>235 GLUTはあくまでglを気軽に使うためのユーティリティだから…… gl関係なくただのスレッド間データ受け渡しの問題だし、 むしろスレッドを管理するAPIについてのスレで聞いた方が良いのではないかな。
237 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 23:41:52 ] glutSetWindowDataとglutGetWindowDataをお探しか? freeglutやOpenGLUTになるけど。
238 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 23:49:31 ] boost::bindでインスタンスとメソッドを一緒にして glutDisplayFunc()に渡してやったらダメかな
239 名前:デフォルトの名無しさん [2008/12/03(水) 03:18:45 ] >236 >237 >238 知らない言葉が多すぎるから答えようがないけど、 あがったキーワードをググってみる。
240 名前:デフォルトの名無しさん [2008/12/03(水) 06:09:36 ] >236 >237 >238 239です。 とりあえず、pthread_createの引数で渡したポインタを glut( ) -> init( ) を経由して、 glutでスコープできる変数に渡す で、やりたいことができました。 参考になったサンプルに出会うときに、キーワードが役立ちました。ども。
241 名前:217 mailto:sage [2008/12/05(金) 17:27:21 ] 前回質問して教えていただいた後、マルチテクスチャは大まかに理解して、2つのテクスチャを貼り付けることに成功しました。 次に線を引いてみようと思って、テクスチャを2枚表示したサンプルに付け加えて以下のソースを書いたのですが、 線のみが表示されてテクスチャが画面に出なくなってしまいました。 glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); glClear(GL_COLOR_BUFFER_BIT); glBindTexture(GL_TEXTURE_2D, texname[0]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //テクスチャ0表示 glBindTexture(GL_TEXTURE_2D, texname[1]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //テクスチャ1表示 // 以下を追記 したら線しか出なくなった GLfloat vertex[20]; for(int i = 0; i < 10; i++){ vertex[2 * i] = 0.1 * i; vertex[2 * i + 1] = 0.1 * i; } glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2 , GL_FLOAT , 0 , vertex); glDrawArrays(GL_LINE_STRIP, 0, 10); glFlush(); やりたいのは画像に落書きする機能の実装なので、 画像の前に線が引ければよく、画像自体に書き込む必要はないのですが、(とはいっても最終的にその結果を保存したいのですが) この場合は直接画面に線を引くのではなく、テクスチャにレンダリングしてから表示しないといけないのでしょうか? それとも何かが欠けているだけでこのまま直接描画できるのでしょうか? 質問ばっかりですみませんが、教えていただけると幸いです。 使っているのはOpenGL ES ver1.1です。
242 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 17:44:07 ] ・デプスバッファをクリアしてないので2度目以降の描画でデプステストが失敗して表示されない ・線分描画で頂点配列を変更したあとそのまま三角形を書こうとしてしている
243 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 20:29:07 ] すみません、質問っす テクスチャを貼ったトライアングルでフェードイン表示みたいなことをしたいばあい、どの機能を使えばいいでしょうか?
244 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 20:31:18 ] アルファブレンド使え 頂点カラーかマテリアルのアルファ要素で何とかなったはずだ
245 名前:241 mailto:sage [2008/12/05(金) 23:37:16 ] >>242 どうもありがとうございます。 ググってみたところ、一つ目の内容については内容は分かりました。 方法としては、描画と描画の間に glClear(GL_DEPTH_BUFFER_BIT); を挟めばいいんですよね? ただ、二つ目の点についてはよくわかりませんでした。 ttp://wisdom.sakura.ne.jp/system/opengl/gl9.html 等、頂点配列を変更したあとそのまま描画しているように見えるのですが・・・ 飲み込みが悪くてすみません。もう少し教えていただけないでしょうか。
246 名前:242じゃないけど mailto:sage [2008/12/06(土) 00:09:06 ] (二点目について) 線分を描画する直前に、glVertexPointerで頂点配列の指定を"vertex"配列に変更してるでしょ? で、次のフレームを描画するときもずっとその指定が続いてるわけ。 つまりテクスチャ0/1を描画するつもりでglDrawArraysを発行しても、 参照してる頂点配列が"vertex"配列になったままだから、線分と同じ位置に GL_TRIANGLE_STRIPで描画されちゃってると。 (プログラム見る限り、頂点が一直線だから実際は縮退して描画されないだろうけど) テクスチャを描く前に、もう一回、テクスチャを描画するための頂点配列を設定するべし。
247 名前:241 mailto:sage [2008/12/06(土) 00:25:37 ] あ、そうか、次に描画するときにvertex配列の指定が解除されてないから、 vertex配列の上にテクスチャが表示されちゃって線しか出ないってことなんですね。 なんだかまだらで変な色の線だなぁ、バグかなぁと思ってたら、 あれはテクスチャ画像の色が出てたんですね。 やっともやもやが取れました。調べてやってみます。 >>242 さん >>246 さん、どうもありがとうございました。
248 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 22:38:52 ] GL_BGRAとかGL_BGRってVS2005に入ってるヘッダでは定義されてないんですが、 この定数ってどこで配布されてるヘッダに存在するんですか?
249 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 22:41:47 ] 俺はglewのを使ってる
250 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 22:45:41 ] OpenGL総本山のExtension Registryのページにglext.hがあったはずだが。 あれでもいいし、最新でなくてよいのならglewのでもいい。
251 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 23:05:04 ] >>249-250 どうもありがとう。取ってきます。
252 名前:デフォルトの名無しさん [2008/12/07(日) 23:44:04 ] マルチスレッドってOPENGLの描画を各スレッドでウインドウ作って GLの描画処理やらせたら シングルスレッドでに2画面描画するより速くなるの?
253 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 00:00:45 ] 複数のハードウェアスレッドが使用可能なら早くなる可能性はある セレロンみたいなシングルコアCPUだと同期処理が必要になる分確実に遅くなる
254 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 01:18:54 ] はぁ?
255 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 01:46:22 ] ↑ケチつけるだけで具体的には何も書けない馬鹿
256 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 08:01:16 ] GPUに空きがあれば速くなる可能性はあるよ その場合スレッド毎にコンテキスト作れってNVが言ってた気がする めんどうにはなるね
257 名前:デフォルトの名無しさん [2008/12/09(火) 03:33:02 ] グラボがGeForce 9300M GSとチップセット内臓の4500MHDを切り替え可能なVaioのノートを使っています。 JavaのOpenGLで、最大化ボタンを押したらフルスクリーン表示するプログラムを作ったんだけれど、 4500MHDの方ではフルスクリーン後も正常に描画されるのに、 GeForceの方ではフルスクリーン後に画面が真白になってしまって描画されません。 真白なのに、キーイベント等は正常で画面内にクリッカブルなボタンとかを作っておけばちゃんとクリックできるし、 第一、エラーが出ないのでどこが問題なのか良く分かりません。 描画している処理自体はきちんと呼び出されているのですが、画面上に表示されていないという感じです。 これってグラボのドライバのせいなんでしょうか? チップセット内臓のグラボが描画できて、より高性能なはずのGeForceがダメという状況に戸惑ってます。
258 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 03:48:48 ] つ glGetError
259 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 03:56:42 ] 俺は旧Direct3Dで言うデバイスロストが怖いから ChangeDisplaySettingsとか呼ぶ度にコンテキストから全て作り直してる
260 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 20:57:37 ] >>257 俺も知り合いのノートPC(DELL、geforceかどうか不明)で フルスクリーン後に画面が真っ黒(多分ウインドウの背景色)になる現象に悩まされてます。 フルスクリーン解除するとまた見えるようになるんだよな。 なぞだ。 DirectXにある >>259 の言うデバイスロストだと、 通常はロスト後はフルスクリーン解除してもロストしたままだったはずなのだが、 うちの問題が起こる環境だと復帰するんだよね・・・。 まあ、一番確実なのは、全て作り直すことなんだろうけど。 時間がなくて試せてない
261 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 20:58:47 ] わかりにくくてスマソ > 通常はロスト後はフルスクリーン解除してもロストしたままだったはずなのだが、 > うちの問題が起こる環境だと復帰するんだよね・・・。 通常はロスト後はフルスクリーン解除してもロストしたままで フルスクリーンから復帰しても見えないままだったはず。
262 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 20:59:58 ] というわけで、全部コンテキストから作り直しなりなんなりで 上手く回避できたら報告キボン
263 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 21:21:50 ] GeForce 8400Mを乗せたVAIOでGeForce側で起動するとどうもOpenGL が不安定なので悩まされた事がある。 それこそフリーズや、フルスクリーン画面がバーコード状態になったり。 サポート出そうにも再現条件がはっきりしないので、半ばムキになって SpecViewPrefを走らせたま酒飲んで寝たら、翌朝にはもう二度と起動 しなくなっていた。
264 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 03:14:02 ] VAIOがあやしいのか? 俺も3Dビューアーを作っているんだが、VAIOのGeForce Go 6200 で画面が何も描画されない現象を 最近報告された。フルスクリーンではなく通常表示。 様々なグラボや内臓チップセットで動作確認して問題なかったのに。 原因もまったく思い当たらない。 ドライバ更新くらいしか手がないのだろうか?
265 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 03:35:04 ] いや〜、自分の場合は完全にGeForce Goの問題だったと思う。 初期はOpenGLの高負荷時にWindowsの画面がフリーズする 程度だったけど、末期には起動直後のBIOSの段階から緑色の バーコード模様やピンク色の市松模様とか表示されていたので。 完全に憶測だけど、NVidiaのリコールとの関連かなと思った。 ちなみにSpecViewPerfによってGeForce Goの不具合は再現率 100%になったので(なにせ起動しない)、はれてVAIOはサポセン 行き->マザボ交換(無償)となったのでした。 保証が切れるギリギリだったので結構やばかったです。
266 名前:257 [2008/12/10(水) 04:02:59 ] >> 258 gl.getError()しても、エラー無いみたいなんですよねぇ・・・。 >> 259 はい、僕もコンテキストから作り直してるんですが、ウィンドウをフルスクリーンモードにすると何故か真白に・・・。 謎です・・・。 フルスクリーンモードに切り替えた後にコンテキストを作り直してるのですが・・・。 GraphicsDevice#setFullScreenWindow(Window w)を呼び出すと真白現象になっちゃいます・・・。 >> 260 同じ現象っぽいですね・・・。 フルスクリーンモードにして真白の状態の後、フルスクリーン解除してウィンドウ画面にしたら描画も復帰します。 >> 263 うーむ。GeForceのモバイル用はOpenGLに弱いのでしょうか・・・。
267 名前:260 mailto:sage [2008/12/10(水) 08:12:09 ] おJavaか。 しかし、そっちはコンテキストから作り直しているんだね。 そちらもウインドウにもどしたら復帰するとすると同じ現象か。 あ、あと 安価する時は、>>258 みたいにスペースいれないでくれ頼む
268 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 00:14:51 ] すいません初心者なんですがOpenGLにはある特定のキーの状態を取得する関数はありますか。 windowsプログラミングのGetAsyncKeyState('J') 的な。
269 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 00:18:41 ] コールバック関数を使ってキーの状態をフラグに保存するとかしか方法はないのでしょうか その場合にメインループとコールバック関数でフラグ変数に対して競合がおきるなどの問題はありますでしょうか
270 名前:デフォルトの名無しさん [2008/12/16(火) 00:35:43 ] 描画以外はOpenGLの仕事ではない
271 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 01:29:51 ] ではLinuxではどうやってキーの状態を調べればよいですか
272 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 01:33:01 ] ここは警察じゃないよ
273 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 01:33:12 ] GLUTでも使っとけ。
274 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 10:20:22 ] >キーの状態 OpenGLは、グラフィックスハードウェアに対して描画命令を発行する以外のことは 本当に何一つできませんよ。キー入力はもちろん、ベクトルや行列の計算だって 自前で(あるいは他の何らかの手段で)やる必要があります。 OpenGLに全く関係の無い話題である以上、ここで質問しても期待される答えが 帰ってくる可能性は低いかと。Linuxのスレなりなんなり、適切な場へ移動した方が 良いのではないでしょうか。 てか、それくらい、ぐぐればいくらでも答えが引っ掛かりそうなもんですが・・・。
275 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 15:57:16 ] OpenGLを1から学びたいんですが、お勧めのサイトは? PBOやFBOについても学びたいです。
276 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 17:25:41 ] >>275 床井先生のとことかかな。
277 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 18:20:16 ] 床井先生のとこ今年頭から更新再開してたのに今頃気づいたw
278 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:34:02 ] glBegin(GL_LINES)や(GL_POINTS)で描画するような点や線の色や質感に関しては ライティングを有効にした場合はどのように設定するのでしょうか? いままでライティングを無効にしていたプログラムではglColor系の関数で色を付けていたのですが、 これではライティングした際に色が抜けてしまうようなので、何かしらの方法で色を付けたいと思うのですが
279 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:35:11 ] つ マテリアル
280 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 22:07:59 ] GLUTによる「手抜き」OpenGL入門 www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html これかな?なかなかよいまとめですね スクリーンショットがもっとあったらもっとよかった
281 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 22:19:55 ] すみません、質問なんですが、回転の変換行列からクォータニオンって求められますか? ttp://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040321 にあるqrot(rt, tq);の逆向きの変換がしたいんですが、どうしたらいいんでしょうか?
282 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 23:36:59 ] クォータニオンの虚部の符号を反転?
283 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 11:37:19 ] 現在、glutを使ってOpenGLを勉強しているのですが、Win32APIを使ったほうがいいのでしょうか? glutを使わずにWin32APIを使うメリットはありますか?
284 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 12:14:31 ] Win32APIの方が、フレームバッファの細かい設定とかできるね。 勉強中ならそこまで必要ないだろうし、GLUTでいいんじゃない? Win32APIを使うのは、Win32APIじゃないとできないことをやりたくなってからで十分かと。 てかGL以外に考えるべきことを増やすのはかえって良くないと思う。 やりたいことに集中して、他の事はシンプルに済まそう。
285 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 22:29:40 ] #include <GL/glut.h> #include <dshow.h> のようにして、glut-3.7.6とDirectShowを同時利用しようとしたら、次のようなコンパイルエラーが出ます。 どうすれば治りますか? c:\program files\microsoft visual studio 9.0\vc\include\stdlib.h(371) : error C2381: 'exit' : 再定義 ; __declspec(noreturn) が異なります。 c:\documents and settings\裕\my documents\visual studio 2008\projects\glut-3.7.6\include\gl\glut.h(146) : 'exit' の宣言を確認してください。 c:\program files\microsoft visual studio 9.0\vc\include\stdlib.h(371) : warning C4985: 'exit': 前の宣言に属性が存在しません。 c:\documents and settings\裕\my documents\visual studio 2008\projects\glut-3.7.6\include\gl\glut.h(146) : 'exit' の宣言を確認してください。
286 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 23:01:47 ] includeの順番のような気もするけど 「error C2381 exit」でググってみたら
287 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 01:24:41 ] 2.0専用スレに誤爆してしまいました orz OpenGLでは各色の値の範囲が0〜1ですが、これってGDI上での0〜255の範囲に リニアに一致する訳じゃないのでしょうか? 256*256のコンテキストを作り、全面ぴったりのポリゴンを張って、フラグメントシェーダーから gl_FragColor = vec4(gl_TexCoord[0].s, gl_TexCoord[0].s, gl_TexCoord[0].s, gl_TexCoord[0].t); として色とアルファの増え方を見てみたのですが、どうもジャギっててきれいに0〜255の範囲で 増えてるわけではないみたいなのですが… コンテキストと同じサイズのGL_NEARESTなテクスチャを張った場合はちゃんと256*256の範囲 全体が張られているのでテクスチャ座標がずれてるわけでもないみたいです。 上の式で得られたレンダリング結果↓ www3.uploda.org/uporg1873748.png
288 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 11:45:51 ] 流れの速いアップロードにファイルを置く馬鹿。
289 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 11:47:07 ] アップローダをアップロードと書いてしまう馬鹿。
290 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:32:44 ] >>287 普通は、リニアに対応するはずだけど。 レンダリング結果が見れないので、もう一度うpぷりーず! (できればついでにソースも。)
291 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 05:11:39 ] glReadPixelで数値にして見てみたら?
292 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 20:06:55 ] 例えば(10,0,0) (0,10,0) (0,0,10)・・ 原点が端のような 立方体があって、(0,0,10)を回転中心にして回転させたいのですが、どうすればよいのでしょうか? for(;;){ glTranslatef(0,0,-10);// 原点に移動 glRotatef(10,1,0,0); // X軸を中心に回転 glTranslatef(0,0,10);// 元に戻す draw(); } とするとどんどんY座標がずれてきます。これを計算で戻すか、 使い方が悪いのか教えてください。
293 名前:デフォルトの名無しさん [2008/12/23(火) 20:40:07 ] 回転したい点を原点に持ってきて回転させて戻せば?
294 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 20:52:49 ] 今は回転中心を原点に持っているつもりなのですが、<<292 では 持っていってないですか? わかっていません。
295 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 20:59:44 ] どんどんずれていくのは、それはずれを蓄積しているからだろw ループの最初で座標を初期化せい
296 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 21:28:32 ] -Y座標方向にどんどんずれていくのですが、 1回転による座標系のずれを計算して、そのずれ分移動して元の位置関係に あわせるということでしょうか? それは計算しなければなりませんか? 関数はないでしょうか?
297 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 22:36:48 ] >Use glPushMatrix and glPopMatrix to save and restore the unrotated coordinate system. 俺も勉強し始めたばかりでよく知らないんだけど、これとかどうよ?
298 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 23:21:39 ] それは使えないかと思います。 回転させてそれを描画しないといけないので。 (なにかまちがっていますかね。。)
299 名前:デフォルトの名無しさん [2008/12/24(水) 00:07:32 ] すいません 教えてください MAXで作ったアニメーションデータをOpenGLESで読み込んで動かしたいのですが、 調べたところCOLLADAがありましたが、C++のコードなんです。 組込み系でC++に対応していないため、C言語がいいんですけれども 何か解決案をご存知の方いますでしょうか? おかしなこといってたらすいません・・・
300 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 00:31:28 ] >>292 ・座標変換は座標(縦ベクトル)に左から変換行列を掛ける ・変換行列の操作は右から行列を掛ける
301 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 01:08:54 ] >>298 glPushMatrix(); glTranslatef(0,0,-10); glRotatef(10.0 * n, 1,0,0); glTranslatef(0,0,10); draw(); glPopMatrix(); とかは?
302 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 01:53:14 ] >>299 C++でCOLLADAからカスタムフォーマットを吐くものを作って、 カスタムフォーマットを再生するものはCで作る。 C++をCでラップしてもいいけど、XMLをそのまま扱うのは重いので 組み込みならなおさら事前に変換する方がよろしいかと。
303 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 02:49:08 ] >>301 それ以前の問題で、変換前の座標を p、変換行列を上から M1, M2, M3 とすると、 変換後の座標は p' = M1 M2 M3 p になるんだってば
304 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 22:23:16 ] >>300 , 303 その言い方じゃ、分かって貰えないんじゃないだろうか・・・。 >>292 移動と回転を組み合わせる、って発想は合ってるよ。 ただ、変換の順番が間違ってる。もし(0, 0, cz)を中心に回転させたいなら、↓こうする。 for(;;){ glTranslatef(0,0, cz); // 元に戻す glRotatef(10,1,0,0); // X軸を中心に回転 glTranslatef(0,0, -cz);// 原点に移動 draw(); } (コメントの順番に注目!) で、こういう変換は>>295 の言うとおり誤差が溜まっていくので、↓こうするともあべたー。 for(ループカウンタをiとする){ glLoadIdentity(); glTranslatef(0,0, cz); // 元に戻す glRotatef(10 * i とか ,1,0,0); // X軸を中心に回転 glTranslatef(0,0, -cz);// 原点に移動 draw(); } (glLoadIdentity()の代わりにglPushMatrix()とglPopMatrix()を使ってもいいよ!)
305 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 22:31:25 ] >>299 それはちょっと難しそうだなー・・・。 仕事でやるなら、Mascot Capsule とかの、既存の3Dエンジンを利用することを考えたほうがいいと思う。 (そもそもMAXでないといけないのかとか、ワークフローの最初から考え直した方が。) 趣味でやるなら、302の方法を支持します。 勉強することすごく多くて大変だけどねー。楽しいよねー。 ・・・てか、組み込み系とはいえ、3Dモデルのアニメーションをさせるような分野で C++が使えない!?というのがまず信じられないという心持ちですよ。
306 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 22:52:37 ] ドリームky・・・おっとこんなクリスマスイブに誰か来たようだ
307 名前:デフォルトの名無しさん [2008/12/25(木) 00:14:38 ] >>302 ,305 レスありがとうございます そういう考え方がありますね!頭が固いもので考えつかなかったです汗 libxmlやらCG言語やら絡んでてややこしいっす。ここらへんはあんまり見ないで データ保持しているドキュメントクラスだけ見ればいいのかもしれないですが とりあえず挑戦してみます! あと、ドローソフトで作った頂点座標などのデータをOpenGLに ドンと投げて楽して描画したいだけなんで、 MAXじゃないとだめってこともないですが、普及率が高い分、拡張性も高くて 3dsファイルはデータの損失が少ないなどの話も聞いたもので。 まだ歴史が浅い分野なもので手探り状態っす Mascot Capsuleなんてものがあるんですね。導入できるのか分からないですが もうちょっと調べてみます
308 名前:デフォルトの名無しさん [2008/12/25(木) 17:36:29 ] OpenGL ESもいいですか? トライアングルの1頂点が画面の外に出ると光源計算してくれないって現象で困ってます. アンビエントは入るのですが,はみ出した頂点だけでは無く,トライアングル全体が暗くなります. GL_TRIANGLE_FANでもGL_TRIANGLE_STRIPでも同じ症状です. 3つの頂点全部が画面内に入ると計算してくれます. 何かヒントになる事でも結構ですのでアレじゃね?みたいなのがあればお願いします.
309 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 20:07:11 ] ドライバーのバグでは?動作環境は何ですか?
310 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 20:32:10 ] iPhoneと言うかiPhone SDKに付いてるiPhoneシミュレータなんすけど. サンプルには光使ってるの無いし,もしかして出来ないなんて事有るんすかね?
311 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 21:15:23 ] ・OpenGLの関数(gl*という名前の関数)のドキュメントって何処にあるんですか? 出来れば日本語のをお願いします。 ・glutの最新版ってバージョンいくつですか?今3.7.6が入っています。
312 名前:デフォルトの名無しさん [2008/12/25(木) 21:39:44 ] .orgにスペックからなにからあるけど、英語。翻訳は金かかるからな…。 glutはfreeglutの2.6がそろそろでようとしている模様。
313 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 22:15:53 ] このスレなんかここ数ヶ月元気だよな
314 名前:311 mailto:sage [2008/12/25(木) 23:50:45 ] >>312 ありがとうございます。ドキュメントは英語で我慢します・・。 glutのバージョンを訊いたのは ttp://wisdom.sakura.ne.jp/system/opengl/gl23.html の一番上にあるプログラムが動かなかったからです。 何故かテクスチャが貼られず、白いままになってしまいます。なぜでしょうか? freeglutの2.4に変えてみても同じでした。 他のOpenGLを使うアプリケーションは普通に動作します。
315 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 00:02:05 ] >glTexImage2D( >GL_TEXTURE_2D , 0 , 3 , TEXSIZE , TEXSIZE , >0 , GL_RGB , GL_UNSIGNED_BYTE , bits >); 3番目の引数を3からGL_RGBに変えて味噌
316 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 11:00:02 ] >>310 もうちっとでiPhone SDKが入るマシンが来るので来たら試してみるわ ってか、シミュレータの不具合の可能性があるかも知れん。実機で再現するか確かめてみ。 シミュレータのバグと確定した場合はバグレポしておいて。
317 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 17:00:28 ] >>311 個人的にはやはり「赤本」がベスト。 手元に一冊あると便利で勉強にもなるけど、高いよね・・・
318 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 22:00:57 ] 俺も学ぶのに赤本は最高だと思うんだけど、 関数のドキュメントとしては青本の方がいいんじゃないか? そういえば前スレに日本語manのリンクがあったけど 今見たらgluとglXのものしかないな…
319 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 22:09:52 ] 時節がら、大学入試の問題集の話かと思ったよw
320 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 17:19:01 ] VCで開発してるけど、VC上でのデバッグ実行では普通に動くけど リリースビルドするとカタカタ動く。 原因は初期化忘れとかあるみたいだけど、こういうの経験ない? 原因はなんですか?
321 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 18:17:13 ] エスパーすると、初期化忘れだな
322 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 20:06:27 ] やっぱり初期化忘れなのかな。 ただ回転させてるだけの処理でリリースはカクカクする。 初期化忘れはない・・と思ってるけど。あるのかな。
323 名前:311 mailto:sage [2008/12/27(土) 22:40:13 ] >>315 GL_RGBにしても関係なかったようです・・なぜか glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); を実行するとテクスチャが表示されるようになりました。コメントアウトすると 表示されなくなります。解決してよかったけど何ででしょう? もう1つ質問いいですか ttp://uproda.2ch-library.com/src/lib084665.zip.shtml ↑このプログラムは、 ttp://www.shader.jp/xoops/html/masafumi/directx9/DShow/dshow001.htm ↑ムービーテクスチャ をGLでやってみるプログラムです。 CTextureRendererのDoRenderSample()からテクスチャに書き込もうとすると GL_INVALID_OPERATIONが帰ってきて何も書き込まれません。 そのため、DoRenderSample()内で 一旦memcpyでムービーの内容を適当なバッファにコピーしてから、 ポリゴンの描画を行う前にglTexSubImage2Dで更新していますが 負荷が大きいようです。何とかDoRenderSample()内で テクスチャを更新したいんですが、どうすればいいでしょう? PBOも使おうとしてみたんですが、どうやったらテクスチャとして使えるのか 分からないしmain.cpp以外から使おうとするとプログラムが落ちて駄目でしたorz
324 名前:311 mailto:sage [2008/12/27(土) 22:50:23 ] プロジェクトのファイル全部入れてしまいましたが 入れ忘れあったのでビルドできません・・ CTextureRenderer.cppとmain.cppだけ見てください
325 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 22:51:17 ] GL_TEXTURE_MIN_FILTERのデフォルト値はなぜかGL_NEAREST_MIPMAP_LINEARなので 環境によってはミップマップを設定しないとテクスチャが表示されない
326 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 23:44:45 ] >一旦memcpyでムービーの内容を適当なバッファにコピーしてから、 >ポリゴンの描画を行う前にglTexSubImage2Dで更新していますが >負荷が大きいようです。 普通にテクスチャ更新すりゃいいだろ。なんで無駄なコピーやっているんだ?
327 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 23:47:43 ] そうしたらなぜかGL_INVALID_OPERATIONが・・
328 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 23:54:03 ] glBindTexture(GL_TEXTURE_2D, TexName); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TEXSIZE_X, TEXSIZE_Y, GL_BGR_EXT, GL_UNSIGNED_BYTE, pSampleBuffer); printf("Error:%d\n", glGetError()); glBindTexture(GL_TEXTURE_2D, 0); //UnBind これをDoRenderSample内でやるとGL_INVALID_OPERATIONが
329 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 23:56:34 ] なんか知らんが、OpenGLにはコンテキストを生成したスレッドでAPI呼ばないといけない制限があるから、 スレッド違いで失敗してるんでね?サンプルごとキューにでも投げてGLのスレッドで処理するようしとくとか。 こんな基本的な事は承知だったらすまね。
330 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 03:45:51 ] >>328 テクスチャーサイズが2のn乗になってないが、大丈夫なのか?
331 名前:330 mailto:sage [2008/12/28(日) 04:11:42 ] と思ったが、write()ではうまくいってるのか。 呼ぶタイミングを見ようと思ったら、DoRenderSample()を呼び出している 箇所が見つからない。どうなってる?
332 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 14:11:09 ] Gluxってなんか面白そうじゃんって調べたらLGPLなのに静的リンクライブラリだった 「自由に使って欲しいからGPLじゃなくてLGPLにしたんだぜ」 って書いてあったけど、これだと全然自由じゃないよな? LGPLって動的リンクならゆるいけど、静的リンクだとソース公開だったよな 俺が勘違いしてるのか?
333 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 14:40:10 ] ソースコードはあるからライセンスに従って適当に使えばいいだろ。
334 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 15:00:31 ] 静的リンクでもいいようだぞ 中身読んでないから知らんが ttp://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License
335 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 20:01:22 ] なんかちょっと伝わってないみたいだから整理してみる 俺が望んでいること →Gluxをライブラリとして使いたいが、全ソース公開は勘弁して欲しい 公式には「自由に使える」と書いてあるが、LGPLなのであまり自由ではない(詳細は下記) LGPLのソース公開条件 →動的リンク(*.dll)ならソース公開は不要だが、リバースエンジニアリングを許可する必要がある 静的リンク(*.libとか*.a)ならソース and/or オブジェクトファイルの公開が必要 んで俺が試してみたところ、DLL化は無理だった(ライブラリ内にmain関数への参照があるから) 要するに静的リンクするしかないので、ソース公開は避けられないんじゃないか? というのが問題なんだ
336 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 23:33:32 ] main関数を共有ライブラリにおけない環境の不幸を呪うがいい
337 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 00:26:23 ] 「and/or」は都合のいいほうに解釈するんだ つまりオブジェクトファイルだけ公開すれば良いんだ
338 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 01:02:27 ] ソース見てみたが簡単にDLL化できそうだけどな
339 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 01:12:16 ] >>335 軽くソースを読んでみただけなので不適当なところがあっても勘弁して下さい。 概略はgluxPlatform.cppでコンソールアプリ用とGUIアプリ用のmain関数の ひな形が実装されていて、ユーザ定義のmain関数はgluxPlatform.h内の #defineでglux_Mainへとリネーム、上記のひな形main内から適切なタイミング でglux_Mainを呼び出す、という形ですね。 で、ひな形main関数の名前がmainだったりWinMainだったりするのでDLL化 が出来ない、と。 となると、まずgluxPlatform.h内のmainをリネームする#defineを削除、次に gluxPlatform.cpp内のひな形メインをConsoleInit, WinInitなど無難な名前に 付け替えて、ユーザ定義のmain等から明示的に呼び出す形にすれば良い のでは。glux_Mainはこの際にポインタとして渡してやれば良いと思います。 で、DLL化のための上記の修正を行うpatchを作成して、LGPLで公開。 DLL化版のgluxもLGPLとなりますから、これを動的リンクするプログラムの ソースを公開する必要は無くなるはずです。
340 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 01:36:59 ] >>335 ttp://www.gnu.org/copyleft/lesser.html LGPL v3だとこんな感じだ 4. Combined Works. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, ... このライセンスはライブラリ部分に相当する最小限のソース・バイナリコードにのみ感染し適用される。その範囲内での感染はGNU GPL第6項と同様の方法で行う。 「glux使いました」と書いてgluxの入手先を明示しておけばおkなライセンス。
341 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 11:05:45 ] >>339 細かいレスありがとう 大体そんな感じでやったら出来たよ 数行程度の修正で間に合った サンプルコードを元に改造していったんだけど エラーが出ると予告無しに終了するって仕様のせいで時間がかかったわ >>340 LGPL v2.1って明記されてるんだけど、そういう場合でも v3だと読みかえていいのか?
342 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 13:10:05 ] >>340 > 「glux使いました」と書いてgluxの入手先を明示しておけばおkなライセンス。 全然違う。 >>341 よくない。 またLGPLとGPLでもソース配布についての規定は少し違う。 gluxを同梱するか、自分のソフトと同じダウンロード場所から自分で配布する必要がある。
343 名前:311 mailto:sage [2008/12/29(月) 21:22:24 ] >>330 2のn乗でないテクスチャはうちの環境ではサポートされています。 >>331 レンダラーフィルタとしてグラフに挿入すれば 後はDoRenderSample()を呼ぶのはDirectShowが勝手にやってくれるみたいです。 >>329 初めて知りました。OpenGL使い始めて長くないので・・ どんなプログラムを書けば実現できるのでしょうか? 「OpenGL マルチスレッド」でググってみましたが、よく分かりません。
344 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 21:57:13 ] OpenGLのAPIが実行されるスレッドを1つになるようにコーディングする。 DirectShowのコードは別スレッドで実行されてるだろ?
345 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 23:34:33 ] すいません、全然やり方わからないですorz どんな関数とかを使えば?
346 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 00:02:07 ] VS std以上を使っていると思うが、ブレークポイントで停止させたりすると、スレッドの一覧でどのスレッドか状態がわかるだろ? Expressだとスレッドは確認できなかったかな。というかExpressはデバッグ機能は貧弱すぎて使い物にならん。 スレッド間でデータを受け渡しする機構なんかは適当にやれ。マルチスレッドを理解していれば簡単だろう。
347 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 00:05:13 ] DirectShowが管理するスレッドがDoRenderSampleを呼ぶならその中ではGLのコマンドは使えない そんだけ
348 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 01:40:44 ] 俺が大昔に書いたらしいMovieTextureなるクラスのソース見たけどmemcpy使ってるな
349 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 07:55:00 ] >>348 今ならどう書く?
350 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 12:28:05 ] OpenGL API を呼ぶ部分をクリティカルセクションで排他制御すれば 別スレッドから OpenGL API を呼んでも問題ないと思うんだけど。
351 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 13:34:11 ] コンテキストがスレッドごとに違うので 排他制御してもうまくいかないと思う。
352 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 16:52:56 ] >>351 ウインドウが1つならスレッドが違ってもデバイスコンテキストは同じじゃね?
353 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 17:30:33 ] デバイスコンテキストじゃなくてGLのコンテキストだろう。
354 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 18:44:35 ] >>350 >>352 GLの常識を知らないならROMっとけよw
355 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 21:53:42 ] >>354 あ〜あ…
356 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 22:02:07 ] 常識を知らずに、自分が常識を知らないということを知ることはできない
357 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 08:27:42 ] 常識もなにも、試してみれば分かることだと思うけど‥‥
358 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 16:16:52 ] >>357 プログラマとして、その考え方は危険だろ。 「たまたまうまくいってた」だけ、ってのが往々にしてあるし。 特にOpenGLは。 ……ええ、こないだそれで長時間悩むハメになりましたさ。
359 名前:311 mailto:sage [2008/12/31(水) 22:59:28 ] マルチスレッドなプログラムなんて組んだことありません。 使っているのはVisual C++ 2008 Express Editionです。 ・・・コンテキスト? wglCopyContextを使えばいいんでしょうか?
360 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 23:11:02 ] 頑張れ。学ぶんだ。今年もあと1時間弱あるから、なんとか。
361 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 18:23:35 ] 今年もまだ8740時間はあるからがんばろう
362 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 01:44:29 ] >>361 そう表現すると、やけに少なそうに見えるな。焦燥感を煽るにはいいかも知れん。
363 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 15:28:56 ] >>361 あのゲームやこのゲームで数百時間浪費することがいかに愚かか実感しました
364 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 15:37:41 ] 寝る時間 8時間、飯食う時間 1時間半としても、今年はまだ 5292.5時間もある。 がんばろうな。
365 名前:311 mailto:sage [2009/01/02(金) 21:45:35 ] ttp://uproda.2ch-library.com/src/lib086808.zip.shtml コンテキストをコピーしてみましたが、駄目でした・・ ・Windows SDK ・Active Template Library ・GLUT ・Irrlichtのinclude ビルドするのにこれらが要ります。
366 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 21:48:39 ] これはアレだ。頭の弱い子には無理かもしれんね。
367 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 22:04:50 ] 諦めてmemcpy使うかD3Dに乗り換えるかしたほうがいいぞ 後学のためにやってるなら止めないが
368 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 22:58:02 ] 諦めんなよ… 諦めんなよ、お前!! どうしてそこでやめるんだ、そこで!! もう少し頑張ってみろよ! ダメダメダメダメ、諦めたら 周りのこと思えよ、応援してる人たちのこと思ってみろって。 あともうちょっとのところなんだから。 俺だってこのマイナス10度のところ、しじみが取れるって頑張ってんだよ! ずっとやってみろ!必ず目標を達成できる! だからこそNever Give Up!!
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になるね