OpenGLスレ Part12
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2008/09/12(金) 19:28:29禁止事項
・「OpenGL終了」系のまず価値否定ありきの主観発言(客観的な懸念要素を挙げた上での建設的議論は可)
・学歴・理系か文系かに関連する差別発言
・その他の荒らし全て
これらは付き合うだけ無駄なので無視しましょう。
- 前スレ -
OpenGLスレ Part10
http://pc11.2ch.net/test/read.cgi/tech/1141034983/
- 関連サイト -
http://www.opengl.org/
http://www.mesa3d.org/
http://developer.nvidia.com/
http://www.ati.com/developer/
http://developer.3dlabs.com/
- 過去スレ -
OpenGLスレ Part11
http://pc11.2ch.net/test/read.cgi/tech/1177523018/
0002デフォルトの名無しさん
2008/09/12(金) 19:31:56OpenGL 2.0 専用スレ
http://pc11.2ch.net/test/read.cgi/tech/1126268759/l50
くだすれOpenGL(超初心者用)
http://pc11.2ch.net/test/read.cgi/tech/1131208166/l50
- 各社のOpenGL拡張対応状況-
nVidia
http://developer.nvidia.com/object/nvidia_opengl_specs.html
ATI
http://mirror.ati.com/developer/sdk/radeonSDK/html/info/Prog3D.html
- その他もろもろリンク集 -
http://www.nbrains.net/php/pukiwiki/index.php?OpenGL
0003デフォルトの名無しさん
2008/09/12(金) 19:33:12■OpenGLコーディングの補助
・glew http://glew.sourceforge.net/
OpenGL拡張の利用を簡便に。
■数値演算ライブラリ
・CwMtx library http://www.xs4all.nl/~hkuiper/cwmtx/cwmtx.html
行列、ベクトル、クォータニオンの演算ライブラリ。LGPL。
・Matrix, vector and quaternion library 2.0 http://www.programmersheaven.com/zone3/cat415/26784.htm
配布ページの記述によれば無償で使えるらしい。ライセンスは未確認。
C++のメタテンプレート技法を多用しているので高速。APIとしての形も非常にシンプル。
・MathGL++ http://sourceforge.net/projects/mathgl-pp/
行列、ベクトル、クォータニオンなどの各種演算用ライブラリ。APIはOpenGLライク。LGPL。
■マルチプラットフォーム化・イベントやサウンドなどのハンドリング
・SDL http://www.libsdl.org/index.php
定番。数多くの関連ライブラリが開発されている。現在のバージョンでは描画とイベントハンドリングを分離できないため、
描画がもたつくとイベント処理ももたつく。ライセンスはLGPL。
・Allegro http://www.talula.demon.co.uk/allegro/
サポートしている機能、対応OSともにSDLに似ている。日本語資料は少ないが、Gift-wareという位の寛大なライセンスが魅力。
・GLFW http://glfw.sourceforge.net/
キーボード、マウス、ジョイスティックなどのイベント処理、タイマ、マルチスレッド辺りのみをシンプルに抑えたマルチプラットフォームライブラリ。
サウンドやその他は他のライブラリと組み合わせたい場合は、こちらの方が競合などの問題が無く安心か。
・Java+jogl https://jogl.dev.java.net/
OpenGLのJavaバインディング。現在のSun JavaVMがC++に肉薄した演算パフォーマンスを発揮している今、
Javaの豊富な標準ライブラリやSwing・Java2Dと連携できる事も考えると、今後はダークホース的選択肢に?
0004デフォルトの名無しさん
2008/09/12(金) 19:34:54・OpenAL http://www.openal.org/
3Dサウンドライブラリ。マルチプラットフォーム。DirectXゲームでもサウンドはこれを使っているものも。MacOSXでは標準で入っている。
■その他
・OpenSceneGraph http://www.openscenegraph.org/
シーングラフライブラリ。
・freetype http://www.freetype.org/
ビットマップフォントやベクタフォントのレンダリングを行うライブラリ。
■フォント描画
・FTGL http://homepages.paradise.net.nz/henryj/code/index.html#FTGL
Freetypeを利用したもの。マルチプラットフォーム。アウトラインフォント対応。日本語が使えるかは未確認。
■物理エンジン
・ODE:Open Dynamics Engine http://ode.org/ode.html
オープンソース物理エンジン(GPL or BSD-Style License)
0005デフォルトの名無しさん
2008/09/12(金) 19:38:40このサンプルコピペして実行してみたんですけど
ポリゴン部分が真っ白になるんです
他に何か設定必要なんですか?
0006ahonoko
2008/09/12(金) 20:34:33OpenGLとOpenCVのメリットやデメリットを教えて下さい。
OpenCVは、
・画像処理のAPIがすぐに使える。
・OpenGLと同様、直線を引いたりすることが出来る。
といった感じですよね。
OpenGLがOpenCVに比べて良い点とは何でしょう?
どちらを使用して、開発をするか検討中です。
よろしくお願いします。
0007デフォルトの名無しさん
2008/09/12(金) 20:43:17OpenGLは3D
だろ
何開発するつもりなんだよ
0008ahonoko
2008/09/12(金) 20:52:03なるほど。
デバッグやアルゴリズムの確認・評価にOpenCVを使用することにし、
当初の予定通り、OpenGLで開発を進めていくことに致します。
ありがとうございます。
0009デフォルトの名無しさん
2008/09/12(金) 23:40:39glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
を追加したら上手くいくかも
0010デフォルトの名無しさん
2008/09/13(土) 18:01:41マウスのポジションをコールバックする回数が少なすぎて
マウスを速く動かすと線がカクカクしてしまいます.
MotionFuncを呼ぶ回数が多くなる方法を知っている方いらっしゃいますか?
もしくはC++とOpenGLの限界なんでしょうか?
0011デフォルトの名無しさん
2008/09/13(土) 18:25:12得られた点列を曲線にするなどして入力を補間したらいいかと。
それで満足できなかったらWin32APIとかOSのAPIを直接叩けばいいと思うよ。
0012デフォルトの名無しさん
2008/09/13(土) 19:21:42そのものを回転することはできませんよね…?
0013デフォルトの名無しさん
2008/09/13(土) 19:49:140014デフォルトの名無しさん
2008/09/15(月) 05:43:11どうするのが簡単な方法でしょうか?
・BitmapのHDCにレンダリング(アルファ取れる?)
・glReadPixels
うーん
0015デフォルトの名無しさん
2008/09/15(月) 09:09:30普通にglTexImage2Dでテクスチャを作ればいいと思うけど、それじゃ何か問題があるの?
0016デフォルトの名無しさん
2008/09/15(月) 09:56:230017デフォルトの名無しさん
2008/09/15(月) 10:07:38いや、GLでレンダリングした結果をWin32の半透明ウィンドウとして
使いたいという意味では?
>>14
その2つでは、glReadPixelでDIBに取得してBitBltのほうが適当かと、
32bits DIBに描画してBitBltは、MSのソフトウェア実装でGL描画が実行される
可能性が高いような。
GPUのピクセルフォーマットのサポート状況にもよるけど、PbufferSurfaceを作り、
そのHDCを使ってUpdateLayeredWindowもできるのかな?
0018デフォルトの名無しさん
2008/09/15(月) 10:35:41eglChooseConfigでEGL_BUFFER_SIZEに32を指定。
失敗した場合、その環境では32bitsのカラーバッファはサポートされていないことに
0019デフォルトの名無しさん
2008/09/15(月) 22:38:46glFlushをフックすればいいんでしょうか?
glFlush
↓
glFlush
glReadPixels
画像を保存とかする
0020デフォルトの名無しさん
2008/09/15(月) 23:59:360021デフォルトの名無しさん
2008/09/16(火) 13:23:02glPushMatrix と glPopMatrix は便利なのですが、
・大きさを三倍にし30度傾けたモデルを、複数の場所に移動させて描画したい
という場合に行列の乗算の順番の問題からうまくできません。
glTranslatef
glRotatef
glScalef
draw
という順番に処理を行う(と思う)のですが…。これだとうまくglPushMatrixを活用できません
これが仮に逆だったら(乗算の前後関係が逆だったら)
glScalef
glRotatef
glPushMatrix
glTranslatef
draw
glPopMatrix
glPushMatrix
glTranslatef
draw
glPopMatrix
このように、非常に手軽だと思います。
何かこの手のやりようが他にあるのでしょうか?
0022デフォルトの名無しさん
2008/09/16(火) 13:37:451.1 CPUで
1.2 Transform Feedbackで
2. GLSLでなんとかする
2.1 三倍と30度をuniform変数に
2.2 せっかくなのでGeometry Instancingで
0023デフォルトの名無しさん
2008/09/16(火) 13:45:331はモデルデータを書き換えてしまうわけですね。ちょっとこれだと、傾けたい角度が動的に変化する場合に負荷がきつそうですね
2はシェーダですね。(iPhoneでのOpneGL活用をやっているのですが)iPhoneにシェーダが使えたか確認してみます。
意外と行列操作そのものの機能が乏しいのでしょうか。
Direct3DにあるD3DXMATRIXのようなものも見当たりませんし、glTranslatefなどを使わず行列そのものを適用する方法も見つかりませんでした
glSetMatrix(float *matrix);
みたいなものがあれば、行列系は全部自前でやってしまうのですが・・・
0024デフォルトの名無しさん
2008/09/16(火) 14:16:370025デフォルトの名無しさん
2008/09/16(火) 14:49:44いけました。
ありがとうございます^^
0026デフォルトの名無しさん
2008/09/16(火) 15:03:10!!
あとは自前で行列クラスを作れば良いですね。
ありがとうございました。
glRotatefなどの行列乗算が適用順番と逆順なのは、カメラ座標への変換(最後に行うべき変換)を最初に宣言させたいからですかね。
というか、適用昇順と逆順は結構使い分けたい場合が多いので、glTranslatefに2種欲しかったですね・・・
0027デフォルトの名無しさん
2008/09/16(火) 20:01:46> 傾けたい角度が動的に変化する場合に負荷がきつそうですね
ちょっと考えればそれは一概には言えないことに気づくはず。
0028デフォルトの名無しさん
2008/09/17(水) 00:42:48描画してもアルファの部分が抜かれません。
何か設定がいるのでしょうか?
0029デフォルトの名無しさん
2008/09/17(水) 01:22:29とかちゃんとやってるだろうか
0030デフォルトの名無しさん
2008/09/17(水) 01:34:270031デフォルトの名無しさん
2008/09/18(木) 23:10:570032デフォルトの名無しさん
2008/09/18(木) 23:11:55つ GL_ALPHA_TEST
0033デフォルトの名無しさん
2008/09/19(金) 07:08:43003414
2008/09/20(土) 09:24:51レス遅くなりました
やっぱり、glReadPixelになるのかあ。
画面に表示せずにでもバッファから取得できるものなのだろうか・・・
試してみたいと思います。
003514
2008/09/20(土) 09:27:26o やっぱり、ハードウェアきかせるには glReadPixelになるのかあ。
開発環境のマシンがドライバが古いせいでか、
glReadPixelがメッチャ遅いんですよね
ドライバ新しくしたら、WMPとかが真っ黒になったりするので、
古いのバージョンのドライバを使ってたりします。
Geforce6600だったと思うけど、ビデオカード買い換えるか・・・orz
0036デフォルトの名無しさん
2008/09/20(土) 11:53:44GF6600ならPBOなりFBOなり使え。
でもpbufferは勘弁な。
0037デフォルトの名無しさん
2008/09/20(土) 13:53:090038デフォルトの名無しさん
2008/09/20(土) 22:59:59一部のアニメーションフレームでボーンが360度一瞬クルッと回ってしまうというバグに困ってます。
0039デフォルトの名無しさん
2008/09/20(土) 23:35:00バグに困ったらデバッグしよう
0040デフォルトの名無しさん
2008/09/21(日) 00:34:51やっぱり地道なデバッグですよね。
デバッグしてたら少し原因が分かりかけてきました。
問題のフレームでクォータニオンの大きさが限りなく0に近くなっているようです。
自分の実装の仕方が悪いみたいです。ありがとうございました。
0041デフォルトの名無しさん
2008/09/21(日) 21:30:20Gemsに載ってる。
それでも反対向きの場合はダメだったはず
だけど、現実的にはあり得ないからOK
というやつだった。
0042デフォルトの名無しさん
2008/09/25(木) 02:20:49glDrawPixelsで背景を描いて
GL_BLENDをなど有効にしてglBeginなどでポリゴンを描いても
ポリゴン同士はアルファが効いてるんですが
背景がポリゴンから透けてないんです
他に設定がいるんでしょうか?
0043デフォルトの名無しさん
2008/09/25(木) 03:22:020044デフォルトの名無しさん
2008/09/25(木) 12:00:43お前の環境がわからんので、とりあえずこれでも挙げとく
http://developer.apple.com/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_fullscreen/chapter_4_section_1.html
0045デフォルトの名無しさん
2008/09/26(金) 13:50:210046デフォルトの名無しさん
2008/09/26(金) 14:25:55俺は、DirectDrawでやってるけど、
何故か一部のマシン(ノートPC)環境で画面が真っ黒になるという現象が
発生しているんだよなあ。
Windowモード→OpenGL初期化→表示、実行→フルスクリーンに切り替え→まっくら
→Windowモードにもどす→また表示される
なんとかしたいんだけどもねえ。
フルスクリーンになってから、最初期化しないといけないのかも
DirectXみたいにサーフェスロストとかってしないよな?OpenGLは。
そもそもWindowモードに戻したらまた表示されるのがわからんな。
0047デフォルトの名無しさん
2008/09/28(日) 05:20:27よくテクスチャにシーンをレンダリングして、
それにシェーダーでエフェクト処理をかけて画面に表示してるとかありますが、
テクスチャなどは2のn乗サイズがメジャーですが(512x512とか)
画面は4:3とかがメジャーだと思います(640:480とか)
そこで、
・縦横比が合わない出力バッファで、どう言う処理概念で出力しているのでしょうか?
・テクスチャと言う事は、最終的な処理は、画面全体に2Dポリゴン+レンダリングテクスチャ、とかになるのでしょうか?
0048デフォルトの名無しさん
2008/09/28(日) 12:29:37* OpenGL2.0以降かGL_ARB_texture_non_power_of_twoがあれば問題なく使える
* GL_ARB_texture_rectangleとかを使う
* でかい2のn乗サイズのテクスチャの一部だけ使う
のどれか
あと最終的には全画面を覆うポリゴンにシェーダなりでテクスチャにフィルタかけながら描画になるね
0049デフォルトの名無しさん
2008/09/29(月) 19:29:56OpenGLをHP-UXにインストールするにはどうすればいいか、
教えてくれ・・・
Solarisへのインストーラは直ぐに見つかったんだが、
HPのがどうしても見つからん
0050デフォルトの名無しさん
2008/09/29(月) 21:28:110051デフォルトの名無しさん
2008/09/29(月) 23:12:35バイナリ形式で書かれたSTLという拡張子のファイルを読み込むライブラリないし
データ形式に関して解説されている資料はありませんでしょうか?
0052デフォルトの名無しさん
2008/09/30(火) 01:52:01拡張子でぐぐれば拡張子辞典が出てくる。
STLを調べればStereoLithographyが見つかる。
あとは"StereoLithography file format"とかでぐぐる。
って、おい!
質問するから普通に検索しても見つかないのかと思ったら
stl file formatでヒットするじゃねーか。だいじょぶかw
まさか日本語じゃなきゃ分からないとか言わないよねw
0053デフォルトの名無しさん
2008/09/30(火) 20:00:52座標を(-1.0,-1.0) - ( 1.0, 1.0) とかでなく、
ドット指定 (0,0) - (640,480) ってできないんですか?
0054デフォルトの名無しさん
2008/09/30(火) 21:43:010055デフォルトの名無しさん
2008/10/01(水) 00:02:37独自に(LINEARやNEARESTじゃないものを自分で定義)拡大時の補間方法を定義できないでしょうか。
0056デフォルトの名無しさん
2008/10/01(水) 00:21:59t-pot バイラテラルフィルタでぐぐると具体例が
0057デフォルトの名無しさん
2008/10/01(水) 09:56:50俺はこんな感じでやってる
glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;
glOrtho(0, ScreenWidth, ScreenHeight, 0, -10000, 10000);
glMatrixMode(GL_MODELVIEW);
glPushMatrix;
glLoadIdentity;
0058デフォルトの名無しさん
2008/10/04(土) 18:18:46自作プログラムを動かしてみたら予想より良く動いて驚いた
ちなみにアプリはsm2.0世代ターゲット(ARBアセンブラシェーダ)、
グラボはゲフォ9600GTでD3D9の95%程度のFPSが出てた
ラデは知らん
0059デフォルトの名無しさん
2008/10/04(土) 18:24:200060デフォルトの名無しさん
2008/10/05(日) 20:12:06カーマックに倣ってレンダリングスレッドを独立させてみたけど
苦労した割りにCPUファンがやかましくなっただけで別段早くならんかった
まあもともと1コアすら使い切ってなかったから当たり前なんだろうけど
0061デフォルトの名無しさん
2008/10/07(火) 10:33:293〜4題(大学1年生レベル)のアルバイト
日当8千円くらいでやってくれる方いませんか?
0062デフォルトの名無しさん
2008/10/07(火) 11:22:200063デフォルトの名無しさん
2008/10/07(火) 11:37:520064デフォルトの名無しさん
2008/10/07(火) 12:24:55計算スレッドとレンダリングスレッドを分けるのがナウい
一度やって懲りたけど
0065デフォルトの名無しさん
2008/10/07(火) 12:41:58分散させれるなさそうしたほうがいいんじゃ。ゲームの種類にもよるんだろうが。
まーシングルCPUでは無意味ですがね。
0066デフォルトの名無しさん
2008/10/07(火) 12:54:30ソースの書き方で大学1年レベルかどうかばれると思うよ
0067デフォルトの名無しさん
2008/10/07(火) 13:10:15ソースは枠があって、座標軸やらポリゴン構成やらの設定を
する部分だけすげかえるような感じなんです。
あまり詳しくかけないですが、工学系の院にいれらておる
法律家で、畑違いでちょっと困っているんです。
0068デフォルトの名無しさん
2008/10/10(金) 11:16:55プログラム中でバッファを再び確保しなおしたい時(つまりデータを書き換えて再度送りたい時)
glBufferData()を呼び出して確保しなおしているのですが
この際,元々確保されていたバッファをクリアしなくて良いのでしょうか?
0069デフォルトの名無しさん
2008/10/10(金) 23:51:490070デフォルトの名無しさん
2008/10/11(土) 19:46:05画面の表示をピクセル単位で制御しようとして、
今表示してるものは glReadPixels で取得するとこまでは成功しました。
で画像を弄くったあとに、表示しようと思ったら
OpenGL ESには、glDrawPixelsがなかった…
こういう場合どうするのが一般的なんでしょう。
ピクセルデータの入った配列から毎フレーム、glTexture2D作るんですか?
よろしくお願いします。
0071デフォルトの名無しさん
2008/10/11(土) 21:35:47glTexSubImage2D で該当部を書き換えがおすすめ
0072デフォルトの名無しさん
2008/10/11(土) 21:36:470073デフォルトの名無しさん
2008/10/11(土) 22:29:43glTexSubImage2D ありました!!
ちょっとこれから実験してみます。
ありがとうございます!!
0074デフォルトの名無しさん
2008/10/12(日) 02:40:19無事かけるようになりました thx!!です
0075デフォルトの名無しさん
2008/10/13(月) 11:08:324次元の同次座標を3次元の空間座標に変換する場合、xyzをwで割ると思うのですが、
glVertex3にwで割ったxyzを入れたときと、glVertex4に同次座標をそのまま入れたときの描画結果が
違うときがあるのですが…
もし、glVertex4がxyzをwで割っているのならば、引数の値が(-1, -1, -2, -2)と(0.5, 0.5, 1, 1)で描画結果が同じに
なるはずですが、全く描画結果が違うので混乱してしまっています orz
007675
2008/10/13(月) 11:39:33してあります。単位行列になっているのが原因とは思えませんが…
0077デフォルトの名無しさん
2008/10/13(月) 13:26:52w < 0 は動作保証されない。正の値を使う。
007875
2008/10/13(月) 17:53:10ということはw<0の時に正しく描画されたのはたまたまだったということですね。
喉のつっかえがとれてすっきりしました。
ありがとうございます。
0079デフォルトの名無しさん
2008/10/15(水) 10:13:24glutDisplayFunc()で登録した関数呼び出したいんですが可能ですか?
glut使った場合は必ずglutMainLoopを使わないといけないの?
0080デフォルトの名無しさん
2008/10/15(水) 11:53:220081デフォルトの名無しさん
2008/10/16(木) 03:10:13The OpenGL
Graphics System:
A Specification
(Version 3.0 - August 11, 2008)
を読まれましたか?
The Deprecation Model
を読むと、
glBegin, glEnd, glVertex, glFrustum, glPopMatrix, glPushMatrix, glTranslate*
glDrawPixels, glNewList, glEndList, 等々
が将来無くなるらしいですよ。
0082デフォルトの名無しさん
2008/10/17(金) 22:21:580083デフォルトの名無しさん
2008/10/17(金) 23:24:49しかし敷居は上がるよな
その辺をフォローするライブラリみたいなのを用意してくれればいいんだが
OpenSceneGraphとかNVSGを使えとか言うのかな
0084デフォルトの名無しさん
2008/10/18(土) 00:27:08glBegin, glEndは実行効率は悪いだろうけどちょっと何かをレンダリングしたいときに
ささっとコードを書けて便利だよね。
0085デフォルトの名無しさん
2008/10/18(土) 00:50:56初心者がまず最初に覚える関数じゃん。
敷居があがっちゃうな、確かに。
0086デフォルトの名無しさん
2008/10/18(土) 00:55:280087デフォルトの名無しさん
2008/10/18(土) 08:02:07glBeginとかなくなったら、どうやって描画寸の???
0088デフォルトの名無しさん
2008/10/18(土) 08:24:04俺はどうすればいいんですか><
0089デフォルトの名無しさん
2008/10/18(土) 10:02:31>>86なだけだろうよ。変換する関数がもっと手前(ユーザー側)に出てくるだけ。
0090デフォルトの名無しさん
2008/10/18(土) 10:33:00Matrix 関連は shader uniforms あたりを使うことになるんですか?
0091デフォルトの名無しさん
2008/10/18(土) 16:02:57OpenGLに行列の乗算の関数ってありますか?
0092デフォルトの名無しさん
2008/10/18(土) 16:07:52glMultMatrix() ですね
0093デフォルトの名無しさん
2008/10/19(日) 00:07:540094デフォルトの名無しさん
2008/10/19(日) 12:48:47もっと奥(シェーダ、GPU側)に行くんじゃないの
0095デフォルトの名無しさん
2008/10/20(月) 01:18:51glTexEnviを使って、ゴニャゴニャ弄ればいけるとは思うんですが、
組み合わせがよくわからず苦戦中です。
とりあえずアプローチは間違ってないでしょうか?
よろしくお願いします。
0096デフォルトの名無しさん
2008/10/20(月) 17:42:390097デフォルトの名無しさん
2008/10/20(月) 21:31:170098デフォルトの名無しさん
2008/10/20(月) 22:23:17GMA950でGLSL使えなくて(´・ω・`)だったけどCg使えばいいしな
009995
2008/10/21(火) 00:45:52ありがとうございます!!
0100デフォルトの名無しさん
2008/10/22(水) 13:28:400101デフォルトの名無しさん
2008/10/23(木) 23:58:40vertex shaderでは値をそのまま通すだけ。
fragment shaderでは法線ベクトルを0〜1の範囲にスケーリングしてfragmentのcolorに設定する。
ただ、これだけでいいんだ。
0102デフォルトの名無しさん
2008/10/24(金) 01:17:54使えないパソコンの方が圧倒的に多いだろ。
特にノーパソ。何とかしてくれ。
0103デフォルトの名無しさん
2008/10/24(金) 01:21:560104デフォルトの名無しさん
2008/10/24(金) 02:39:190105デフォルトの名無しさん
2008/10/24(金) 07:23:23アセンブリ直接書くのはつらいからCg使うことになるだろうけど
使えるという程の速度が出ないと言うことなら仕方ないが
0106デフォルトの名無しさん
2008/10/25(土) 09:06:58フォンシェーディングとシャドウマップで次世代な気分になった
ttp://www1.axfc.net/uploader/Li/so/18674.mp4
でも頂点シェーダからテクスチャにアクセスできないんで
仕方なくCPUでスキニングとか全然次世代じゃねぇ('A`)
0107デフォルトの名無しさん
2008/10/25(土) 10:07:12骨が指の関節にまで入ってたりでもするのか?
0108デフォルトの名無しさん
2008/10/25(土) 17:34:18でもノーマルマップとHDRが今の次世代(?)標準らしいぜ
スキニングはテクスチャ必要ないと思うけど
バーテックスシェーダのuniform変数の数が足りないなら
足りそうな所まででモデルを分けて描画という面倒な手もある
他には頂点座標の値を1次元テクスチャに書く方法でスキニングをピクセルシェーダでやるとか
まあ今はCPUもコア数余ってたりするから
余程頂点数が多くない限りスキニングはCPUでもいいんじゃないか
別スレッドでやればマルチコア対応で次世代気分だよ
0109デフォルトの名無しさん
2008/10/26(日) 00:42:11しかもそれをディスプレースメントマッピングしたりとか
表示だけならいいんだろうが当たり判定したい場合はどうするんだろうな
もしかして当たり判定もGPUでやる時代になるのか
0110デフォルトの名無しさん
2008/10/26(日) 00:54:44CUDAかなんかで一度実装すればCPU/GPUのどっちでも実行できるって世界が理想だけど
0111デフォルトの名無しさん
2008/10/26(日) 09:21:11だな
0112デフォルトの名無しさん
2008/10/26(日) 14:58:51見た目そのままで判定したい場合はやっぱりCPUで頂点処理することになるはずなので
そのうち頂点シェーダは要らない子になるな
0113デフォルトの名無しさん
2008/10/26(日) 15:35:31やるにしても頂点シェーダからジオメトリシェーダはOpenCLとかでの
汎用処理になっていくんじゃないかと思う
0114デフォルトの名無しさん
2008/10/26(日) 16:43:37表示とコリジョンのレベルを一致させるにしてもめりこみ対策をするにしても
やっぱり分離しておくほうがいろいろと便利
0115デフォルトの名無しさん
2008/10/29(水) 18:46:12ttp://www.4gamer.net/games/000/G000000/20081029023/
0116デフォルトの名無しさん
2008/10/29(水) 18:53:19調べてみたんですが、サンプルから入っていくのでよく分からない。
シェーダーを使うことによって得られる利点ってのは何なんですか?
CPUを使わないでGPUで演算?わけわかからん
0117デフォルトの名無しさん
2008/10/29(水) 19:06:02ttp://journal.mycom.co.jp/column/graphics/001/index.html
0118デフォルトの名無しさん
2008/10/29(水) 19:08:26ありがとう。記事にバーチャ載ってて少しテンション上がった。
0119デフォルトの名無しさん
2008/10/29(水) 19:35:49でもまぁ大抵そういうところから入っていくんだよね
0120デフォルトの名無しさん
2008/10/29(水) 22:18:16とかいってるけど本当はよくわかってない俺にちょうどいい記事があるときいて
0121デフォルトの名無しさん
2008/10/30(木) 00:11:30ようやくかよw
まだあきらめてなかったんだな
0122デフォルトの名無しさん
2008/10/30(木) 10:28:30すばらしいまとめ。最初は歴史だけだったが、
後半から3Dのシェーダーがらみのパイプラインの詳しい解説。
ちと長いがw
0123デフォルトの名無しさん
2008/10/30(木) 10:33:13>>116じゃないけど、>>117を一通り読んだ俺にオススメのシェーダー本を教えてください
0124デフォルトの名無しさん
2008/10/30(木) 10:49:49強いて言えば赤本でGLSLの解説が日本語で読める位か
0125デフォルトの名無しさん
2008/10/30(木) 12:55:470126デフォルトの名無しさん
2008/10/31(金) 06:53:08スゲーな…
オレンジ本って言うの?
OpenGL Shading Language
英語だし、内容が古いけど、これが一番詳しい気がする
後、More OpenGL Game Programmingは持って無いが気になる
0127デフォルトの名無しさん
2008/10/31(金) 09:28:39ありがとう
本が好きなんですw
過去スレ除いたら同じような質問が出てたので、それも参考にできました。
テンプレに入れといていい気がする。
赤本の英語版がPDFで読める?という情報も過去レスにあったのですが、
見つからない・・・
■書籍
・赤本(OpenGL1.5と2.0を網羅。シェーダーに関しても少し載っている)
Amazon.co.jp: OpenGLプログラミングガイド 原著第5版: OpenGL策定委員会, 松田 晃一: 本
http://www.amazon.co.jp/dp/4894717239
http://images-jp.amazon.com/images/P/4894717239.09.MZZZZZZZZZ.jpg
・古い赤本が無料で読める(英語)
http://www.opengl.org/documentation/red_book/ (1.1)
http://www.glprogramming.com/red/ (1.1)
・オレンジ本(シェーダー、GLSLに関して。英語。少しふるい)
Amazon.co.jp: Open Gl Shading Language: Marc Olano, Randi J. Rost, John M. Kessenich, Barthold Lichtenbelt: 洋書
http://www.amazon.co.jp/dp/0321197895
http://images-jp.amazon.com/images/P/0321197895.09.MZZZZZZZZZ.jpg
・Cgの本(Cgを使ったシェーダー入門本)
Amazon.co.jp: 3D‐CGプログラマーのためのリアルタイムシェーダー 理論と実践―「古典的ライティング・モデル」から「グローバル・イルミネーション」まで (I・O BOOKS): 金谷 一朗: 本
http://www.amazon.co.jp/dp/4777510875
http://images-jp.amazon.com/images/P/4777510875.09.MZZZZZZZZZ.jpg
0128デフォルトの名無しさん
2008/10/31(金) 09:30:46具体的にはどの辺をよめばいいんでしょうか?
仕様書?
0129デフォルトの名無しさん
2008/10/31(金) 21:59:21質問があります。
WindowsVistaに対応しているGLUTは存在しないのでしょうか?
また,GLUTが使えない場合は,Win32を使ってプログラムするのが無難でしょうか?
よろしくお願いします。
0130デフォルトの名無しさん
2008/10/31(金) 22:32:38おいらはOpenGLで調べたいことがあったら、まずは仕様書読むようにしている。
仕様書読んでもよくわからんかったらググるか、それもでもわからんだらここで聞けばいいんでない。
>>129
まずはお手元のglutがvistaで動くか試す。
それが駄目ならfreeglut使うとかglfw, gluxとか使ってみてはどうだろうか。
Win32apiの勉強もしたいのなら、glut系のラブライブラリを使わずにやればいいけど
結構大変だと思う。
0131デフォルトの名無しさん
2008/10/31(金) 23:53:27ここで聞いてもよくわからんかったらググるか、それもでもわからんだら仕様書読めばいいんでない。
0132デフォルトの名無しさん
2008/10/31(金) 23:58:500133デフォルトの名無しさん
2008/11/01(土) 00:46:26ありがとうございます。m(_ _)m
やはり、公式にvistaまで対応しているglutは、ないんですかね。
windowsXPまで対応しているglutが動くか試してみます。
0134デフォルトの名無しさん
2008/11/01(土) 16:32:41多分GLUTも動くはず
0135デフォルトの名無しさん
2008/11/02(日) 03:58:37↓
glutがメンテされなくなったので
openglut, freeglut開始
↓
glut互換なapiでは物足りないのでglfw開始
↓
glut系がほとんどメンテされてないのでglux開始←今ここ
↓
??
0136デフォルトの名無しさん
2008/11/02(日) 13:14:30ttp://www-sop.inria.fr/reves/Sylvain.Lefebvre/glux/
・・・と思ったらこっち?Ogreの人らが作ってるのか
ttp://code.google.com/p/glux/
0137デフォルトの名無しさん
2008/11/04(火) 00:56:12単に 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
0138デフォルトの名無しさん
2008/11/05(水) 12:42:13浮動小数点値で色を指定してmビット深度のバッファにレンダリングする場合、
その丸め方について定式化された方法はあるのでしょうか。
灰色(L=0.5)を出そうとするとき、8bitバッファでは127/255になるか128/255になるかは決まっているのでしょうか。
ttp://www.opengl.org/registry/doc/glspec21.20061201.pdf
2.14.9 Final Color Processing
0139デフォルトの名無しさん
2008/11/06(木) 01:24:49大抵は切り捨てで127/255になりそうな気はするが
どうしても一致させたいなら整数テクスチャとか使った方がいいかもな
0140デフォルトの名無しさん
2008/11/06(木) 10:38:59ATIだけ微妙な動作をしたので、
差を吸収するためにCPU側で整数化することにしました。
0141デフォルトの名無しさん
2008/11/06(木) 19:53:570142デフォルトの名無しさん
2008/11/08(土) 00:51:15物体を関数化してくれているライブラリとかありませんか?
0143デフォルトの名無しさん
2008/11/08(土) 13:33:54次のような画像データを直接送ることができるのでしょうか?
RRRRR....
........................
GGGGG....
........................
BBBBB....
........................
0144デフォルトの名無しさん
2008/11/08(土) 18:28:26保存したいのですが、何かよいサンプルとかありますか?
0145デフォルトの名無しさん
2008/11/08(土) 19:35:32・PFD_DRAW_TO_BITMAP
・glReadPixels
・pbuffer拡張
・FBO(Frame Buffer Object)拡張
他にある?
0146デフォルトの名無しさん
2008/11/08(土) 20:03:420147デフォルトの名無しさん
2008/11/08(土) 21:19:41・glReadPixels
・glCopyTex[Sub]Image2D
・pbuffer拡張
・render texture拡張
・FBO(Frame Buffer Object)拡張
・PBO(Pixel Buffer Object)拡張
0148デフォルトの名無しさん
2008/11/08(土) 22:24:430149デフォルトの名無しさん
2008/11/08(土) 22:33:240150デフォルトの名無しさん
2008/11/09(日) 00:37:01PFD_DRAW_TO_BITMAPはWindowsべったりな上にアクセラレーション効かないし、
glReadPixelsはシステムメモリへの転送でCPU喰うしレンダリングパイプライン止まるし、
glCopyTex[Sub]Image2Dもパイプライン止まるしFBからテクスチャへの転送は大抵変換が必要で遅いし、
pbufferは多少古いIntelオンボも対応してるおかげで使える環境は多いけどコンテキスト切り替えとか不便&コスト高いし、
render textureは単にpbufferからテクスチャにコピーせずに済むだけだし、
FBOは比較的最近の環境を仮定するなら決定打だろうけど未だにノートPCだと使えない場合が多いし、
PBOは単にコピーのお手伝い拡張だし。
まぁ、選ぶならFBOだな。
0151デフォルトの名無しさん
2008/11/09(日) 00:52:400152デフォルトの名無しさん
2008/11/09(日) 15:58:50たとえばこんな例。
・オブジェクトは空き缶
・まずは空き缶を3Dオブジェクトとして回転量(Rotated)や視点(LookAt)を指定して
見え方を決める。この結果空き缶を真上から見た絵になったとする
・次にこの「真上から見た空き缶の絵」を「2D一枚絵として」
回転・拡大縮小したい
0153デフォルトの名無しさん
2008/11/09(日) 16:13:130154デフォルトの名無しさん
2008/11/09(日) 16:47:210155デフォルトの名無しさん
2008/11/09(日) 21:07:19自分の理解が足りなくて変な座標変換を間に挟んでいるのだと思います。
セレクションモードとレンダモードの切り替えにおける内部の動作を流れ図で教えてもらえませんか。
0156デフォルトの名無しさん
2008/11/11(火) 12:36:22内部動作とかよくしらんけど、関数呼び出し順序は、
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPickMatrix(...);
gluPerspective(...); or glOrtho(...);
とかしとけば、セレクションうまくいくと思うよ。
はずしてたらすまん。
0157名無し
2008/11/13(木) 13:51:451辺の長さが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を使用したいと考えています。
0158デフォルトの名無しさん
2008/11/13(木) 14:38:55この部分だけがGL的に面白い部分なので、
まずはただの球に衝突判定をつけて作ってみなさい。
0159デフォルトの名無しさん
2008/11/13(木) 14:50:10Fortranだとマングリングを合わせればCの関数も呼べたと思う
まあ調べてみて
0160デフォルトの名無しさん
2008/11/13(木) 15:20:29一見すると親切かつ丁寧な風に見えて、その実は回答の先送り投げっぱなしジャーマン。
宿題丸投げに対するパーフェクトな回答の見本だな。
久しぶりに職人の仕事を見た。
0161デフォルトの名無しさん
2008/11/13(木) 21:41:160162デフォルトの名無しさん
2008/11/14(金) 23:38:040163デフォルトの名無しさん
2008/11/14(金) 23:56:03DXならD3DXVEC3DNORMALIZEとかいうのです
0164デフォルトの名無しさん
2008/11/15(土) 01:19:100165デフォルトの名無しさん
2008/11/15(土) 01:19:160166デフォルトの名無しさん
2008/11/15(土) 01:22:510167デフォルトの名無しさん
2008/11/15(土) 01:24:130168デフォルトの名無しさん
2008/11/15(土) 03:10:09{
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;
}
0169デフォルトの名無しさん
2008/11/15(土) 08:46:24まあ、俺も音鳴らすのにDirectSoundとか使ってるがw
マジレスすると、言語用に大抵、geometry関係のライブラリがフリーのがあるから
それを探してみたらどうかな?
0170デフォルトの名無しさん
2008/11/15(土) 12:46:07信頼性の高い高速なgeometry関係のフリーのライブラリ = D3DX
0171デフォルトの名無しさん
2008/11/15(土) 13:02:480172デフォルトの名無しさん
2008/11/15(土) 13:11:510173172
2008/11/15(土) 17:30:06確かに大体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
0174デフォルトの名無しさん
2008/11/15(土) 18:13:02そのコードだとむしろ遅くなりそうなものだけど・・・
0175デフォルトの名無しさん
2008/11/15(土) 18:40:20そうなんすか?
とりあえず改良できると所あれば指摘してくださいな
0176デフォルトの名無しさん
2008/11/15(土) 18:54:28intrinsic関数で組んでインライン展開できるようにする
ループごと取り込んで関数呼び出しを消す
新しいSSE命令を使う(haddps/dpps)
特に関数呼び出しを消すのが重要。
0177デフォルトの名無しさん
2008/11/15(土) 19:49:49解答ありがとうございます
イントリンシック!そういうのもあるんですな
慣れないアセンブリより楽かも…
SSE3命令はCPUが対応してないから試せそうにありません
オンボロCPU乙ですねハハハ
0178デフォルトの名無しさん
2008/11/16(日) 16:21:32行列スタックでレンダリングしたものを
どのようにしたら色をつけることができますか?
glClearでは線に色が付くだけなってしまいます
0179デフォルトの名無しさん
2008/11/16(日) 16:46:53glClearは画面消去だぞ
glClearじゃなくてglColor4fとかでは?
0180デフォルトの名無しさん
2008/11/16(日) 17:36:47うはぁ、ミスった
glClearじゃなくてglColor3fでした
0181デフォルトの名無しさん
2008/11/16(日) 18:14:33色がついていないのではなく、表示されていないのだろう
PROJECTIONマトリックスが不適切で線に見える部分意外はクリッピングされているのでは
near/farの設定、MODELVIEWとのへの切り替え部分のチェック
0182デフォルトの名無しさん
2008/11/16(日) 21:11:52glGenTexturesでテクスチャを2個作って、
二つのテクスチャを画面に表示しようとしたのですが、
最初に表示したテクスチャが消えてしまいますorz
OpenGLで二つのテクスチャを一度に表示することは可能なのでしょうか?
もしくは、方法を教えていただけないでしょうか。
0183デフォルトの名無しさん
2008/11/16(日) 21:12:21本やサイト読んでもイマイチ分からなくて
日本語下手ですみません
0184デフォルトの名無しさん
2008/11/16(日) 21:26:25glBindTextureの第二引数
0185デフォルトの名無しさん
2008/11/16(日) 21:34:43glColor
まずはlightingをしないで射影変換の正しさを確認して、光源を作るならそのあと
0186デフォルトの名無しさん
2008/11/16(日) 22:05:11ありがとうございます。
一応、glBindTextureの第2引数に別々のテクスチャ名を与えてるのですが、
それでも消えてしまいますorz
どうやら表示するときに消えてるのではなく、
2個目をBindしたときに消えてしまってるみたいです。
(glBindTextureを呼ぶだけで1個目のテクスチャが消えました)
0187デフォルトの名無しさん
2008/11/16(日) 23:14:22カプセル化してかなり忘れてたが、見直してみたら
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, ...);
glBegin(...);
glEnd();
glDisable(GL_TEXTURE_2D);
を逐一繰り返す構造になってた
glPushAttrib, glPopAttrib のテクスチャ関係も参考に
もし関数化してたら、一度関数化してないmainのみのストレートフォワードなテストコードを書くといいかも
カプセル化しない状態で人力コーディングするとスタックの積み下ろしを忘れてることがよくあるから
0188デフォルトの名無しさん
2008/11/17(月) 00:07:07ありがとうございます。
自己解決できました
OpenGLをはじめてほとんど時間が立ってないにもかかわらず、
カプセル化に挑戦したところ行き詰っていました。
原因に関してですが、
ぶっちゃけて簡単に言うと、
glBindTextureでテクスチャを切り替えた際に、
いくつかの設定が初期化されてしまうのと、
モードによって複数のテクスチャを同時に使えなくなってしまうことが原因でした。
0189デフォルトの名無しさん
2008/11/17(月) 09:00:14それだと線にしか色が付かないですよ
書く位置が悪いんですかね?
0190デフォルトの名無しさん
2008/11/17(月) 10:07:49GL_QUADS
0191デフォルトの名無しさん
2008/11/17(月) 11:30:170192デフォルトの名無しさん
2008/11/17(月) 13:38:130193デフォルトの名無しさん
2008/11/17(月) 18:36:330194デフォルトの名無しさん
2008/11/17(月) 18:51:31これしかない
0195デフォルトの名無しさん
2008/11/17(月) 20:17:55Unity3d
0196デフォルトの名無しさん
2008/11/18(火) 15:56:330197デフォルトの名無しさん
2008/11/19(水) 00:23:11見るだけならNVPerfKit入れたりとかして見ることはできる
ATIなら普通にドライバ入れた時点でパフォーマンスカウンタ見れるのかな?
そうでなくどの環境でもプログラムから残り容量取るって話なら大分難しいと思う
0198デフォルトの名無しさん
2008/11/19(水) 12:28:440199デフォルトの名無しさん
2008/11/19(水) 12:49:360200デフォルトの名無しさん
2008/11/19(水) 18:25:030201デフォルトの名無しさん
2008/11/19(水) 23:53:550202デフォルトの名無しさん
2008/11/20(木) 03:41:20IDirect3DDevice9::GetAvailableTextureMem ?
これは、VRAMじゃなくテクスチャに使える容量だお
0203デフォルトの名無しさん
2008/11/20(木) 15:10:06直接アクセスしたいのですが、どうしたらいいでしょうか?
0204デフォルトの名無しさん
2008/11/20(木) 23:27:22DirectDraw::getAvailableTotalMemのことじゃね?
0205デフォルトの名無しさん
2008/11/21(金) 13:12:20テクスチャの中身ってこと?
それは無理なので書き換えるにはglTexSubImage2Dを呼んで下さい
読み出すならglGetTexImage
PixelBufferObjectを使えば比較的高速にやりとりできるはず
>>204
DirectDrawってVistaとかでもちゃんとそれ使えるのか?
Direct3DでエミュレーションとかになっててAvailableTextreMemと同じような気がする
0206デフォルトの名無しさん
2008/11/21(金) 14:09:22glOrtho(-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を変更するところなのですが、
視点の位置、注視点の位置、視野の上方向が毎回変わるので、
できればそれらの設定によらず画像だけの回転を行いたいと思っています。
0207206
2008/11/21(金) 14:12:47glOrtho(-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);
のように変更したところ、ちんちくりんな軸を中心に回転しているようで、
確認したい目標のオブジェクトの形まで変わってしまいます。
上記でまずいところがありましたらご指摘をお願いします。
0208デフォルトの名無しさん
2008/11/21(金) 14:34:38これじゃだめかな?
0210デフォルトの名無しさん
2008/11/22(土) 01:38:06重心座標が(3,4,5)としたらx=3を中心としてy軸周りに回転させるようにとか
0211デフォルトの名無しさん
2008/11/22(土) 01:43:360212デフォルトの名無しさん
2008/11/22(土) 01:50:39メインメモリ側に構造体を保持しておいて、
必要に応じてCPUで平行移動させてからディスプレイリストを作るのもよい
0213デフォルトの名無しさん
2008/11/22(土) 06:45:30glDisable(GL_MULTISAMPLE)で一時的に無効にしようとしてもなぜか効かないんだけど原因わかる人いる?
同じことをD3D9でやったらちゃんと期待通りに動くから
ハードウェアの仕様じゃないみたいだけどよくわからん
0214213
2008/11/22(土) 08:20:37x8以下だとちゃんと機能してx16,x32だと効かないぽい
意味不
0215デフォルトの名無しさん
2008/11/22(土) 12:24:06それはともかく単なるドライバのバグではないかと
暇があったらNVIDIAに文句言ってやるといいかもしれない
0216デフォルトの名無しさん
2008/11/23(日) 11:24:39どうもありがとうございました。
0217デフォルトの名無しさん
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のデータがきちんと透過データとして読み込めていないのでしょうか?
そもそもやり方が間違っているのでしょうか?
もしやり方が間違っている場合、本来どういう方法で実装すべきなのか、
ググるキーワード位でもいいので教えていただけると幸いです。
0218デフォルトの名無しさん
2008/11/25(火) 19:01:58でもこの場合、テクスチャ切り替えて2回描画すればおkな気もする
0220デフォルトの名無しさん
2008/11/27(木) 12:55:35アルファ値つき重ね合わせくらいはCPU側で実装するのも手だな
0221デフォルトの名無しさん
2008/11/27(木) 22:30:59まだテクスチャの基本的な使い方からわかってないみたいだから
床井先生のサイトを見てみるといいと思う
0222デフォルトの名無しさん
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とか知っていたら教えてください。
0223デフォルトの名無しさん
2008/11/30(日) 11:23:46internalformatはそれを元にどんなテクスチャを作るか
を指定するんだよー。
0224デフォルトの名無しさん
2008/12/01(月) 11:05:05glScaleで拡大すると暗くなって、glScaleで縮小すると明るくなります。
法線ベクトルも頂点ベクトルと共に拡大縮小されるのなら、まだわかるのですが、
法線ベクトルだけ逆になっているようでよくわかりません。
これはOpenGLの仕様ということなのでしょうか?
0225デフォルトの名無しさん
2008/12/01(月) 13:59:06例えば物体をX方向だけに2倍拡大するとき、法線も同じようにX方向に2倍拡大したら、向きが変になるでしょう
まぁ何も考えず glEnable(GL_NORMALIZE) しておけばわりと幸せ
0226デフォルトの名無しさん
2008/12/01(月) 14:00:38逆になるのは、たとえば平面をY軸に縮小すると頂点は小さくなるけど、法線ベクトルは起つため
法線は転地逆行列変換(かも)
0227デフォルトの名無しさん
2008/12/01(月) 14:04:49仕様です。
法線ベクトルはモデルビューの逆行列が掛けられます。
仕様書のNormal Transformationのとこに書いてあります。
0228デフォルトの名無しさん
2008/12/01(月) 20:34:28ありがとうございます。
よく考え直したらその通りでしたね。仕様もわかりました。
0229デフォルトの名無しさん
2008/12/02(火) 05:05:36ありがとうございます。
するとinternalformatはglutInitDisplayMode(GLUT_RGB);
で指定した値に矛盾してはいけないという理解でよろしいでしょうか
他に制限事項とかございましたら、ご教授してくださいませ
0230デフォルトの名無しさん
2008/12/02(火) 09:43:080231デフォルトの名無しさん
2008/12/02(火) 21:27:06OpenGLnのmain関数をスレッドで呼び出して使おうと思っているのだが、display()関数のオブジェクトカラーを引数で渡した値で更新したいんだ。
マルチスレッドで値を渡すことはできるのだが、OpenGL側でどうやって、display()関数に値を綿したらいいのかわらかない。
つまり、
プログラム1 --> OpenGLプログラム(スレッドで生成)
▼ ▼
値の更新 色変更
▼ ▼
値の更新 色変更
… …
ってことをしたいんだ。
↑
これはできないのか?
0232デフォルトの名無しさん
2008/12/02(火) 21:30:15グローバル変数使えばいいんじゃね
0233デフォルトの名無しさん
2008/12/02(火) 21:53:32使いたくないんだよ。
0234デフォルトの名無しさん
2008/12/02(火) 22:40:46display()ってGLUTの話?
0235デフォルトの名無しさん
2008/12/02(火) 23:06:09スレッドには、ポインタを引数として渡してる。
それじゃ具合悪い?
>display()・・・のくだり
え?GLUT?おれが使ってるのってOpenGLじゃなかったのか。。。
確かに、ヘッダで、glut.hってのを読み込んでるが、OpenGLとばかり思ってた。
0236デフォルトの名無しさん
2008/12/02(火) 23:31:20GLUTはあくまでglを気軽に使うためのユーティリティだから……
gl関係なくただのスレッド間データ受け渡しの問題だし、
むしろスレッドを管理するAPIについてのスレで聞いた方が良いのではないかな。
0237デフォルトの名無しさん
2008/12/02(火) 23:41:52freeglutやOpenGLUTになるけど。
0238デフォルトの名無しさん
2008/12/02(火) 23:49:31glutDisplayFunc()に渡してやったらダメかな
0239デフォルトの名無しさん
2008/12/03(水) 03:18:45>237
>238
知らない言葉が多すぎるから答えようがないけど、
あがったキーワードをググってみる。
0240デフォルトの名無しさん
2008/12/03(水) 06:09:36>237
>238
239です。
とりあえず、pthread_createの引数で渡したポインタを
glut( ) -> init( ) を経由して、 glutでスコープできる変数に渡す
で、やりたいことができました。
参考になったサンプルに出会うときに、キーワードが役立ちました。ども。
0241217
2008/12/05(金) 17:27:21次に線を引いてみようと思って、テクスチャを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です。
0242デフォルトの名無しさん
2008/12/05(金) 17:44:07・線分描画で頂点配列を変更したあとそのまま三角形を書こうとしてしている
0243デフォルトの名無しさん
2008/12/05(金) 20:29:07テクスチャを貼ったトライアングルでフェードイン表示みたいなことをしたいばあい、どの機能を使えばいいでしょうか?
0244デフォルトの名無しさん
2008/12/05(金) 20:31:18頂点カラーかマテリアルのアルファ要素で何とかなったはずだ
0245241
2008/12/05(金) 23:37:16どうもありがとうございます。
ググってみたところ、一つ目の内容については内容は分かりました。
方法としては、描画と描画の間に glClear(GL_DEPTH_BUFFER_BIT); を挟めばいいんですよね?
ただ、二つ目の点についてはよくわかりませんでした。
ttp://wisdom.sakura.ne.jp/system/opengl/gl9.html
等、頂点配列を変更したあとそのまま描画しているように見えるのですが・・・
飲み込みが悪くてすみません。もう少し教えていただけないでしょうか。
0246242じゃないけど
2008/12/06(土) 00:09:06線分を描画する直前に、glVertexPointerで頂点配列の指定を"vertex"配列に変更してるでしょ?
で、次のフレームを描画するときもずっとその指定が続いてるわけ。
つまりテクスチャ0/1を描画するつもりでglDrawArraysを発行しても、
参照してる頂点配列が"vertex"配列になったままだから、線分と同じ位置に
GL_TRIANGLE_STRIPで描画されちゃってると。
(プログラム見る限り、頂点が一直線だから実際は縮退して描画されないだろうけど)
テクスチャを描く前に、もう一回、テクスチャを描画するための頂点配列を設定するべし。
0247241
2008/12/06(土) 00:25:37vertex配列の上にテクスチャが表示されちゃって線しか出ないってことなんですね。
なんだかまだらで変な色の線だなぁ、バグかなぁと思ってたら、
あれはテクスチャ画像の色が出てたんですね。
やっともやもやが取れました。調べてやってみます。
>>242 さん >>246 さん、どうもありがとうございました。
0248デフォルトの名無しさん
2008/12/06(土) 22:38:52この定数ってどこで配布されてるヘッダに存在するんですか?
0249デフォルトの名無しさん
2008/12/06(土) 22:41:470250デフォルトの名無しさん
2008/12/06(土) 22:45:41あれでもいいし、最新でなくてよいのならglewのでもいい。
0251デフォルトの名無しさん
2008/12/06(土) 23:05:04どうもありがとう。取ってきます。
0252デフォルトの名無しさん
2008/12/07(日) 23:44:04GLの描画処理やらせたら
シングルスレッドでに2画面描画するより速くなるの?
0253デフォルトの名無しさん
2008/12/08(月) 00:00:45セレロンみたいなシングルコアCPUだと同期処理が必要になる分確実に遅くなる
0254デフォルトの名無しさん
2008/12/08(月) 01:18:540255デフォルトの名無しさん
2008/12/08(月) 01:46:220256デフォルトの名無しさん
2008/12/08(月) 08:01:16その場合スレッド毎にコンテキスト作れってNVが言ってた気がする
めんどうにはなるね
0257デフォルトの名無しさん
2008/12/09(火) 03:33:02JavaのOpenGLで、最大化ボタンを押したらフルスクリーン表示するプログラムを作ったんだけれど、
4500MHDの方ではフルスクリーン後も正常に描画されるのに、
GeForceの方ではフルスクリーン後に画面が真白になってしまって描画されません。
真白なのに、キーイベント等は正常で画面内にクリッカブルなボタンとかを作っておけばちゃんとクリックできるし、
第一、エラーが出ないのでどこが問題なのか良く分かりません。
描画している処理自体はきちんと呼び出されているのですが、画面上に表示されていないという感じです。
これってグラボのドライバのせいなんでしょうか?
チップセット内臓のグラボが描画できて、より高性能なはずのGeForceがダメという状況に戸惑ってます。
0258デフォルトの名無しさん
2008/12/09(火) 03:48:480259デフォルトの名無しさん
2008/12/09(火) 03:56:42ChangeDisplaySettingsとか呼ぶ度にコンテキストから全て作り直してる
0260デフォルトの名無しさん
2008/12/09(火) 20:57:37俺も知り合いのノートPC(DELL、geforceかどうか不明)で
フルスクリーン後に画面が真っ黒(多分ウインドウの背景色)になる現象に悩まされてます。
フルスクリーン解除するとまた見えるようになるんだよな。
なぞだ。
DirectXにある >>259 の言うデバイスロストだと、
通常はロスト後はフルスクリーン解除してもロストしたままだったはずなのだが、
うちの問題が起こる環境だと復帰するんだよね・・・。
まあ、一番確実なのは、全て作り直すことなんだろうけど。
時間がなくて試せてない
0261デフォルトの名無しさん
2008/12/09(火) 20:58:47> 通常はロスト後はフルスクリーン解除してもロストしたままだったはずなのだが、
> うちの問題が起こる環境だと復帰するんだよね・・・。
通常はロスト後はフルスクリーン解除してもロストしたままで
フルスクリーンから復帰しても見えないままだったはず。
0262デフォルトの名無しさん
2008/12/09(火) 20:59:58上手く回避できたら報告キボン
0263デフォルトの名無しさん
2008/12/09(火) 21:21:50が不安定なので悩まされた事がある。
それこそフリーズや、フルスクリーン画面がバーコード状態になったり。
サポート出そうにも再現条件がはっきりしないので、半ばムキになって
SpecViewPrefを走らせたま酒飲んで寝たら、翌朝にはもう二度と起動
しなくなっていた。
0264デフォルトの名無しさん
2008/12/10(水) 03:14:02俺も3Dビューアーを作っているんだが、VAIOのGeForce Go 6200 で画面が何も描画されない現象を
最近報告された。フルスクリーンではなく通常表示。
様々なグラボや内臓チップセットで動作確認して問題なかったのに。
原因もまったく思い当たらない。
ドライバ更新くらいしか手がないのだろうか?
0265デフォルトの名無しさん
2008/12/10(水) 03:35:04初期はOpenGLの高負荷時にWindowsの画面がフリーズする
程度だったけど、末期には起動直後のBIOSの段階から緑色の
バーコード模様やピンク色の市松模様とか表示されていたので。
完全に憶測だけど、NVidiaのリコールとの関連かなと思った。
ちなみにSpecViewPerfによってGeForce Goの不具合は再現率
100%になったので(なにせ起動しない)、はれてVAIOはサポセン
行き->マザボ交換(無償)となったのでした。
保証が切れるギリギリだったので結構やばかったです。
0266257
2008/12/10(水) 04:02:59gl.getError()しても、エラー無いみたいなんですよねぇ・・・。
>> 259
はい、僕もコンテキストから作り直してるんですが、ウィンドウをフルスクリーンモードにすると何故か真白に・・・。
謎です・・・。
フルスクリーンモードに切り替えた後にコンテキストを作り直してるのですが・・・。
GraphicsDevice#setFullScreenWindow(Window w)を呼び出すと真白現象になっちゃいます・・・。
>> 260
同じ現象っぽいですね・・・。
フルスクリーンモードにして真白の状態の後、フルスクリーン解除してウィンドウ画面にしたら描画も復帰します。
>> 263
うーむ。GeForceのモバイル用はOpenGLに弱いのでしょうか・・・。
0267260
2008/12/10(水) 08:12:09しかし、そっちはコンテキストから作り直しているんだね。
そちらもウインドウにもどしたら復帰するとすると同じ現象か。
あ、あと 安価する時は、>>258 みたいにスペースいれないでくれ頼む
0268デフォルトの名無しさん
2008/12/16(火) 00:14:51windowsプログラミングのGetAsyncKeyState('J') 的な。
0269デフォルトの名無しさん
2008/12/16(火) 00:18:41その場合にメインループとコールバック関数でフラグ変数に対して競合がおきるなどの問題はありますでしょうか
0270デフォルトの名無しさん
2008/12/16(火) 00:35:430271デフォルトの名無しさん
2008/12/16(火) 01:29:510272デフォルトの名無しさん
2008/12/16(火) 01:33:010273デフォルトの名無しさん
2008/12/16(火) 01:33:120274デフォルトの名無しさん
2008/12/16(火) 10:20:22OpenGLは、グラフィックスハードウェアに対して描画命令を発行する以外のことは
本当に何一つできませんよ。キー入力はもちろん、ベクトルや行列の計算だって
自前で(あるいは他の何らかの手段で)やる必要があります。
OpenGLに全く関係の無い話題である以上、ここで質問しても期待される答えが
帰ってくる可能性は低いかと。Linuxのスレなりなんなり、適切な場へ移動した方が
良いのではないでしょうか。
てか、それくらい、ぐぐればいくらでも答えが引っ掛かりそうなもんですが・・・。
0275デフォルトの名無しさん
2008/12/16(火) 15:57:16PBOやFBOについても学びたいです。
0276デフォルトの名無しさん
2008/12/16(火) 17:25:41床井先生のとことかかな。
0277デフォルトの名無しさん
2008/12/16(火) 18:20:160278デフォルトの名無しさん
2008/12/16(火) 22:34:02ライティングを有効にした場合はどのように設定するのでしょうか?
いままでライティングを無効にしていたプログラムではglColor系の関数で色を付けていたのですが、
これではライティングした際に色が抜けてしまうようなので、何かしらの方法で色を付けたいと思うのですが
0279デフォルトの名無しさん
2008/12/16(火) 22:35:110280デフォルトの名無しさん
2008/12/17(水) 22:07:59http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html
これかな?なかなかよいまとめですね
スクリーンショットがもっとあったらもっとよかった
0281デフォルトの名無しさん
2008/12/17(水) 22:19:55ttp://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040321
にあるqrot(rt, tq);の逆向きの変換がしたいんですが、どうしたらいいんでしょうか?
0282デフォルトの名無しさん
2008/12/17(水) 23:36:590283デフォルトの名無しさん
2008/12/21(日) 11:37:19glutを使わずにWin32APIを使うメリットはありますか?
0284デフォルトの名無しさん
2008/12/21(日) 12:14:31勉強中ならそこまで必要ないだろうし、GLUTでいいんじゃない?
Win32APIを使うのは、Win32APIじゃないとできないことをやりたくなってからで十分かと。
てかGL以外に考えるべきことを増やすのはかえって良くないと思う。
やりたいことに集中して、他の事はシンプルに済まそう。
0285デフォルトの名無しさん
2008/12/21(日) 22:29:40#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' の宣言を確認してください。
0286デフォルトの名無しさん
2008/12/21(日) 23:01:47「error C2381 exit」でググってみたら
0287デフォルトの名無しさん
2008/12/22(月) 01:24:41OpenGLでは各色の値の範囲が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の範囲
全体が張られているのでテクスチャ座標がずれてるわけでもないみたいです。
上の式で得られたレンダリング結果↓
http://www3.uploda.org/uporg1873748.png
0288デフォルトの名無しさん
2008/12/22(月) 11:45:510289デフォルトの名無しさん
2008/12/22(月) 11:47:070290デフォルトの名無しさん
2008/12/22(月) 23:32:44普通は、リニアに対応するはずだけど。
レンダリング結果が見れないので、もう一度うpぷりーず!
(できればついでにソースも。)
0291デフォルトの名無しさん
2008/12/23(火) 05:11:390292デフォルトの名無しさん
2008/12/23(火) 20:06:55立方体があって、(0,0,10)を回転中心にして回転させたいのですが、どうすればよいのでしょうか?
for(;;){
glTranslatef(0,0,-10);// 原点に移動
glRotatef(10,1,0,0); // X軸を中心に回転
glTranslatef(0,0,10);// 元に戻す
draw();
}
とするとどんどんY座標がずれてきます。これを計算で戻すか、
使い方が悪いのか教えてください。
0293デフォルトの名無しさん
2008/12/23(火) 20:40:070294デフォルトの名無しさん
2008/12/23(火) 20:52:49持っていってないですか? わかっていません。
0295デフォルトの名無しさん
2008/12/23(火) 20:59:44ループの最初で座標を初期化せい
0296デフォルトの名無しさん
2008/12/23(火) 21:28:321回転による座標系のずれを計算して、そのずれ分移動して元の位置関係に
あわせるということでしょうか?
それは計算しなければなりませんか? 関数はないでしょうか?
0297デフォルトの名無しさん
2008/12/23(火) 22:36:48俺も勉強し始めたばかりでよく知らないんだけど、これとかどうよ?
0298デフォルトの名無しさん
2008/12/23(火) 23:21:39(なにかまちがっていますかね。。)
0299デフォルトの名無しさん
2008/12/24(水) 00:07:32MAXで作ったアニメーションデータをOpenGLESで読み込んで動かしたいのですが、
調べたところCOLLADAがありましたが、C++のコードなんです。
組込み系でC++に対応していないため、C言語がいいんですけれども
何か解決案をご存知の方いますでしょうか?
おかしなこといってたらすいません・・・
0300デフォルトの名無しさん
2008/12/24(水) 00:31:28・座標変換は座標(縦ベクトル)に左から変換行列を掛ける
・変換行列の操作は右から行列を掛ける
0301デフォルトの名無しさん
2008/12/24(水) 01:08:54glPushMatrix();
glTranslatef(0,0,-10);
glRotatef(10.0 * n, 1,0,0);
glTranslatef(0,0,10);
draw();
glPopMatrix();
とかは?
0302デフォルトの名無しさん
2008/12/24(水) 01:53:14C++でCOLLADAからカスタムフォーマットを吐くものを作って、
カスタムフォーマットを再生するものはCで作る。
C++をCでラップしてもいいけど、XMLをそのまま扱うのは重いので
組み込みならなおさら事前に変換する方がよろしいかと。
0303デフォルトの名無しさん
2008/12/24(水) 02:49:08それ以前の問題で、変換前の座標を p、変換行列を上から M1, M2, M3 とすると、
変換後の座標は
p' = M1 M2 M3 p
になるんだってば
0304デフォルトの名無しさん
2008/12/24(水) 22:23:16その言い方じゃ、分かって貰えないんじゃないだろうか・・・。
>>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()を使ってもいいよ!)
0305デフォルトの名無しさん
2008/12/24(水) 22:31:25それはちょっと難しそうだなー・・・。
仕事でやるなら、Mascot Capsule とかの、既存の3Dエンジンを利用することを考えたほうがいいと思う。
(そもそもMAXでないといけないのかとか、ワークフローの最初から考え直した方が。)
趣味でやるなら、302の方法を支持します。
勉強することすごく多くて大変だけどねー。楽しいよねー。
・・・てか、組み込み系とはいえ、3Dモデルのアニメーションをさせるような分野で
C++が使えない!?というのがまず信じられないという心持ちですよ。
0306デフォルトの名無しさん
2008/12/24(水) 22:52:370307デフォルトの名無しさん
2008/12/25(木) 00:14:38レスありがとうございます
そういう考え方がありますね!頭が固いもので考えつかなかったです汗
libxmlやらCG言語やら絡んでてややこしいっす。ここらへんはあんまり見ないで
データ保持しているドキュメントクラスだけ見ればいいのかもしれないですが
とりあえず挑戦してみます!
あと、ドローソフトで作った頂点座標などのデータをOpenGLに
ドンと投げて楽して描画したいだけなんで、
MAXじゃないとだめってこともないですが、普及率が高い分、拡張性も高くて
3dsファイルはデータの損失が少ないなどの話も聞いたもので。
まだ歴史が浅い分野なもので手探り状態っす
Mascot Capsuleなんてものがあるんですね。導入できるのか分からないですが
もうちょっと調べてみます
0308デフォルトの名無しさん
2008/12/25(木) 17:36:29トライアングルの1頂点が画面の外に出ると光源計算してくれないって現象で困ってます.
アンビエントは入るのですが,はみ出した頂点だけでは無く,トライアングル全体が暗くなります.
GL_TRIANGLE_FANでもGL_TRIANGLE_STRIPでも同じ症状です.
3つの頂点全部が画面内に入ると計算してくれます.
何かヒントになる事でも結構ですのでアレじゃね?みたいなのがあればお願いします.
0309デフォルトの名無しさん
2008/12/25(木) 20:07:110310デフォルトの名無しさん
2008/12/25(木) 20:32:10サンプルには光使ってるの無いし,もしかして出来ないなんて事有るんすかね?
0311デフォルトの名無しさん
2008/12/25(木) 21:15:23出来れば日本語のをお願いします。
・glutの最新版ってバージョンいくつですか?今3.7.6が入っています。
0312デフォルトの名無しさん
2008/12/25(木) 21:39:44glutはfreeglutの2.6がそろそろでようとしている模様。
0313デフォルトの名無しさん
2008/12/25(木) 22:15:530314311
2008/12/25(木) 23:50:45ありがとうございます。ドキュメントは英語で我慢します・・。
glutのバージョンを訊いたのは
ttp://wisdom.sakura.ne.jp/system/opengl/gl23.html
の一番上にあるプログラムが動かなかったからです。
何故かテクスチャが貼られず、白いままになってしまいます。なぜでしょうか?
freeglutの2.4に変えてみても同じでした。
他のOpenGLを使うアプリケーションは普通に動作します。
0315デフォルトの名無しさん
2008/12/26(金) 00:02:05>GL_TEXTURE_2D , 0 , 3 , TEXSIZE , TEXSIZE ,
>0 , GL_RGB , GL_UNSIGNED_BYTE , bits
>);
3番目の引数を3からGL_RGBに変えて味噌
0316デフォルトの名無しさん
2008/12/26(金) 11:00:02もうちっとでiPhone SDKが入るマシンが来るので来たら試してみるわ
ってか、シミュレータの不具合の可能性があるかも知れん。実機で再現するか確かめてみ。
シミュレータのバグと確定した場合はバグレポしておいて。
0317デフォルトの名無しさん
2008/12/26(金) 17:00:28個人的にはやはり「赤本」がベスト。
手元に一冊あると便利で勉強にもなるけど、高いよね・・・
0318デフォルトの名無しさん
2008/12/26(金) 22:00:57関数のドキュメントとしては青本の方がいいんじゃないか?
そういえば前スレに日本語manのリンクがあったけど
今見たらgluとglXのものしかないな…
0319デフォルトの名無しさん
2008/12/26(金) 22:09:520320デフォルトの名無しさん
2008/12/27(土) 17:19:01リリースビルドするとカタカタ動く。
原因は初期化忘れとかあるみたいだけど、こういうの経験ない?
原因はなんですか?
0321デフォルトの名無しさん
2008/12/27(土) 18:17:130322デフォルトの名無しさん
2008/12/27(土) 20:06:27ただ回転させてるだけの処理でリリースはカクカクする。
初期化忘れはない・・と思ってるけど。あるのかな。
0323311
2008/12/27(土) 22:40:13GL_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
0324311
2008/12/27(土) 22:50:23入れ忘れあったのでビルドできません・・
CTextureRenderer.cppとmain.cppだけ見てください
0325デフォルトの名無しさん
2008/12/27(土) 22:51:17環境によってはミップマップを設定しないとテクスチャが表示されない
0326デフォルトの名無しさん
2008/12/27(土) 23:44:45>ポリゴンの描画を行う前にglTexSubImage2Dで更新していますが
>負荷が大きいようです。
普通にテクスチャ更新すりゃいいだろ。なんで無駄なコピーやっているんだ?
0327デフォルトの名無しさん
2008/12/27(土) 23:47:430328デフォルトの名無しさん
2008/12/27(土) 23:54:03glTexSubImage2D(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が
0329デフォルトの名無しさん
2008/12/27(土) 23:56:34スレッド違いで失敗してるんでね?サンプルごとキューにでも投げてGLのスレッドで処理するようしとくとか。
こんな基本的な事は承知だったらすまね。
0330デフォルトの名無しさん
2008/12/28(日) 03:45:51テクスチャーサイズが2のn乗になってないが、大丈夫なのか?
0331330
2008/12/28(日) 04:11:42呼ぶタイミングを見ようと思ったら、DoRenderSample()を呼び出している
箇所が見つからない。どうなってる?
0332デフォルトの名無しさん
2008/12/28(日) 14:11:09「自由に使って欲しいからGPLじゃなくてLGPLにしたんだぜ」
って書いてあったけど、これだと全然自由じゃないよな?
LGPLって動的リンクならゆるいけど、静的リンクだとソース公開だったよな
俺が勘違いしてるのか?
0333デフォルトの名無しさん
2008/12/28(日) 14:40:100334デフォルトの名無しさん
2008/12/28(日) 15:00:31中身読んでないから知らんが
ttp://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License
0335デフォルトの名無しさん
2008/12/28(日) 20:01:22俺が望んでいること
→Gluxをライブラリとして使いたいが、全ソース公開は勘弁して欲しい
公式には「自由に使える」と書いてあるが、LGPLなのであまり自由ではない(詳細は下記)
LGPLのソース公開条件
→動的リンク(*.dll)ならソース公開は不要だが、リバースエンジニアリングを許可する必要がある
静的リンク(*.libとか*.a)ならソース and/or オブジェクトファイルの公開が必要
んで俺が試してみたところ、DLL化は無理だった(ライブラリ内にmain関数への参照があるから)
要するに静的リンクするしかないので、ソース公開は避けられないんじゃないか?
というのが問題なんだ
0336デフォルトの名無しさん
2008/12/28(日) 23:33:320337デフォルトの名無しさん
2008/12/29(月) 00:26:23つまりオブジェクトファイルだけ公開すれば良いんだ
0338デフォルトの名無しさん
2008/12/29(月) 01:02:270339デフォルトの名無しさん
2008/12/29(月) 01:12:16軽くソースを読んでみただけなので不適当なところがあっても勘弁して下さい。
概略は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となりますから、これを動的リンクするプログラムの
ソースを公開する必要は無くなるはずです。
0340デフォルトの名無しさん
2008/12/29(月) 01:36:59ttp://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なライセンス。
0341デフォルトの名無しさん
2008/12/29(月) 11:05:45細かいレスありがとう
大体そんな感じでやったら出来たよ
数行程度の修正で間に合った
サンプルコードを元に改造していったんだけど
エラーが出ると予告無しに終了するって仕様のせいで時間がかかったわ
>>340
LGPL v2.1って明記されてるんだけど、そういう場合でも
v3だと読みかえていいのか?
0342デフォルトの名無しさん
2008/12/29(月) 13:10:05> 「glux使いました」と書いてgluxの入手先を明示しておけばおkなライセンス。
全然違う。
>>341
よくない。
またLGPLとGPLでもソース配布についての規定は少し違う。
gluxを同梱するか、自分のソフトと同じダウンロード場所から自分で配布する必要がある。
0343311
2008/12/29(月) 21:22:242のn乗でないテクスチャはうちの環境ではサポートされています。
>>331
レンダラーフィルタとしてグラフに挿入すれば
後はDoRenderSample()を呼ぶのはDirectShowが勝手にやってくれるみたいです。
>>329
初めて知りました。OpenGL使い始めて長くないので・・
どんなプログラムを書けば実現できるのでしょうか?
「OpenGL マルチスレッド」でググってみましたが、よく分かりません。
0344デフォルトの名無しさん
2008/12/29(月) 21:57:13DirectShowのコードは別スレッドで実行されてるだろ?
0345デフォルトの名無しさん
2008/12/29(月) 23:34:33どんな関数とかを使えば?
0346デフォルトの名無しさん
2008/12/30(火) 00:02:07Expressだとスレッドは確認できなかったかな。というかExpressはデバッグ機能は貧弱すぎて使い物にならん。
スレッド間でデータを受け渡しする機構なんかは適当にやれ。マルチスレッドを理解していれば簡単だろう。
0347デフォルトの名無しさん
2008/12/30(火) 00:05:13そんだけ
0348デフォルトの名無しさん
2008/12/30(火) 01:40:440349デフォルトの名無しさん
2008/12/30(火) 07:55:00今ならどう書く?
0350デフォルトの名無しさん
2008/12/30(火) 12:28:05別スレッドから OpenGL API を呼んでも問題ないと思うんだけど。
0351デフォルトの名無しさん
2008/12/30(火) 13:34:11排他制御してもうまくいかないと思う。
0352デフォルトの名無しさん
2008/12/30(火) 16:52:56ウインドウが1つならスレッドが違ってもデバイスコンテキストは同じじゃね?
0353デフォルトの名無しさん
2008/12/30(火) 17:30:330354デフォルトの名無しさん
2008/12/30(火) 18:44:350355デフォルトの名無しさん
2008/12/30(火) 21:53:42あ〜あ…
0356デフォルトの名無しさん
2008/12/30(火) 22:02:070357デフォルトの名無しさん
2008/12/31(水) 08:27:420358デフォルトの名無しさん
2008/12/31(水) 16:16:52プログラマとして、その考え方は危険だろ。
「たまたまうまくいってた」だけ、ってのが往々にしてあるし。
特にOpenGLは。
……ええ、こないだそれで長時間悩むハメになりましたさ。
0359311
2008/12/31(水) 22:59:28使っているのはVisual C++ 2008 Express Editionです。
・・・コンテキスト?
wglCopyContextを使えばいいんでしょうか?
0360デフォルトの名無しさん
2008/12/31(水) 23:11:020361デフォルトの名無しさん
2009/01/01(木) 18:23:350362デフォルトの名無しさん
2009/01/02(金) 01:44:29そう表現すると、やけに少なそうに見えるな。焦燥感を煽るにはいいかも知れん。
0363デフォルトの名無しさん
2009/01/02(金) 15:28:56あのゲームやこのゲームで数百時間浪費することがいかに愚かか実感しました
0364デフォルトの名無しさん
2009/01/02(金) 15:37:41がんばろうな。
0365311
2009/01/02(金) 21:45:35コンテキストをコピーしてみましたが、駄目でした・・
・Windows SDK
・Active Template Library
・GLUT
・Irrlichtのinclude
ビルドするのにこれらが要ります。
0366デフォルトの名無しさん
2009/01/02(金) 21:48:390367デフォルトの名無しさん
2009/01/02(金) 22:04:50後学のためにやってるなら止めないが
0368デフォルトの名無しさん
2009/01/02(金) 22:58:02諦めんなよ、お前!!
どうしてそこでやめるんだ、そこで!!
もう少し頑張ってみろよ!
ダメダメダメダメ、諦めたら
周りのこと思えよ、応援してる人たちのこと思ってみろって。
あともうちょっとのところなんだから。
俺だってこのマイナス10度のところ、しじみが取れるって頑張ってんだよ!
ずっとやってみろ!必ず目標を達成できる!
だからこそNever Give Up!!
0369311
2009/01/02(金) 23:27:13それ以前にこの方法が使えるのかどうか分かりませんが
wglCopyContext(OrigCt, CopyCt, GL_ALL_ATTRIB_BITS)
0370デフォルトの名無しさん
2009/01/03(土) 01:37:240371デフォルトの名無しさん
2009/01/03(土) 03:14:15memcpy使う代わりにメインスレッドと同期を取ってコピー元のポインタを投げてやる、ってのを思いついた
ちゃんと動くかわからんけど試してみる気も無いw
0372デフォルトの名無しさん
2009/01/03(土) 22:27:09まずはVS std以上を買ってちゃんと勉強すべきだ。
お年玉貰っただろ?
0373デフォルトの名無しさん
2009/01/03(土) 23:26:15ttp://support.microsoft.com/kb/128122
ttp://support.microsoft.com/kb/128122/ja
0374デフォルトの名無しさん
2009/01/03(土) 23:52:09お前も死ねw
0375デフォルトの名無しさん
2009/01/04(日) 03:27:54glHogehoge()を呼べばいいんでしょ
0376デフォルトの名無しさん
2009/01/04(日) 12:07:25うん、たしかに参考にならないwww
0377デフォルトの名無しさん
2009/01/04(日) 12:18:250378311
2009/01/04(日) 22:31:35せいでした・・>>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()の外でテクスチャへの書き込み処理をしたらいかんのか
0379デフォルトの名無しさん
2009/01/05(月) 00:53:34マウスとかでグリグリしていろんな方向から見えるようにしたいなと考えています。
毎フレーム画像を取得して、描画するのは1度きりなので、テクスチャに読み込まなくても、
glDrawPixelsでいいかなって思ってやっていたのですが、不具合が生じます。
とりあえず、glFrustumで視錐体を設定して、glMultMatrixで変換して、
glDrawPixelsで表示するという感じでやってみています。
そうすると、どんな位置に変換してみても表示する画像がウィンドウいっぱいに表示されて
マウスでグリグリして、姿勢を換えるとかができません。
とりあえず、できていると確認しているのは
�@ウィンドウいっぱいならglDrawPixelsで表示できる
�Aキューブとかオブジェクトなら求める位置に表示することができ、
マウスでグリグリする部分は完成している。
ということです。
glDrawPixels付近に問題があるのだと思うのですが、これって適当に四角形作って、
そこにテクスチャみたく貼りつけて表示しているのではないのかな?
そもそも3次元上で表示するってのは無理な関数なのかな?
って感じでわからないことが多いです。
テクスチャで読み込めばいいんですけど、画像サイズがVGAサイズなのでめんどいとか、
毎回読み込むのでメリットなかったりとかあって、使うのは微妙なんですがいい方法ないでしょうか?
参考になるサイトとかでも教えていただけるとありがたいです。
0380デフォルトの名無しさん
2009/01/05(月) 01:26:52昔スプライトっぽくglDrawPixelsで描画しようと試行錯誤した経験があるのだが、シェーダーとか色々影響した。
なので、glDrawPixels前にステートやシェーダーの設定をし直す必要がある。
ちなみに画像表示するならテクスチャでやるのがパフォーマンスがよい。
0381デフォルトの名無しさん
2009/01/06(火) 12:20:53マルチポストのようですみませんがここでもう一度質問させてください。
iPhoneに載っているバージョンのOpenGL ESではGL_LINE_SMOOTHが利かないようなんですが、
ttp://discussions.apple.com/thread.jspa?threadID=1611394&tstart=120
この場合アンチエイリアスをかけるにはどうすればいいんでしょうか?
他に、座標点列をペシェ曲線みたいに補完してくれるライブラリとかがあったらそっちも教えていただきたいです。
よろしくお願いします。
0382デフォルトの名無しさん
2009/01/06(火) 19:55:33初歩的な質問ですみませんが、
・法線情報(ノーマライズ済み)
・原点からの距離
の二つの情報から効率的に平面を描画させる方法はありませんでしょうか?大きさは適当です。
法線から直交する2ベクトルを計算して平面状の適当な4頂点を生成して…とかやっていたのですが、0の例外処理とかがややこしくなり、スマートにいきません。
環境は
WindowsVista
c++
glut
です。
よろしくお願いいたします。
0383デフォルトの名無しさん
2009/01/06(火) 23:35:48Z軸に垂直で距離Lの平面を描く4点(?,?,L)をZ軸をNに変換する行列で変換すればいい
(0,0,1)とN(a,b,c)との外積T,NとTの外積B
TとBを正規化してT,B,Nで3x3の行列を作って4点を変換するといいかも
0384デフォルトの名無しさん
2009/01/07(水) 23:47:10「効率的に」の意味が分からないけど。
法線をN、原点からの距離をdとすると・・・
Nとx軸の外積を求めて正規化→Bベクトルとする
NとBの外積を求めて正規化→Tベクトルとする
って作っておけば、位置dNを平面の原点として、BとTで
好きなだけ平面を張れるよ。
ただ、Nがx軸と平行な時(平行に近い時)は、x軸の代わりにy軸を使うとか
みたいな場合分けが必要になるけど。
って、結局、言ってる事は382,383と変わらないなこりゃ。
「0の例外処理」って何だろう?
・Nを球面上で連続に動かした時、平面を張る二つのベクトルも連続して動く
・Nを決めたとき、平面を張る二つのベクトルは一意に決まる
の二つを同時に満たすことは不可能だから、不連続な関数でも使わない限りは
何らかの場合分けが必ず必要になるよ。
0385デフォルトの名無しさん
2009/01/07(水) 23:49:59もう寝る!
0386デフォルトの名無しさん
2009/01/09(金) 15:37:013Dではなく2D用として作ってるんですが、
2Dの描画したオブジェクト同士が重なっているかを調べる
ようないい方法はあるんでしょうか?
やはり、自力で重なっているか(衝突しているか)を
調べないとだめですよね?
0387デフォルトの名無しさん
2009/01/09(金) 15:44:33「ピックアップ OpenGL」でググると良いよ
0388デフォルトの名無しさん
2009/01/09(金) 16:37:42なんか難しそうだけどやってみます!
サンクスです!
0389デフォルトの名無しさん
2009/01/09(金) 18:07:10悉皆判定したいので実は向かないと予想
0390デフォルトの名無しさん
2009/01/09(金) 18:38:33だいたいピックアップの概要は分かったんですが
これって、回転してない矩形領域に対しての判定なので
重なり判定したいオブジェクトが回転してない状態に全体を
回転させて判断しないとだめですよね?
>> 389
どういう意味ですか?
0391デフォルトの名無しさん
2009/01/09(金) 19:04:31ああそうか、ある部位で重複があるかを調べるんじゃなくて、
どこが重なってるかを調べるのでは向かないか。
>>390
? 回転?
0392デフォルトの名無しさん
2009/01/11(日) 14:39:58ピックアップって特定の矩形(回転なし)の部分にある
オブジェクトを取得できますよね。
調べたいのは矩形A(回転あり)と矩形B(回転あり)が
重なっているかどうかなんです。
なので、ピックアップを矩形Aに合わせて回転させて調べる
ということかなと思ったんです。
0393386
2009/01/12(月) 18:57:20セレクションがそもそもないですね。。。
やっぱりスクリーン座標から実際に計算しないとダメな気がしました。
0394デフォルトの名無しさん
2009/01/13(火) 13:45:46TBitmapに描画しようと思ったら激遅らしいし、
BitBltじゃディスプレイ解像度よりあげられないしで、
正直どうしようか迷ってる・・・
0395デフォルトの名無しさん
2009/01/13(火) 18:54:230397デフォルトの名無しさん
2009/01/13(火) 20:41:390399デフォルトの名無しさん
2009/01/13(火) 22:40:480400デフォルトの名無しさん
2009/01/13(火) 23:00:570401デフォルトの名無しさん
2009/01/14(水) 00:17:41パースがあるとか関係ないよ簡単だよ。
>>399
FBOだと結局解像度の制限があるよ。
領域分割に対して何も利点無さそうだけど、ジッタドレンダリングした後に
ピクセルを組み替えてもいいかもね。
あ、それだとMIPMAPのレベルが適切にならないか・・・。
0402デフォルトの名無しさん
2009/01/14(水) 00:43:06d3dだと範囲外を指定するとレンダリングされないんで勘違いしてた
0403デフォルトの名無しさん
2009/01/14(水) 01:09:400404デフォルトの名無しさん
2009/01/14(水) 20:16:52スペックの低いモバイルマシンだと線が増えてくるとラグくなってきます。
画面更新毎に全ての線を描画し直しているのが問題だと思うのですが、
過去に引いた線はテクスチャとして残しておいて、
一気に書き込んでしまうというようなことはどうすればできるのでしょうか?
0405デフォルトの名無しさん
2009/01/14(水) 20:43:42FBOでググレカス
0406デフォルトの名無しさん
2009/01/14(水) 23:53:25なんでわざわざOPENGLでやろうと思ったんだ?
要はペイントでいいわけだろ?
0407デフォルトの名無しさん
2009/01/15(木) 00:36:20ピクセルごとの細かい制御をしようとすると難しいけど、シェーダ前提なら色々できるし。
>>404
で、405も言ってるけど、FrameBufferObjectというのを使うといいです。
※→FBOに(追加で)描画→画面をクリアした後、FBOの内容を画面に描画→※に戻る
一番単純に考えると、単に画面をクリアするのをやめて、シングルバッファで重ね描きしていけば
いいんだけど・・・VISTAとかみたいなスマートな画面ドライバモデルじゃないと、重なったウィンドウに
内容を破壊されちゃうかな。
0408デフォルトの名無しさん
2009/01/15(木) 00:56:130409デフォルトの名無しさん
2009/01/15(木) 02:24:57iPhone/iPod touch以外にあるんかいな
0410デフォルトの名無しさん
2009/01/15(木) 20:35:37変更可能な矩形を描画しようとしてるんですが、
矩形内の色が白に塗り潰されてしまいます。
枠だけ描画というのはどうやったらできるんでしょうか。
画像はrawで、OpenGLで描画されています。
OpenGLを使わずに描画したビットマップ上では枠だけ描画されたので、
OpenGLの問題かと思いこちらで質問させていただきました。
0411デフォルトの名無しさん
2009/01/15(木) 23:04:22エスパーじゃないんだから「お前の使い方が悪い」としか言えんぞ
0412デフォルトの名無しさん
2009/01/16(金) 01:09:210413デフォルトの名無しさん
2009/01/16(金) 04:00:14塗りつぶされるのは、ポリゴンになってるからだ
矩形の枠だけなら、ラインで引いたほうがいいと思う
0414デフォルトの名無しさん
2009/01/16(金) 09:49:00OpenGLの描画の上にGDIで描画しちゃダメ
枠線もOpenGLで描いてください
0415410
2009/01/16(金) 13:49:20コメントありがとうございます。
ソースはこちらにうpしました。
ttp://www1.axfc.net/uploader/File/so/16918
DrawOpenGL()で画像の描画、InitializeOpenGL()で矩形の初期化(m_tracker)、
OnDraw()で矩形の描画の処理で
右クリックで矩形の描画、左ドラッグでトラッキングを行えるようにしています。
OpenGLでCRectTrackerと同様の機能のものを作るのは難しいでしょうか。
0416デフォルトの名無しさん
2009/01/17(土) 05:16:560418デフォルトの名無しさん
2009/01/18(日) 13:58:02NULL_BRUSH選択してから矩形かいてみ。
0419デフォルトの名無しさん
2009/01/18(日) 19:33:36OpenGLで描くなら普通にGL_LINESなんかで線描いてglBlendFuncで描画先反転させるかな
0420デフォルトの名無しさん
2009/01/21(水) 01:28:06ぬりぬりするためには、どうしたらいいのでしょうか、
セレクションバッファ使えばできるような気がするけど、
塗り塗りしてるようなサンプルとかってどこかにないですかね、
よろしくおねがいします。
0421デフォルトの名無しさん
2009/01/22(木) 13:20:32glGetTexLevelParameteriv( ... GL_TEXTURE_INTERNAL_FORMAT ... ) が返す値は
必ず一致するでしょうか?
0422デフォルトの名無しさん
2009/01/23(金) 06:38:450423デフォルトの名無しさん
2009/01/27(火) 23:43:141.
ポリゴンをframebufferに描画し
それをglReadPixelsで配列に読み込む
2.
新しくテクスチャを作って
今読み込んだ配列をglTexImage2Dで関連付ける
んでためしにそのテクスチャでテクスチャマッピングすると
真っ白になるんだけどなぜ?
真っ白というか正確には最後にglColorで設定した値になる
glTexParameterとかglTexEnvfは2でglTexImage2Dの前に設定してるんだけど・・・
読み込んだ配列の中身を書き出してみたら
一応期待した通りの値が入ってるんだ。わけわかめ
0424デフォルトの名無しさん
2009/01/28(水) 00:00:31普通にファイルから読んだデータで2.からやってみるとかで確認してみれば
0425デフォルトの名無しさん
2009/01/28(水) 00:06:53TexGenをEnableにしっぱなしだったとか
0426デフォルトの名無しさん
2009/01/30(金) 10:36:17視点変更をした際に,対象物が視野から外れてるかどうかを判定したいのですが….
0427デフォルトの名無しさん
2009/01/30(金) 16:48:33例えば3Dモデルのハエを画面じゅう飛び回らせたり
0428デフォルトの名無しさん
2009/01/30(金) 17:26:450429デフォルトの名無しさん
2009/01/30(金) 17:34:52groachなんてあるんだな。
0430デフォルトの名無しさん
2009/01/30(金) 19:07:03始点から終点に書けてαブレンド値を下げて、透明になっていくような曲線を書きたいのですが、
そういった関数はOpenGLで用意されているでしょうか?
0431デフォルトの名無しさん
2009/01/30(金) 21:03:350432デフォルトの名無しさん
2009/01/30(金) 23:51:53VRAMにCPUから直接かけるの?
0433デフォルトの名無しさん
2009/01/31(土) 00:15:50で、FBOのほうがパフォーマンスいいよっと。使いやすいし。
0434デフォルトの名無しさん
2009/01/31(土) 01:27:48gluUnproject()をうまく使えばなんとかなる?
>>430
曲線は書けないので細かい直線をつなげていくしか。
0435427
2009/01/31(土) 19:09:270436デフォルトの名無しさん
2009/02/01(日) 17:56:44WindowsXP Intel865G環境で、OpenGLのスクリーンセーバーを使用したいと考えています。
しかしながら、スクリーンセーバーとしてはあまりに重く、カクカク状態です。
通常の実行ファイルとして実行した場合(拡張子.exeに変更、/s起動)は、ある程度高速に動作します。
Windowsのスクリーンセーバー起動の場合は、OpenGLが有効にならないバグ等あるのでしょうか?
原因をご存じの方が、いらっしゃいましたらお答えいただけると幸いです。
0437デフォルトの名無しさん
2009/02/01(日) 18:33:350438デフォルトの名無しさん
2009/02/01(日) 21:03:37Windows環境でOpenGLを使用してスクリーンセーバーを作成しました
しかしハードウェアアクセラレーションが有効になりません
どうすれば改善できるか、教えて頂けないでしょうか?
0439デフォルトの名無しさん
2009/02/01(日) 21:35:16どのくらいのテクスチャユニット数ですか。
単純にマルチテクスチャするときの枚数として知りたいんですが。
0441432
2009/02/01(日) 21:49:45あれはVRAMに直接書き込んでいるの・・?
0442デフォルトの名無しさん
2009/02/01(日) 21:56:38マップやロックは要するに、VRAM<->システムメモリで転送を行うこと。
読み出しならロック時にVRAMから転送。書き込みならアンロック時にVRAMに転送される感じ。
名前の似ているWindowsのメモリマップドファイルとは別物ね。
0443デフォルトの名無しさん
2009/02/02(月) 10:55:070444デフォルトの名無しさん
2009/02/02(月) 16:52:21GeForce GTX280 だと4枚
0445432
2009/02/03(火) 22:13:32なるほど
よくわかった、ありがとう
PBO1の内容を読みながら
PBO2に書き込む方法ってある?
一旦glGetBufferSubDataしないと無理そう
0446デフォルトの名無しさん
2009/02/03(火) 22:53:340447デフォルトの名無しさん
2009/02/07(土) 12:08:24と、とても遅レス
0448デフォルトの名無しさん
2009/02/08(日) 08:56:19グラフィックのアクセラレーションを切ったら正常になった.
コード以外に原因があるときの調査って大変だよねぇ.
0449デフォルトの名無しさん
2009/02/08(日) 14:03:28それをDCに貼り付けてUpdateLayeredWindowで表示してるんだけど
うまく半透明にならない
glClearColorでアルファを0にしといて背景を透明にして
その上に半透明の物体を重ねていく、で最終的に合計のアルファ値で
画面に加算した結果を表示するというようにやりたいんだけど
出来ないの?
0450デフォルトの名無しさん
2009/02/08(日) 15:26:41glReadPixelsで取得した値を直接BitmapにしてUpdateLayeredWindowに渡すんじゃなくて
いったんどこかに書き出してちゃんとアルファが取得できてるか確認したらどうかな
あと、描画した物でなくちゃんと透けるような値が入った配列をビットマップにして
ちゃんと透けるか確認する
glReadPixelsではちゃんと取得できてるが、CreateCompatibleDCで作ったDCが
24bitでアルファ無しになってて透けないことがあった
あと関係ないが、Chrome430GTではglReadPixelsがもの凄く重くて使い物にならなかったぜ
0451デフォルトの名無しさん
2009/02/08(日) 16:42:110452449
2009/02/09(月) 10:32:48ピクセルフォーマット定義
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();
何か間違ってる?
0453449
2009/02/09(月) 11:41:08ピクセルフォーマットのアルファビット数を1にしたら出来た
0454デフォルトの名無しさん
2009/02/10(火) 08:07:33同じサイズのを2枚やると失敗する
メタデータでもせいぜい5MBくらいだと思うけどGeforce上のRAMは1Gある
テクスチャのメモリって制限か何かあるの?
0455デフォルトの名無しさん
2009/02/10(火) 15:39:26しかも成功する時としない時がある。
9800GTXだったと思う。
0456デフォルトの名無しさん
2009/02/10(火) 20:32:070457デフォルトの名無しさん
2009/02/10(火) 23:37:58glGetErrorでエラーは出てないの?
ドライバでエラーチェックONにするのを忘れずに
0458デフォルトの名無しさん
2009/02/11(水) 22:03:03描画中のコンテキストに対してユーザー操作の別スレッドで割り込んで
テクスチャを作ろうとするとこけるらしい
0459デフォルトの名無しさん
2009/02/12(木) 00:11:280460デフォルトの名無しさん
2009/02/12(木) 00:29:39>>458
複数スレッドには対応していないぞ。
0461デフォルトの名無しさん
2009/02/12(木) 23:04:46共有コンテキストにすれば別コンテキストで作ったテクスチャも使えるしな
描画中のテクスチャをいじったらどうなるか知らん
0462デフォルトの名無しさん
2009/02/14(土) 20:14:01全部1にして中を0にするとかは無しで
0463デフォルトの名無しさん
2009/02/14(土) 20:59:430464デフォルトの名無しさん
2009/02/15(日) 18:53:36ttp://groups.yahoo.co.jp/group/opengl-jp/messages/851?viscount=-15&expand=1
ぐぐって出てきたこの方法やろうと思ったんですがウィンドウハンドルの取得が
「glutCreateWindowから返ってくるint値がウィンドウハンドル」ではないみたいで。
0465デフォルトの名無しさん
2009/02/15(日) 19:04:170466デフォルトの名無しさん
2009/02/15(日) 23:08:26DCはHGLRCから取得。
0467デフォルトの名無しさん
2009/02/16(月) 19:59:04あるスレッドで作ったテクスチャを別スレッドで描画することはできますか?
現状うまくいってないんですが、それがwglCopyContextの使い方が悪いのか、
あるいはそもそもレンダリングコンテキスト間でテクスチャの共有ができないのか、
よく分かっていないのです。
0469デフォルトの名無しさん
2009/02/17(火) 00:02:04オブジェクトを回転させたらいまいちうまくいかなくて困ってる・・・
0470デフォルトの名無しさん
2009/02/17(火) 00:35:29glPushMatrixで微分を退避してglPopMatrixで戻すといいよ
というかそうしないとオブジェクトが複数重なったら計算がめんどいだけだ
0471デフォルトの名無しさん
2009/02/17(火) 01:03:25それは描画しながらテクスチャを作ろうとした場合の話であって
最初にまとめて作られたテクスチャを別々のスレッドで利用するのはまた別の話だぞ
0472468
2009/02/17(火) 02:35:26自分の用途に関しては以下のような感じでうまくいきました。
描画用スレッド内では↓こんな感じでテクスチャロード用スレッドを起動
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_);
}
0473デフォルトの名無しさん
2009/02/18(水) 19:04:220474デフォルトの名無しさん
2009/02/18(水) 19:05:01openGL + GLUTでプログラムを組んでいるのですが、
起動中に表示されるコマンドプロンプトを表示させないようにする方法はないのでしょうか?
0475デフォルトの名無しさん
2009/02/18(水) 19:40:02それは開発環境の問題じゃないの?
0476デフォルトの名無しさん
2009/02/18(水) 19:52:420477デフォルトの名無しさん
2009/02/18(水) 20:00:36vcなら
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
0478デフォルトの名無しさん
2009/02/19(木) 02:15:370479デフォルトの名無しさん
2009/02/19(木) 15:41:14Delphi2005プログラミングテクニックVol10にそのまんまなコードがあるよ
ライブラリではないけど
>>469の続きなんだけど、特定のウィンドウ座標にオブジェクトの表示はできたけど、
-Z方向のオブジェクトが描画されない・・・どうしたらいいか教えて欲しい
いまはglOrthoで視体積を取って、gluUnProjectでウィンドウ隅に対応するワールド座標を取得、
取得した座標分だけglTranslarefでオブジェクトを移動してる
オブジェクトを移動してみたりしたけどいまいち上手くいかない
0481480
2009/02/19(木) 16:04:32自己解決した
取得した座標分じゃなくて係数かけて減らしたら見えるようになった
無理やりな気がしないでもないけど
0482デフォルトの名無しさん
2009/02/19(木) 22:38:180483デフォルトの名無しさん
2009/02/19(木) 23:37:28通常テクスチャ更新には最低1個のコピーが必要だけどそれが消せるので速いという理屈らしい
俺にはいまいちよくわからない
0484デフォルトの名無しさん
2009/02/20(金) 00:52:58その情報を元に一括で描画をさせると早いということでしょ
0485デフォルトの名無しさん
2009/02/20(金) 02:32:04glTexImg2Dとかだと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.
って書いてあるぽ。
0486デフォルトの名無しさん
2009/02/20(金) 02:38:16Buffer objectをvertex buffer objectとして頂点情報を書き込んでレンダリングして結果をテクスチャに書き込むって事?
それだとPBOが無くてもVBOで事足りるじゃん。
0487デフォルトの名無しさん
2009/02/20(金) 03:17:40イメージをmallocしたバッファなんかに一端格納するんじゃなくて、直接PBOに入れとけば
そこからVRAMへはOpenGLがノンブロッキングのDMA転送で送ってくれるということらしい。
ただ、さらに下のダブルバッファリングの例はOpenGLのレンダリングが最大何フレーム
遅延するかはわからないと思うから毎回新しいバッファを割り当ててやらないと
やっぱりブロッキングされる気がする
0488デフォルトの名無しさん
2009/02/20(金) 06:18:35PBOのDMA転送というのをGPUが実装してないと意味がない
そのくらいだったらドライバで偽装してCPUでやってる可能性のが高いけど
0489デフォルトの名無しさん
2009/02/20(金) 14:58:140490デフォルトの名無しさん
2009/02/20(金) 16:29:490491デフォルトの名無しさん
2009/02/20(金) 19:08:290492491
2009/02/20(金) 19:11:160493デフォルトの名無しさん
2009/02/21(土) 19:02:43glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
glLineWidth( i );
glBegin(GL_LINE_STRIP);
glEnd();
iが10以上だとi=10と認識されて描画されてしまう。
この限界値ってどうやって変更するんです?
スペックによるの??
0494デフォルトの名無しさん
2009/02/21(土) 19:17:140495デフォルトの名無しさん
2009/02/21(土) 21:15:47限界値は限界値なので、それ以上は無理なのですよ。
ビデオカードorドライバによって決まるます。
0496デフォルトの名無しさん
2009/02/23(月) 10:50:37OpenGLで、ボーンアニメーション(スキンアニメーション)を扱うライブラリというのはありますか?
自前で作る前に、まずは実績のあるライブラリを探せ。とよく言われていたもので。
>>38の人が自前で実装していたのをみるに、「これ!」といったライブラリはまだないのでしょうか?
0497デフォルトの名無しさん
2009/02/23(月) 12:21:48D3DX
0498デフォルトの名無しさん
2009/02/23(月) 12:43:500499デフォルトの名無しさん
2009/02/23(月) 12:55:400500デフォルトの名無しさん
2009/02/23(月) 12:59:050501デフォルトの名無しさん
2009/02/23(月) 13:29:440502デフォルトの名無しさん
2009/02/23(月) 17:04:54俺は使ったこと無いんだけどソースも公開されてるOgreはどうよ。
0503デフォルトの名無しさん
2009/02/23(月) 18:56:26FBX SDK
0504デフォルトの名無しさん
2009/02/24(火) 23:22:47Stencil Routed K-BufferってOpenGL2.1でも出来る?
シェーダー書くときは何を使うべき?
0505デフォルトの名無しさん
2009/02/24(火) 23:37:34その世代だとシェーダは基本的にglsl一択、nVidiaのグラボならCgもアリ
0506デフォルトの名無しさん
2009/02/24(火) 23:40:403.0標準でもたぶん無理
GeForceでGL_NV_explicit_multisample拡張使えばいけそうな気がする
シェーダはとりあえずNVIDIAなGPUで動けばいいというならCg
Radeonでも動いて欲しいならGLSL
制限ついてもいいからIntelやちょっと古いGPUでも動いて欲しいならCgでarbvp1/arbfp1プロファイル
CgはランタイムDLLが必要だが、GLSLはドライバ依存でドライバがアレだと酷いことになる
一長一短だな
0507デフォルトの名無しさん
2009/02/25(水) 17:27:48いまどきすごいな
0508デフォルトの名無しさん
2009/02/25(水) 17:34:540509デフォルトの名無しさん
2009/02/25(水) 20:49:37Direct3DでもD3DXとして分けてるくらいだ
0510504
2009/02/25(水) 23:14:08OpenGLのバージョンは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市か使ったこと無いんだが
0511デフォルトの名無しさん
2009/02/25(水) 23:33:14gl2.1と書いたのだけど・・
(そもそもどうやって移行するのか分からない)
0512デフォルトの名無しさん
2009/02/25(水) 23:38:42OpenGL Extensions Viewerで表示されるバージョンは
通常のコンテキストでのGL_VERSIONだから2.1になってしまう。
9.1だとプログラムが落ちたけど、Catalyst 9.2からは3.0コンテキストを
カレントコンテキストにしてからGL_VERSIONを見ればちゃんと3.0になるよ。
もっともHD2xxxがOpenGL 3.0に対応してるかどうかは知らないけど。
0513デフォルトの名無しさん
2009/02/25(水) 23:48:18前方互換コンテキストでなければ非推奨になった機能も使える。
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));
0514デフォルトの名無しさん
2009/02/25(水) 23:51:510515デフォルトの名無しさん
2009/02/26(木) 06:25:36Extentions Viewerは3.0対応してれば3.0って返してくれるんじゃなかったっけ
最近のRadeonのドライバで3.0対応したからHD2400以上ならドライバ更新すればいけるはず
0516デフォルトの名無しさん
2009/02/26(木) 09:56:05int 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);
らしいよ
0517デフォルトの名無しさん
2009/02/26(木) 11:13:43> 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で対応予定。
0518デフォルトの名無しさん
2009/02/27(金) 21:53:02フラグメントシェーダーにvaryingで値を渡すと
補間がかかって値が変わりますよね?
値を全く変えないでバーテックスシェーダーから
フラグメントシェーダーに値を渡すにはどうすればよいでしょうか?
0519デフォルトの名無しさん
2009/02/27(金) 22:24:160520デフォルトの名無しさん
2009/02/27(金) 22:47:48補間して欲しくないということなら宣言にflatをつければよい
ただしOpenGL3.0(GLSL1.3)の機能だ
0521デフォルトの名無しさん
2009/02/28(土) 00:46:01>>519
uniformでVS→FS出来たんですね。
uniformはアプリからVSやFSに値を渡すものだと思ってました。
今環境が無いので試せないので今度試してみます。
>>520
書いてませんでしたが今使ってるのは2.1です。
OpenGL3.0ではflatなんてのがあるんですね。
0522デフォルトの名無しさん
2009/02/28(土) 01:48:56どっちかというと、赤本がどうなるのかが気になる。
いきなりVBOから始まるんじゃ入門者にとって敷居が高すぎるし…
0523sage
2009/02/28(土) 02:15:190524デフォルトの名無しさん
2009/02/28(土) 03:07:260525デフォルトの名無しさん
2009/02/28(土) 07:11:38uniform変数でVertexShader→FragmentShaderは無理だろ
そもそもuniform変数はShaderではread-onlyなんだし。
0526デフォルトの名無しさん
2009/02/28(土) 09:44:54それじゃ全点通して変わらないのと一緒=unformでアプリから渡すのと同じだから
三角形ごとに切り替わるのかな
0527デフォルトの名無しさん
2009/02/28(土) 22:13:16for (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で頂点配列しか使えなくなると、
この辺の柔軟性が無くて困るような・・・。
0528デフォルトの名無しさん
2009/02/28(土) 22:13:50gl_Colorとかでパラメータ渡せば補間無しにできるわ
GL3ではShadeModelがDeprecateだからflat使えということになるんだあ
0529デフォルトの名無しさん
2009/02/28(土) 22:16:49そういう頂点配列をいちいち作ればいい
glBegin/glEndの中ではそういうことやってるんだろうな
0530デフォルトの名無しさん
2009/02/28(土) 23:50:31GL_ARB_instanced_arrays / GL_EXT_bindable_uniform / Vertex Texture Fetch+GL_ARB_texture_float
/ GL_EXT_transform_feedbackで前処理 / CPUで前処理
お好きなのをどうぞ。そもそも3.0フルコンテキストならImmediateも使えると何度(ry
0531デフォルトの名無しさん
2009/03/01(日) 10:35:05FPSが変わってくるけどアニメーションは一定の速度にしたいのだけど
60FPSなら1000/60msでタイマーで割り込みを掛けると約16msで
割り込み速度が追いつかなくてのろのろになるんだけど
普通はどうやってやるの?
スレッドでループさせて16ms間隔のSleepをさせるとか?
0532デフォルトの名無しさん
2009/03/01(日) 11:09:11ゲームはFPSを一定にする必要は無いんじゃないか?
0533デフォルトの名無しさん
2009/03/01(日) 11:10:310534デフォルトの名無しさん
2009/03/01(日) 11:44:462. Sleep(0)で一瞬寝る
3. 1に戻る
OpenGL関係ないやん
0535デフォルトの名無しさん
2009/03/01(日) 12:03:06sleep時間ゼロだと、ビジーループにならないか?
0536デフォルトの名無しさん
2009/03/01(日) 12:12:55必要以上にCPU時間をとりはするけど思う程多くはないし
ゲームだったら多少無駄に喰うくらい問題ないだろう
0537デフォルトの名無しさん
2009/03/01(日) 12:19:39WinAPIを良く知らないので的確なアドバイスができない。
さすがに、ここまで低レベルの処理はGLUTには無いだろうし。
0538531
2009/03/01(日) 12:21:31実際の描画フレームはもっといく
1秒間に60フレーム分の動作をさせて
描画は完全に独立したフレームにするから30だったり100だったりする
つーかゲームって普通そうだろ
>>ゲームだったら多少無駄に喰うくらい問題ないだろう
そうか?
0539デフォルトの名無しさん
2009/03/01(日) 12:25:14リフレッシュレートが85とかだとゲームが速くなるってのも同人ならよくあるが…
0540デフォルトの名無しさん
2009/03/01(日) 12:26:16これが一番単純
0541デフォルトの名無しさん
2009/03/01(日) 12:32:07画面同期しなくていいなら、自分が良く使う方法は
long FRAME=20; // ゲーム周期(ミリ秒)
long prev; // 一つ前の時刻
// ゲームループ
game(){
:
ゲーム処理;
:
long now=その環境のミリ秒単位現在時刻取得関数();
long wait=FRAME-(now-prev);
if(wait<0) wait=0; // 処理落ちした場合ウェイトなし
sleep(wait); // 指定したゲーム周期を待つ
prev=now; // 直前の時刻を更新
}
こんな感じ。
0542デフォルトの名無しさん
2009/03/01(日) 13:18:17とりあえずそれでやってみる
0543デフォルトの名無しさん
2009/03/01(日) 20:36:24最近のノート用ゲフォ等では、低電力モード時にリフレッシュレート変更や
vsync同期非同期切替が出来なかったりする。
0544デフォルトの名無しさん
2009/03/01(日) 20:41:570545デフォルトの名無しさん
2009/03/01(日) 22:52:01全てタイマーをもとにして行えばvsyncとか問題ない!
0546デフォルトの名無しさん
2009/03/01(日) 23:14:38OpenGLの話題となると、ゲームの話が多くなるのは当然といや当然かもしれないが。
0547デフォルトの名無しさん
2009/03/02(月) 13:26:450548デフォルトの名無しさん
2009/03/04(水) 22:36:20ゲームを作るときは飛行機とか車とかをオブジェクトにするのが普通だと思うけど、
表示するモデルの座標を保持するときって、同次行列にしてる?
それともxyz+クォータニオンにしてる?
同次行列を持っていたほうが柔軟で応用が効きそうな気はするんだが、そうなると
回転処理のときにクォータニオンを自分で実装しなきゃいけないからやや面倒で。
0549デフォルトの名無しさん
2009/03/06(金) 18:15:50列ベクトルないし純虚数のメモリ配置に直接マップできる状態なら、
どちらでも同じかなという気がする。
C99で<complex.h>が入ってたり、新言語でも複素数サポートが充実してるんで、
2次元の回転処理を大半複素数でやるようになってきたのだが、
ガウス平面上の回転も重視されるようになったのは最近とかなんとか。
まあ20世紀前半は物理学で線形代数が花盛りだったしなあと思うと、そんなものかもしれない。
0550デフォルトの名無しさん
2009/03/06(金) 22:42:28サンクス。
548だが、考えた結果行列で持つことにした。
OpenGL自体との相性がいいしね。
0551デフォルトの名無しさん
2009/03/06(金) 22:51:54四元数を自前実装するときに[ i, j, k, 1 ]にすれば、
そのメモリ配列そのままで四元数にできると思うよ
0552デフォルトの名無しさん
2009/03/07(土) 17:36:09glTexSubImage2Dを使ってテクスチャ画像をアップデートできるみたいなんですが
gluBuild2DMipmapsで作成したテクスチャにglTexSubImage2Dをやるとうまくいかないんでしょうか?
gluBuild2DMipmapsで最初に読み込まれた画像から全然変化しないのです
0553デフォルトの名無しさん
2009/03/07(土) 19:04:49自前でやるのが面倒なら
GL_SGIS_generate_mipmap拡張があれば、テクスチャをバインドしたあとに
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
で自動ミップマップ生成が有効になる
あとはglTexSubImage2Dで全てのミップマップが更新されるんじゃないかな
0554552
2009/03/07(土) 20:38:47gluBuild2DMipmapsをglTexImage2Dに置き換えたら成功するようになりました
最近のglTexSubImage2Dはピクセル数が2のべき乗じゃなくても成功するんですね
0555デフォルトの名無しさん
2009/03/07(土) 22:31:19前々から言われてるけど、RadeonはGL_GENERATE_MIPMAPもglGenerateMipmapも効かなくて困る。
うまくいってるって人の書き込みを参考にしてみたけどどれも駄目だった。
うまい次善策はないものだろうか。
>>554
つ GL_ARB_texture_non_power_of_two
0556デフォルトの名無しさん
2009/03/10(火) 22:26:00XP+RADEON HD 2600XTで以前glewinfoで調べたときは、
GL_EXT_gpu_shader4はありましたがGL_ARB_geometry_shader4がありませんでした。
Catalyst 9.2にした後はビデオカードが壊れてしまい調べられませんでした。
XP + RADEON HD 4830 + 最新Catalystでは使えるんでしょうか?
0557デフォルトの名無しさん
2009/03/11(水) 00:11:24Catalyst 9.2でもジオメトリシェーダはまだっぽい
0558デフォルトの名無しさん
2009/03/11(水) 00:33:14GL_EXT_geometry_shader4との関係が書いてあるから早晩実装されるでしょう。
0559デフォルトの名無しさん
2009/03/11(水) 23:53:120560デフォルトの名無しさん
2009/03/12(木) 01:05:27そういうことは、テクスチャフェッチ/フィルタリングユニットのマイクロコードを書いてから言えw
0561デフォルトの名無しさん
2009/03/12(木) 18:04:23つか文句自体カッコ悪い。
0562デフォルトの名無しさん
2009/03/15(日) 12:35:410563デフォルトの名無しさん
2009/03/15(日) 14:18:02計算機資源豊富な今でも、2^nから外れるとパフォーマンスは急激に劣化するしなあ。
0564デフォルトの名無しさん
2009/03/15(日) 14:19:28OpenGLのバージョンはGPUとそれのドライバで決まる
OpenGL Extensions Viewerとかどうぞ
0565デフォルトの名無しさん
2009/03/15(日) 18:04:49その仕様が出来た頃はマイクロコードどころかFPGAとかで
実装していたわけで。テクスチャユニットが8個ならチップの
集まりが8組基盤の上に並んでいる。そういう時代。
物理的にロジックが実装されている以上柔軟性を持たせる
のにも限度があるから、2^nの制限もやむを得ないところ。
RealityEngine辺りの現物と論文を比べると結構面白い。
論文に書かれているブロックダイアグラムそのままにチップ
が大きな基盤に綺麗に並んでいるので非常に分かりやすい。
0566デフォルトの名無しさん
2009/03/15(日) 18:32:380567デフォルトの名無しさん
2009/03/15(日) 19:21:220568デフォルトの名無しさん
2009/03/15(日) 23:12:27無事opengl3.0がフルに使えるようになりました。
ありがとう。
0569デフォルトの名無しさん
2009/03/16(月) 19:13:49あと、皆さんはどんな開発環境を使ってますか?。
0570デフォルトの名無しさん
2009/03/18(水) 00:08:08開発環境は主にiMacでgccとVIM
OpenGL Profilerが非常に便利だ
WindowsマシンはVistaでGeForceとRadeonとChromeを適宜差し替え
WindowsでもgccとVIM、たまにデバッグ用にVisual Studio
gDEBuggerが欲しいけど高い
0571デフォルトの名無しさん
2009/03/19(木) 10:34:240572デフォルトの名無しさん
2009/03/19(木) 12:15:030573デフォルトの名無しさん
2009/03/19(木) 13:06:00(例えば、赤本に wglChoosePixelFormatARB() って載ってましたっけ…?)
拡張機能の学習にお勧めの書籍はありますでしょうか。
今のところ OpenGL Superbible あたりを買ってみようかと考えています。
0574デフォルトの名無しさん
2009/03/20(金) 00:20:20拡張もある程度載ってるけど、応用的なものは少ない
基本的なものを知りたいならいい本だけどね
洋書いけるならMore OpenGL Game Programmingが結構面白かった
ちょっぴり古いけどまだ参考にはなると思う
0576デフォルトの名無しさん
2009/03/24(火) 00:34:59起動時に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を始めて日が浅く質問内容に不備があったり、意味不明なことをしていたりするかもしれませんが、よろしくお願いします。
0577デフォルトの名無しさん
2009/03/24(火) 00:37:02すいません、ありがとうございます。
gccとvimですか、coolですね。
0578デフォルトの名無しさん
2009/03/24(火) 01:13:25Matrix演算順の問題だね。移動のベクトルが回転の影響を受ける場合、
Translate->Rotate と Rotate->Translate は結果が違ってくる。
上記のコードだと、2つのglTranslateがY軸回転の前後にあるので、まさにその状況。
Modelview Matrixを取得して値を見てみながら動作を確認すれば理解しやすいかも。
0579デフォルトの名無しさん
2009/03/24(火) 10:12:30ありがとうございます。行列確認しつつ試してみます。
0580デフォルトの名無しさん
2009/03/24(火) 19:54:06今実際に逐次行列を確認しながら、実行してみたところ挙動を理解することができました。
TranslatedやRotatedはワールド座標ではなくモデル座標で動作するんですね。Rotatedがワールドでもモデルでも差があまりないためTranslatedもつられて勘違いしていました。
ありがとうございました。
0581デフォルトの名無しさん
2009/03/25(水) 08:07:51そこはどこからどこまでがモデル座標系なのかワールド座標系なのか自分で管理しないとだめ
そしてOpenGL 3.1 Released
ttp://www.khronos.org/opengl/
0582デフォルトの名無しさん
2009/03/26(木) 00:33:33ttp://developer.nvidia.com/object/opengl_3_driver.html
0583デフォルトの名無しさん
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面でコの字を組み合わせたような状態になってしまい、他の色のテクスチャが反映されていません。
この描画処理が入る直前でテクスチャの中身を確認してみても、しっかり各色のテクスチャが格納されていました。
何が間違っているのでしょうか。お願いします。
0584デフォルトの名無しさん
2009/03/26(木) 17:53:530585デフォルトの名無しさん
2009/03/27(金) 11:56:22MaterialのGL_SHININESSの値(0〜128が範囲だそうです)についてなのですが、
これはライティング計算式においてどう扱われるのでしょうか。
Direct3Dと同等の描画になるように移植しているのですが、
Direct3DのMaterialのPowerにあたるものが、GL_SHININESSだと考えています。
Direct3DのPowerについては、下記のサイトに計算式がありました。
http://msdn.microsoft.com/ja-jp/library/cc373089.aspx
ただ、こちらでは値の範囲が0〜正の無限大 となっているため、この値をそのままGL_SHININESSに入れても期待通りになりそうもありません。
0586デフォルトの名無しさん
2009/03/27(金) 12:52:070587デフォルトの名無しさん
2009/03/27(金) 14:32:47ついでなので赤本も買ってみます
0588デフォルトの名無しさん
2009/03/27(金) 19:20:04マウスのドラッグにより物体を見たままに回転させたいのですが、上記のような動作をさせている良いサンプルなどはないでしょうか。
0589デフォルトの名無しさん
2009/03/27(金) 20:28:09しかし3番においてマウスを下に動かすと2番の面が見えるわけではなく、視線(その時点でのモデルのx軸)を軸として回転する形になってしまいます。
0590デフォルトの名無しさん
2009/03/27(金) 20:33:000591デフォルトの名無しさん
2009/03/27(金) 21:13:39こことかどーだろ
0592デフォルトの名無しさん
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を呼ばなければ
テクスチャも描画されない代わりに負荷も上がりません。
0593デフォルトの名無しさん
2009/03/27(金) 21:50:46ttp://zoome.jp/kontonsoft/diary/3/
このビデオでやってるみたいな回転をしたいってことですか?
これはタッチパネル操作だけど
0594デフォルトの名無しさん
2009/03/27(金) 21:54:21視界の右方/上方ベクトルを、適宜視点位置ベクトルに加え続ければいいよ
0595デフォルトの名無しさん
2009/03/27(金) 22:00:13>>593
そんな感じですね。グーグルアースは画面上で渦状の回転も入りますがあんな感じというとわかりやすいでしょうか。
どの方向から見ていても横にドラッグすれば画面上で横向きに回転、縦にドラッグすれば縦向きに回転といった感じです。
0596デフォルトの名無しさん
2009/03/27(金) 23:00:02申し訳ありません。まだまだ経験が浅くよく理解できないのですが、視界の右方、上方ベクトルというのはPROJECTION_MATRIXの中でしょうか。
0597デフォルトの名無しさん
2009/03/27(金) 23:53:27新しいコンテキストはスレッドBで作った方がいいんじゃないだろうか
0598592
2009/03/28(土) 01:07:33なるほど。元のレンダリングコンテキストをスレッドBに渡して、
スレッドBでwglCreateContextとwglShareListsを呼ぶわけですね。
今ソースが手元にないので明日試してみます。ありがとうございます。
0599592
2009/03/28(土) 17:29:16うまくいきました!
スレッドB
hdc = wglGetCurrentDC();
hrc = wglCreateContext(hdc);
wglShareLists(hrc_base, hrc); // hrc_baseはスレッドAから受け取ったコンテキスト
wglMakeCurrent(hdc, hrc);
〜テクスチャ生成〜
wglMakeCurrent(hdc, NULL);
wglDeleteContext(hrc);
以上
0600592
2009/03/28(土) 17:42:32負荷は上がらなかったものの、肝心のテクスチャが描画されていませんでした。
wglShareListsは元のスレッドで呼ばないといけないということはないでしょうか。
今日は時間切れなので、後日もう少し試してみます。
0601デフォルトの名無しさん
2009/03/28(土) 21:08:16といった感じに半端な透過処理になってしまっています。挙動を見た感じでは恐らく原因は、テクスチャ座標か各面のポリゴン座標の配置が時計廻りかそうでないかにあると思うのですがどうなんでしょう。
0602デフォルトの名無しさん
2009/03/28(土) 22:09:240603デフォルトの名無しさん
2009/03/28(土) 22:18:53その状況からして、Depth TestでFailになっているからだね。
半透明の物体は、奥から手前にソートして描画しないとうまくいかないというのは認識してる?
0604デフォルトの名無しさん
2009/03/28(土) 22:47:49ありがとうございます。奥から描画しないといけないとは知りませんでした。
ソートは面倒になりそうですね。
0605デフォルトの名無しさん
2009/03/28(土) 23:28:19スレッド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);
0606592
2009/03/29(日) 13:57:10同じようにしてみたんですが駄目でした。
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に挙げた例です)
うーん…。
0607デフォルトの名無しさん
2009/03/29(日) 21:52:45うーん
>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使用時は描画前に勝手にやってくれるので必要ない?)
0608592
2009/03/30(月) 00:50:15>>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を作るのは別のスレッドでもいい気がするのですが。
とりあえず別スレッドでテクスチャがきちんと生成できる条件はだいたいわかりました。
あとは負荷の問題…。
0609デフォルトの名無しさん
2009/03/30(月) 01:16:240610デフォルトの名無しさん
2009/03/30(月) 01:21:04あれってどうやって.NETの窓につっこむようにできてるの?
0611デフォルトの名無しさん
2009/03/30(月) 01:29:060612デフォルトの名無しさん
2009/03/30(月) 01:47:55例えば「スレッドセーフではない」というのはどういう状況ですか?
1つのレンダリングコンテキストに対して複数スレッドがwglMakeCurrentを呼ぶとまずいということですか?
0613デフォルトの名無しさん
2009/03/30(月) 13:39:50GL自体が激しくステートマシンなので、
同じコンテキストに対し、あっちのスレッドでglBeginしてglEndする前にこっちのスレッドからglBeginしたりすると困ったことになる。
だからこういうのは、異なるスレッドが一つのコンテキストを共有できたりしないように規制したりするんだが、
wglの動作はよく知らん。
0614612
2009/03/30(月) 20:54:34要求されたリソースは使用中というエラーが返るけど、そういうことならスレッドセーフなのではないかな。
あるスレッドでアクティブなRCのリソースを異なるスレッドが共有するために
wglShareListsがあるわけだし。
0615デフォルトの名無しさん
2009/03/30(月) 22:09:220616デフォルトの名無しさん
2009/03/31(火) 10:24:080617デフォルトの名無しさん
2009/03/31(火) 21:20:16>(描画前にスレッドAでwglMakeCurrent(hdc, hrcA)と戻しています)。
wglMakeCurrentの設定はスレッドごとに保持されるみたい・・(MSDNより)
http://msdn.microsoft.com/en-us/library/dd374387(VS.85).aspx
>wglMakeCurrent(hdc, NULL)
どうでもいいことだけど
第2引数HGLRCをNULLにするとhdcの方は無視されるらしい。
負荷の問題は良く分からない・・
参考URL
the best is yet to be: テクスチャを異なるレンダリングコンテキスト間で共有するにはなどなど・・・
http://corvette.blogzine.jp/blog/2005/08/post_f3c1.html
0618デフォルトの名無しさん
2009/03/31(火) 21:27:55もう誰かテンプレ用にまとめ作っちゃいなYO!
0619592
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が重要)?
0620デフォルトの名無しさん
2009/04/01(水) 08:16:170621デフォルトの名無しさん
2009/04/01(水) 19:12:37おつ。
個人的には最後の項目が良くわからんなぁ。
さらにvistaだと、また別問題が幾つか残ってそうだけど。
例えば、vistaだと同じスレッドでもDCごとにRCを作ってやらなきゃならない気がする。
BeginPaintとGetDCで帰ってくるhDCが異なることがあるようで、ここも怪しいが。
俺の知識不足かもしれん。
0622デフォルトの名無しさん
2009/04/01(水) 20:22:37http://jp.reuters.com/article/domesticFunds/idJPnTK834789220090401
ワロタ
0623デフォルトの名無しさん
2009/04/01(水) 20:36:01景気が底を打つまで
そのまま冬眠させておいた方がいいな。
0624デフォルトの名無しさん
2009/04/01(水) 22:41:39OpenGLは債権者のところに譲渡されるのかな?
無料のままだといいね
0625デフォルトの名無しさん
2009/04/02(木) 00:57:38あれは何が目的なんだろ
0626デフォルトの名無しさん
2009/04/02(木) 18:49:22とかかなぁ。
0627デフォルトの名無しさん
2009/04/02(木) 19:31:08ttp://www.sgi.org/
0628デフォルトの名無しさん
2009/04/02(木) 22:33:531日、米シリコングラフィックス(SGI)は、連邦破産法11条の適用を申請し、経営破綻したことが
裁判所への提出文書で明らかになった。
提出文書によると、同社は総資産3億9050万ドルに対し、5億2650万ドルの負債を抱えている。
シリコングラフィックスは、OpenGLの開発元であり、「Open」と冠しているもののあくまで「オー
プン仕様」であり、またクロノスグループという団体に管理を移管しているものの特許などの
権利は全て同社が保有しており、同技術を採用しているPLAYSTATION3への影響が懸念される。
http://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
0629デフォルトの名無しさん
2009/04/03(金) 01:17:020630デフォルトの名無しさん
2009/04/04(土) 00:11:49これで買収した会社がOpenGLから収益をあげようとして
第二のSCO訴訟が起こったら、また盛大な祭りになるんだろうなあ。
0631デフォルトの名無しさん
2009/04/04(土) 00:29:02商標ならSGIだったと思うけど
0632デフォルトの名無しさん
2009/04/04(土) 00:43:18今回FBOでテクスチャを関連付けてオフスクリーンレンダリングを行う際に、glEnable(GL_TEXTURE_2D)を指定する位置によって生成されるテクスチャが違うもの(妙に明るさが違う)になってしまったもので。
・テクスチャの事前設定やFBOの生成前にglEnable(GL_TEXTURE_2D)を指定し、オフスクリーンレンダリングでテクスチャを生成後、オブジェクトに貼り付け画面に描画。→貼り付けられているテクスチャが妙に暗い。
・上記の設定、オフスクリーンレンダリングでテクスチャを生成後、glEnable(GL_TEXTURE_2D)を指定し、オブジェクトに貼り付け画面に描画。→恐らく正しいテクスチャが貼り付けられる。
0633デフォルトの名無しさん
2009/04/04(土) 09:10:34enableするべきだし、必要ないならdisableするべきってだけの話では?
0634デフォルトの名無しさん
2009/04/04(土) 11:18:05glEnable(GL_TEXTURE_2D)は
テクスチャを今から行う描画に使うかどうかを指定するだけ
0635デフォルトの名無しさん
2009/04/04(土) 12:37:41ありがとうございます。では明確に画面描画に使用する直前に指定したほうが問題はなさそうですね。
0636592
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側で削除すれば問題ないようです。
仕様上どうなのかはよくわかりませんが。
0637デフォルトの名無しさん
2009/04/06(月) 17:53:08投影テクスチャーシャドウをやろうと思っていて問題がでました。
環境はOpenGLES1.1です。早い話がiPhoneです。
単に描画結果をテクスチャにし、平面の四角ポリゴンに映して影とするのはうまくいきました。
そこで、その発展形で、影を落としたいモデルのUVを自動生成しようとしました。
これだと影が落ちる側のモデルが凸凹していても、きれいに影がでますので。
最初は
glMatrixMode(GL_TEXTURE);
で光源の位置にカメラを置いた場合の行列を・・・とやっていたのですが、詳しく調べたところこれは
「UV座標を変換する行列を設定できる」というものらしく、合致しません。
次に、頂点座標をテクスチャ座標として使うための
GL_OBJECT_LINEAR
を使おうとしましたが、どうもES1.1には見当たらないようです。
OpenGLES1.1では、影が落ちるモデルのUV座標を自動生成するタイプの影は不可能なのでしょうか?
0638デフォルトの名無しさん
2009/04/06(月) 22:45:11バイナリでもいいのでテストツールあげてくれたら、こちらでも検証するよ。
こちらはtypeSZで、同様にオンボintel&ゲフォ7400Mの切り替え式です。
0639592
2009/04/07(火) 20:47:31かたじけない。
アップロードするのは初めてでちょっと不安ですが、↓に置いてみました。
DLキーはgl、ソース付きのzipファイルです。
http://uproda.2ch-library.com/lib117505.zip.shtml
起動するとブルーのテクスチャが見えるはずですが、
スペースキーを押すとテクスチャを更新します(見た目は変わりません)。
このときに負荷が高くなります。
nVidiaのGPUが載ったデスクトップ(Vista64)でも試してみましたが、やはり負荷が高くなりました。
0640592
2009/04/07(火) 21:12:43テクスチャ更新後の負荷は高くなりませんでした。
やっぱりnVidiaのドライバーかなぁ…。
0641デフォルトの名無しさん
2009/04/07(火) 22:13:560642デフォルトの名無しさん
2009/04/07(火) 22:22:49自前で実装です^^
0643デフォルトの名無しさん
2009/04/07(火) 23:20:42638ではないがChrome 430GTとGeForce 9500GTで試してみた。どちらもVista32bit
Chromeの方は特に問題なく動いた
スペース連打すると当然それなりのCPUは使うがそれ程ではない
GeForceの方は最初起動した時は何度かスペース押したら100%どころかアプリが応答しなくなった
しかし強制終了して3回目以降はこちらも全く問題なく動くようになったので、うちの環境が怪しいだけかも
ドライバはちょっと古めの180.48
ドライバ設定のスレッドした最適化が怪しいかと思ったがオンでもオフでも自動でもかわらなかった
あんまり参考にならない情報ですまん
0644592
2009/04/07(火) 23:58:42ありがとうございます!
稀にアプリが応答しなくなる原因ですが、描画用スレッドとテクスチャ生成用スレッドで、
テクスチャの読み書きを排他制御していないせいだと思います。
アップロード用に修正したときに省略しました。気にしないでください。
こちらで試せした結果は↓です。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で○
もしドライバーの問題ならそれはそれで開発の方は進められるので幸いではあります。
0645638
2009/04/08(水) 00:05:00テストしてみました。
typeSZ, OS:VistaSP1HOME, 表示モードは「Windows Vista ベーシック」
Mobile Intel(R) 945(オンボ)の場合
起動するだけでタスクマネージャーの表示(1秒更新)が固まるほどの負加。
CPU負荷というより描画だけが妨害されている感じ。
GeForce7400GM
スペースを数回押すだけでは負荷は特に無し。
1秒くらい押し続けると、test.exeがフリーズ。しかしCPU使用率は低いまま。
この場合はタスクマネージャーへの影響はなし。
ご参考になれば幸い。
0646デフォルトの名無しさん
2009/04/08(水) 00:06:49う〜ん、intelオンボの動作見てると、なんとなくドライバ以外の問題な気もするなぁ。
お節介でなければ今後もテスト付き合いますので。
0647638
2009/04/08(水) 00:15:57素朴な疑問なんだけど、WM_PAINTでなぜBeginPaintしないの?
これだと無効領域がクリアされずにWM_PAINTが発生し続けないか?
単にそれで負荷になってる気もするんだけど。
コンパイルして確認していないので無責任な発言です。すまそ
0648592
2009/04/08(水) 02:11:16描画はタイマーイベントで10msec間隔(main.cpp:76行目)で
InvalidateRectすることでWM_PAINTを発生させています。
しょぼいPCだと負荷になるかもしれませんが、今時のPCであれば無視できる程度かと。
>>645
スペースを押し続けると固まるのは、テクスチャ生成スレッドがわさわさ作られて、
各スレッドでのテクスチャ書き換えと元スレッドでのテクスチャ描画のタイミングが
ぶつかりやすくなる(変な表現ですが)ためだと思います。
ここは実際には排他制御してますので無視してください。
>>638さんの環境はやはりVista32なのですね。
Vista64+NVIDIAで大丈夫だったという人がいると一気に不安になれるのですが…。
0649デフォルトの名無しさん
2009/04/08(水) 02:17:460650デフォルトの名無しさん
2009/04/08(水) 03:50:43>InvalidateRectすることでWM_PAINTを発生させています。
>しょぼいPCだと負荷になるかもしれませんが、今時のPCであれば無視できる程度かと。
いやいやそうじゃなくて、
WM_PAINTってのは無効領域が存在するときに繰り返し発生し続けるメッセージなんだよ。
すなわちWM_PAINTを一度で止めるためには無効領域をクリアしなきゃならない。
BeginPaintってのはそのクリアを担当する関数でもあるんだよ。
0651592
2009/04/08(水) 10:11:52丁寧にありがとうございます。誤解してました。
つまり今のやり方だと10msecごとにWM_PAINTが呼ばれる+
無効領域を有効にしようと頻繁にWM_PAINTが呼ばれる、
という状況なわけですね。
OpenGLから離れちゃって申し訳ないですが勉強になりました。
0653デフォルトの名無しさん
2009/04/08(水) 21:32:290654デフォルトの名無しさん
2009/04/10(金) 23:32:35g++ 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
どうすれば解決できるでしょうか。
0655デフォルトの名無しさん
2009/04/11(土) 11:15:15>Use --enable-stdcall-fixup to disable these warnings
では解決しないのか?
0656デフォルトの名無しさん
2009/04/11(土) 23:54:36ややこしい話なのでうまく伝わるかどうか自信が無いのですが、
たとえば、6面体のサイコロを描画したいときを考えます。
頂点は8つありますので、glBufferData()を使って8頂点を登録しました。
ところが、サイコロの場合、同じ頂点座標でも同じ法線や同じテクスチャ座標とは限りません。
どの面に所属する頂点かによって、テクスチャの参照座標や法線は変わってきます。
そのため、頂点インデクスは12三角面*3頂点で36頂点分を設定しました。
同じ頂点座標が何度も参照されるということです。
法線やテクスチャ座標も、頂点インデクスの分だけ設定しました。
で、glDrawElementsで描画したところ、形状は正常に表示できたのですが、
テクスチャと法線が見事に化けて、まともに表示できませんでした。
しばらく考えた末に、テクスチャや法線のパラメータは頂点インデクスではなく
頂点座標に所属してしまっていることに気が付き、
頂点インデクスの数だけ頂点座標を重複して登録するようにしたところ、正常な表示が可能となりました。
ただ、この場合だと重複頂点が大量に発生してしまい、同じ座標に対して何度も行列演算が行われているはずです。
サイコロくらいならいいのですが、表示するポリゴンが数万とかのオーダーになった場合、
GPUにかかる無駄な負荷が無視できなくなってくると考えられます。
テクスチャ座標や法線データを、頂点座標ではなく頂点インデックスに所属させる方法というものがあれば
教えて頂きたく、よろしくお願いいたします。
0657デフォルトの名無しさん
2009/04/12(日) 00:58:26頂点と同じであると判定できる場合のみ8頂点で済ませることができる。
0658656
2009/04/12(日) 01:02:51やっぱりそうか…
ありがとうございます。
場合分けして展開するのもかなり面倒なので、頂点重複で持つことにします。
しかし、OpenGL初期のころのハードでは行列演算のコストがそんな安いわけではなかったのに、
こういう仕様になっているのが意外といえば意外です。
フラットシェーディングのときには、頂点が共有できないってことですし。
0659デフォルトの名無しさん
2009/04/12(日) 03:52:28OpenGLで低位の表現から始めるほうが有効でしょうか?
それとも3DCGエディタツールの仕様書を眺めて使うほうがいいでしょうか?
0660デフォルトの名無しさん
2009/04/12(日) 12:13:46両方並行というがよいのではないでしょうか。
たとえば、OpenGLの赤本を読みながら、メタセコイアのmqoファイルのフォーマットを理解してみましょう。
別にVRMLでもDXFでも構わないですが、テクスチャやシェーディングなどをサポートしているほうがいいでしょう。
そのファイルフォーマットを画面に表示するにはどうすればいいのか考えてみましょう。
頂点座標や法線をどう保持すべきか、ポリゴンの概念を明示的に扱うべきかどうか、考えるべき点はたくさんあります。
文献やウェブサイトを最大限に活用しましょう。
この試行錯誤の過程で、対象のライブラリに関するノウハウを急速に蓄えることができます。
>>659に数年以上のプログラムの経験があれば、ファイルを読み込んで形状を画面に表示するところまでは、
比較的短期間に到達するでしょう。
では、パフォーマンスを出すにはどうすればいいか考えてみましょう。
できるだけ処理をGPU側にやらせるにはどうすればいいか考えてみましょう。
ファイルフォーマットを読み込んで画面に表示するプログラムを作ることで、
そのAPIセットのエッセンスをかなりの程度理解することができます。
0661デフォルトの名無しさん
2009/04/12(日) 19:04:05丁寧な返答ありがとうございます.
あなたの提案に則った勉強をしようと思います.
さきほどMetasequoiaをインストールしてmpoファイルを見てみましたが
ずいぶんと可読性の高いフォーマットですね.
ありがとうございました.
0662デフォルトの名無しさん
2009/04/14(火) 00:13:58659ではないけど、すげーさんくす
さっそくやるわ。テンプレに入れて欲しいぐらい良い解答だった、おれにとって。
0663デフォルトの名無しさん
2009/04/21(火) 12:09:49glDepthRangeには-1〜1の範囲の値しか設定できないのでしょうか?
絶対値で1以上の値を設定したら1になってしまうって事であってますか?
0664デフォルトの名無しさん
2009/04/21(火) 12:39:43glDepthRange 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 は普通指定する必要はない。
0665デフォルトの名無しさん
2009/04/22(水) 08:23:350<=zNear<=zFar<=1 でしょう。
zNearとzFarは逆転できるのかなぁ? やったことないや。
manpageには
Thus, the values accepted by glDepthRange are
both clamped to this range before they are accepted.
と書いてあるので、範囲外の値を指定しても0〜1にクランプされちゃうでしょうね。
0666デフォルトの名無しさん
2009/05/01(金) 07:23:00ttp://www.kumaryu.net/cgi-bin/diary/?date=20090428#p02
DX11の機能一部先取りした形なんだろうか
0667デフォルトの名無しさん
2009/05/05(火) 13:07:10大体15秒ほど掛かります(流石にこれはちょっと困る・・・)
SDLの初期化がOpenGLを使うフラグを建てたときだけ遅くなったり
MetasequoiaもOpenGL切り替えだけが偉い遅かったりするので
やっぱりこれってOpenGLを使う場合の問題なんではないか、と認識してます。
これの対策で考えられるのってどんなのがありそうですか?
もしや皆我慢して使っている?それともうちの環境だけなのかな?
0668デフォルトの名無しさん
2009/05/05(火) 16:08:13・どの環境でも遅いのか
を調べる気概が欲しい
0669デフォルトの名無しさん
2009/05/05(火) 23:00:38SDLですが
SDL_SetVideoMode(xResolution, yResolution, bitsPerPixel, SDL_OPENGL);
この関数が遅いところまでは分かってます。ここで固まるようです
0670デフォルトの名無しさん
2009/05/06(水) 00:17:360671デフォルトの名無しさん
2009/05/06(水) 10:47:37しかし現在の方法ではPBOに転送した背景画像を毎フレームDrawPixelsで描画しているので、内容の割には無駄に負荷が高くなってしまいます。
何かもっと画期的な方法は存在するのでしょうか。よろしくお願いします。
0672デフォルトの名無しさん
2009/05/06(水) 12:49:00そんでもってPBOは使うな。
0673デフォルトの名無しさん
2009/05/06(水) 13:08:53即レスありがとうございます。
レイヤードウインドウ試してみます。
0674デフォルトの名無しさん
2009/05/06(水) 18:19:590675デフォルトの名無しさん
2009/05/07(木) 08:23:02Quaternion C++ class
http://www.programmersheaven.com/download/17059/download.aspx
0676デフォルトの名無しさん
2009/05/07(木) 21:05:210677デフォルトの名無しさん
2009/05/07(木) 22:14:39y座標を逆にして考える必要がありますが、テクスチャの読み込みや、最終的なレンダリング結果の画像出力の際に画像の上下反転を省くことができますね。
Vista T7500 2.2GHz 8600M GT、オフスクリーンレンダリング解像度256x256において、上限反転の有無でCPU使用率には15%ほどの差がありました。
0678デフォルトの名無しさん
2009/05/08(金) 00:19:29glDrawElementsで一括描画すると
頂点をインデックスで指定するので
1頂点=1UV座標となってしまいます、
同じ頂点で、違うUV指定のたくさんのポリゴンを描画するには、
glDrawArraysを複数回呼ぶしか無いのですか?
0679デフォルトの名無しさん
2009/05/08(金) 00:27:26>>656-657
0680デフォルトの名無しさん
2009/05/08(金) 00:39:31ありがとうございます。
forで、indexを何度も参照するぐらいだったら
高速化のために最初から
インデックスの数だけDirectXで言うTLVERTEXみたいなものを作るべきなのかもですね
0681デフォルトの名無しさん
2009/05/08(金) 18:32:46しかし、後でUnsignedByteで内容を配列に取得してみると256x256の解像度なのにも関わらず、65535までしかデータが埋まりません。
カラーバッファはUnsignedByteでもRGBA32ビット取得されますが、デプスバッファはUnsignedByteだと8ビット分しか取得されないのでしょうか。
また、UnsignedIntで取得してみると今度は262144まで、つまり32ビット分埋まりますが、内容を見てみると4バイトのうち2バイトは同じ値で残り2バイトは妙な値になっています。
これはつまりUnsignedByteで取得すると大体の深度値が返されるということなんでしょうか。
0682デフォルトの名無しさん
2009/05/09(土) 02:19:36ピクセルフォーマットの設定値とグラボの相性でそうなる場合がある。
アルファブレンド使う場合でも24bitにしとくと上手く動いたりする。
0683デフォルトの名無しさん
2009/05/10(日) 20:49:31あとUNSIGNED_BYTEとかの指定はコンポーネント毎に何ビットか
RGBA8に対してUNSIGNED_BYTEなら1ピクセル4コンポーネントで32bitになるが
DEPTH_COMPONENTに対してUNSIGNED_BYTEなら1ピクセル1コンポーネントで8bitになってしまう
精度良く深度を扱いたいならDEPTH_COMPONENT32Fなんかの浮動小数点深度バッファを使うのがいいんじゃなかろうか
0684デフォルトの名無しさん
2009/05/10(日) 21:47:42返事が遅くなりまして申し訳ありません。お返事ありがとうございます。
UnsignedIntで取得すると1ピクセル1コンポーネントでもIntが32bitであるため、しっかり262143まで埋まったんですかね。
で、4バイトのうち3バイトが深度値を表していて、残り1バイトは実際には24ビットで処理されているためにとりあえず3バイト目と同じ値で埋まっていると。
勝手にこういう解釈しましたが、間違いがありましたらご指摘よろしくお願いします。
0685デフォルトの名無しさん
2009/05/11(月) 01:14:09何らかのアドバイスしたいけど、
正直グラボに依存する問題のような気がしてならないです。
テストツールとかをうpしてくださればうちの幾つかの環境で試してみますよ。
0686デフォルトの名無しさん
2009/05/11(月) 22:52:13ありがとうございます。テスト用のファイルアップしました。
http://senduit.com/c88099
Display関数の最後にあるReadPixelsでデプスバッファの内容を取得しています。
OSはVistaでGPUは8600M GTで、ForceWareは185.85です。この環境ではバイト配列を渡してUnsignedIntで取得すると1バイト目と4バイト目が一緒の値になります。
0687デフォルトの名無しさん
2009/05/11(月) 23:34:14あ、うん。
VC#使ってないので、せめてバイナリでテストできるもの頼むよ。
0688デフォルトの名無しさん
2009/05/12(火) 00:09:55http://senduit.com/0e0c03
かなり適当に作ったので取得押してからが少し時間かかります。
取得を押すと128x128の解像度で描画した結果のデプスバッファの内容を取得します。
動かなかったりしたら申し訳ありません。その際は一人で頑張りますw
0689デフォルトの名無しさん
2009/05/12(火) 00:48:11テキストファイルに貼り付けておきました。
テスト環境はVista32, GeForce7400Goです。
http://senduit.com/8ffae7
Intelのオンボードでも試してみたかったけど、
FBO非対応だったのですみません。
0690デフォルトの名無しさん
2009/05/12(火) 23:45:49実験ありがたいのですが、文字化けしちゃってますね。
機会があれば再度別のところにでもあげてもらえれば幸いです。すみません。
0691デフォルトの名無しさん
2009/05/13(水) 00:06:200692デフォルトの名無しさん
2009/05/13(水) 02:04:260693デフォルトの名無しさん
2009/05/13(水) 02:27:18なぜ文字化けしたんだろうか
http://www.dotup.org/uploda/www.dotup.org23789.zip.html
0694デフォルトの名無しさん
2009/05/13(水) 02:50:130695デフォルトの名無しさん
2009/05/14(木) 00:05:13実験ありがとうございました。Go 7400でも実際には24bitのようですね。
0696デフォルトの名無しさん
2009/05/14(木) 00:21:18NVIDIAの全部のGPUで32bit Depthを指定しても24bitになるね
0697デフォルトの名無しさん
2009/05/19(火) 23:18:27DX9では頂点の各要素を別々に定義したりできるみたいですが
http://marupeke296.com/DXG_No53_DrawUsingStream.html
0698デフォルトの名無しさん
2009/05/19(火) 23:32:21余裕でできます。赤本レベルでもやってるような気がする。
VBOでも出来ますぜ。
0699デフォルトの名無しさん
2009/05/20(水) 12:56:520700デフォルトの名無しさん
2009/05/21(木) 20:17:11DirectXみたいにLockRect等での
高速に、メモリを直接操作は、出来ないのでしょうか?
0701デフォルトの名無しさん
2009/05/21(木) 20:24:22gltexsubimage2d
0702デフォルトの名無しさん
2009/05/21(木) 20:29:240703デフォルトの名無しさん
2009/05/21(木) 20:48:160704デフォルトの名無しさん
2009/05/26(火) 00:05:28mobilesynth ってやつをちょっと触ってみたいなと思って落としてみました。
新規プロジェクトでClasses/synthをコピーして、ユーザー検索パスに「Classes」を追加して書き出してみたんだけど
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
duplicate symbol _main in /****/arpeggio_test.o and /****/main.o
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/g++-4.0 failed with exit code 1
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
こんなエラーが出ます。
落としてきたやつを書き出すとちゃんと書き出せますが、自分のプロジェクトにとりあえずクラスを置いてみただけのやつは上記のエラーが...
エラーの意味がよく分からないんですがなにか設定とか必用でしょうか?
0705デフォルトの名無しさん
2009/05/26(火) 00:13:08スレ違い
0706デフォルトの名無しさん
2009/05/26(火) 12:48:20>>>704
>スレ違い
激しくスレ違いでした。。。
0707デフォルトの名無しさん
2009/05/27(水) 14:56:10OpenGLを導入してプログラミングを行おうと思ったのですが、glVertex2dを使っての二次元の描画がセグメンテーション違反になってしまいます。
具体的には、
ttp://www.komoto.org/opengl/
このサイトを参考にしてとりあえずサンプルプログラムをコンパイルしてみたのですが、
sample01の線の描画などが、実行するとセグメンテーション違反になってしまいます。
自分で点を描画だけのプログラムなど書いてみましたが同様でした。
sample02以降の3次元のプログラムに関しては問題なく動きます。
どなたか原因わかるかたいますでしょうか?
0708デフォルトの名無しさん
2009/05/27(水) 22:25:050709デフォルトの名無しさん
2009/05/27(水) 23:31:490710デフォルトの名無しさん
2009/05/28(木) 01:11:020711デフォルトの名無しさん
2009/05/28(木) 02:59:33どの関数は使えなくなるから次からはこうしろ、とかならすごく興味ある
0712707
2009/05/28(木) 11:29:28Fedoraで使っています。Mesaは別途インストールしました。
プログラムの問題についてはサンプルそのままなので、ちょっと自分には分かり兼ねます。今まで普通にプログラムを確聞には問題なかったのですが・・・
もしよろしければ、どの辺りを調べてみたら良いかなどアドバイス頂けますか?
0713デフォルトの名無しさん
2009/05/28(木) 14:33:10ソースうp汁
0714デフォルトの名無しさん
2009/05/28(木) 15:28:40ttp://www.komoto.org/opengl/sources/sample01.c
0715デフォルトの名無しさん
2009/05/28(木) 17:58:50#include<GLUT/glut.h>
//#include<GL/gl.h>
に変換したらあとは普通にビルド&ラン出来たぞ、エラーもなく
Macでだけど
http://alkn.net/gazou2/src/1243501035283.png
0716デフォルトの名無しさん
2009/05/28(木) 18:05:220717デフォルトの名無しさん
2009/05/28(木) 18:07:37SIGSEGVで落ちてるなら、gdbで実行してスタックトレースくらい見てみろよ。
0718707
2009/05/29(金) 12:42:43うまくいきませんでした・・・
インクルードは問題なく動いていると思うのですが。
>>716
関数の順序を入れ替えてみるということでしょうか?
>>717
gcbの使い方がまだよくわかっていないのですが、動かして見たところ
Program received signal SIGSEGV, Segmentation fault.
0x0033bebc in ?? () from /usr/lib/dri/i915_dri.so
というものが出てきました。何かヒントになりますでしょうか?
デバッグの仕方についてはもうちょっと勉強してみます・・・
0719デフォルトの名無しさん
2009/05/29(金) 12:45:080720デフォルトの名無しさん
2009/05/29(金) 12:50:43よりによってi915かよ。Mesaに付属のglxgearsは動くのか?
まともなGPUの載ってるマシンなら普通に動くだろうな。
ちなみにSIGSEGVで落ちた場合はgdbのプロンプトでbtと打つと
スタックのバックトレースが見れるから、そこからスタックフレームを
up/downして変数の値等を調べる。
0721デフォルトの名無しさん
2009/05/29(金) 16:57:32#0 0x001eeebc in ?? () from /usr/lib/dri/i915_dri.so
#1 0x00216aef in ?? () from /usr/lib/dri/i915_dri.so
#2 0x003f1135 in ?? () from /usr/lib/dri/libdricore.so
#3 0x003e9059 in _tnl_run_pipeline () from /usr/lib/dri/libdricore.so
#4 0x002172f2 in ?? () from /usr/lib/dri/i915_dri.so
#5 0x003e9aa4 in _tnl_draw_prims () from /usr/lib/dri/libdricore.so
#6 0x003e1d18 in vbo_exec_vtx_flush () from /usr/lib/dri/libdricore.so
#7 0x003ddce7 in vbo_exec_FlushVertices () from /usr/lib/dri/libdricore.so
#8 0x0035d344 in _mesa_Flush () from /usr/lib/dri/libdricore.so
#9 0x080487be in display_func ()
#10 0x00fca85b in ?? () from /usr/lib/libglut.so.3
#11 0x00fce163 in fgEnumWindows () from /usr/lib/libglut.so.3
#12 0x00fcb220 in glutMainLoopEvent () from /usr/lib/libglut.so.3
#13 0x00fcb685 in glutMainLoop () from /usr/lib/libglut.so.3
#14 0x08048853 in main ()
glxgearsは一応動きますが、エラーを吐いているようです。
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0"
after 1658 requests (37 known processed) with 0 events remaining.
これから自分でもエラーを調べてみます。
0722デフォルトの名無しさん
2009/05/29(金) 17:12:390723デフォルトの名無しさん
2009/05/29(金) 21:10:37glFlush()に問題があるわけないし、どう考えてもi915のDRIドライバに問題が
あるとしか思えない。
Fedoraに入ってるのがどの程度新しいか分からないが、新しいDRIドライバを
入れてみるとか試行錯誤するしかないな。
とりあえずここのでも入れてみれば?
http://intellinuxgraphics.org/2009Q1.html
0724デフォルトの名無しさん
2009/05/30(土) 15:37:363Dなら問題なく描けるのに・・・!
0725デフォルトの名無しさん
2009/05/30(土) 17:45:41ゲームを一本通して作りながらOpenGLを学んでいく本は無いでしょうか?英語は読めませんが、洋書大丈夫です。
できれば、少しでもGLSLを使用しているとありがたいです。
0726デフォルトの名無しさん
2009/05/30(土) 18:06:59PixelCityという夜景シミュレータみたいなのがあって、開発工程の説明があるから
おすすめ。プログラム内でビルなどを全部生成しているからゲームとは多少違うが、
その辺を無視してもコードも1万行無いし、色々参考になる部分が多いはず。
ただ、まだWindowsでしか動かないかもしれない。
デモムービー(ここに置いてあるコードは多分古い)
http://code.google.com/p/pixelcity/
ソースコード
http://github.com/skeeto/pixelcity/tree/master
開発工程の説明
http://www.shamusyoung.com/twentysidedtale/?p=2940
0727デフォルトの名無しさん
2009/05/31(日) 03:18:543Dの物体を他の角度から撮ったりしたいんですけどいい方法無いですかね
0728デフォルトの名無しさん
2009/05/31(日) 03:29:290729デフォルトの名無しさん
2009/05/31(日) 11:20:02GL_AUXiもあるでよ。
0730デフォルトの名無しさん
2009/05/31(日) 15:08:11いいねえ。
このムービーだけ見せてクローンを作れというのは学生向けのいい課題になりそうだ。
3人チームで組ませて分担させればチームで作ることの訓練にもなりそうだ。
0731デフォルトの名無しさん
2009/05/31(日) 17:32:47これは素晴らしい
0732デフォルトの名無しさん
2009/05/31(日) 19:16:48とん。いいもの知ったよ。
このワクワク感がやっぱり重要だよな
0733デフォルトの名無しさん
2009/05/31(日) 22:32:53GL_AUXiってどんな効果があるんですか?調べてもよく分かりませんでした
0734デフォルトの名無しさん
2009/05/31(日) 23:35:560735デフォルトの名無しさん
2009/06/01(月) 02:40:43>>729ではないが、オフスクリーン描画用のバッファ。glDrawBuffer()して使う。
ただしドライバによっては描画が遅かったりするし、描画結果を利用するのに
一々glReadPixels()しないといけないから、今時のGPU(数年前ぐらいまで)を
使ってるならFBOを使うべき。テクスチャに直接描画出来るから無駄が無い。
0736デフォルトの名無しさん
2009/06/01(月) 07:09:45>>726
ありがとうございます。
ぜひ、参考にしたいと思います!。
0737デフォルトの名無しさん
2009/06/01(月) 12:38:39ありがとうございます
0738デフォルトの名無しさん
2009/06/01(月) 12:39:22>>735
ありがとうございます
0739デフォルトの名無しさん
2009/06/02(火) 11:45:52サンプルコードの切り貼りなのにテクスチャが貼れません('A`
以下のコードで何か問題ありそうだったら教えていただけるとうれしいです。
void gl_paint( HWND hWnd, HGLRC hglrc, char* bitmap){
PAINTSTRUCT ps;
HDC hdc = BeginPaint( hWnd, &ps);
GLuint texnames[1];
// テクスチャの有効化
glEnable( GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glPixelStorei(GL_UNPACK_ALIGNMENT, 3);
// テクスチャを拡大・縮小する方法の指定
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
// テクスチャの繰り返し方法の指定
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
>>739につづく
0740デフォルトの名無しさん
2009/06/02(火) 11:47:30glGenTextures( 1, texnames);
glBindTexture( GL_TEXTURE_2D, texnames[0]);
GLbyte test[512][512][3];
for( int i = 0; i < 512 ; i++){
for( int j = 0; j < 512; j++){
test[i][j][0] = (GLbyte)255;
test[i][j][1] = (GLbyte)0;
test[i][j][2] = (GLbyte)0;
}
}
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_BYTE, test);
wglMakeCurrent( hdc, hglrc);
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
static double theta = 0.0;
theta += 5.0;
glRotatef( theta, 0, 1, 0);
glBindTexture( GL_TEXTURE_2D, texnames[0]);
glColor3f( 1.0f, 1.0f, 1.0f);
>>741につづく
0741デフォルトの名無しさん
2009/06/02(火) 11:49:01{
glTexCoord2f( 0, 1); glVertex2f( -0.9f, 0.9f);
glTexCoord2f( 1, 1); glVertex2f( 0.9f, 0.9f);
glTexCoord2f( 1, 0); glVertex2f( 0.9f, -0.9f);
glTexCoord2f( 0, 1); glVertex2f( -0.9f, 0.9f);
glTexCoord2f( 0, 0); glVertex2f( -0.9f, -0.9f);
glTexCoord2f( 1, 0); glVertex2f( 0.9f, -0.9f);
}
glEnd();
glFlush();
SwapBuffers( hdc);
wglMakeCurrent( 0, 0);
EndPaint( hWnd, &ps);
glDisable( GL_TEXTURE_2D);
}
遅れましたが開発環境はVC2008, WinVistaですー
0742デフォルトの名無しさん
2009/06/02(火) 11:51:36二番目の引数を1でどうよ。
0743デフォルトの名無しさん
2009/06/02(火) 12:04:12こんなことするならGLubyteとGL_UNSIGNED_BYTE使うべき。
0744デフォルトの名無しさん
2009/06/02(火) 12:29:070745デフォルトの名無しさん
2009/06/02(火) 13:03:00必要がある。BeginPaint()の直後にwglMakeCurrent()を呼ぶべき。
0746デフォルトの名無しさん
2009/06/02(火) 15:50:47ウィンドウの位置に関わらず、キャンバスがディスプレイの左上に表示されてしまいます。
それで、色々と試してみたのですが・・・
hdc = GetDC(hWnd);
iPixelFormat = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, iPixelFormat, &pfd);
ghRC = wglCreateContext(hdc);
wglMakeCurrent(hdc, ghRC);
〜略〜
wglMakeCurrent(NULL, NULL);
ReleaseDC(hWnd, hdc);
上が異常になるプログラム。これを、
hdc = GetDC(hWnd);
hdc2 = GetDC(hWnd);
iPixelFormat = ChoosePixelFormat(hdc2, &pfd);
SetPixelFormat(hdc2, iPixelFormat, &pfd);
ghRC = wglCreateContext(hdc);
wglMakeCurrent(hdc, ghRC);
〜略〜
wglMakeCurrent(NULL, NULL);
ReleaseDC(hWnd, hdc);
としたら正常に表示されるようになりました。
普通に考えたら、これってReleaseDC(hWnd, hdc2);をしないとダメですよね・・・。
でもそれをすると、表示がおかしくなるんです。
こういった現象になった方か、正しい解決方法をご存知の方、居ませんか?
0747デフォルトの名無しさん
2009/06/02(火) 16:28:220748デフォルトの名無しさん
2009/06/02(火) 16:56:000749デフォルトの名無しさん
2009/06/02(火) 17:16:12>>742
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); で試してみましたが変わらずでした...
>>743
自分でもその記述にした意味がわからなかったので直しました('A`
>>744-745
wglMakeCurrent( hdc, hglrc);をHDC hdc = BeginPaint( hWnd, &ps)の後に
持っていってみましたが、やはり変化なしでした。
せっかくアドバイスいただいたのに活かせてなさげで申し訳ないです(´・ω・`)
0750749
2009/06/02(火) 17:20:30HGLRC gl_init( HWND hWnd){
HDC hDC = GetDC( hWnd);
if( hDC == NULL)
return NULL;
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA, 24,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,
0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
};
int pxfm = ChoosePixelFormat( hDC, &pfd);
if( pxfm == 0)
return NULL;
if( !SetPixelFormat( hDC, pxfm, &pfd))
return NULL;
return wglCreateContext( hDC);
}
0751デフォルトの名無しさん
2009/06/02(火) 18:10:12これ実行するとどうなんの?回転する白い板が出るの?
なんで描画のたびにglGenTexturesしてんの
つかこのサンプルコードはどこから?
0752デフォルトの名無しさん
2009/06/02(火) 18:12:51コードが悪いのだからよく調べろ。
デバッグはお前の仕事だ。
0753749
2009/06/02(火) 18:25:29レンダリング時のglGetErrorは確認していて0っぽかったのですが、
初期化時に0x502(GL_INVALID_OPERATION?)が発生しているみたいです。
まだ詳しくはわかりませんが、手がかりが掴めてちょっと気が楽になりました!
ありがとうございます(`・ω・´)
毎フレームGenTexturesしてるのは、最初は初期化時に一度だけやっていたのですが、
そこが問題かもしれないなーと思って描画の直前に設定してみた名残です。
コードは以下のページに掲載されているものを切り張りしてます。
ttp://d.hatena.ne.jp/yaakaito/20090228/1235836453
ttp://wisdom.sakura.ne.jp/system/opengl/gl23.html
>>752
32bitですが、そもそも別アプリケーションでテクスチャが使えることは確認しているので、
どこに問題があるのかなーと悩んでるところです(´・ω・`)
0754デフォルトの名無しさん
2009/06/02(火) 18:44:24初期化時にGL_INVALID_OPERATIONって、gl_init()以外で初期化してるってことかよ。
あまり小出しにされるとまともなアドバイスができんぞ。
0755デフォルトの名無しさん
2009/06/02(火) 19:02:17いえ、gl_init()内のreturn wglCreateContext( hDC);の直前です。
語弊のある書き方でごめんなさいです。
0756デフォルトの名無しさん
2009/06/02(火) 19:13:53それはおかしい。GL_INVALID_OPERATIONを発生させるのはgl*()関数だけだぞ。
0757デフォルトの名無しさん
2009/06/02(火) 19:29:02main関数の冒頭でglGetErrorを読んでみましたが、
やはりGL_INVALIDE_OPERATIONSでした。
調べてみたところ、
glGetError自体がエラーを出してる?可能性があるらしいです。
だとすると初期化時に呼んでも仕方ないかもしれないですが、
レンダリング時だとGL_NO_ERRORですし・・・
ttp://groups.yahoo.co.jp/group/opengl-jp/message/3280?expand=1
> 2. エラーが発生していればその原因を取り除く。(glGetError()
> は呼び出して良いところと悪いところがあり、悪いところだと
> glGetError() 自体でエラーが発生するので注意)
0758デフォルトの名無しさん
2009/06/02(火) 19:34:200759デフォルトの名無しさん
2009/06/02(火) 19:35:21>>749
glTexParameteri達を最初のglBindTextureの後に移動して、
glTexImage2DをGL_UNSIGNED_BYTEにしてみ。255はsigned charでは扱えない
0760749
2009/06/02(火) 19:43:49ちょっと考えはじめてましたw
>>749
うまく行きました!ありがとうございました(´;ω;`)
まずglTexParameterをglBindTextureの直後に移動したところポリゴンが表示されなくなり、
glTexImage2DのtypeをGL_UNSIGNED_BYTEにしたところ、
思惑どおり赤いテクスチャが貼られました!
glBindTextureはそれまでにglTexParameterに従うのかと思っていましたが、
glTexParameterを利用するのはglTexImage2Dで、BindTextureはパラメータをリセットしてしまうのかなあ、
とか推測しましたが、実際のところはよくわかりません('A`
ともかくうまく動くようになって助かりました!みなさんありがとうございました。
0761749
2009/06/02(火) 19:45:17void gl_paint( HWND hWnd, HGLRC hglrc, char* bitmap){
PAINTSTRUCT ps;
HDC hdc = BeginPaint( hWnd, &ps);
wglMakeCurrent( hdc, hglrc);
GLuint texnames[1];
glEnable( GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glGenTextures( 1, texnames);
glBindTexture( GL_TEXTURE_2D, texnames[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
GLubyte test[512][512][3];
for( int i = 0; i < 512 ; i++){
for( int j = 0; j < 512; j++){
test[i][j][0] = 255;
test[i][j][1] = 0;
test[i][j][2] = 0;
}
}
0762デフォルトの名無しさん
2009/06/02(火) 19:46:21glClearColor( 0.0f, 0.0f, 0.0f, 0.0f);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
static double theta = 0.0;
theta += 5.0;
glRotatef( theta, 0.2, 1, 0);
glBindTexture( GL_TEXTURE_2D, texnames[0]);
glColor3f( 1.0f, 1.0f, 1.0f);
glBegin( GL_TRIANGLES);
{
glTexCoord2f( 0, 1); glVertex2f( -0.9f, 0.9f);
glTexCoord2f( 1, 1); glVertex2f( 0.9f, 0.9f);
glTexCoord2f( 1, 0); glVertex2f( 0.9f, -0.9f);
glTexCoord2f( 0, 1); glVertex2f( -0.9f, 0.9f);
glTexCoord2f( 0, 0); glVertex2f( -0.9f, -0.9f);
glTexCoord2f( 1, 0); glVertex2f( 0.9f, -0.9f);
}
glEnd();
glFlush();
SwapBuffers( hdc);
wglMakeCurrent( 0, 0);
EndPaint( hWnd, &ps);
}
0763デフォルトの名無しさん
2009/06/02(火) 19:47:35HDC hDC = GetDC( hWnd);
if( hDC == NULL)
return NULL;
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA, 24,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,
0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
};
int pxfm = ChoosePixelFormat( hDC, &pfd);
if( pxfm == 0)
return NULL;
if( !SetPixelFormat( hDC, pxfm, &pfd))
return NULL;
return wglCreateContext( hDC);
}
>>761-763 が動作を確認したコードです。
それから>>760での>>749へのアンカーは>>759さんへの間違いです。
みなさんありがとうございました!
0764デフォルトの名無しさん
2009/06/02(火) 21:32:27FBO使って裏で描画しているのですが
FBOを512x512だと普通に軽いのに
FBOを1024x1024にすると、重くなります。
画面サイズより大きいと重いとか
そういう仕様とかあるんですか?
回避方法ありますか?
0765デフォルトの名無しさん
2009/06/02(火) 21:38:38それはGPUのfill能力が追いついていないだけだと思う。
0766デフォルトの名無しさん
2009/06/03(水) 06:46:30http://www.opengl.org/pipeline/article/vol003_7/
を読んでおくといいね。デスクトップコンポジションを無効にしない方法
(PFD_SUPPORT_COMPOSITION)やその他の注意が色々書いてあるから初学者には
参考になると思う。
0767デフォルトの名無しさん
2009/06/03(水) 13:17:38TexParameterってのは、名前の通り、テクスチャごとに付随してるパラメータだよ。
BindTextureすると、バインドされたテクスチャに設定されてるパラメータが使われるよ。
だから、GenTexturesで新しく作ったテクスチャをバインドすると、そのテクスチャの
デフォルトのパラメータに従って動作するよ。何もパラメータを設定していないテクスチャの
TEXTURE_MIN_FILTERのデフォルト設定はNEAREST_MIPMAP_LINEARだから、表示するポリゴンや
ウィンドウの大きさによってテクスチャが出たり出なかったりするという罠にハマるよ。
ちなみにTexEnvの方は、テクスチャをフラグメントに適用するユニットの設定なので、
バインドするテクスチャを切り替えても設定は変わらないよ。
この辺は、パイプラインの仕組みを理解していれば、混乱しないできちんと区別できるようになるよ。
0768デフォルトの名無しさん
2009/06/03(水) 14:19:31るよ。
るよ。
るよ。
いよ。
るよ。
0769デフォルトの名無しさん
2009/06/03(水) 14:55:030770デフォルトの名無しさん
2009/06/03(水) 15:29:090771デフォルトの名無しさん
2009/06/07(日) 02:37:47結果をprog.exeで表示することはできましたが画像として保存することができません
出力結果の保存、Excelへの挿入やコピーしてペイントに張り付ける方法はないのでしょうか?
上でFBOという言葉を見ましたがどこか求めているものと違う気がしたので書き込みました
0772デフォルトの名無しさん
2009/06/07(日) 02:38:330773デフォルトの名無しさん
2009/06/07(日) 02:50:46まあPrintScreenが一番楽だな。プログラム的にやりたいなら、描画後に
glReadPixels()して、適当なライブラリを使って画像ファイルに保存すれば良い。
0774デフォルトの名無しさん
2009/06/07(日) 03:19:27恥ずかしいこんな方法があるとは・・
glReadPixels()は課題より複雑そうなので後々覚えることにします
0775デフォルトの名無しさん
2009/06/08(月) 08:51:58OpenGL3.0とSDLで開発ってできるの?
0776デフォルトの名無しさん
2009/06/08(月) 10:00:300777デフォルトの名無しさん
2009/06/09(火) 14:04:56Blit することはできるでしょうか?
0778デフォルトの名無しさん
2009/06/10(水) 00:01:05ビットマップにしてBitBltしてください
直接は無理
0779デフォルトの名無しさん
2009/06/10(水) 13:34:02なるほど。
ReadPixels は遅そうなのでウィンドウ毎にシングルバッファのコンテキストを作って
CopyPixels か BlitFramebufferEXT でカラーデータを転送するようにします。
0780デフォルトの名無しさん
2009/06/11(木) 17:27:43開発に使用しているマシンはVAIO VGN-SZ92PSという機種で
(A)NVIDIA GeForce Go 7400 with NVIDIA TurboCache
(B)インテル グラフィックス・メディア・アクセラレータ 950 (チップセットに内蔵)
の2つのグラフィックアクセラレーターを切り替えることの出来るマシンです。
開発しているソフトウェアを(B)で動かしている分には問題は発生しないのですが、(A)で動かしている場合に限ってシステムダウンしてしまいます。
0781780
2009/06/11(木) 17:29:09エラー報告に含まれるデータの参照:ここをクリックしてください <- これをクリックして得られる情報が以下のとおりで
ModName: nvoglnt.dll
ModVer: 6.14.10.8491
Offset: 0018ae8b
この画面から、
エラーに関する技術情報: ここをクリックしてください <- さらにここをクリックして得られる情報が
Exception Information
Code: 0xc000005 Flags: 0x00000000
Record: 0x0000000000000000 Address: 0x000000006968ae80
といった情報です。
不具合が発生するタイミングはバラバラで、特にマウス操作等何もせずに画面を放置しているだけでも上記の不具合が発生します。
0782780
2009/06/11(木) 17:30:42VAIO VGN-SZ92PS が2つのグラフィックアクセラレータを搭載する際に、
元のグラフィックドライバーに手を加えているらしく、NVIDIAのページで
最新ドライバにアップデートをすることも出来ない状況です。
これまでは、nvoglnt.dllに不具合があって開発したソフトウェア側の問題
ではないのであろうと、問題を放置してきたのですが、私がコーディングを
行う際にOpenGLの仕様範囲外のコーディングを行っている可能性もあるので
何とかして原因を突き止めたいのですが、どこから手を付けたらいいのか
困っている状況です。
問題点が絞りきれない質問で申し訳ありません。
同様の不具合に過去に遭遇した方がいて、「OpenGLの仕様範囲外のコーディング」等
、何かソフトウェア開発者側が原因でありそうな状況に心当たりがある方いましたら
アドバイスよろしくお願いします。
0783デフォルトの名無しさん
2009/06/11(木) 18:32:320785デフォルトの名無しさん
2009/06/11(木) 21:17:340786780
2009/06/11(木) 21:33:29すみません、メール等を書く時、癖で文末に「以上です。」って書いてるもので^^;とりあえず、デバッグコンパイルをしてコールスタックを調べてみたのですが、下記のような状況でした。
kernel32->glut32->opengl32->nvoglnt
の順に呼ばれていて、自分の書いたソースと並列して?動作してるカーネルから呼ばれてるモジュールみたいです。
> nvoglnt.dll!6968ae8b()
[下のフレームは間違っているか、または見つかりません。nvoglnt.dll に対して読み込まれたシンボルはありません。]
nvoglnt.dll!69730093()
nvoglnt.dll!69726382()
opengl32.dll!5c8e9926()
opengl32.dll!5c8e9a2d()
opengl32.dll!5c8e9c5f()
glut32.dll!0039aa05()
glut32.dll!003950ac()
glut32.dll!00394958()
kernel32.dll!7c817077()
下記のようなコードを再描画の関数とかかな?思いつきそうな場所に埋め込んで調べてみたいと思います。
errCode = glGetError();
switch( errCode )
{
case GL_NO_ERROR:
printf( "glerrCode:GL_NO_ERROR\n" );
break;
case GL_INVALID_ENUM:
printf( "glerrCode:GL_INVALID_ENUM\n" );
break;
・・・
case GL_OUT_OF_MEMORY:
printf( "glerrCode:GL_OUT_OF_MEMORY\n" );
break;
}
0787デフォルトの名無しさん
2009/06/12(金) 00:28:530788デフォルトの名無しさん
2009/06/12(金) 01:55:40バッファオブジェクトの範囲外参照とかポインタの範囲外参照をするよう操作をしてしまうと落ちるかもね
でもそれ以外で普通にエラーが出る場合でもドライバによっては落ちるから困る
NVIDIAだとドライバの設定でOpenGLのエラー報告がOFFになってる場合もあるから忘れずに
>>787
GLSLはここだな
0789デフォルトの名無しさん
2009/06/12(金) 16:17:18こちらのSZ91ではインテル側のバグが頻発で、とくに7400Goは不具合出ません。
もしあれでしたら、動作チェックくらいはできますよ。
といっても、おたくのソフト中でどの関数を呼んだときに落ちるのかが全く掛かれていないから、
>同様の不具合に過去に遭遇した方がいて、
といわれても困る
0790780
2009/06/12(金) 20:43:56アドバイスありがとうございます。
> バッファオブジェクトの範囲外参照とかポインタの範囲外参照
このあたりのキーワードも参考にして調べてみます。
> NVIDIAだとドライバの設定でOpenGLのエラー報告がOFFになってる場合もあるから忘れずに
これは初耳でした。
0791780
2009/06/12(金) 20:45:53> こちらのSZ91ではインテル側のバグが頻発で、とくに7400Goは不具合出ません。
> もしあれでしたら、動作チェックくらいはできますよ。
研究で開発している公開前のソフトウェアなので外部に出すのは少し難しいです。
でも、お心遣い本当にありがとうございます。
> といっても、おたくのソフト中でどの関数を呼んだときに落ちるのかが全く掛かれていないから、
> >同様の不具合に過去に遭遇した方がいて、
> といわれても困る
不具合の発生するタイミングが明確ではないですね、まったくおっしゃるとおりです^^;
今のところ分かっているのは、デバックモジュールを作って調査した結果が786に書いた結果で
以下の順に問題のモジュールが呼ばれているというところまでは分かりました。
kernel32->glut32->opengl32->nvoglnt
不具合のタイプが私の書いたコード内で何か関数を呼んだ時に落ちているのではなくてカーネル?から呼び出されているのかな?
GUIのプログラムだと、並列に何か処理しているのかな?・・・
この手の不具合が出た場合の解決方法を知らなくて、どうしたものか悩んでいたところです。
「落ちているモジュールの位置は同じでも、不具合が発生するタイミングがまるでバラバラ」
という特徴があるといえばあるのですが、確かにこれだけじゃアドバイスするのも困りますね^^;
どこかで
kernel32->glut32->opengl32->nvoglnt
の流れで参照している領域を私の書いたコードと共有している場所があってそこを破壊してるのかな・・・
ガベージコレクションとか見たいに不定期に実行される仕組みをOpenGLが何か持ってて、それが実行されたタイミングで不具合が出るとかなのかな・・・
皆さんアドバイス本当にありがとうございます。
参考にさせていただきます。
0792デフォルトの名無しさん
2009/06/12(金) 21:02:03http://www.google.co.jp/search?source=ig&hl=ja&rlz=&q=nvoglnt.dll+%E3%82%A8%E3%83%A9%E3%83%BC
0793デフォルトの名無しさん
2009/06/14(日) 23:09:28使えないみたい?
Extension verification:
GL_ARB_framebuffer_object has the entry point glFramebufferTexturLayer missing!
GL_ARB_geometry_shader4 was not found, but has the entry point glFramebufferTextureARB
GL_ARB_geometry_shader4 was not found, but has the entry point glFramebufferTextureFaceARB
GL_ARB_geometry_shader4 was not found, but has the entry point glProgramParameteriARB
GL_ARB_imaging was not found, but has the entry point glBlendEquation
GL_EXT_geometry_shader4 was not found, but has the entry point glFramebufferTextureEXT
GL_EXT_geometry_shader4 was not found, but has the entry point glFramebufferTextureFaceEXT
GL_EXT_geometry_shader4 was not found, but has the entry point glFramebufferTextureLayerEXT
GL_EXT_geometry_shader4 was not found, but has the entry point glProgramParameteriEXT
0794デフォルトの名無しさん
2009/06/15(月) 02:00:330795デフォルトの名無しさん
2009/06/15(月) 02:18:500796デフォルトの名無しさん
2009/06/15(月) 19:18:37教えてください。
0797デフォルトの名無しさん
2009/06/15(月) 19:40:530798デフォルトの名無しさん
2009/06/15(月) 21:19:100799デフォルトの名無しさん
2009/06/15(月) 22:38:150800デフォルトの名無しさん
2009/06/16(火) 00:31:11全然うまくいかないぜ。。。
0801デフォルトの名無しさん
2009/06/16(火) 13:18:49OpenGL ES 1.x なら OpenGL と変わらないはずだよ。
0802デフォルトの名無しさん
2009/06/16(火) 15:11:54ESはgluProject()が無いんだよ
0803デフォルトの名無しさん
2009/06/16(火) 15:38:510804デフォルトの名無しさん
2009/06/16(火) 18:10:020805デフォルトの名無しさん
2009/06/16(火) 18:31:29ていうかさ、頂点の座標にモデルビュー行列掛けて、投影行列掛けて、wで割って、
ビューポート変換かければウインドウ座標出るよ。
OpenGLというか3Dグラフィックスの基本が分かってれば簡単だし、その位は理解
しておくべき。
0806デフォルトの名無しさん
2009/06/16(火) 19:27:17[ w/2 0 0 w/2+x ]
[ 0 h/2 0 h/2+y ]
[ 0 0 -1/2 -1/2 ]
[ 0 0 0 1 ]
0807806
2009/06/16(火) 20:47:31[ w/2 0 0 w/2+x ]
[ 0 h/2 0 h/2+y ]
[ 0 0 1/2 1/2 ]
[ 0 0 0 1 ]
0808デフォルトの名無しさん
2009/06/16(火) 22:56:222Dの画像を移動・回転・拡大縮小させつつ大量に描画するにはどうしたらいいですか?
glLoadIdentiy→glScale→glRotate→glTranslate→glDrawArraysのようにするんでしょうか。
このやり方で速度大丈夫なんでしょうか?
そしてテクスチャのαでαブレンドして、αが0の部分を抜きたいんですがうまくいきません・・
glEnableでGL_ALPHA_TESTとGL_BLENDを有効にして
glAlphaFunc(GL_GREATER, 0.f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
にすればいけると思ったんですがαが0の部分が白く表示されてしまうようです。
どうすれば
0809デフォルトの名無しさん
2009/06/16(火) 23:43:04GLUTのHPにある例題の立方体を元に作り直しました。
一応、表示はされるのですがあっているのでしょうか?
勉強し始めたばかりで、よくわかっていません。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9475.txt
0810デフォルトの名無しさん
2009/06/17(水) 08:07:27俺はauxWireCorn使ってた
あ、それとダブルバッファの切り替えとか癖にした方がいい気がする。
まぁ俺も勉強中の身だけどw
0811デフォルトの名無しさん
2009/06/17(水) 08:34:590812780
2009/06/17(水) 09:25:221.以下のページからGLUT関連ファイルを取得
ttp://www.xmission.com/~nate/glut.html
のページの
glut-3.7.6-bin.zip (117 KB)
GLUT for Win32 dll, lib and header file (everything you need to get started programming with GLUT).
2.各ファイルを開発環境に合わせて配置
例.VC++6.0の場合
glut32.dll -> C:\WINDOWS\system32
glut32.lib -> C:\Program Files\Microsoft Visual Studio\VC98\Lib
glut.h -> C:\Program Files\Microsoft Visual Studio\VC98\Include\GL
例.VC++2008の場合
glut32.dll -> C:\WINDOWS\system32
glut32.lib -> C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib
glut.h -> C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl
後は、
#include <GL/glut.h>
をソースの先頭に記述すればOK
0813デフォルトの名無しさん
2009/06/17(水) 22:19:55アルファテストいらなくね?
速度はダメになってから考える
0814デフォルトの名無しさん
2009/06/17(水) 23:17:143角形の集まりにしてGL_TRIANGLESで描画するのって、
パフォーマンス的にどうなんでしょうか?
よく、3角形の方が効率がいいみたいな話を聞いたりしますが、
実際のところどうなんでしょう..モデルデータは頂点の数が多く
なっても3角ポリゴンの集まりに分割にしといた方がいいので
しょうか?
0815デフォルトの名無しさん
2009/06/17(水) 23:24:555時間ぐらいって遅い方かな?
0816デフォルトの名無しさん
2009/06/17(水) 23:37:44QUADS系は3.1で消えるんだよな。まあnvidiaを使ってる限りは安泰なんだが。
パフォーマンスはドライバによるだろうが、多分変わらないのが多いはず。
数が多いなら、なるべくTRIANGLE_STRIPを使うように頑張った方がいいぞ。
0817デフォルトの名無しさん
2009/06/17(水) 23:42:27ありがとうございます。
ですか...3角形にしといた方が無難なようですね。
0818デフォルトの名無しさん
2009/06/18(木) 21:42:38GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT, GL_BACK_RIGHT
はそれぞれ別々の RGB ストレージを持っていると思いますが、
深度、ステンシル、αはこれらのバッファ間で共有されることが
あるでしょうか?
0819808
2009/06/18(木) 23:09:59アルファテストは要らないんですか?なら
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
さえ入っていればできるんじゃないんでしょうか・・。何か足りない?
テクスチャ張らずに、ColorPointerを有効にしてポリゴンを表示したときはちゃんと半透明合成されたんですが。
もしかしてglTexEnvを使ったらちゃんと合成されるようになると思っていろいろ試していますが
やっぱりうまく行きません。
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
としたらテクスチャの色が変になりました。
0820デフォルトの名無しさん
2009/06/18(木) 23:20:59どうすれば頂点カラーのアルファではなくてテクスチャのアルファが使われるようになるんでしょうか・・
それとテクスチャの特定の色を抜いたりできる機能はOpenGL ESにはあるんでしょうか。
あればこっちも試してみたいです。
0821デフォルトの名無しさん
2009/06/18(木) 23:43:57glTexEnvf()でGL_DECALモードに設定すればアルファ抜き出来る。
赤本のglTexEnvf()の部分にあるテクスチャブレンド関数のテーブルを
よく見ておくこと。
0822デフォルトの名無しさん
2009/06/18(木) 23:48:23ESの仕様が気になるなら、ここで聞くよりまず仕様書に当たるべき。
pdfで公開されているんだから。
http://www.khronos.org/registry/gles/
0823デフォルトの名無しさん
2009/06/19(金) 00:00:560824デフォルトの名無しさん
2009/06/19(金) 00:47:42FRONT_LEFT、FRONT_RIGHT、BACK_LEFT、BACK_RIGHTはいずれもカラーバッファ
RGBAのみ個別に保持する
深度とステンシルは共有だよ
αは個別
>>819
glBlendFunc(GL_ZERO, GL_ONE)とかしたらどうなる?
0825デフォルトの名無しさん
2009/06/19(金) 01:51:42基本的には
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
だけでブレンドできるはず。それでダメなら、ブレンド以外の問題なんじゃないかな。
とりあえず、アルファテストは切っておいて良いと思うます。
あとは、テクスチャの内部フォーマットがちゃんとGL_RGBA(又はその亜種)になってるか、
そもそもちゃんとテクスチャは適用されてるのか(αが0の部分が白くなる、とか明らかに
おかしいです)、あとは・・・なんだろう。他にチェックすることあったっけな?
あ、テスト段階ではTexEnvはGL_REPLACEにしとくのがいいかな。
スクリーンショットか、携帯で撮った写真でもなんでもいいから、実際の絵があると
少しは状況が分かるかも。
0826808
2009/06/20(土) 22:27:18ここにあったんですか、見てみます
>>824
glBlendFunc(GL_ZERO, GL_ONE)したら何も表示されなくなりました・・これにどんな意味が?
>>825
自前ではなく用意されているAPI使ってRGBが(0,0,255)の部分のαを0にしようとしていましたが
自分でこの処理を作りました。(携帯アプリのAPI使うと0x00FFFFFFになる?)RGBが(0,0,255)の部分の色を0x00000000にすると
その部分の色は黒くなりましたが、やっぱりテクスチャのαは反映されてはいない
(青→黒にした部分が透明ならない)ようです。
テクスチャがちゃんとRGBAになっているかどうかが怪しいんですが、どうやって確かめたら?
glGetTexImageはありません。PC上ならESでも普通のOpenGLで動作しているはずなので
特定のアプリでglTexImage2DされたらPNGで保存してくれるツールがあればテクスチャの内容調べられそうですが・・。
スクリーンショットって参考になるんでしょうか・・
頂点のαを0.5fにして、GL_REPLACE→全部不透明
頂点のαを0.5fにして、GL_MODULATE→全部半透明
頂点のαを0.5fにして、GL_MODULATE→全部半透明
こんな感じなんです。
0827デフォルトの名無しさん
2009/06/20(土) 22:34:480828デフォルトの名無しさん
2009/06/20(土) 22:45:17gDEBuggerってものがあるので体験版を試してみるといいかも
DirectXならPIXが無料で使えるんだけどね
0829デフォルトの名無しさん
2009/06/20(土) 22:50:54glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sizeX, sizeY, 0, gl.GL_RGBA, GL_UNSIGNED_BYTE, buffer);
試しに両方にGL_RGBを指定すると、壊れた画像が表示されました。
internalだけGL_RGBAにすると、なぜか真っ白になりました。
0830デフォルトの名無しさん
2009/06/21(日) 01:49:22あとは同じようなことやってるサンプルがあればそれとの違いをみつけるんだ
0831デフォルトの名無しさん
2009/06/21(日) 13:12:17glGetErrorもglTexImage2DとglTexEnvfの後は0でした。
あとはサンプル探しか・・
0832デフォルトの名無しさん
2009/06/23(火) 21:36:07例えばあるbmpを読み込んで、テクスチャオブジェクトにした状態で中の値を変化(どこどこのビットの色を変えたり)させたりしたい
こういう場合どこをどういじればいいの?
もっと言えば変化させたテクスチャオブジェクトをbmpに出力したりしたい
0833デフォルトの名無しさん
2009/06/23(火) 22:36:21テクスチャ初期化できるんなら難しいことじゃないと思うが。
0834デフォルトの名無しさん
2009/06/23(火) 23:03:24メモリ上で普通に変化させてglTexImage2DとかglTexSubImage2Dで更新するしかないね
取得はglGetTexImageだけど、メモリ上でいじるならいらん
0835デフォルトの名無しさん
2009/06/24(水) 02:49:18subImageって任意の1ビットを任意の色に塗り替えることができる?
0836デフォルトの名無しさん
2009/06/24(水) 10:21:44どなたか教えてください。
0837デフォルトの名無しさん
2009/06/24(水) 19:02:000838デフォルトの名無しさん
2009/06/24(水) 20:07:06sampler型に割り当てるのはglGenTextures()で作ったオブジェクトだし、
texture型に渡してみても不正なパラメタ的エラーメッセージ出すし。
sampler_stateでTextureを参照しているようなのに対してはテクスチャオブジェクトを直接渡しちゃっていいんでしょうか。
0839デフォルトの名無しさん
2009/06/24(水) 23:00:54本に例として書かれていたプログラムで下記の部分にエラーが出たのですが、
どこが間違っているのかわかりません。
エラーの出た箇所をピックアップしてみましたが、何処が間違えているのでしょうか・・・
1 glLineStipple(1, 0x0101);
2 drawOneLine(50.0, 125.0, 150.0, 125.0);
個人的にはdrawにはglが付かないといけないと思うのですが、
単にglをつけてもエラーが出てしまい疑問です・・・
後、やはりプログラム全て書き起こした方がよろしいでしょうか?
0840デフォルトの名無しさん
2009/06/24(水) 23:14:420841デフォルトの名無しさん
2009/06/24(水) 23:43:49OpenCVと組み合わせればBMPでもJPGでも一発で出力可能
glTexImage2D→IplImage
0842デフォルトの名無しさん
2009/06/24(水) 23:46:12Cgのtexture型に相当するもの?
そんなものは無い!
しいていうならglTexImage2Dで指定するメモリ領域かな。
プログラム側ではtexture型のパラメータからファイル名とか種類(1〜3D, cube等)を取得して
そのtextureを参照しているsampler型のオブジェクトに対応するテクスチャにglTexImage2Dとかで画像を与えるのが普通ではないかと思う。
Cgは使った事あるけどCgFXのプログラム側はあまり作った事無いので間違ってたらごめん。
>>839
openglの関数にはすべてglの文字が付いてるから, drawOneLineって本の作者が作った関数か何かじゃないの!?
それとそのエラーはコンパイルエラー?リンクエラー?それともランタイムエラー?
0843デフォルトの名無しさん
2009/06/25(木) 03:39:48OpenCV使わないでどうにかできないでしょうか?
0844838
2009/06/25(木) 07:48:11なるほど、やはりOpenGLではtexture型メンバに何か与えて〜って訳じゃないんですね。
DirectXの場合のコードを見てたらsampler型じゃなくてtexture型のハンドル取得してそこにテクスチャを渡してたので気になったってたんですけど、
HLSLのtexture型を調べてたらテクスチャのサイズやメモリ〜とか書かれてて何渡したらいいのか判らなかったんです。
cgGetSamplerState*()やらcgSetSamplerState()を使って参考にすれば良いって事ですよね。
0845デフォルトの名無しさん
2009/06/25(木) 11:28:31加算合成して、白くなるのって、ライトが効いてるからですか?
0846デフォルトの名無しさん
2009/06/25(木) 21:05:090847デフォルトの名無しさん
2009/06/25(木) 21:30:03クリックした箇所に表示するプログラムを作って試したんですが・・
G,B成分がないから、ですかね?
0848デフォルトの名無しさん
2009/06/25(木) 21:47:200849デフォルトの名無しさん
2009/06/26(金) 01:14:520850デフォルトの名無しさん
2009/06/26(金) 01:22:490851デフォルトの名無しさん
2009/06/26(金) 02:41:45OpenCV使わないでOpenCVより簡単に実装することは無理。
一番単純なBMPで保存するにしても、ヘッダ情報から自前で用意する
必要があるだろ。GL描画に追いつくほどの「高速」な画像バッファ
も確保しとかなくちゃならんし。
0852デフォルトの名無しさん
2009/06/26(金) 03:31:570853デフォルトの名無しさん
2009/06/26(金) 03:56:04無理じゃないだろ。初学者はバッファとかヘッダとかもちゃんと
勉強したほうがいいんじゃね?それらをちゃんと把握してから、
OpenCVで簡単にやるのは構わないと思うが。
確かに、OpenCVと組み合わせればOpenGLの動きをリアルタイムでAVI
ファイルに保存することとかも簡単にできるけどな。
0854839
2009/06/26(金) 09:37:56C:\Documents and Settings\Tetsuzo Kuragano\My Documents\GLtest7.c(32) : error C2065: 'x1' : 定義されていない識別子です。
C:\Documents and Settings\Tetsuzo Kuragano\My Documents\GLtest7.c(32) : error C2065: 'y1' : 定義されていない識別子です。
C:\Documents and Settings\Tetsuzo Kuragano\My Documents\GLtest7.c(32) : error C2065: 'x2' : 定義されていない識別子です。
C:\Documents and Settings\Tetsuzo Kuragano\My Documents\GLtest7.c(32) : error C2065: 'y2' : 定義されていない識別子です。
C:\Documents and Settings\Tetsuzo Kuragano\My Documents\GLtest7.c(32) : error C2146: 構文エラー : ';' が、識別子 'glBegin' の前に必要です。
C:\Documents and Settings\Tetsuzo Kuragano\My Documents\GLtest7.c(34) : error C2146: 構文エラー : ';' が、識別子 'glBegin' の前に必要です。
C:\Documents and Settings\Tetsuzo Kuragano\My Documents\GLtest7.c(36) : error C2146: 構文エラー : ';' が、識別子 'glBegin' の前に必要です。
C:\Documents and Settings\Tetsuzo Kuragano\My Documents\GLtest7.c(41) : error C2146: 構文エラー : ';' が、識別子 'glBegin' の前に必要です。
C:\Documents and Settings\Tetsuzo Kuragano\My Documents\GLtest7.c(43) : error C2146: 構文エラー : ';' が、識別子 'glBegin' の前に必要です。
C:\Documents and Settings\Tetsuzo Kuragano\My Documents\GLtest7.c(45) : error C2146: 構文エラー : ';' が、識別子 'glBegin' の前に必要です。
で、x、yがおかしいと出ているのですが、何処がどう間違っているのか・・・
0855デフォルトの名無しさん
2009/06/26(金) 09:44:420856デフォルトの名無しさん
2009/06/26(金) 09:44:51C言語の1時間目から復習してください
つか、名前かっこいいなw
0857839
2009/06/26(金) 10:02:07プログラムベタ張りさせて下さい。
ttp://www12.ocn.ne.jp/~h01a09bk/index.html
0858デフォルトの名無しさん
2009/06/26(金) 10:08:08#define drawOne (x1,y1,x2,y2)
のところ
#define drawOne(x1,y1,x2,y2)
ってしてみて
たぶんマクロ関数の定義のしかたが悪いと思う
0859839
2009/06/26(金) 10:08:19スルーして頂けると嬉しいです。
0860デフォルトの名無しさん
2009/06/26(金) 10:53:090861デフォルトの名無しさん
2009/06/26(金) 12:29:08つーか、マクロにしないで関数にしろよ。
static void drawOneLine(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) {
glBegin(GL_INES);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
glEnd();
}
0862デフォルトの名無しさん
2009/06/26(金) 13:43:450863デフォルトの名無しさん
2009/06/26(金) 16:10:27赤本のプログラムそのものだし、入門中にそこまで要求しちゃ酷。
つかマクロのがいいだろ。
0864デフォルトの名無しさん
2009/06/26(金) 18:39:20ネタじゃないのかw
0865デフォルトの名無しさん
2009/06/26(金) 20:55:12あと、コードは見やすく書いた方が上達するよ。
おかしなインデント、スペース、改行はだめ。
http://www.dotup.org/uploda/www.dotup.org172961.c
0866デフォルトの名無しさん
2009/06/27(土) 01:27:28>>839
赤本なら自分で入力しないでコピペしてきたほうが楽だよ
http://www.opengl.org/resources/code/samples/redbook/lines.c
0867デフォルトの名無しさん
2009/06/27(土) 04:44:55プログラミングがおぼつかないうちは、赤本なら>>866が貼ってくれたように
GLのサイトにソースがあるので、それをもとにいじり倒して理解していくのもいいと思う。
赤本を勉強する姿勢は大事なので、がんばってねー
0868デフォルトの名無しさん
2009/06/27(土) 14:39:25JavaのGUIに表示する本やサイトを教えてください。
0869デフォルトの名無しさん
2009/06/27(土) 14:46:32がプログラムなのかその出力物なのか何なのか想像が難しいんだが、あえて言うなら、そんぐらいググれよカスさん。
0870デフォルトの名無しさん
2009/06/27(土) 14:48:07ライブラリーのようなものなのです。
そして、windows固有のAPIを使わないように作っておいて、
GUIをJavaにすることで機種に依存しないソフトウェアを
開発しようと考えています。
0871デフォルトの名無しさん
2009/06/27(土) 14:55:42でもC++のライブラリ自体は環境依存になると思うけど。
0872デフォルトの名無しさん
2009/06/27(土) 14:56:59素直にクロスプラットフォームなGUIツールキットを使っとけ。
0873デフォルトの名無しさん
2009/06/27(土) 15:01:500874デフォルトの名無しさん
2009/06/27(土) 15:05:52選択肢
1 そんな方法は無い
2 分からない
3 教えるのが面倒
0875デフォルトの名無しさん
2009/06/27(土) 15:10:11保存する方法を教えてください。
0876デフォルトの名無しさん
2009/06/27(土) 15:12:17だけど俺自身試したことないからちゃんと動くかどうかは定かではない。
あと、基本的にライブラリはOS間で可搬性はないのでどっちみち機種依存になると思う。
0877デフォルトの名無しさん
2009/06/27(土) 15:18:39glReadPixels で何でも読み込める。
0878デフォルトの名無しさん
2009/06/27(土) 15:24:38A) glReadPixels で何でも読み込める。
なんだこの珍問答はw
0879デフォルトの名無しさん
2009/06/27(土) 15:52:24すぐ上に解決法が上がってるだろ。よく読め。
>>853
0880デフォルトの名無しさん
2009/06/27(土) 16:01:48お前偉そうな奴だな。出来るに決まってるだろうが
ただしGUIとC++コードのインタラクションをすべてJNIでラッピング
するのが面倒なだけだ
0881デフォルトの名無しさん
2009/06/27(土) 16:06:240882デフォルトの名無しさん
2009/06/27(土) 16:08:30グラボのS-Video出力からHDレコーダーに入れて動画ファイルとして保存
画面動画キャプチャソフトってのもあるよw
0883デフォルトの名無しさん
2009/06/27(土) 16:11:00JNI使えば可能、で分からないのか?
0884デフォルトの名無しさん
2009/06/27(土) 16:14:44Javaのグラフィックコンテキストに出力するのかを
ききたいのですよ。
0885デフォルトの名無しさん
2009/06/27(土) 16:26:280886デフォルトの名無しさん
2009/06/27(土) 16:35:210887デフォルトの名無しさん
2009/06/27(土) 16:36:090888デフォルトの名無しさん
2009/06/27(土) 16:36:27お返事ありがとう。
いや、OpenGLで書いた絵をプログラムレベルで動画ファイルにしたいんです。
>>879がOpenCVですぐできるって言うから自分もやってみたくて、
具体的にはどうすればいいのかと。
0889デフォルトの名無しさん
2009/06/27(土) 16:57:58スレ違いっぽいが、ここのサンプルでもみてやってみれば
http://opencv.jp/sample/video_io.html
0890デフォルトの名無しさん
2009/06/27(土) 16:58:000891デフォルトの名無しさん
2009/06/27(土) 17:01:26GUIの処理速度は多項式時間に抑えられるので
Javaでもよいのですよ。
0892デフォルトの名無しさん
2009/06/27(土) 17:04:27OpenCVのスレッドへGO!
【Intel】OpenCV総合スレ【画像処理】2
http://pc12.2ch.net/test/read.cgi/tech/1230511656/
0893デフォルトの名無しさん
2009/06/27(土) 17:14:14Java3Dのソースでも読めば参考になるんじゃね?教えて君
0894デフォルトの名無しさん
2009/06/27(土) 17:18:18うーん、残念。
0895デフォルトの名無しさん
2009/06/27(土) 17:18:22だったら最初からもっと細かく書けよ。
そうじゃなくて、OpenGLで直接JavaのFrameに描画するんだ。
1.2の頃はAWTにあったクラスでWindowハンドルを取得出来たんだが、
今はもう無理なようだ。俺も偉そうなことを言ってさすがにそれは無いから
少し調べてみた。
JOGLにあるjavax.media.nativewindow.DefaultGraphicsDeviceを継承したクラスの
getHandle()でFrameのwindowハンドルを取れるな。あとは必要ならネイティブの
ウインドウを作ってMakeCurrent()すればOpenGLで好きに描画できる。
getHandle()を自分で実装したけりゃJOGLのソースでも見てくれ。
>>891
あまり知ったかするなよ。OpenGLを直接使うかJOGL経由で使うかの違いは
計算量的には定数項の違いに過ぎない。
0896895
2009/06/27(土) 17:32:39Windowハンドルが取れて、ネイティブコードからCanvasに直接描画可能。
JOGLも同じことをやってるはず。
0897デフォルトの名無しさん
2009/06/27(土) 17:35:39その回答でOK。
0898デフォルトの名無しさん
2009/06/27(土) 17:36:120899デフォルトの名無しさん
2009/06/27(土) 17:38:530900デフォルトの名無しさん
2009/06/27(土) 17:43:220901デフォルトの名無しさん
2009/06/27(土) 17:51:210902デフォルトの名無しさん
2009/06/27(土) 17:58:01>>897がこのような態度を取る気持ちもわからなくもないよ
どっちもどっちだな
0903デフォルトの名無しさん
2009/06/27(土) 18:01:39つまりスルーすべきだったということだな。
0904デフォルトの名無しさん
2009/06/27(土) 18:04:460905デフォルトの名無しさん
2009/06/27(土) 18:05:170906デフォルトの名無しさん
2009/06/27(土) 18:08:400907デフォルトの名無しさん
2009/06/27(土) 18:12:210908デフォルトの名無しさん
2009/06/27(土) 18:14:330909デフォルトの名無しさん
2009/06/27(土) 18:20:570910デフォルトの名無しさん
2009/06/27(土) 18:27:380911デフォルトの名無しさん
2009/06/27(土) 19:40:560912デフォルトの名無しさん
2009/06/28(日) 13:03:16定数項じゃなくて係数じゃね?
まぁどのみち891は意味が分からんが。
GUI以外では多項式時間に収まらないような計算でもやってんのか?
>>902
どっちもどっちてwwww
897みたいなアフォの気持ちなんて分かるわけないだろ。
8 9 7 以 外 に は な 。
0913デフォルトの名無しさん
2009/06/28(日) 19:08:06自演じゃないならな
0914839
2009/06/29(月) 16:02:49無事動かす事が出来ました。
今使っている本なのですがプログラムの
細かい解説が載っていなく、
ベタ打ちで打って動かして読み取く方法しか取れません。
良かったら初心者にオススメのopenGLの本何か無いでしょうか?
初心者なのでサイトも考えられますが、
自由に使えるネット環境では無いのでサイトではなく本で勉強したいです。
0915デフォルトの名無しさん
2009/06/29(月) 16:06:29Mason Woo著者の
OpenGL Programming Guide です。
英語の本なのですが、アマゾンでこれしか見つからなくて…
0916デフォルトの名無しさん
2009/06/29(月) 16:27:250917デフォルトの名無しさん
2009/06/29(月) 16:43:35その本は俗に赤本(Redbook)といってopenGLのバイブル的本。その本で細かい解説が載ってないというのはどうかと。
ただC言語の本じゃないので、処理の流れまでは説明してない。あくまでもopenGLの本だから。
ちょっと高いけど日本語版もあるので、日本語で読んでみたら?
http://www.amazon.co.jp/dp/4894717239
赤本が最初からじゃ重いというなら、別の本を買うのもいいかもしれんけど、自分が入門したころは赤本しかなかったのでよくわからん
絶対にネットじゃ嫌だってなら、床井氏の本とかいいんじゃない。安いし
http://www.amazon.co.jp/dp/4777511340
あと866にも書いたけど、赤本のサンプルプログラムはネットにあるのでベタ打ちしなくても動かせるよ
http://www.opengl.org/resources/code/samples/redbook/
0918デフォルトの名無しさん
2009/07/01(水) 03:49:01しかし,main文中で
(1) ウインドウを開く
(2) 図形の描画
(3) ウインドウを閉じる
の順番で処理を行いたいと考えています.
ウインドウを開くためにglutMainLoopを呼び出してしまうとそこから先の処理に進めません
メインスレッドの処理を中断させないために,glutMainLoop内の処理を別スレッドで行わせるといった事は可能なのでしょうか?
LVの低い質問で恐縮ですが,何かいい方法があればご教示願います.
0919デフォルトの名無しさん
2009/07/01(水) 08:16:240920デフォルトの名無しさん
2009/07/01(水) 16:45:55その程度ならGLUTで十分可能。
イベントドリブンプログラミングについてググれ。
0921デフォルトの名無しさん
2009/07/02(木) 04:01:39誤解を招いてしまったようなので追記します.
GUIベースのいわゆるお絵かきソフトではなく,プログラム中で計算した結果をグラフにして表示させるために用いたいと考えています.
int main(...)
{
init(...); // 初期化処理(glut初期化)
// TODO : 計算
drawLine(...); // 描画命令
close(...); // 終了処理
}
というようなプログラムが書けるAPIにしたいのですが,
initの中でglutの呼び出しおよびglutMainLoopの呼び出しを行ってしまうと,ウインドウは開きますがその先の処理に進めません.
やはりglutではこのような要求を満たすのは難しそうです.
・終了処理関数内でglutMainLoopを呼び出し,結果のみを表示する(妥協案)
・描画関数が呼ばれる毎に新しいウインドウを開き,古いウインドウを閉じる(一応現実的だが非効率)
・SDL等の別のAPIを用いる(妥協案2,win/linux両対応かつ複数ウインドウに対応しているglutは理想的)
・glutで作成したウインドウに,glutのコールバック関数を用いずに何らかの方法で図形を描画する
現在上記の選択肢のどれをとるかで迷っています.
0922デフォルトの名無しさん
2009/07/02(木) 05:36:260923デフォルトの名無しさん
2009/07/02(木) 06:45:350924デフォルトの名無しさん
2009/07/02(木) 08:27:37その若さで哀れな……
0925デフォルトの名無しさん
2009/07/02(木) 08:52:37これだけだとアレなので、床井先生の手抜きOpenGL入門の最初のほうを見てくると良いよ。
0926デフォルトの名無しさん
2009/07/02(木) 23:18:15メインスレッドでやっている処理をglutのIdleFunc内で実行できるようなループ処理にすれば1スレッドで実行可能じゃないか?
それが面倒ならメインスレッドを実行しながら別スレッドでglutMainLoopを実行し, display関数内でメインスレッドで処理しているデータを参照しながらグラフでも描画すればいいんでね?
確かglutMainLoopを抜けるにはexit関数しかなったと思うんだけどそれが嫌ならopenglutでも使ってみたら?
glutと似たようなAPIだけどメインループは自分で書けるよ。
0927デフォルトの名無しさん
2009/07/03(金) 01:14:40レスありがとうございます.
用途的にはそういった事も想定しています.
計算処理をglutにコールバック関数として渡せば確かにリアルタイム表示は可能ですが,
>>921のような手順で処理ができるようなAPIを目指しているのでやはりglutに頼るわけには行かないようです.
ご紹介いただいたOpenGLUTを丁度漁っていたところなので,これを使って頑張ろうと思います.
0928デフォルトの名無しさん
2009/07/03(金) 01:23:08なんかイライラする。
0929デフォルトの名無しさん
2009/07/03(金) 03:30:110930デフォルトの名無しさん
2009/07/03(金) 04:14:31あおりっぽいひとたちの言葉も、案外老婆心だなと思ったり。今回に関しては。
最近流れ悪いな。
0931デフォルトの名無しさん
2009/07/03(金) 07:31:050932デフォルトの名無しさん
2009/07/03(金) 13:22:471行でその人が真に必要としているものを示しているわけだから煽りとも言えないだろう
0933デフォルトの名無しさん
2009/07/04(土) 00:33:57「APIにしたい」「APIを目指す」とか意味の分からない用語を使ってるあたり、
OpenGL以前に学ぶべきことが多過ぎるような気がするけど・・・。
ま、それはともかく。
A→B→C という順番で処理をするなら、プログラムも
A;
B;
C;
というように書かないといけない・・・と思っているのだとしたら、いつまでたっても
GLUTに限らずイベントドリブンなツールキット/フレームワークは使えないよ。
>>921さんのやりたいことは、GLUTで十分に、簡単にできる。
0934デフォルトの名無しさん
2009/07/04(土) 00:34:39Calc();
glutMainLoop(); → draw_func();
Fin();
ではFin()が実行されなくて困る、というのなら、draw_func()の中で
void draw_func() {
[描画]
glutSwapBuffers();
Fin();
}
とやってやればいい。ちゃんとCalc()→[描画]→Fin()の順番で実行されるでしょ。
(まぁ、これは正直あまり良くない組み方だけど)
ESCキーを押したらFin()を実行したいのならkeyboard_funcの中でFin()呼べばいいし、
クリックしたらFin()に移りたいのならmouse_funcの中でFin()を呼べばいい。
それだけの話。
>>919>>920は誤解でもなんでもなく、ごくまっとうなアドバイスなのですよ。
0935デフォルトの名無しさん
2009/07/04(土) 07:49:40main(){
calc();
draw();
fin();
}
ってやりたい。そういう「API」を作りたいって言ってるみたいよ。
そこで、いやglutだとこうやって実装するのが正しい、とかそんなの関係ないの。
draw()で描画します、fin()で終了しますっていう「仕様」の「API」を作らねばならんらしい
ウィンドウがリサイズされたり再描画するイベントが起きたらどうするかって?さー?
結局glutのフレームワークとは相反するんだし、「glutではできない、全部自分で作ろう」っていうのが正解か
最近の流れは>>850が正しいのかもね
0936デフォルトの名無しさん
2009/07/04(土) 12:15:530937デフォルトの名無しさん
2009/07/04(土) 14:23:53例外投げて脱出してみたりとか試したこともあったけどねw
debugビルドではうまくいったんだけど、releaseビルドでは落ちちゃったので諦めた。
あれは何故なんだろう?
あと、やったことないけど、setjmp/longjmpならいけるのかな?
GLUTも、glutExitMainLoop()とかあればいいのにね。何故無いのかなー。
>>936
でも>>918がやりたいのはそういうことなんですよねぇ多分・・・。よく分からんけど。
0938デフォルトの名無しさん
2009/07/04(土) 14:35:440939デフォルトの名無しさん
2009/07/04(土) 14:44:26終了する以外にglutMainLoop抜けたい理由はないんだから、
終了イベントが来たら後処理してexitすればいいじゃん。
glutMainLoopの下に書かないといけない理由はないっしょ
0940デフォルトの名無しさん
2009/07/04(土) 15:02:080941デフォルトの名無しさん
2009/07/04(土) 16:41:42open scene graphでも使った方がいいと思います。
きっと優しい>>945がわかり易い日本語解説サイトを立ち上げてくれるだろう。たぶん。
0942デフォルトの名無しさん
2009/07/04(土) 17:03:50んなこた言われなくても当たり前に分かってるよ。実際そう書いてるし。
ただ、下に「書かないといけない」理由は無くても、そう書ければ嬉しい場合はあるでしょ。
main関数内で作った自動変数のデストラクタを走らせたいとか、(918みたいに)init()とfin()を対応させたいとか。
現実問題としてglutExitMainLoop()は無いのだから918はGLUTに合わせた書き方をするべきだけど、
それとは別の問題として、なんでglutExitMainLoop()が無いのかな(あったらいいのに)と思った。というだけの話。
glutExitMainLoop()の実装に手間がかかるとも思えないし、他のGLUT APIとの間に
矛盾が出るわけでもないと思うんだけどなぁ。
・・・とか書くと確実に、「だったら自分でGLUT書けよw」とか言い出すやつが出てくるだろうけど
意味が無いからレスはしませんよとあらかじめ言っておく。
>>938
メンドクセーから読んだ事ないけど、読めばglutExitMainLoop()が無い理由とか分かんの?
>>941
GLUTより新しいのを使うべきというのはごもっとも。
そして>>945に期待。
0943デフォルトの名無しさん
2009/07/04(土) 17:12:07glutIldeFunc()やglutKeyboardFunc()、glutTimerFunc()などに、ユーザ定義の関数を渡してやれば
いいだけのような気がするんだが。
なんか簡単なことを変に難しく実装しようとしてない?
0944デフォルトの名無しさん
2009/07/04(土) 17:13:16そもそもGLUTは学習用に作られたauxが古くさいから置き換えるために
書かれたAPIだからな。オリジナルの実装者はもうメンテナンスを放棄しているし
ライセンス上ソースを勝手に改変出来ないから色々な派生プロジェクトが出来た。
とは言っても所詮小さなツールを作る程度までのAPIだから別にそこまで
注目されなかったんだよ。
ちなみに、freeglutだとglutLeaveMainLoop()というそのものズバリな関数が
用意されているがな。
0945デフォルトの名無しさん
2009/07/04(土) 17:17:04単に設計段階でMainLoopを抜ける使い方は想定されてないってだけの話だろ。
そもそもFORTRANとANSIに準拠したCのライブラリなのに、デストラクタとかアホか。
0946デフォルトの名無しさん
2009/07/04(土) 17:18:280947デフォルトの名無しさん
2009/07/04(土) 17:26:33それか、atexit()やon_exit()で終了処理を登録するとか..
0948デフォルトの名無しさん
2009/07/04(土) 17:29:59いや、デストラクタは単に現在glutExitMainLoop()が欲しい理由の一例として挙げただけで・・・
対応する前処理と後処理を、ソースの上で近い場所、同じ関数に置いておきたいっていうのは
プログラマとして当然湧いてくる欲求だろ。(「自動変数生成→デストラクタを走らせたい」も同じ)
要するに、なんで「MainLoopを抜ける使い方は想定されてない」んだろう?って話なんだよ。
まぁ、当初からそこまで真面目に考えられてなかった、てのは分かったけどさ。
なんでいちいちここまで書かないといけないのかな。
そういう事を考えたりとかしないわけ?
デストラクタって言葉尻だけ捕まえて噛み付くとか、まったくもってナンセンスだ。
0949デフォルトの名無しさん
2009/07/04(土) 17:34:01イベントループを抜けるってことは全てのウィンドウは閉じてるのだろうし、
画面にウィンドウが無いなら終了してください。mainには戻ってきませんので忘れ物の無いようにお願いします。
って言ってんだよ。そのほうが使いやすいし、間違いも起こりにくいでしょ
0950デフォルトの名無しさん
2009/07/04(土) 17:48:44> そういう事を考えたりとかしないわけ?
普通の人間なら、こんなどうにもならない事をずっとグダグダ考えてる
暇があったら、さっさとGLUTを使わないコードを書いてる。
0951デフォルトの名無しさん
2009/07/04(土) 17:56:11個人的には同意しかねるけどなるほど、そういう主張と解釈するのもアリですかね・・・。
0952951
2009/07/04(土) 17:59:37まぁ950から荒らし認定も頂いたことだしwwとりあえずここいらで消えますわん。
0953デフォルトの名無しさん
2009/07/04(土) 18:08:340954デフォルトの名無しさん
2009/07/04(土) 18:43:520955951
2009/07/04(土) 18:48:17>>933>>934>>937>>942>>948>>951>>952
が僕ね。てかどこをどう読めばじゃばの人と同じに見えんの? ・・・見えるんですかそうですか。('A`)
0956デフォルトの名無しさん
2009/07/04(土) 19:17:03自分と違う考え方は全て間違ってるとでも言いたげな。
無意識に他人を見下してるタイプと見た。
お前のポリシーとglutのポリシーは合わないので、
さっさとglutから離れることをオススメするよ。
つーかあと、純粋に言動が気持ち悪いよお前。
0957デフォルトの名無しさん
2009/07/04(土) 19:35:190958780
2009/07/05(日) 11:49:41>>780 >>781 >>782 >>783 >>784 >>785 >>786 >>788 >>789 >>790 >>791 >>792
少し前の話題になりますが、問題点が分かったので連絡します。
「恐らく」としかいえないレベルではあるのですが・・・
問題としていた不具合のおきやすい状況として
今回作っているソフトウェアはマルチウィンドウを用いているのですが、
(操作画面と結果画面のような感じです。内部ではglutCreateWindowを複数回呼び出しています)
2つのウィンドウが出ている状況で、
タスクバー上で2つのウィンドウを交互にクリックして選択を切り替える操作を繰り返す。
→選択したウィンドウにフォーカスが移るのが徐々に遅くなる
→最終的に落ちる
これ以外のパターンでも落ちるのですが(この為恐らくとしかいえないのですが・・・)、
これ以外のパターンの例としては
・作ったソフトを起動していくつかの操作を行った後、IE等を起動して全画面表示で放置すると数分後には落ちている。
問題と思われるのはdisplay関数の定義の中で
windowA_display()
{
・・・
TwDraw();/* AntTweakBarの描画 */
glutPostRedisplay();
glutSwapBuffers();
if(windowB != NULL) windowB_display();
}
としている部分でした。
display関数の中でglutPostRedisplay()を呼び出しているのですが、ここをコメントアウトすることで落ちなくはなりました。
0959780
2009/07/05(日) 11:51:40>>780 では
> OpenGL + GLUT + C言語 + Visual C++ 2008 Express Edition にてソフトウェア開発を行っています。
と記述していたのですが、現状ではこれにAntTweakBarというライブラリを組み合わせて使ってます。
ttp://www.antisphere.com/Wiki/tools:anttweakbar
問題の不具合はAntTweakBarを組み込む前から発生していたのでAntTweakBarは開発環境の説明に入れなくてもいいかと思っていたのですが以下のような状況でした。
AntTweakBarを組み込む前
GLUTを使い始めた当初で特に理由もなく上記のようなコーディングをしていた
AntTweakBarを組み込んだ後
上記のようなコーディングをしないと、メニュー上にマウスを持って行った際のフォーカスがうまく表示されない。
AntTweakBarのサンプルコードを見るとGLUTの場合には上記のようなコーディングになっていて
GLFWのサンプルコードではSwapBufferをしているだけなので、なぜGLUTの場合のみglutPostRedisplayをしなければうまく表示できないのかは分からないところなのですが・・・
glutPostRedisplayを呼び出す代わりに、AntTweakBarの描画関数を2度呼び出したらダメかなと思い試して見ましたがダメでした^^;
windowA_display()
{
・・・
TwDraw();/* AntTweakBarの描画 */
TwDraw();/* AntTweakBarの描画 */
glutSwapBuffers();
if(windowB != NULL) windowB_display();
}
display関数の中でglutPostRedisplayを呼び出すというのはなんだか無限ループを作っているような感じがするのですが、こうすることの利点が何かあるのでしょうか?
0960デフォルトの名無しさん
2009/07/05(日) 12:37:30AntTweakBarとやらを使った事無いし、落ちる原因にも思い当たらないのですが、最後の
>display関数の中でglutPostRedisplayを呼び出すというのはなんだか無限ループを作っているような感じがするのですが、こうすることの利点が何かあるのでしょうか?
の部分にだけコメントを。
「無限プール」てのは無限再帰呼び出しのことでしょうかね。
だとしたら、glutPostRedisplayの動作を勘違いしてるかも。
glutPostRedisplayはその中でdisplay関数を呼び出すわけじゃなく、GLUTに対して
「次に機会があったらメインループからdisplay関数を呼んで頂戴」というメモを書き残すだけで、
glutPostRedisplay関数自体からはすぐに処理が帰ってきます。
だからdisplay関数の中で呼んでも大丈夫だし、あちこちで複数回呼んでも大丈夫。
ちなみにGLUTに限らずどのライブラリでも、〜Post〜とかいう名前の関数は、似たような動作
(イベント等の登録だけして、すぐに処理は帰って来る)をすることが多いです。
・・・そのくらいのことはすでに分かってる、とかだったらゴメンナサイ。
display関数の中でglutPostRedisplayを呼ぶ利点といったら・・・再描画のタイミングを
あれこれ考えなくても、勝手に延々と再描画をし続けてくれることですかね。つまり手抜きw
0961デフォルトの名無しさん
2009/07/05(日) 12:47:26>>958
まず言いたいのは、理由も無くコーディングしたり、ためしに1行消してみたら動いたとか、
そしたら違うバグが出たのでためしに2回呼んでみたけどダメだった。とかやめろ
それで偶然動くようになったプログラムとか怖くて使えないから。
glutPostRedisplay()は再描画マークをイベントキューに入れる(再描画を予約する)だけなので、
常に描画され続けているという無限ループにはなるけど問題はない。
利点はそうしないと、GUIを動かした時にGUIが再描画されないでしょ。(他にも方法はあるだろうが一番簡単)
glutPostRedisplayを消したら落ちなくなったのは描画する回数が圧倒的に減ったので落ちるまでの時間が延びただけだろう
それよりwindowB_display()を呼んでいるのはなんで?
マルチウィンドウならそっちのdisplay()もコールバック登録してあるんじゃないの
つか「・・・」ってとこに原因はないの?「・・・」とwindowB_display()をコメントアウトすれば動いたりせんか?w
0962780
2009/07/05(日) 14:49:58コメントありがとうございます。
>>960
> ちなみにGLUTに限らずどのライブラリでも、〜Post〜とかいう名前の関数は、似たような動作(イベント等の登録だけして、すぐに処理は帰って来る)をすることが多いです。
おーなるほど
> ・・・そのくらいのことはすでに分かってる、とかだったらゴメンナサイ。
glutPostRedisplayに関しては助言いただいた動作をすることは理解していたのですが、
GLUT全体として上の〜Post〜的な関数一連が同じ動きをするとかすごく参考になります^^
> display関数の中でglutPostRedisplayを呼ぶ利点といったら・・・再描画のタイミングを
> あれこれ考えなくても、勝手に延々と再描画をし続けてくれることですかね。つまり手抜きw
そういう利点もあるか・・・なるほど
display関数で書いた最後の
if(windowB!=NULL)windowB_display();
は、windowAに対する処理にwindowBを連動させることを目的としているのですが
本来はwindowBに関係する処理の末端のみに記述するところを、windowAで行われた全ての処理から呼ばれるdisplay関数の中で記述すように書き換えたなんて経緯があります^^;
0963780
2009/07/05(日) 14:57:51すみません、言葉が足りませんでした。
今回の不具合なのですが、自分のコードで書いた箇所での不具合ではなく、外部モジュールでエラーが発生しているタイプです。
外部モジュールを呼び出している親関数も自分の書いたコードからではなく、詳しくは>>786 のような状況です。
この手の不具合のつぶし方が分からなくて右往左往しているという状況がまずありました。
そこで、不具合の起こる状況から何が問題になっているのかを推測しながら、問題点を探してみることにしました。
何も操作してなくても落ちるという状況から問題が発生する可能性があるとしたら描画部分以外なかったので、display関数を見直して無意味だと感じたglutPostRedisplayを消してみた
という流れです。
> 理由も無くコーディングしたり
これに関しては、GLUTを使い始めた当初は、display関数の中で条件分けをして描画内容を切り替えたり、
それぞれの描画内容に応じて別のウィンドウを連動させて描画するなんてことをしていました。
開発後半になって、プログラム全体が複雑になりすぎたので処理全体を見直して記述しなおして、整理している段階で
display関数の中のglutPostRedisplayが役目を果たしていないことに気がついた。
といった状況です。
> ためしに1行消してみたら動いたとか、そしたら違うバグが出たので
消した理由はglutPostRedisplayの動作がdisplay関数を開いたタイミング?で呼び出すというものだったので、display関数の中にglutPostRedisplayが存在していても意味を成さないのでは?と考えたからです。
ただ実際にはAntTweakBarの中ではこういった記述に意味を持っていて、glutPostRedisplayを消すと描画処理が不完全な状況になってしまった。
という状況です。
AntTweakBarのソースコードは公開されているので、TwDrawの動作を追ってdisplay関数の中でglutPostRedisplayをなぜ呼ぶ必要があるのかを調べれば一番いいのですが・・・
> ためしに2回呼んでみた
glutPostRedisplayの動作が複数回記述しても一度だけ実行される。というものだったので
display関数の中でglutPostRedisplayを呼ぶということは、display関数の処理を2度行っているのに等しいのでは?と考えて、同じ処理を2回やってみました。
0964780
2009/07/05(日) 14:59:06>glutPostRedisplayを消したら落ちなくなったのは描画する回数が圧倒的に減ったので落ちるまでの時間が延びただけだろう
まさにこんな状況ですね^^;
> それよりwindowB_display()を呼んでいるのはなんで?
> マルチウィンドウならそっちのdisplay()もコールバック登録してあるんじゃないの
「windowAにAntTweakBarで作ったボタンをおいて、各操作に対応した計算を行った後、計算結果をwindowBに出す。」
ということを行っています。
「windowAに対する操作に対してwindowBを書き換えたい」
ということを実装したくて、当初はwindowBに関わる全ての処理の最後でwindowB_display()をコールしていました。
ただ機能数が増えていくに従い、リファクタリング時に苦労するようになってきたので
windowAで操作が合ったら常にwindowAのディスプレイ関数が呼ばれるのでそこでコールすればいいかなと
ただ、windowBが存在しない状況でwindowAに操作を行っている状況も存在するので、
if(windowB!=NULL)windowB_display();
とすることで間違いが起きないかなと・・・つまり手抜きです^^;
> つか「・・・」ってとこに原因はないの?「・・・」とwindowB_display()をコメントアウトすれば動いたりせんか?w
同じ結果ですね〜^^;
0965デフォルトの名無しさん
2009/07/05(日) 15:42:27glutPostRedisplayが何をしてるのかを勝手に想像して勝手に削るなと。glutPostRedisplayでググれば
「表示コールバック関数内から再表示のために呼ばれるかもしれない」って書いてあるでしょ?
glutPostRedisplay()が必要な意味はこれ以上説明しないが、それが原因ではないことはたしか
windowB_displayはWindowBをcreateした後にglutDisplayFunc(windowB_display)ってしてないの?してるなら
glutSetWindow(windowB); glutPostRedisplay();
ってやればよいのでは。windowAのdisplayコールバックからwindowBのdisplayを直接コールはダメ。どこでカレントウィンドウ切り替えてんのよ
>> つか「・・・」ってとこに原因はないの?「・・・」とwindowB_display()をコメントアウトすれば動いたりせんか?w
>同じ結果ですね〜^^;
同じ結果ってのは同じように落ちるってこと?「・・・」とwindowB_displayをやらないってことは実質AntTweakBar関係しかやってないってことじゃん
それで落ちるってことは原因はAntTeakBarを用いたGUI部分にある可能性が高いのだから
AntTeakBar以外の部分(多分あなたの研究の部分)を全部隔離して、GUIだけのテストを行うべきでしょ
0966デフォルトの名無しさん
2009/07/05(日) 15:42:59マルチビューポートならそんな問題は起きないけど。
0967780
2009/07/05(日) 21:36:48カレントウィンドウの切り替えは
glutDisplayFunc(windowB_display);
を定義して
windowB_display()
{
glutSetWindow(windowB);
・・・
glutPostRedisplay();
}
といった感じでやってます。
> 同じ結果ってのは同じように落ちるってこと?「・・・」とwindowB_displayをやらないってことは実質AntTweakBar関係しかやってないってことじゃん
> それで落ちるってことは原因はAntTeakBarを用いたGUI部分にある可能性が高いのだから
> AntTeakBar以外の部分(多分あなたの研究の部分)を全部隔離して、GUIだけのテストを行うべきでしょ
隔離できるところまで隔離しきって試してみます。
>>966
当初はマルチビューポート的なコーディングをしていたのですが、画面制御(ユーザ好みにサイズ調整を行う等)の実装がきつくなってきたので、出力内容毎に窓を分けるようにしました。
0968デフォルトの名無しさん
2009/07/06(月) 01:02:510969デフォルトの名無しさん
2009/07/06(月) 02:13:340970デフォルトの名無しさん
2009/07/09(木) 01:50:50テクスチャに対してレンダリングするにはどうすればよいでしょう?
0971デフォルトの名無しさん
2009/07/09(木) 01:53:030972デフォルトの名無しさん
2009/07/09(木) 21:11:44方法はあるでしょうか?
0973デフォルトの名無しさん
2009/07/09(木) 22:27:450974デフォルトの名無しさん
2009/07/10(金) 00:52:53OpenGL でいうクライアントが動作しているマシン側のシステムメモリのことです。
ウィンドウとレンダリングコンテキストの作り方によって glCopyTexImage2D()
で転送できるのではと思ったのですが無理ですかね。
0975デフォルトの名無しさん
2009/07/10(金) 01:04:08どうやってもシステムメモリを使用する事になるよ。
0976デフォルトの名無しさん
2009/07/10(金) 13:49:140977デフォルトの名無しさん
2009/07/10(金) 14:17:12OpenGL 3.0で標準入り。それ以前では拡張扱い(EXT_framebuffer_object)
0978デフォルトの名無しさん
2009/07/11(土) 02:00:290979デフォルトの名無しさん
2009/07/11(土) 02:19:320980デフォルトの名無しさん
2009/07/11(土) 02:20:02vector<Buttai*> buttai;
while(1) {
if (KeyPush()) {
buttai.push_back(new Buttai);
}
for(size_t indekkusu=0; indekkusu<buttai.size(); ++indekkusu{
buttai[indekkusu].byouga();
}
}
glut的には
vector<Buttai*> buttai;
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
for(size_t ind=0; ind<buttai.size(); ++ind) {
buttai[indekkusu].byouga();
}
glFlush();
}
void keyb(unsigned char key, int x, int y) {
buttai.push_back(new Buttai);
}
int main(int argc, char *argv[]) {
glutDisplayFunc(disp);
glutKeyboardFunc(keyb}
retrun(0);
}
どっちにしろGLそのものとは関係ない質問だな
0981デフォルトの名無しさん
2009/07/11(土) 07:35:500982デフォルトの名無しさん
2009/07/11(土) 09:12:14これ今自分で書いたの?
0983デフォルトの名無しさん
2009/07/11(土) 09:29:520984978
2009/07/11(土) 22:59:10すいませんが実際にコンパイルできるソースを書いてくれませんか?
C 言語どころかプログラミング言語はほとんど知りません
お願いします m(__)m
読み込んでいるヘッダーファイル(?)は
<stdlib.h>
<GL/glut.h>
<GL/gl.h>
<GL/glu.h>
<math.h>
で、環境は WindowsXP の Visual Studio というソフトです
キーを押すと flag が 1 になって、display 関数の中に
if(flag = 1){
glTranslatef(1.0, 0.0, 0.0);
glutTeapot(1.0);
flag = 0;
}
としてみたんですが、それまでの物体は消えて平行移動した感じになります
glClear(GL_COLOR_BUFFER_BIT); をコメントアウトすると
それまでの画面は変な形で残りますが
物体は最終的には回転できるようにしたりするのでよくないのです
0985デフォルトの名無しさん
2009/07/11(土) 23:09:420986デフォルトの名無しさん
2009/07/11(土) 23:13:290987デフォルトの名無しさん
2009/07/11(土) 23:14:59コンパイルできるソースを書いてくれませんか?wwwwww
0988デフォルトの名無しさん
2009/07/11(土) 23:29:140989デフォルトの名無しさん
2009/07/11(土) 23:42:400990デフォルトの名無しさん
2009/07/12(日) 00:39:280991デフォルトの名無しさん
2009/07/12(日) 01:12:56あんな短いコードを読んで理解できないならOpenGL以前の問題
0992デフォルトの名無しさん
2009/07/12(日) 03:51:560993デフォルトの名無しさん
2009/07/12(日) 04:39:00レベルの低い質問はスルーした方がいい。
0994デフォルトの名無しさん
2009/07/12(日) 05:14:030995デフォルトの名無しさん
2009/07/12(日) 10:02:03http://pc12.2ch.net/test/read.cgi/tech/1247349324/
0996デフォルトの名無しさん
2009/07/12(日) 13:22:26君が質問するべきはOpenGLスレじゃなくて、宿題スレだな。
ここはやり方を教えてくれる人はいても、答えを書いてくれる人はいない。
(つーか宿題スレ以外、「答えを書け」なんていう質問はどう考えても嫌われる。)
OK?
レス数が950を超えています。1000を超えると書き込みができなくなります。