またまた質問です。
OpenGLとOpenCVのメリットやデメリットを教えて下さい。
OpenCVは、
・画像処理のAPIがすぐに使える。
・OpenGLと同様、直線を引いたりすることが出来る。
といった感じですよね。
OpenGLがOpenCVに比べて良い点とは何でしょう?
どちらを使用して、開発をするか検討中です。
よろしくお願いします。
OpenCVは2D画像処理
OpenGLは3D
だろ
何開発するつもりなんだよ
>>7 なるほど。
デバッグやアルゴリズムの確認・評価にOpenCVを使用することにし、
当初の予定通り、OpenGLで開発を進めていくことに致します。
ありがとうございます。
>>5 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
を追加したら上手くいくかも
10 :
デフォルトの名無しさん:2008/09/13(土) 18:01:41
OpenGLを使って簡単なお絵かきプログラムを組んだのですが
マウスのポジションをコールバックする回数が少なすぎて
マウスを速く動かすと線がカクカクしてしまいます.
MotionFuncを呼ぶ回数が多くなる方法を知っている方いらっしゃいますか?
もしくはC++とOpenGLの限界なんでしょうか?
>>10 得られた点列を曲線にするなどして入力を補間したらいいかと。
それで満足できなかったらWin32APIとかOSのAPIを直接叩けばいいと思うよ。
ポイントスプライトは頂点がひとつしかありませんから
そのものを回転することはできませんよね…?
そうですね
OpenGLにてWin32APIの UpdateLayeredWindow(); 用の32bitのアルファ付き画像をレンダリングしたいのですが、
どうするのが簡単な方法でしょうか?
・BitmapのHDCにレンダリング(アルファ取れる?)
・glReadPixels
うーん
>>14 普通にglTexImage2Dでテクスチャを作ればいいと思うけど、それじゃ何か問題があるの?
OpenGL ESでColorDepthを32bitにするにはどうすれば良いのでしょうか?
>>15 いや、GLでレンダリングした結果をWin32の半透明ウィンドウとして
使いたいという意味では?
>>14 その2つでは、glReadPixelでDIBに取得してBitBltのほうが適当かと、
32bits DIBに描画してBitBltは、MSのソフトウェア実装でGL描画が実行される
可能性が高いような。
GPUのピクセルフォーマットのサポート状況にもよるけど、PbufferSurfaceを作り、
そのHDCを使ってUpdateLayeredWindowもできるのかな?
>>16 eglChooseConfigでEGL_BUFFER_SIZEに32を指定。
失敗した場合、その環境では32bitsのカラーバッファはサポートされていないことに
人が作ったOpenGLアプリケーションをフックして画像を取得したいんですが、
glFlushをフックすればいいんでしょうか?
glFlush
↓
glFlush
glReadPixels
画像を保存とかする
つ GLIntercept
行列スタックについて質問です。
glPushMatrix と glPopMatrix は便利なのですが、
・大きさを三倍にし30度傾けたモデルを、複数の場所に移動させて描画したい
という場合に行列の乗算の順番の問題からうまくできません。
glTranslatef
glRotatef
glScalef
draw
という順番に処理を行う(と思う)のですが…。これだとうまくglPushMatrixを活用できません
これが仮に逆だったら(乗算の前後関係が逆だったら)
glScalef
glRotatef
glPushMatrix
glTranslatef
draw
glPopMatrix
glPushMatrix
glTranslatef
draw
glPopMatrix
このように、非常に手軽だと思います。
何かこの手のやりようが他にあるのでしょうか?
1. 描写する前にモデルを三倍にして30度傾けておく
1.1 CPUで
1.2 Transform Feedbackで
2. GLSLでなんとかする
2.1 三倍と30度をuniform変数に
2.2 せっかくなのでGeometry Instancingで
>>22 1はモデルデータを書き換えてしまうわけですね。ちょっとこれだと、傾けたい角度が動的に変化する場合に負荷がきつそうですね
2はシェーダですね。(iPhoneでのOpneGL活用をやっているのですが)iPhoneにシェーダが使えたか確認してみます。
意外と行列操作そのものの機能が乏しいのでしょうか。
Direct3DにあるD3DXMATRIXのようなものも見当たりませんし、glTranslatefなどを使わず行列そのものを適用する方法も見つかりませんでした
glSetMatrix(float *matrix);
みたいなものがあれば、行列系は全部自前でやってしまうのですが・・・
つglLoadMatrix*()
>>24 !!
あとは自前で行列クラスを作れば良いですね。
ありがとうございました。
glRotatefなどの行列乗算が適用順番と逆順なのは、カメラ座標への変換(最後に行うべき変換)を最初に宣言させたいからですかね。
というか、適用昇順と逆順は結構使い分けたい場合が多いので、glTranslatefに2種欲しかったですね・・・
>>23 > 傾けたい角度が動的に変化する場合に負荷がきつそうですね
ちょっと考えればそれは一概には言えないことに気づくはず。
4ByteでGL_RGBA指定でテクスチャーを作っているのですが、
描画してもアルファの部分が抜かれません。
何か設定がいるのでしょうか?
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
とかちゃんとやってるだろうか
やってませんでした><
31 :
デフォルトの名無しさん:2008/09/18(木) 23:10:57
一応これ置いときますね
書き込んじまったorz
つ GL_ALPHA_TEST
vbogl.tlbのedxさんめちゃくちゃいい人だ。メールしたら速攻返事きたw
34 :
14:2008/09/20(土) 09:24:51
>>15-17 レス遅くなりました
やっぱり、glReadPixelになるのかあ。
画面に表示せずにでもバッファから取得できるものなのだろうか・・・
試してみたいと思います。
35 :
14:2008/09/20(土) 09:27:26
x やっぱり、glReadPixelになるのかあ。
o やっぱり、ハードウェアきかせるには glReadPixelになるのかあ。
開発環境のマシンがドライバが古いせいでか、
glReadPixelがメッチャ遅いんですよね
ドライバ新しくしたら、WMPとかが真っ黒になったりするので、
古いのバージョンのドライバを使ってたりします。
Geforce6600だったと思うけど、ビデオカード買い換えるか・・・orz
glReadPixelsが重いのは大抵のハードウェアで共通。
GF6600ならPBOなりFBOなり使え。
でもpbufferは勘弁な。
OpenGLでスキンメッシュボーンアニメーションを実装しているのですが、クォータニオンから回転行列への変換って一意じゃないのでしょうか?
一部のアニメーションフレームでボーンが360度一瞬クルッと回ってしまうというバグに困ってます。
そのおかしなアニメーションの時のクォータニオンと変換した行列を調べて何がいけないのか原因をつきとめればいい
バグに困ったらデバッグしよう
>>39 やっぱり地道なデバッグですよね。
デバッグしてたら少し原因が分かりかけてきました。
問題のフレームでクォータニオンの大きさが限りなく0に近くなっているようです。
自分の実装の仕方が悪いみたいです。ありがとうございました。
重なる向きで正しい結果が出る実装は
Gemsに載ってる。
それでも反対向きの場合はダメだったはず
だけど、現実的にはあり得ないからOK
というやつだった。
42 :
デフォルトの名無しさん:2008/09/25(木) 02:20:49
質問です
glDrawPixelsで背景を描いて
GL_BLENDをなど有効にしてglBeginなどでポリゴンを描いても
ポリゴン同士はアルファが効いてるんですが
背景がポリゴンから透けてないんです
他に設定がいるんでしょうか?
解像度指定(640x480等)のフルスクリーンにするにはどうすればいいでしょうか?
glutGameModeString
>>43 俺は、DirectDrawでやってるけど、
何故か一部のマシン(ノートPC)環境で画面が真っ黒になるという現象が
発生しているんだよなあ。
Windowモード→OpenGL初期化→表示、実行→フルスクリーンに切り替え→まっくら
→Windowモードにもどす→また表示される
なんとかしたいんだけどもねえ。
フルスクリーンになってから、最初期化しないといけないのかも
DirectXみたいにサーフェスロストとかってしないよな?OpenGLは。
そもそもWindowモードに戻したらまた表示されるのがわからんな。
シェーダー系の処理について質問です
よくテクスチャにシーンをレンダリングして、
それにシェーダーでエフェクト処理をかけて画面に表示してるとかありますが、
テクスチャなどは2のn乗サイズがメジャーですが(512x512とか)
画面は4:3とかがメジャーだと思います(640:480とか)
そこで、
・縦横比が合わない出力バッファで、どう言う処理概念で出力しているのでしょうか?
・テクスチャと言う事は、最終的な処理は、画面全体に2Dポリゴン+レンダリングテクスチャ、とかになるのでしょうか?
2のn乗サイズにならないテクスチャは
* OpenGL2.0以降かGL_ARB_texture_non_power_of_twoがあれば問題なく使える
* GL_ARB_texture_rectangleとかを使う
* でかい2のn乗サイズのテクスチャの一部だけ使う
のどれか
あと最終的には全画面を覆うポリゴンにシェーダなりでテクスチャにフィルタかけながら描画になるね
誰か頼む・・・
OpenGLをHP-UXにインストールするにはどうすればいいか、
教えてくれ・・・
Solarisへのインストーラは直ぐに見つかったんだが、
HPのがどうしても見つからん
HPにOpenGL使いたいがどうすればいいかと聞く方がよさそうな。
51 :
デフォルトの名無しさん:2008/09/29(月) 23:12:35
OpenGLを用いてシミュレーションをしたいんですが,
バイナリ形式で書かれたSTLという拡張子のファイルを読み込むライブラリないし
データ形式に関して解説されている資料はありませんでしょうか?
>>51 拡張子でぐぐれば拡張子辞典が出てくる。
STLを調べればStereoLithographyが見つかる。
あとは"StereoLithography file format"とかでぐぐる。
って、おい!
質問するから普通に検索しても見つかないのかと思ったら
stl file formatでヒットするじゃねーか。だいじょぶかw
まさか日本語じゃなきゃ分からないとか言わないよねw
スプライト(矩形)表示したいんですけど、
座標を(-1.0,-1.0) - ( 1.0, 1.0) とかでなく、
ドット指定 (0,0) - (640,480) ってできないんですか?
gluOrtho2Dとかでお好みの座標系を設定すればいいと思うよ
55 :
デフォルトの名無しさん:2008/10/01(水) 00:02:37
GL_TEXTURE_MAG_FILTERで設定できるのはLINEARとNEARESTがあると思うのですが,
独自に(LINEARやNEARESTじゃないものを自分で定義)拡大時の補間方法を定義できないでしょうか。
ピクセルシェーダで必要な数だけサンプリングして適当に混ぜ合わせればできる
t-pot バイラテラルフィルタでぐぐると具体例が
>>53 俺はこんな感じでやってる
glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;
glOrtho(0, ScreenWidth, ScreenHeight, 0, -10000, 10000);
glMatrixMode(GL_MODELVIEW);
glPushMatrix;
glLoadIdentity;
今更だけど動作検証用にvista導入して最新ドライバで
自作プログラムを動かしてみたら予想より良く動いて驚いた
ちなみにアプリはsm2.0世代ターゲット(ARBアセンブラシェーダ)、
グラボはゲフォ9600GTでD3D9の95%程度のFPSが出てた
ラデは知らん
計算間違ってた、大体90%程度ね
61 :
デフォルトの名無しさん:2008/10/07(火) 10:33:29
どなたかプログラミングの宿題
3〜4題(大学1年生レベル)のアルバイト
日当8千円くらいでやってくれる方いませんか?
いません
金出すなら学校のツテで探したほうが早いだろ
>>60 計算スレッドとレンダリングスレッドを分けるのがナウい
一度やって懲りたけど
描画するだけならともかく、ゲームになると結構いろんなところでCPUは食うから
分散させれるなさそうしたほうがいいんじゃ。ゲームの種類にもよるんだろうが。
まーシングルCPUでは無意味ですがね。
>>61 ソースの書き方で大学1年レベルかどうかばれると思うよ
67 :
デフォルトの名無しさん:2008/10/07(火) 13:10:15
>>66 ソースは枠があって、座標軸やらポリゴン構成やらの設定を
する部分だけすげかえるような感じなんです。
あまり詳しくかけないですが、工学系の院にいれらておる
法律家で、畑違いでちょっと困っているんです。
VBOを使うときはまず初期化処理の段階でglBufferData()でバッファを確保しますよね
プログラム中でバッファを再び確保しなおしたい時(つまりデータを書き換えて再度送りたい時)
glBufferData()を呼び出して確保しなおしているのですが
この際,元々確保されていたバッファをクリアしなくて良いのでしょうか?
バッファをテクスチャに、glBufferDataをglTexImage*に読み替えてみればわかると思うよ。
最近OpenGL ESから勉強し始めて、なんとなくOPEN GLそのものは理解しました。
画面の表示をピクセル単位で制御しようとして、
今表示してるものは glReadPixels で取得するとこまでは成功しました。
で画像を弄くったあとに、表示しようと思ったら
OpenGL ESには、glDrawPixelsがなかった…
こういう場合どうするのが一般的なんでしょう。
ピクセルデータの入った配列から毎フレーム、glTexture2D作るんですか?
よろしくお願いします。
Texture はあらかじめ作成しておいて、glBindTexture 後、
glTexSubImage2D で該当部を書き換えがおすすめ
と、思ったけど、glTexSubImage2D が OpenGL ESにあるかどうかは知らない。
>>71 glTexSubImage2D ありました!!
ちょっとこれから実験してみます。
ありがとうございます!!
>>71 無事かけるようになりました thx!!です
glVertex4についての質問なんですが、4つめの引数のwは他のxyzに対してどのように作用しているのでしょうか?
4次元の同次座標を3次元の空間座標に変換する場合、xyzをwで割ると思うのですが、
glVertex3にwで割ったxyzを入れたときと、glVertex4に同次座標をそのまま入れたときの描画結果が
違うときがあるのですが…
もし、glVertex4がxyzをwで割っているのならば、引数の値が(-1, -1, -2, -2)と(0.5, 0.5, 1, 1)で描画結果が同じに
なるはずですが、全く描画結果が違うので混乱してしまっています orz
76 :
75:2008/10/13(月) 11:39:33
書き忘れてましたが、モデルビュー行列とプロジェクション行列は一応単位行列に
してあります。単位行列になっているのが原因とは思えませんが…
>>75 w < 0 は動作保証されない。正の値を使う。
78 :
75:2008/10/13(月) 17:53:10
>>77 ということはw<0の時に正しく描画されたのはたまたまだったということですね。
喉のつっかえがとれてすっきりしました。
ありがとうございます。
79 :
デフォルトの名無しさん:2008/10/15(水) 10:13:24
glutMainLoop()を使わずに自分で作ったfor文の中で、
glutDisplayFunc()で登録した関数呼び出したいんですが可能ですか?
glut使った場合は必ずglutMainLoopを使わないといけないの?
つfreeglut
みなさん、
The OpenGL
Graphics System:
A Specification
(Version 3.0 - August 11, 2008)
を読まれましたか?
The Deprecation Model
を読むと、
glBegin, glEnd, glVertex, glFrustum, glPopMatrix, glPushMatrix, glTranslate*
glDrawPixels, glNewList, glEndList, 等々
が将来無くなるらしいですよ。
シェーダでもOpenGLが自動的に設定してくれていたattribute変数やuniform変数が使えなくなるぞ
ある程度真面目に作った場合はどれも使わなくなる機能だから消えるのは仕方ないかもれない
しかし敷居は上がるよな
その辺をフォローするライブラリみたいなのを用意してくれればいいんだが
OpenSceneGraphとかNVSGを使えとか言うのかな
誰か固定機能パイプラインの関数と互換性のある関数を(OpenGLのちゃんとした関数で)実装したりしそうだけどな。
glBegin, glEndは実行効率は悪いだろうけどちょっと何かをレンダリングしたいときに
ささっとコードを書けて便利だよね。
うわ、マジなのか。
初心者がまず最初に覚える関数じゃん。
敷居があがっちゃうな、確かに。
まあ今までglNantoka()だったのがgluNantoka()に変わるだけだろうな
えええええ
glBeginとかなくなったら、どうやって描画寸の???
88 :
デフォルトの名無しさん:2008/10/18(土) 08:24:04
glPush・PopMatrix使って、中級者レベルになってきたんじゃね?って
俺はどうすればいいんですか><
今でもドライバの中ではそれらの関数とかはvboなりに置き換えてからやっていたりするので、
>>86なだけだろうよ。変換する関数がもっと手前(ユーザー側)に出てくるだけ。
アホな質問ですみません
OpenGLに行列の乗算の関数ってありますか?
すみません自己解決しました
glMultMatrix() ですね
そのうちなくなるけどな
>>89 もっと奥(シェーダ、GPU側)に行くんじゃないの
ビットマップテクスチャにglColorで色加えることってできますよね(多分)。
glTexEnviを使って、ゴニャゴニャ弄ればいけるとは思うんですが、
組み合わせがよくわからず苦戦中です。
とりあえずアプローチは間違ってないでしょうか?
よろしくお願いします。
乗算合成はできるけど加算合成は無理じゃね
シェーダ使って足せばいいんじゃね
シェーダだけ覚えてしまえば他のいろいろ面倒なことを完全スルーできるから楽だな
GMA950でGLSL使えなくて(´・ω・`)だったけどCg使えばいいしな
99 :
95:2008/10/21(火) 00:45:52
なるほどです。シェーダ勉強しはじめます!!
ありがとうございます!!
100get
もうゴテゴテした固定機能パイプラインの関数なんて覚えなくていい。
vertex shaderでは値をそのまま通すだけ。
fragment shaderでは法線ベクトルを0〜1の範囲にスケーリングしてfragmentのcolorに設定する。
ただ、これだけでいいんだ。
102 :
デフォルトの名無しさん:2008/10/24(金) 01:17:54
シェーダー使えればどんなに楽か。
使えないパソコンの方が圧倒的に多いだろ。
特にノーパソ。何とかしてくれ。
つmacbook
つソフトエミュ
ARB_fragment_programならノートでも結構使えるよ
アセンブリ直接書くのはつらいからCg使うことになるだろうけど
使えるという程の速度が出ないと言うことなら仕方ないが
このぐらいのモデルならスキニングでテクスチャにアクセスする必要はないと思うが・・・
骨が指の関節にまで入ってたりでもするのか?
いい感じに次世代な気分
でもノーマルマップとHDRが今の次世代(?)標準らしいぜ
スキニングはテクスチャ必要ないと思うけど
バーテックスシェーダのuniform変数の数が足りないなら
足りそうな所まででモデルを分けて描画という面倒な手もある
他には頂点座標の値を1次元テクスチャに書く方法でスキニングをピクセルシェーダでやるとか
まあ今はCPUもコア数余ってたりするから
余程頂点数が多くない限りスキニングはCPUでもいいんじゃないか
別スレッドでやればマルチコア対応で次世代気分だよ
VRAMに頂点データ置いておいてGPUだけでボーン変形して
しかもそれをディスプレースメントマッピングしたりとか
表示だけならいいんだろうが当たり判定したい場合はどうするんだろうな
もしかして当たり判定もGPUでやる時代になるのか
表示モデルとコリジョンモデルは分けておく
CUDAかなんかで一度実装すればCPU/GPUのどっちでも実行できるって世界が理想だけど
> 表示モデルとコリジョンモデルは分けておく
だな
めり込んだり貫通したりしても見なかったことにするというわけか
見た目そのままで判定したい場合はやっぱりCPUで頂点処理することになるはずなので
そのうち頂点シェーダは要らない子になるな
今のシェーディングはピクセル単位だからそういう意味でも頂点「シェーダ」ではないしな
やるにしても頂点シェーダからジオメトリシェーダはOpenCLとかでの
汎用処理になっていくんじゃないかと思う
表示に最適なデータ形式とコリジョンに最適なデータ形式は一致しない
表示とコリジョンのレベルを一致させるにしてもめりこみ対策をするにしても
やっぱり分離しておくほうがいろいろと便利
116 :
デフォルトの名無しさん:2008/10/29(水) 18:53:19
シェーダーってのが何なのか簡潔に教えてください><
調べてみたんですが、サンプルから入っていくのでよく分からない。
シェーダーを使うことによって得られる利点ってのは何なんですか?
CPUを使わないでGPUで演算?わけわかからん
118 :
デフォルトの名無しさん:2008/10/29(水) 19:08:26
>>117 ありがとう。記事にバーチャ載ってて少しテンション上がった。
あまりに正直な感想でちょっと笑ってしまった
でもまぁ大抵そういうところから入っていくんだよね
普段は調子こいて「今シェーダーが熱い!」
とかいってるけど本当はよくわかってない俺にちょうどいい記事があるときいて
>>115 ようやくかよw
まだあきらめてなかったんだな
>>117 すばらしいまとめ。最初は歴史だけだったが、
後半から3Dのシェーダーがらみのパイプラインの詳しい解説。
ちと長いがw
個人的にはシェーダに関してはネットがあれば本を買う必要は全く感じないな
強いて言えば赤本でGLSLの解説が日本語で読める位か
red book
赤本は最近のだとシェーダーの説明してるの?
スゲーな…
オレンジ本って言うの?
OpenGL Shading Language
英語だし、内容が古いけど、これが一番詳しい気がする
後、More OpenGL Game Programmingは持って無いが気になる
> 個人的にはシェーダに関してはネットがあれば本を買う必要は全く感じないな
具体的にはどの辺をよめばいいんでしょうか?
仕様書?
129 :
デフォルトの名無しさん:2008/10/31(金) 21:59:21
OpenGLのプログラミングをこれからはじめようとしている初心者です(・・;)
質問があります。
WindowsVistaに対応しているGLUTは存在しないのでしょうか?
また,GLUTが使えない場合は,Win32を使ってプログラムするのが無難でしょうか?
よろしくお願いします。
>>128 おいらはOpenGLで調べたいことがあったら、まずは仕様書読むようにしている。
仕様書読んでもよくわからんかったらググるか、それもでもわからんだらここで聞けばいいんでない。
>>129 まずはお手元のglutがvistaで動くか試す。
それが駄目ならfreeglut使うとかglfw, gluxとか使ってみてはどうだろうか。
Win32apiの勉強もしたいのなら、glut系のラブライブラリを使わずにやればいいけど
結構大変だと思う。
おいらはOpenGLで調べたいことがあったら、まずはここで聞くようにしている。
ここで聞いてもよくわからんかったらググるか、それもでもわからんだら仕様書読めばいいんでない。
132 :
デフォルトの名無しさん:2008/10/31(金) 23:58:50
最低の人間ですね
133 :
デフォルトの名無しさん:2008/11/01(土) 00:46:26
>>130 ありがとうございます。m(_ _)m
やはり、公式にvistaまで対応しているglutは、ないんですかね。
windowsXPまで対応しているglutが動くか試してみます。
俺はGLUT使ってないけど、SDLとかglfw使ったプログラムもVistaで問題無く動いてるよ
多分GLUTも動くはず
赤本のためにglutが書かれる
↓
glutがメンテされなくなったので
openglut, freeglut開始
↓
glut互換なapiでは物足りないのでglfw開始
↓
glut系がほとんどメンテされてないのでglux開始←今ここ
↓
??
OpenGL で Fetch4 使えたんで日記投下・・・と思ったけど日記にもならないほど簡単だった。
単に GLSL で vec4 texture4( sampler2D, vec2 ) を使うだけ。
左下基準で
r g
a b
の順番で4つ読んでくれる。
internalformat は DEPTH かつ FLOAT である必要はなくて、ALPHA4 とか1要素ものはなんでもおkだった。
3850、4850で動作確認。GPUSAによると2xxx以下じゃ動かないらしい。
GL_AMD_texture_texture4のドキュメントが出ないとわからないけど、ひょっとしたら2xxx以下は
DirectXみたいにglTexParameteri辺りで設定するとtexture2Dでいけるようになったりするのかもしれない。
2要素以上の internalformat に無理やり使うと一応テクスチャから読んではくれる。
但し読んでくれるのは1つだけで、テクスチャの内容を xy [ z [ w ] ]、vec4 を rgba であらわすと
・2要素
g = b = x
r = a = y
・3要素
r = y
g = z
b = x
a = 1
・4要素
r = y
g = z
b = x
a = w
ま、意味はないなw
そこを見る限りでは決まってはなさげ
大抵は切り捨てで127/255になりそうな気はするが
どうしても一致させたいなら整数テクスチャとか使った方がいいかもな
ありがとうございます。
ATIだけ微妙な動作をしたので、
差を吸収するためにCPU側で整数化することにしました。
VBで使ってみようと思ったら滅茶簡単でワロタ
glut以外に、glutSolidCubeのような
物体を関数化してくれているライブラリとかありませんか?
glDrawPixels() APIを使用して画像データを転送するとき、
次のような画像データを直接送ることができるのでしょうか?
RRRRR....
........................
GGGGG....
........................
BBBBB....
........................
画面じゃなく、テクスチャに描画して
保存したいのですが、何かよいサンプルとかありますか?
画面じゃないところに描画したりする方法まとめ
・PFD_DRAW_TO_BITMAP
・glReadPixels
・pbuffer拡張
・FBO(Frame Buffer Object)拡張
他にある?
PBO
・PFD_DRAW_TO_BITMAP
・glReadPixels
・glCopyTex[Sub]Image2D
・pbuffer拡張
・render texture拡張
・FBO(Frame Buffer Object)拡張
・PBO(Pixel Buffer Object)拡張
たくさん出てきて涙目
決定打はないのかよw
決定打ねぇ。
PFD_DRAW_TO_BITMAPはWindowsべったりな上にアクセラレーション効かないし、
glReadPixelsはシステムメモリへの転送でCPU喰うしレンダリングパイプライン止まるし、
glCopyTex[Sub]Image2Dもパイプライン止まるしFBからテクスチャへの転送は大抵変換が必要で遅いし、
pbufferは多少古いIntelオンボも対応してるおかげで使える環境は多いけどコンテキスト切り替えとか不便&コスト高いし、
render textureは単にpbufferからテクスチャにコピーせずに済むだけだし、
FBOは比較的最近の環境を仮定するなら決定打だろうけど未だにノートPCだと使えない場合が多いし、
PBOは単にコピーのお手伝い拡張だし。
まぁ、選ぶならFBOだな。
概要サンクス
glutで「3Dオブジェクトを2Dとして変形」したいんですが方法あるでしょうか?
たとえばこんな例。
・オブジェクトは空き缶
・まずは空き缶を3Dオブジェクトとして回転量(Rotated)や視点(LookAt)を指定して
見え方を決める。この結果空き缶を真上から見た絵になったとする
・次にこの「真上から見た空き缶の絵」を「2D一枚絵として」
回転・拡大縮小したい
描画結果をテクスチャにして描画
回転はカメラのロールで、拡縮はglViewportで
初心者です。セレクションモードに切り替えると座標系がズレて変になってしまうのですが、
自分の理解が足りなくて変な座標変換を間に挟んでいるのだと思います。
セレクションモードとレンダモードの切り替えにおける内部の動作を流れ図で教えてもらえませんか。
>>155 内部動作とかよくしらんけど、関数呼び出し順序は、
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPickMatrix(...);
gluPerspective(...); or glOrtho(...);
とかしとけば、セレクションうまくいくと思うよ。
はずしてたらすまん。
157 :
名無し:2008/11/13(木) 13:51:45
質問がございます。
1辺の長さが10の箱の中に直径がBの球(中心座標:x,y,z)がM個存在するとします。
3次元上で考え、箱の端では周期境界条件を採用しています。
球の中心の座標は箱内でS回の移動を繰り返すとします。
例えば球の中心の座標は次のように変化します。
座標はファイルQにまとめて書いてあるとします。
※(S+1)個のブロックが存在。(スペースで区切り)1個のブロックにM個のxyz座標が存在。
<ファイルQ>
1 2 3
2 3 4
・
・
・
1 3 4
1 9 5
・
・
・
・
・
・
球が箱からはみ出ると周期境界条件によって、はみ出た部分だけ反対側から出てくるとします。
このようなM個の球のS回の移動の様子をOpenGLで表示することは可能でしょうか?
(表示するもの:球、箱)
可能ならばその方法について教えてもらえませんか?
(ファイルQの読み込み方法、球の直径もしくは半径の指定方法、周期境界条件を考慮した球の表示方法など)
ちなみにプログラムの記述言語はできればFortran77を使用したいと考えています。
> はみ出た部分だけ反対側から出てくるとします。
この部分だけがGL的に面白い部分なので、
まずはただの球に衝突判定をつけて作ってみなさい。
あとOpenGLはCで定義されていたはずだが、
Fortranだとマングリングを合わせればCの関数も呼べたと思う
まあ調べてみて
これは凄い。
一見すると親切かつ丁寧な風に見えて、その実は回答の先送り投げっぱなしジャーマン。
宿題丸投げに対するパーフェクトな回答の見本だな。
久しぶりに職人の仕事を見た。
危ねぇ…俺もシンセツダナーとか思いそうだった
ワロタww
3次元ベクトルの正規化をするような関数とかあります?
DXならD3DXVEC3DNORMALIZEとかいうのです
ないから自分で書け
ないので自分で作ってください
質問するより自分で書いた方が早い
d3dxのをそのまま使えばいい
void DXならD3DXVEC3DNORMALIZEとかいうのです( vector3* vec )
{
float scalar = sqrt( vec->x * vec->x + vec->y * vec->y + vec->z * vec->z );
if( scalar == 0.0 ) return;
vec->x /= scalar;
vec->y /= scalar;
vec->z /= scalar;
}
OpenGL使うのにD3DX使うのもなあ
まあ、俺も音鳴らすのにDirectSoundとか使ってるがw
マジレスすると、言語用に大抵、geometry関係のライブラリがフリーのがあるから
それを探してみたらどうかな?
探すくらいなら自分で作ったほうがいいと思う派だが、あえて探すなら
信頼性の高い高速なgeometry関係のフリーのライブラリ = D3DX
GLM(OpenGL Mathematics)とかいいんじゃない?
NASMで実装します
173 :
172:2008/11/15(土) 17:30:06
1677万回呼んでも差は0.7秒程度でした
確かに大体3分の1程度にはなりましたけど
骨折りですね
global fun
section .text
fun:
mov eax, [esp+4]
mov ebx, [esp+8]
movups xmm0, [ebx]
movaps xmm2, xmm0
mulps xmm0, xmm0
movaps xmm1, xmm0
shufps xmm0, xmm1, 0x4e
addps xmm0, xmm1
movaps xmm1, xmm0
shufps xmm1, xmm1, 0x11
addps xmm0, xmm1
rsqrtps xmm0, xmm0
mulps xmm2, xmm0
movups [eax], xmm2
ret
SSE化で1/3縮んだのなら成功の部類じゃないか
そのコードだとむしろ遅くなりそうなものだけど・・・
>そのコードだとむしろ遅くなりそうなものだけど・・・
そうなんすか?
とりあえず改良できると所あれば指摘してくださいな
データのアラインメントを変えてmovupsを消す(可能なら4要素にする)
intrinsic関数で組んでインライン展開できるようにする
ループごと取り込んで関数呼び出しを消す
新しいSSE命令を使う(haddps/dpps)
特に関数呼び出しを消すのが重要。
>>176 解答ありがとうございます
イントリンシック!そういうのもあるんですな
慣れないアセンブリより楽かも…
SSE3命令はCPUが対応してないから試せそうにありません
オンボロCPU乙ですねハハハ
すごく初歩的な質問と思われるかもしれませんが
行列スタックでレンダリングしたものを
どのようにしたら色をつけることができますか?
glClearでは線に色が付くだけなってしまいます
日本語でおk
glClearは画面消去だぞ
glClearじゃなくてglColor4fとかでは?
>>179 うはぁ、ミスった
glClearじゃなくてglColor3fでした
質問の意味がまったくわからないので勝手に妄想
色がついていないのではなく、表示されていないのだろう
PROJECTIONマトリックスが不適切で線に見える部分意外はクリッピングされているのでは
near/farの設定、MODELVIEWとのへの切り替え部分のチェック
182 :
デフォルトの名無しさん:2008/11/16(日) 21:11:52
はじめまして、質問させていただきます。
glGenTexturesでテクスチャを2個作って、
二つのテクスチャを画面に表示しようとしたのですが、
最初に表示したテクスチャが消えてしまいますorz
OpenGLで二つのテクスチャを一度に表示することは可能なのでしょうか?
もしくは、方法を教えていただけないでしょうか。
基本立体を塗りつぶしたいんです
本やサイト読んでもイマイチ分からなくて
日本語下手ですみません
>>183 glColor
まずはlightingをしないで射影変換の正しさを確認して、光源を作るならそのあと
>>184 ありがとうございます。
一応、glBindTextureの第2引数に別々のテクスチャ名を与えてるのですが、
それでも消えてしまいますorz
どうやら表示するときに消えてるのではなく、
2個目をBindしたときに消えてしまってるみたいです。
(glBindTextureを呼ぶだけで1個目のテクスチャが消えました)
>>186 カプセル化してかなり忘れてたが、見直してみたら
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, ...);
glBegin(...);
glEnd();
glDisable(GL_TEXTURE_2D);
を逐一繰り返す構造になってた
glPushAttrib, glPopAttrib のテクスチャ関係も参考に
もし関数化してたら、一度関数化してないmainのみのストレートフォワードなテストコードを書くといいかも
カプセル化しない状態で人力コーディングするとスタックの積み下ろしを忘れてることがよくあるから
>>187 ありがとうございます。
自己解決できました
OpenGLをはじめてほとんど時間が立ってないにもかかわらず、
カプセル化に挑戦したところ行き詰っていました。
原因に関してですが、
ぶっちゃけて簡単に言うと、
glBindTextureでテクスチャを切り替えた際に、
いくつかの設定が初期化されてしまうのと、
モードによって複数のテクスチャを同時に使えなくなってしまうことが原因でした。
>>183 それだと線にしか色が付かないですよ
書く位置が悪いんですかね?
glPolygonMode
GL_QUADS
日本語が下手ならコードを晒せ
ブラウザ上でOpenglを動かす方法教えれ
プラグインを自分で書く
これしかない
VRAMの使用状況を取得するAPIは無いのでしょうか?
無いよ
見るだけならNVPerfKit入れたりとかして見ることはできる
ATIなら普通にドライバ入れた時点でパフォーマンスカウンタ見れるのかな?
そうでなくどの環境でもプログラムから残り容量取るって話なら大分難しいと思う
GL_ATI_meminfo は仕様が公開されていないの?
俺もglATI.hを読んで見たが壮絶に意味不だった…
DirectXならVRAM使用量見れるのにねー
VRAMみたいな特定のハードに依存したインターフェースはおかしいだろ、GL的に考えて…
>>200 IDirect3DDevice9::GetAvailableTextureMem ?
これは、VRAMじゃなくテクスチャに使える容量だお
glTexImage2D で作ったテクスチャに
直接アクセスしたいのですが、どうしたらいいでしょうか?
>>202 DirectDraw::getAvailableTotalMemのことじゃね?
>>203 テクスチャの中身ってこと?
それは無理なので書き換えるにはglTexSubImage2Dを呼んで下さい
読み出すならglGetTexImage
PixelBufferObjectを使えば比較的高速にやりとりできるはず
>>204 DirectDrawってVistaとかでもちゃんとそれ使えるのか?
Direct3DでエミュレーションとかになっててAvailableTextreMemと同じような気がする
206 :
デフォルトの名無しさん:2008/11/21(金) 14:09:22
openglで描画した画像を、見え方はそのままで描画される角度のみを変更したいのですが、どうしたらよいでしょうか?
glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 0.001f, 150.0f);
gluLookAt(a1,a2,a3,b1,b2,b3,c1,c2,c3);
を、
d1=b1-a1
d2=b2-a2
d3=c3-a3
として
glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 0.001f, 150.0f);
glTranslatef(a1,a2,a3);
glRotatef(30,d1,d2,d3);
glTranslatef(-a1,-a2,-a3);
gluLookAt(a1,a2,a3,b1,b2,b3,c1,c2,c3);
と変更しました。
本来はc1、c2、c3を変更するところなのですが、
視点の位置、注視点の位置、視野の上方向が毎回変わるので、
できればそれらの設定によらず画像だけの回転を行いたいと思っています。
207 :
206:2008/11/21(金) 14:12:47
失礼しました、206の
glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 0.001f, 150.0f);
glTranslatef(a1,a2,a3);
glRotatef(30,d1,d2,d3);
glTranslatef(-a1,-a2,-a3);
gluLookAt(a1,a2,a3,b1,b2,b3,c1,c2,c3);
のように変更したところ、ちんちくりんな軸を中心に回転しているようで、
確認したい目標のオブジェクトの形まで変わってしまいます。
上記でまずいところがありましたらご指摘をお願いします。
glOrthoの直後にgluLookAtを持ってくる
これじゃだめかな?
209 :
206:2008/11/21(金) 14:41:37
>>208 ( д ) ゜ ゜
うわぉ ありがとうございます
行列の順番を勘違いしてました
本当にありがとうございます
210 :
デフォルトの名無しさん:2008/11/22(土) 01:38:06
任意の座標(例えば重心)をとおる軸を中心として回転させるにはどうやればいいですか。
重心座標が(3,4,5)としたらx=3を中心としてy軸周りに回転させるようにとか
x方向に-3だけ平行移動して、原点中心の回転をして、x方向に+3だけ平行移動する、ってのはどう?
回転軸を頻繁に変えるというのでなければ、
メインメモリ側に構造体を保持しておいて、
必要に応じてCPUで平行移動させてからディスプレイリストを作るのもよい
9600GT+WGL_ARB_multisampleを使ってアンチエイリアシングをやってて
glDisable(GL_MULTISAMPLE)で一時的に無効にしようとしてもなぜか効かないんだけど原因わかる人いる?
同じことをD3D9でやったらちゃんと期待通りに動くから
ハードウェアの仕様じゃないみたいだけどよくわからん
214 :
213:2008/11/22(土) 08:20:37
自己解決?
x8以下だとちゃんと機能してx16,x32だと効かないぽい
意味不
MSAAx32とか設定できんのか?
それはともかく単なるドライバのバグではないかと
暇があったらNVIDIAに文句言ってやるといいかもしれない
216 :
デフォルトの名無しさん:2008/11/23(日) 11:24:39
>>211,212
どうもありがとうございました。
複数枚の画像を合成したいと思っています。
例えばプリクラで顔写真の周りをハート型で縁取ったりしていますが、
ああいう感じである画像の上に透過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のデータがきちんと透過データとして読み込めていないのでしょうか?
そもそもやり方が間違っているのでしょうか?
もしやり方が間違っている場合、本来どういう方法で実装すべきなのか、
ググるキーワード位でもいいので教えていただけると幸いです。
つ マルチテクスチャ、glActiveTexture
でもこの場合、テクスチャ切り替えて2回描画すればおkな気もする
219 :
217:2008/11/26(水) 13:47:16
>>218 教えてくださってありがとうございます。
調べてみます(・∀・)
pixel to pixelの合成だから、実時間で変動させたり市内なら
アルファ値つき重ね合わせくらいはCPU側で実装するのも手だな
>217
まだテクスチャの基本的な使い方からわかってないみたいだから
床井先生のサイトを見てみるといいと思う
222 :
デフォルトの名無しさん:2008/11/30(日) 11:10:48
超初心者です
床井先生のサイトが落ちてるので。。。
上のサンプル使わせていただくと
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData2);
この3引数”GL_RGBA”internalFormatとtypeで何が違うんでしょう
bmpをOpenCVで読み込んだとき読み込んだファイルの形式がtypeなのはわかるのですが
internalFormatって何奴でしょう。ここが間違えていると画面が真っ白で表示されない…理由を知りたいのです。
馬鹿な質問なのは重々承知しております、
解説webとか知っていたら教えてください。
formatとtypeはメモリの中に画像がどのように格納されてるか
internalformatはそれを元にどんなテクスチャを作るか
を指定するんだよー。
224 :
デフォルトの名無しさん:2008/12/01(月) 11:05:05
画面に三角形や四角形を書いてライトを当てているのですが、
glScaleで拡大すると暗くなって、glScaleで縮小すると明るくなります。
法線ベクトルも頂点ベクトルと共に拡大縮小されるのなら、まだわかるのですが、
法線ベクトルだけ逆になっているようでよくわかりません。
これはOpenGLの仕様ということなのでしょうか?
そーです
例えば物体をX方向だけに2倍拡大するとき、法線も同じようにX方向に2倍拡大したら、向きが変になるでしょう
まぁ何も考えず glEnable(GL_NORMALIZE) しておけばわりと幸せ
つ glEnable(GL_NORMALIZE);
逆になるのは、たとえば平面をY軸に縮小すると頂点は小さくなるけど、法線ベクトルは起つため
法線は転地逆行列変換(かも)
>>224 仕様です。
法線ベクトルはモデルビューの逆行列が掛けられます。
仕様書のNormal Transformationのとこに書いてあります。
229 :
デフォルトの名無しさん:2008/12/02(火) 05:05:36
>>223 ありがとうございます。
するとinternalformatはglutInitDisplayMode(GLUT_RGB);
で指定した値に矛盾してはいけないという理解でよろしいでしょうか
他に制限事項とかございましたら、ご教授してくださいませ
ディスプレイモードとテクスチャフォーマットは何の関係もない
231 :
デフォルトの名無しさん:2008/12/02(火) 21:27:06
"OpenGL 2.0 専用スレ"にも書いたんだが、
OpenGLnのmain関数をスレッドで呼び出して使おうと思っているのだが、display()関数のオブジェクトカラーを引数で渡した値で更新したいんだ。
マルチスレッドで値を渡すことはできるのだが、OpenGL側でどうやって、display()関数に値を綿したらいいのかわらかない。
つまり、
プログラム1 --> OpenGLプログラム(スレッドで生成)
▼ ▼
値の更新 色変更
▼ ▼
値の更新 色変更
… …
ってことをしたいんだ。
↑
これはできないのか?
意味が分からん
グローバル変数使えばいいんじゃね
233 :
デフォルトの名無しさん:2008/12/02(火) 21:53:32
>232
使いたくないんだよ。
openGL関係なしに排他制御してスレッド間で変数共有できてるなら、それを使えばいいんじゃない
display()ってGLUTの話?
235 :
デフォルトの名無しさん:2008/12/02(火) 23:06:09
>234
スレッドには、ポインタを引数として渡してる。
それじゃ具合悪い?
>display()・・・のくだり
え?GLUT?おれが使ってるのってOpenGLじゃなかったのか。。。
確かに、ヘッダで、glut.hってのを読み込んでるが、OpenGLとばかり思ってた。
>>235 GLUTはあくまでglを気軽に使うためのユーティリティだから……
gl関係なくただのスレッド間データ受け渡しの問題だし、
むしろスレッドを管理するAPIについてのスレで聞いた方が良いのではないかな。
glutSetWindowDataとglutGetWindowDataをお探しか?
freeglutやOpenGLUTになるけど。
boost::bindでインスタンスとメソッドを一緒にして
glutDisplayFunc()に渡してやったらダメかな
239 :
デフォルトの名無しさん:2008/12/03(水) 03:18:45
>236
>237
>238
知らない言葉が多すぎるから答えようがないけど、
あがったキーワードをググってみる。
240 :
デフォルトの名無しさん:2008/12/03(水) 06:09:36
>236
>237
>238
239です。
とりあえず、pthread_createの引数で渡したポインタを
glut( ) -> init( ) を経由して、 glutでスコープできる変数に渡す
で、やりたいことができました。
参考になったサンプルに出会うときに、キーワードが役立ちました。ども。
241 :
217:2008/12/05(金) 17:27:21
前回質問して教えていただいた後、マルチテクスチャは大まかに理解して、2つのテクスチャを貼り付けることに成功しました。
次に線を引いてみようと思って、テクスチャを2枚表示したサンプルに付け加えて以下のソースを書いたのですが、
線のみが表示されてテクスチャが画面に出なくなってしまいました。
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texname[0]);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //テクスチャ0表示
glBindTexture(GL_TEXTURE_2D, texname[1]);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //テクスチャ1表示
// 以下を追記 したら線しか出なくなった
GLfloat vertex[20];
for(int i = 0; i < 10; i++){
vertex[2 * i] = 0.1 * i;
vertex[2 * i + 1] = 0.1 * i;
}
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2 , GL_FLOAT , 0 , vertex);
glDrawArrays(GL_LINE_STRIP, 0, 10);
glFlush();
やりたいのは画像に落書きする機能の実装なので、
画像の前に線が引ければよく、画像自体に書き込む必要はないのですが、(とはいっても最終的にその結果を保存したいのですが)
この場合は直接画面に線を引くのではなく、テクスチャにレンダリングしてから表示しないといけないのでしょうか?
それとも何かが欠けているだけでこのまま直接描画できるのでしょうか?
質問ばっかりですみませんが、教えていただけると幸いです。
使っているのはOpenGL ES ver1.1です。
・デプスバッファをクリアしてないので2度目以降の描画でデプステストが失敗して表示されない
・線分描画で頂点配列を変更したあとそのまま三角形を書こうとしてしている
すみません、質問っす
テクスチャを貼ったトライアングルでフェードイン表示みたいなことをしたいばあい、どの機能を使えばいいでしょうか?
アルファブレンド使え
頂点カラーかマテリアルのアルファ要素で何とかなったはずだ
245 :
241:2008/12/05(金) 23:37:16
(二点目について)
線分を描画する直前に、glVertexPointerで頂点配列の指定を"vertex"配列に変更してるでしょ?
で、次のフレームを描画するときもずっとその指定が続いてるわけ。
つまりテクスチャ0/1を描画するつもりでglDrawArraysを発行しても、
参照してる頂点配列が"vertex"配列になったままだから、線分と同じ位置に
GL_TRIANGLE_STRIPで描画されちゃってると。
(プログラム見る限り、頂点が一直線だから実際は縮退して描画されないだろうけど)
テクスチャを描く前に、もう一回、テクスチャを描画するための頂点配列を設定するべし。
247 :
241:2008/12/06(土) 00:25:37
あ、そうか、次に描画するときにvertex配列の指定が解除されてないから、
vertex配列の上にテクスチャが表示されちゃって線しか出ないってことなんですね。
なんだかまだらで変な色の線だなぁ、バグかなぁと思ってたら、
あれはテクスチャ画像の色が出てたんですね。
やっともやもやが取れました。調べてやってみます。
>>242 さん
>>246 さん、どうもありがとうございました。
GL_BGRAとかGL_BGRってVS2005に入ってるヘッダでは定義されてないんですが、
この定数ってどこで配布されてるヘッダに存在するんですか?
俺はglewのを使ってる
OpenGL総本山のExtension Registryのページにglext.hがあったはずだが。
あれでもいいし、最新でなくてよいのならglewのでもいい。
252 :
デフォルトの名無しさん:2008/12/07(日) 23:44:04
マルチスレッドってOPENGLの描画を各スレッドでウインドウ作って
GLの描画処理やらせたら
シングルスレッドでに2画面描画するより速くなるの?
複数のハードウェアスレッドが使用可能なら早くなる可能性はある
セレロンみたいなシングルコアCPUだと同期処理が必要になる分確実に遅くなる
はぁ?
↑ケチつけるだけで具体的には何も書けない馬鹿
GPUに空きがあれば速くなる可能性はあるよ
その場合スレッド毎にコンテキスト作れってNVが言ってた気がする
めんどうにはなるね
257 :
デフォルトの名無しさん:2008/12/09(火) 03:33:02
グラボがGeForce 9300M GSとチップセット内臓の4500MHDを切り替え可能なVaioのノートを使っています。
JavaのOpenGLで、最大化ボタンを押したらフルスクリーン表示するプログラムを作ったんだけれど、
4500MHDの方ではフルスクリーン後も正常に描画されるのに、
GeForceの方ではフルスクリーン後に画面が真白になってしまって描画されません。
真白なのに、キーイベント等は正常で画面内にクリッカブルなボタンとかを作っておけばちゃんとクリックできるし、
第一、エラーが出ないのでどこが問題なのか良く分かりません。
描画している処理自体はきちんと呼び出されているのですが、画面上に表示されていないという感じです。
これってグラボのドライバのせいなんでしょうか?
チップセット内臓のグラボが描画できて、より高性能なはずのGeForceがダメという状況に戸惑ってます。
つ glGetError
俺は旧Direct3Dで言うデバイスロストが怖いから
ChangeDisplaySettingsとか呼ぶ度にコンテキストから全て作り直してる
>>257 俺も知り合いのノートPC(DELL、geforceかどうか不明)で
フルスクリーン後に画面が真っ黒(多分ウインドウの背景色)になる現象に悩まされてます。
フルスクリーン解除するとまた見えるようになるんだよな。
なぞだ。
DirectXにある
>>259 の言うデバイスロストだと、
通常はロスト後はフルスクリーン解除してもロストしたままだったはずなのだが、
うちの問題が起こる環境だと復帰するんだよね・・・。
まあ、一番確実なのは、全て作り直すことなんだろうけど。
時間がなくて試せてない
わかりにくくてスマソ
> 通常はロスト後はフルスクリーン解除してもロストしたままだったはずなのだが、
> うちの問題が起こる環境だと復帰するんだよね・・・。
通常はロスト後はフルスクリーン解除してもロストしたままで
フルスクリーンから復帰しても見えないままだったはず。
というわけで、全部コンテキストから作り直しなりなんなりで
上手く回避できたら報告キボン
GeForce 8400Mを乗せたVAIOでGeForce側で起動するとどうもOpenGL
が不安定なので悩まされた事がある。
それこそフリーズや、フルスクリーン画面がバーコード状態になったり。
サポート出そうにも再現条件がはっきりしないので、半ばムキになって
SpecViewPrefを走らせたま酒飲んで寝たら、翌朝にはもう二度と起動
しなくなっていた。
VAIOがあやしいのか?
俺も3Dビューアーを作っているんだが、VAIOのGeForce Go 6200 で画面が何も描画されない現象を
最近報告された。フルスクリーンではなく通常表示。
様々なグラボや内臓チップセットで動作確認して問題なかったのに。
原因もまったく思い当たらない。
ドライバ更新くらいしか手がないのだろうか?
いや〜、自分の場合は完全にGeForce Goの問題だったと思う。
初期はOpenGLの高負荷時にWindowsの画面がフリーズする
程度だったけど、末期には起動直後のBIOSの段階から緑色の
バーコード模様やピンク色の市松模様とか表示されていたので。
完全に憶測だけど、NVidiaのリコールとの関連かなと思った。
ちなみにSpecViewPerfによってGeForce Goの不具合は再現率
100%になったので(なにせ起動しない)、はれてVAIOはサポセン
行き->マザボ交換(無償)となったのでした。
保証が切れるギリギリだったので結構やばかったです。
266 :
257:2008/12/10(水) 04:02:59
>> 258
gl.getError()しても、エラー無いみたいなんですよねぇ・・・。
>> 259
はい、僕もコンテキストから作り直してるんですが、ウィンドウをフルスクリーンモードにすると何故か真白に・・・。
謎です・・・。
フルスクリーンモードに切り替えた後にコンテキストを作り直してるのですが・・・。
GraphicsDevice#setFullScreenWindow(Window w)を呼び出すと真白現象になっちゃいます・・・。
>> 260
同じ現象っぽいですね・・・。
フルスクリーンモードにして真白の状態の後、フルスクリーン解除してウィンドウ画面にしたら描画も復帰します。
>> 263
うーむ。GeForceのモバイル用はOpenGLに弱いのでしょうか・・・。
267 :
260:2008/12/10(水) 08:12:09
おJavaか。
しかし、そっちはコンテキストから作り直しているんだね。
そちらもウインドウにもどしたら復帰するとすると同じ現象か。
あ、あと 安価する時は、
>>258 みたいにスペースいれないでくれ頼む
すいません初心者なんですがOpenGLにはある特定のキーの状態を取得する関数はありますか。
windowsプログラミングのGetAsyncKeyState('J') 的な。
コールバック関数を使ってキーの状態をフラグに保存するとかしか方法はないのでしょうか
その場合にメインループとコールバック関数でフラグ変数に対して競合がおきるなどの問題はありますでしょうか
270 :
デフォルトの名無しさん:2008/12/16(火) 00:35:43
描画以外はOpenGLの仕事ではない
ではLinuxではどうやってキーの状態を調べればよいですか
ここは警察じゃないよ
GLUTでも使っとけ。
>キーの状態
OpenGLは、グラフィックスハードウェアに対して描画命令を発行する以外のことは
本当に何一つできませんよ。キー入力はもちろん、ベクトルや行列の計算だって
自前で(あるいは他の何らかの手段で)やる必要があります。
OpenGLに全く関係の無い話題である以上、ここで質問しても期待される答えが
帰ってくる可能性は低いかと。Linuxのスレなりなんなり、適切な場へ移動した方が
良いのではないでしょうか。
てか、それくらい、ぐぐればいくらでも答えが引っ掛かりそうなもんですが・・・。
OpenGLを1から学びたいんですが、お勧めのサイトは?
PBOやFBOについても学びたいです。
床井先生のとこ今年頭から更新再開してたのに今頃気づいたw
glBegin(GL_LINES)や(GL_POINTS)で描画するような点や線の色や質感に関しては
ライティングを有効にした場合はどのように設定するのでしょうか?
いままでライティングを無効にしていたプログラムではglColor系の関数で色を付けていたのですが、
これではライティングした際に色が抜けてしまうようなので、何かしらの方法で色を付けたいと思うのですが
つ マテリアル
クォータニオンの虚部の符号を反転?
現在、glutを使ってOpenGLを勉強しているのですが、Win32APIを使ったほうがいいのでしょうか?
glutを使わずにWin32APIを使うメリットはありますか?
Win32APIの方が、フレームバッファの細かい設定とかできるね。
勉強中ならそこまで必要ないだろうし、GLUTでいいんじゃない?
Win32APIを使うのは、Win32APIじゃないとできないことをやりたくなってからで十分かと。
てかGL以外に考えるべきことを増やすのはかえって良くないと思う。
やりたいことに集中して、他の事はシンプルに済まそう。
#include <GL/glut.h>
#include <dshow.h>
のようにして、glut-3.7.6とDirectShowを同時利用しようとしたら、次のようなコンパイルエラーが出ます。
どうすれば治りますか?
c:\program files\microsoft visual studio 9.0\vc\include\stdlib.h(371) : error C2381: 'exit' : 再定義 ; __declspec(noreturn) が異なります。
c:\documents and settings\裕\my documents\visual studio 2008\projects\glut-3.7.6\include\gl\glut.h(146) : 'exit' の宣言を確認してください。
c:\program files\microsoft visual studio 9.0\vc\include\stdlib.h(371) : warning C4985: 'exit': 前の宣言に属性が存在しません。
c:\documents and settings\裕\my documents\visual studio 2008\projects\glut-3.7.6\include\gl\glut.h(146) : 'exit' の宣言を確認してください。
includeの順番のような気もするけど
「error C2381 exit」でググってみたら
2.0専用スレに誤爆してしまいました orz
OpenGLでは各色の値の範囲が0〜1ですが、これってGDI上での0〜255の範囲に
リニアに一致する訳じゃないのでしょうか?
256*256のコンテキストを作り、全面ぴったりのポリゴンを張って、フラグメントシェーダーから
gl_FragColor = vec4(gl_TexCoord[0].s, gl_TexCoord[0].s, gl_TexCoord[0].s, gl_TexCoord[0].t);
として色とアルファの増え方を見てみたのですが、どうもジャギっててきれいに0〜255の範囲で
増えてるわけではないみたいなのですが…
コンテキストと同じサイズのGL_NEARESTなテクスチャを張った場合はちゃんと256*256の範囲
全体が張られているのでテクスチャ座標がずれてるわけでもないみたいです。
上の式で得られたレンダリング結果↓
http://www3.uploda.org/uporg1873748.png
流れの速いアップロードにファイルを置く馬鹿。
アップローダをアップロードと書いてしまう馬鹿。
>>287 普通は、リニアに対応するはずだけど。
レンダリング結果が見れないので、もう一度うpぷりーず!
(できればついでにソースも。)
glReadPixelで数値にして見てみたら?
例えば(10,0,0) (0,10,0) (0,0,10)・・ 原点が端のような
立方体があって、(0,0,10)を回転中心にして回転させたいのですが、どうすればよいのでしょうか?
for(;;){
glTranslatef(0,0,-10);// 原点に移動
glRotatef(10,1,0,0); // X軸を中心に回転
glTranslatef(0,0,10);// 元に戻す
draw();
}
とするとどんどんY座標がずれてきます。これを計算で戻すか、
使い方が悪いのか教えてください。
293 :
デフォルトの名無しさん:2008/12/23(火) 20:40:07
回転したい点を原点に持ってきて回転させて戻せば?
今は回転中心を原点に持っているつもりなのですが、<<292 では
持っていってないですか? わかっていません。
どんどんずれていくのは、それはずれを蓄積しているからだろw
ループの最初で座標を初期化せい
-Y座標方向にどんどんずれていくのですが、
1回転による座標系のずれを計算して、そのずれ分移動して元の位置関係に
あわせるということでしょうか?
それは計算しなければなりませんか? 関数はないでしょうか?
>Use glPushMatrix and glPopMatrix to save and restore the unrotated coordinate system.
俺も勉強し始めたばかりでよく知らないんだけど、これとかどうよ?
それは使えないかと思います。 回転させてそれを描画しないといけないので。
(なにかまちがっていますかね。。)
299 :
デフォルトの名無しさん:2008/12/24(水) 00:07:32
すいません 教えてください
MAXで作ったアニメーションデータをOpenGLESで読み込んで動かしたいのですが、
調べたところCOLLADAがありましたが、C++のコードなんです。
組込み系でC++に対応していないため、C言語がいいんですけれども
何か解決案をご存知の方いますでしょうか?
おかしなこといってたらすいません・・・
>>292 ・座標変換は座標(縦ベクトル)に左から変換行列を掛ける
・変換行列の操作は右から行列を掛ける
>>298 glPushMatrix();
glTranslatef(0,0,-10);
glRotatef(10.0 * n, 1,0,0);
glTranslatef(0,0,10);
draw();
glPopMatrix();
とかは?
>>299 C++でCOLLADAからカスタムフォーマットを吐くものを作って、
カスタムフォーマットを再生するものはCで作る。
C++をCでラップしてもいいけど、XMLをそのまま扱うのは重いので
組み込みならなおさら事前に変換する方がよろしいかと。
>>301 それ以前の問題で、変換前の座標を p、変換行列を上から M1, M2, M3 とすると、
変換後の座標は
p' = M1 M2 M3 p
になるんだってば
>>300, 303
その言い方じゃ、分かって貰えないんじゃないだろうか・・・。
>>292 移動と回転を組み合わせる、って発想は合ってるよ。
ただ、変換の順番が間違ってる。もし(0, 0, cz)を中心に回転させたいなら、↓こうする。
for(;;){
glTranslatef(0,0, cz); // 元に戻す
glRotatef(10,1,0,0); // X軸を中心に回転
glTranslatef(0,0, -cz);// 原点に移動
draw();
}
(コメントの順番に注目!)
で、こういう変換は
>>295の言うとおり誤差が溜まっていくので、↓こうするともあべたー。
for(ループカウンタをiとする){
glLoadIdentity();
glTranslatef(0,0, cz); // 元に戻す
glRotatef(10 * i とか ,1,0,0); // X軸を中心に回転
glTranslatef(0,0, -cz);// 原点に移動
draw();
}
(glLoadIdentity()の代わりにglPushMatrix()とglPopMatrix()を使ってもいいよ!)
>>299 それはちょっと難しそうだなー・・・。
仕事でやるなら、Mascot Capsule とかの、既存の3Dエンジンを利用することを考えたほうがいいと思う。
(そもそもMAXでないといけないのかとか、ワークフローの最初から考え直した方が。)
趣味でやるなら、302の方法を支持します。
勉強することすごく多くて大変だけどねー。楽しいよねー。
・・・てか、組み込み系とはいえ、3Dモデルのアニメーションをさせるような分野で
C++が使えない!?というのがまず信じられないという心持ちですよ。
ドリームky・・・おっとこんなクリスマスイブに誰か来たようだ
307 :
デフォルトの名無しさん:2008/12/25(木) 00:14:38
>>302,305
レスありがとうございます
そういう考え方がありますね!頭が固いもので考えつかなかったです汗
libxmlやらCG言語やら絡んでてややこしいっす。ここらへんはあんまり見ないで
データ保持しているドキュメントクラスだけ見ればいいのかもしれないですが
とりあえず挑戦してみます!
あと、ドローソフトで作った頂点座標などのデータをOpenGLに
ドンと投げて楽して描画したいだけなんで、
MAXじゃないとだめってこともないですが、普及率が高い分、拡張性も高くて
3dsファイルはデータの損失が少ないなどの話も聞いたもので。
まだ歴史が浅い分野なもので手探り状態っす
Mascot Capsuleなんてものがあるんですね。導入できるのか分からないですが
もうちょっと調べてみます
308 :
デフォルトの名無しさん:2008/12/25(木) 17:36:29
OpenGL ESもいいですか?
トライアングルの1頂点が画面の外に出ると光源計算してくれないって現象で困ってます.
アンビエントは入るのですが,はみ出した頂点だけでは無く,トライアングル全体が暗くなります.
GL_TRIANGLE_FANでもGL_TRIANGLE_STRIPでも同じ症状です.
3つの頂点全部が画面内に入ると計算してくれます.
何かヒントになる事でも結構ですのでアレじゃね?みたいなのがあればお願いします.
ドライバーのバグでは?動作環境は何ですか?
iPhoneと言うかiPhone SDKに付いてるiPhoneシミュレータなんすけど.
サンプルには光使ってるの無いし,もしかして出来ないなんて事有るんすかね?
・OpenGLの関数(gl*という名前の関数)のドキュメントって何処にあるんですか?
出来れば日本語のをお願いします。
・glutの最新版ってバージョンいくつですか?今3.7.6が入っています。
312 :
デフォルトの名無しさん:2008/12/25(木) 21:39:44
.orgにスペックからなにからあるけど、英語。翻訳は金かかるからな…。
glutはfreeglutの2.6がそろそろでようとしている模様。
このスレなんかここ数ヶ月元気だよな
314 :
311:2008/12/25(木) 23:50:45
>glTexImage2D(
>GL_TEXTURE_2D , 0 , 3 , TEXSIZE , TEXSIZE ,
>0 , GL_RGB , GL_UNSIGNED_BYTE , bits
>);
3番目の引数を3からGL_RGBに変えて味噌
>>310 もうちっとでiPhone SDKが入るマシンが来るので来たら試してみるわ
ってか、シミュレータの不具合の可能性があるかも知れん。実機で再現するか確かめてみ。
シミュレータのバグと確定した場合はバグレポしておいて。
>>311 個人的にはやはり「赤本」がベスト。
手元に一冊あると便利で勉強にもなるけど、高いよね・・・
俺も学ぶのに赤本は最高だと思うんだけど、
関数のドキュメントとしては青本の方がいいんじゃないか?
そういえば前スレに日本語manのリンクがあったけど
今見たらgluとglXのものしかないな…
時節がら、大学入試の問題集の話かと思ったよw
VCで開発してるけど、VC上でのデバッグ実行では普通に動くけど
リリースビルドするとカタカタ動く。
原因は初期化忘れとかあるみたいだけど、こういうの経験ない?
原因はなんですか?
エスパーすると、初期化忘れだな
やっぱり初期化忘れなのかな。
ただ回転させてるだけの処理でリリースはカクカクする。
初期化忘れはない・・と思ってるけど。あるのかな。
323 :
311:2008/12/27(土) 22:40:13
>>315 GL_RGBにしても関係なかったようです・・なぜか
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
を実行するとテクスチャが表示されるようになりました。コメントアウトすると
表示されなくなります。解決してよかったけど何ででしょう?
もう1つ質問いいですか
ttp://uproda.2ch-library.com/src/lib084665.zip.shtml ↑このプログラムは、
ttp://www.shader.jp/xoops/html/masafumi/directx9/DShow/dshow001.htm ↑ムービーテクスチャ
をGLでやってみるプログラムです。
CTextureRendererのDoRenderSample()からテクスチャに書き込もうとすると
GL_INVALID_OPERATIONが帰ってきて何も書き込まれません。
そのため、DoRenderSample()内で
一旦memcpyでムービーの内容を適当なバッファにコピーしてから、
ポリゴンの描画を行う前にglTexSubImage2Dで更新していますが
負荷が大きいようです。何とかDoRenderSample()内で
テクスチャを更新したいんですが、どうすればいいでしょう?
PBOも使おうとしてみたんですが、どうやったらテクスチャとして使えるのか
分からないしmain.cpp以外から使おうとするとプログラムが落ちて駄目でしたorz
324 :
311:2008/12/27(土) 22:50:23
プロジェクトのファイル全部入れてしまいましたが
入れ忘れあったのでビルドできません・・
CTextureRenderer.cppとmain.cppだけ見てください
GL_TEXTURE_MIN_FILTERのデフォルト値はなぜかGL_NEAREST_MIPMAP_LINEARなので
環境によってはミップマップを設定しないとテクスチャが表示されない
>一旦memcpyでムービーの内容を適当なバッファにコピーしてから、
>ポリゴンの描画を行う前にglTexSubImage2Dで更新していますが
>負荷が大きいようです。
普通にテクスチャ更新すりゃいいだろ。なんで無駄なコピーやっているんだ?
そうしたらなぜかGL_INVALID_OPERATIONが・・
glBindTexture(GL_TEXTURE_2D, TexName);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TEXSIZE_X, TEXSIZE_Y, GL_BGR_EXT, GL_UNSIGNED_BYTE, pSampleBuffer);
printf("Error:%d\n", glGetError());
glBindTexture(GL_TEXTURE_2D, 0); //UnBind
これをDoRenderSample内でやるとGL_INVALID_OPERATIONが
なんか知らんが、OpenGLにはコンテキストを生成したスレッドでAPI呼ばないといけない制限があるから、
スレッド違いで失敗してるんでね?サンプルごとキューにでも投げてGLのスレッドで処理するようしとくとか。
こんな基本的な事は承知だったらすまね。
>>328 テクスチャーサイズが2のn乗になってないが、大丈夫なのか?
331 :
330:2008/12/28(日) 04:11:42
と思ったが、write()ではうまくいってるのか。
呼ぶタイミングを見ようと思ったら、DoRenderSample()を呼び出している
箇所が見つからない。どうなってる?
Gluxってなんか面白そうじゃんって調べたらLGPLなのに静的リンクライブラリだった
「自由に使って欲しいからGPLじゃなくてLGPLにしたんだぜ」
って書いてあったけど、これだと全然自由じゃないよな?
LGPLって動的リンクならゆるいけど、静的リンクだとソース公開だったよな
俺が勘違いしてるのか?
ソースコードはあるからライセンスに従って適当に使えばいいだろ。
なんかちょっと伝わってないみたいだから整理してみる
俺が望んでいること
→Gluxをライブラリとして使いたいが、全ソース公開は勘弁して欲しい
公式には「自由に使える」と書いてあるが、LGPLなのであまり自由ではない(詳細は下記)
LGPLのソース公開条件
→動的リンク(*.dll)ならソース公開は不要だが、リバースエンジニアリングを許可する必要がある
静的リンク(*.libとか*.a)ならソース and/or オブジェクトファイルの公開が必要
んで俺が試してみたところ、DLL化は無理だった(ライブラリ内にmain関数への参照があるから)
要するに静的リンクするしかないので、ソース公開は避けられないんじゃないか?
というのが問題なんだ
main関数を共有ライブラリにおけない環境の不幸を呪うがいい
「and/or」は都合のいいほうに解釈するんだ
つまりオブジェクトファイルだけ公開すれば良いんだ
ソース見てみたが簡単にDLL化できそうだけどな
>>335 軽くソースを読んでみただけなので不適当なところがあっても勘弁して下さい。
概略はgluxPlatform.cppでコンソールアプリ用とGUIアプリ用のmain関数の
ひな形が実装されていて、ユーザ定義のmain関数はgluxPlatform.h内の
#defineでglux_Mainへとリネーム、上記のひな形main内から適切なタイミング
でglux_Mainを呼び出す、という形ですね。
で、ひな形main関数の名前がmainだったりWinMainだったりするのでDLL化
が出来ない、と。
となると、まずgluxPlatform.h内のmainをリネームする#defineを削除、次に
gluxPlatform.cpp内のひな形メインをConsoleInit, WinInitなど無難な名前に
付け替えて、ユーザ定義のmain等から明示的に呼び出す形にすれば良い
のでは。glux_Mainはこの際にポインタとして渡してやれば良いと思います。
で、DLL化のための上記の修正を行うpatchを作成して、LGPLで公開。
DLL化版のgluxもLGPLとなりますから、これを動的リンクするプログラムの
ソースを公開する必要は無くなるはずです。
>>335 ttp://www.gnu.org/copyleft/lesser.html LGPL v3だとこんな感じだ
4. Combined Works.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, ...
このライセンスはライブラリ部分に相当する最小限のソース・バイナリコードにのみ感染し適用される。その範囲内での感染はGNU GPL第6項と同様の方法で行う。
「glux使いました」と書いてgluxの入手先を明示しておけばおkなライセンス。
>>339 細かいレスありがとう
大体そんな感じでやったら出来たよ
数行程度の修正で間に合った
サンプルコードを元に改造していったんだけど
エラーが出ると予告無しに終了するって仕様のせいで時間がかかったわ
>>340 LGPL v2.1って明記されてるんだけど、そういう場合でも
v3だと読みかえていいのか?
>>340 > 「glux使いました」と書いてgluxの入手先を明示しておけばおkなライセンス。
全然違う。
>>341 よくない。
またLGPLとGPLでもソース配布についての規定は少し違う。
gluxを同梱するか、自分のソフトと同じダウンロード場所から自分で配布する必要がある。
343 :
311:2008/12/29(月) 21:22:24
>>330 2のn乗でないテクスチャはうちの環境ではサポートされています。
>>331 レンダラーフィルタとしてグラフに挿入すれば
後はDoRenderSample()を呼ぶのはDirectShowが勝手にやってくれるみたいです。
>>329 初めて知りました。OpenGL使い始めて長くないので・・
どんなプログラムを書けば実現できるのでしょうか?
「OpenGL マルチスレッド」でググってみましたが、よく分かりません。
OpenGLのAPIが実行されるスレッドを1つになるようにコーディングする。
DirectShowのコードは別スレッドで実行されてるだろ?
すいません、全然やり方わからないですorz
どんな関数とかを使えば?
VS std以上を使っていると思うが、ブレークポイントで停止させたりすると、スレッドの一覧でどのスレッドか状態がわかるだろ?
Expressだとスレッドは確認できなかったかな。というかExpressはデバッグ機能は貧弱すぎて使い物にならん。
スレッド間でデータを受け渡しする機構なんかは適当にやれ。マルチスレッドを理解していれば簡単だろう。
DirectShowが管理するスレッドがDoRenderSampleを呼ぶならその中ではGLのコマンドは使えない
そんだけ
俺が大昔に書いたらしいMovieTextureなるクラスのソース見たけどmemcpy使ってるな
OpenGL API を呼ぶ部分をクリティカルセクションで排他制御すれば
別スレッドから OpenGL API を呼んでも問題ないと思うんだけど。
コンテキストがスレッドごとに違うので
排他制御してもうまくいかないと思う。
>>351 ウインドウが1つならスレッドが違ってもデバイスコンテキストは同じじゃね?
デバイスコンテキストじゃなくてGLのコンテキストだろう。
常識を知らずに、自分が常識を知らないということを知ることはできない
常識もなにも、試してみれば分かることだと思うけど‥‥
>>357 プログラマとして、その考え方は危険だろ。
「たまたまうまくいってた」だけ、ってのが往々にしてあるし。
特にOpenGLは。
……ええ、こないだそれで長時間悩むハメになりましたさ。
359 :
311:2008/12/31(水) 22:59:28
マルチスレッドなプログラムなんて組んだことありません。
使っているのはVisual C++ 2008 Express Editionです。
・・・コンテキスト?
wglCopyContextを使えばいいんでしょうか?
頑張れ。学ぶんだ。今年もあと1時間弱あるから、なんとか。
今年もまだ8740時間はあるからがんばろう
>>361 そう表現すると、やけに少なそうに見えるな。焦燥感を煽るにはいいかも知れん。
>>361 あのゲームやこのゲームで数百時間浪費することがいかに愚かか実感しました
寝る時間 8時間、飯食う時間 1時間半としても、今年はまだ 5292.5時間もある。
がんばろうな。
365 :
311:2009/01/02(金) 21:45:35
これはアレだ。頭の弱い子には無理かもしれんね。
諦めてmemcpy使うかD3Dに乗り換えるかしたほうがいいぞ
後学のためにやってるなら止めないが
諦めんなよ…
諦めんなよ、お前!!
どうしてそこでやめるんだ、そこで!!
もう少し頑張ってみろよ!
ダメダメダメダメ、諦めたら
周りのこと思えよ、応援してる人たちのこと思ってみろって。
あともうちょっとのところなんだから。
俺だってこのマイナス10度のところ、しじみが取れるって頑張ってんだよ!
ずっとやってみろ!必ず目標を達成できる!
だからこそNever Give Up!!
369 :
311:2009/01/02(金) 23:27:13
wglCopyContextが何故かfalseを返しています・・
それ以前にこの方法が使えるのかどうか分かりませんが
wglCopyContext(OrigCt, CopyCt, GL_ALL_ATTRIB_BITS)
つ wglShareLists
>349
memcpy使う代わりにメインスレッドと同期を取ってコピー元のポインタを投げてやる、ってのを思いついた
ちゃんと動くかわからんけど試してみる気も無いw
>>329 で答え出てるのに、それを実行できないなんてただの無能だろ。
まずはVS std以上を買ってちゃんと勉強すべきだ。
お年玉貰っただろ?
つまりOpenGLを初期化したスレッドでのみ
glHogehoge()を呼べばいいんでしょ
勘違いしてた。
>>373はスルーしてください orz
378 :
311:2009/01/04(日) 22:31:35
>>369はコピー先でwglCreateContextしていなかった
せいでした・・
>>365でもwglShareListsは使っていますが、
ムービー再生前にwglMakeCurrentしてなかったので動きませんでした。
//レンダリングコンテキストを複製
DC = wglGetCurrentDC();
OldRC = wglGetCurrentContext();
HGLRC RC = wglCreateContext(DC);
wglCopyContext(OldRC, RC, GL_ALL_ATTRIB_BITS);
wglShareLists(OldRC, RC);
//ムービー再生前に
wglMakeCurrent(DC, RC);
//DoRenderSample内に
wglMakeCurrent(DC, RC);
ムービー再生前にwglMakeCurrentしたり、古い(というか複製元)
のレンダリングコンテキストでもう1回wglMakeCurrentを呼ばなくて良い理由は
よく分かりませんが動きました。
720x480 30fpsのMPEG2で音が途切れまくりだったのが改善されています。
ビデオを2つ以上にしたら動くかどうかは分かりません。
以前うpしたコードで
memcpyではなく
tmp = pSampleBuffer
のようにしても動くようですがサイズのでかい動画で音が途切れるのは
これでは直りませんでした。なんでだろう?
DoRenderSample()の外でテクスチャへの書き込み処理をしたらいかんのか
379 :
デフォルトの名無しさん:2009/01/05(月) 00:53:34
質問なのですが、3次元空間内において四角領域にカメラ画像を描写して、
マウスとかでグリグリしていろんな方向から見えるようにしたいなと考えています。
毎フレーム画像を取得して、描画するのは1度きりなので、テクスチャに読み込まなくても、
glDrawPixelsでいいかなって思ってやっていたのですが、不具合が生じます。
とりあえず、glFrustumで視錐体を設定して、glMultMatrixで変換して、
glDrawPixelsで表示するという感じでやってみています。
そうすると、どんな位置に変換してみても表示する画像がウィンドウいっぱいに表示されて
マウスでグリグリして、姿勢を換えるとかができません。
とりあえず、できていると確認しているのは
@ウィンドウいっぱいならglDrawPixelsで表示できる
Aキューブとかオブジェクトなら求める位置に表示することができ、
マウスでグリグリする部分は完成している。
ということです。
glDrawPixels付近に問題があるのだと思うのですが、これって適当に四角形作って、
そこにテクスチャみたく貼りつけて表示しているのではないのかな?
そもそも3次元上で表示するってのは無理な関数なのかな?
って感じでわからないことが多いです。
テクスチャで読み込めばいいんですけど、画像サイズがVGAサイズなのでめんどいとか、
毎回読み込むのでメリットなかったりとかあって、使うのは微妙なんですがいい方法ないでしょうか?
参考になるサイトとかでも教えていただけるとありがたいです。
glDrawPixelsの実装はテクスチャ&ポリゴンだった希ガス。
昔スプライトっぽくglDrawPixelsで描画しようと試行錯誤した経験があるのだが、シェーダーとか色々影響した。
なので、glDrawPixels前にステートやシェーダーの設定をし直す必要がある。
ちなみに画像表示するならテクスチャでやるのがパフォーマンスがよい。
382 :
デフォルトの名無しさん:2009/01/06(火) 19:55:33
初めて投稿させていただきます。
初歩的な質問ですみませんが、
・法線情報(ノーマライズ済み)
・原点からの距離
の二つの情報から効率的に平面を描画させる方法はありませんでしょうか?大きさは適当です。
法線から直交する2ベクトルを計算して平面状の適当な4頂点を生成して…とかやっていたのですが、0の例外処理とかがややこしくなり、スマートにいきません。
環境は
WindowsVista
c++
glut
です。
よろしくお願いいたします。
適当にax+by+cz=Lを満たす点を選ぶのが効率的な気もするけど
Z軸に垂直で距離Lの平面を描く4点(?,?,L)をZ軸をNに変換する行列で変換すればいい
(0,0,1)とN(a,b,c)との外積T,NとTの外積B
TとBを正規化してT,B,Nで3x3の行列を作って4点を変換するといいかも
>>382 「効率的に」の意味が分からないけど。
法線をN、原点からの距離をdとすると・・・
Nとx軸の外積を求めて正規化→Bベクトルとする
NとBの外積を求めて正規化→Tベクトルとする
って作っておけば、位置dNを平面の原点として、BとTで
好きなだけ平面を張れるよ。
ただ、Nがx軸と平行な時(平行に近い時)は、x軸の代わりにy軸を使うとか
みたいな場合分けが必要になるけど。
って、結局、言ってる事は382,383と変わらないなこりゃ。
「0の例外処理」って何だろう?
・Nを球面上で連続に動かした時、平面を張る二つのベクトルも連続して動く
・Nを決めたとき、平面を張る二つのベクトルは一意に決まる
の二つを同時に満たすことは不可能だから、不連続な関数でも使わない限りは
何らかの場合分けが必ず必要になるよ。
↑「必ず必要」て。ボケてるね。orz
もう寝る!
iPhone開発でOpenGL(ES1.1)を初めて触っています。
3Dではなく2D用として作ってるんですが、
2Dの描画したオブジェクト同士が重なっているかを調べる
ようないい方法はあるんでしょうか?
やはり、自力で重なっているか(衝突しているか)を
調べないとだめですよね?
>>386 「ピックアップ OpenGL」でググると良いよ
>> 387
なんか難しそうだけどやってみます!
サンクスです!
>> 387
だいたいピックアップの概要は分かったんですが
これって、回転してない矩形領域に対しての判定なので
重なり判定したいオブジェクトが回転してない状態に全体を
回転させて判断しないとだめですよね?
>> 389
どういう意味ですか?
>>389 ああそうか、ある部位で重複があるかを調べるんじゃなくて、
どこが重なってるかを調べるのでは向かないか。
>>390 ? 回転?
>> 391
ピックアップって特定の矩形(回転なし)の部分にある
オブジェクトを取得できますよね。
調べたいのは矩形A(回転あり)と矩形B(回転あり)が
重なっているかどうかなんです。
なので、ピックアップを矩形Aに合わせて回転させて調べる
ということかなと思ったんです。
393 :
386:2009/01/12(月) 18:57:20
ってかOpenGL ES(iPhone)って
セレクションがそもそもないですね。。。
やっぱりスクリーン座標から実際に計算しないとダメな気がしました。
印刷用に高解像度レンダリングしたいんだけど、そういうときってどうしてる?
TBitmapに描画しようと思ったら激遅らしいし、
BitBltじゃディスプレイ解像度よりあげられないしで、
正直どうしようか迷ってる・・・
レンダリングする領域を分割して適当に繋げればいいんでないかな
396 :
394:2009/01/13(火) 20:35:48
>>395 そりゃそうだ
何で気づかないかな・・・
3Dだとパースがあるから割とむずいよ
398 :
394:2009/01/13(火) 22:31:43
>>397 正射影でやるからパースは割りと考えなくていいかもしれない
そうでもない?
FBOじゃだめなん?
GameProgrammingGemsの2と4に高解像度レンダリングについての項目があるので参考までに
>>397 パースがあるとか関係ないよ簡単だよ。
>>399 FBOだと結局解像度の制限があるよ。
領域分割に対して何も利点無さそうだけど、ジッタドレンダリングした後に
ピクセルを組み替えてもいいかもね。
あ、それだとMIPMAPのレベルが適切にならないか・・・。
ああglだと行列いじらなくてもビューポートの切り替えだけでできるのか
d3dだと範囲外を指定するとレンダリングされないんで勘違いしてた
お前どっちもちゃんと仕様を理解してねーだろw
お絵かきアプリを作ってるんですが、
スペックの低いモバイルマシンだと線が増えてくるとラグくなってきます。
画面更新毎に全ての線を描画し直しているのが問題だと思うのですが、
過去に引いた線はテクスチャとして残しておいて、
一気に書き込んでしまうというようなことはどうすればできるのでしょうか?
2D上書きならわざわざGL使う必要もないし、テクスチャにレンダリング内容をコピーしたい、またはオフレンダリングしたいならすればいいだけだろう。
FBOでググレカス
>>404 なんでわざわざOPENGLでやろうと思ったんだ?
要はペイントでいいわけだろ?
いや、GLを2Dのペイントやドローに使うのも、十分にアリだと思うんだけど・・・。楽だし。
ピクセルごとの細かい制御をしようとすると難しいけど、シェーダ前提なら色々できるし。
>>404 で、405も言ってるけど、FrameBufferObjectというのを使うといいです。
※→FBOに(追加で)描画→画面をクリアした後、FBOの内容を画面に描画→※に戻る
一番単純に考えると、単に画面をクリアするのをやめて、シングルバッファで重ね描きしていけば
いいんだけど・・・VISTAとかみたいなスマートな画面ドライバモデルじゃないと、重なったウィンドウに
内容を破壊されちゃうかな。
なんとなくiPhoneかなと思った俺
逆に、OpenGL ESでプログラムできる実機が手軽に手に入るハードって
iPhone/iPod touch以外にあるんかいな
Visual C++でCRectTrackerを使って画像内にドラッグで大きさ、位置が
変更可能な矩形を描画しようとしてるんですが、
矩形内の色が白に塗り潰されてしまいます。
枠だけ描画というのはどうやったらできるんでしょうか。
画像はrawで、OpenGLで描画されています。
OpenGLを使わずに描画したビットマップ上では枠だけ描画されたので、
OpenGLの問題かと思いこちらで質問させていただきました。
で、ソースは?
エスパーじゃないんだから「お前の使い方が悪い」としか言えんぞ
OpenGLの問題というよりOpenGL以前の問題のような
>>410 塗りつぶされるのは、ポリゴンになってるからだ
矩形の枠だけなら、ラインで引いたほうがいいと思う
>>410 OpenGLの描画の上にGDIで描画しちゃダメ
枠線もOpenGLで描いてください
415 :
410:2009/01/16(金) 13:49:20
ソース見る気は毛頭ないがSetPixelFormatでGDIフラグたてとけ。
417 :
410:2009/01/18(日) 01:51:10
>>416 ありがとうございます。
なんとかやってみます。
あーもしかしたら…矩形描画時にブラシで上書きしてんだっけか。
NULL_BRUSH選択してから矩形かいてみ。
それで動いたとしてもVistaではOpenGL描画の上にGDI描画は御法度だからな
OpenGLで描くなら普通にGL_LINESなんかで線描いてglBlendFuncで描画先反転させるかな
420 :
デフォルトの名無しさん:2009/01/21(水) 01:28:06
ボーン用のウェイトを塗り塗りするアプリを作りたいんだけど、
ぬりぬりするためには、どうしたらいいのでしょうか、
セレクションバッファ使えばできるような気がするけど、
塗り塗りしてるようなサンプルとかってどこかにないですかね、
よろしくおねがいします。
glTexImage2D() の internalformat 引数に与えた値と、その時生成したテクスチャの
glGetTexLevelParameteriv( ... GL_TEXTURE_INTERNAL_FORMAT ... ) が返す値は
必ず一致するでしょうか?
必ずしも一致しません
ちょいと質問
1.
ポリゴンをframebufferに描画し
それをglReadPixelsで配列に読み込む
2.
新しくテクスチャを作って
今読み込んだ配列をglTexImage2Dで関連付ける
んでためしにそのテクスチャでテクスチャマッピングすると
真っ白になるんだけどなぜ?
真っ白というか正確には最後にglColorで設定した値になる
glTexParameterとかglTexEnvfは2でglTexImage2Dの前に設定してるんだけど・・・
読み込んだ配列の中身を書き出してみたら
一応期待した通りの値が入ってるんだ。わけわかめ
配列の中身が正しいなら、1.jは関係無いところでまちがってるってことでしょ
普通にファイルから読んだデータで2.からやってみるとかで確認してみれば
テクスチャがEnableになってないとか
TexGenをEnableにしっぱなしだったとか
426 :
デフォルトの名無しさん:2009/01/30(金) 10:36:17
オブジェクトがビューポートの中に入っているかどうかを判定する方法はありますか?
視点変更をした際に,対象物が視野から外れてるかどうかを判定したいのですが….
XPなんだけどデスクトップ上にキャラを書き出すってことは出来る?
例えば3Dモデルのハエを画面じゅう飛び回らせたり
xroach を思い出したわ
xroach懐かしい。
groachなんてあるんだな。
質問があります。
始点から終点に書けてαブレンド値を下げて、透明になっていくような曲線を書きたいのですが、
そういった関数はOpenGLで用意されているでしょうか?
glMapBufferって
VRAMにCPUから直接かけるの?
PBOだっけ?DirectXのロックと同じだ。
で、FBOのほうがパフォーマンスいいよっと。使いやすいし。
>>426 gluUnproject()をうまく使えばなんとかなる?
>>430 曲線は書けないので細かい直線をつなげていくしか。
435 :
427:2009/01/31(土) 19:09:27
自己解決
プログラムは分からないユーザー側の質問で申し訳ないのですが、質問させてください。
WindowsXP Intel865G環境で、OpenGLのスクリーンセーバーを使用したいと考えています。
しかしながら、スクリーンセーバーとしてはあまりに重く、カクカク状態です。
通常の実行ファイルとして実行した場合(拡張子.exeに変更、/s起動)は、ある程度高速に動作します。
Windowsのスクリーンセーバー起動の場合は、OpenGLが有効にならないバグ等あるのでしょうか?
原因をご存じの方が、いらっしゃいましたらお答えいただけると幸いです。
分かるけどスレ違いだから教えない
438 :
デフォルトの名無しさん:2009/02/01(日) 21:03:37
>>437 Windows環境でOpenGLを使用してスクリーンセーバーを作成しました
しかしハードウェアアクセラレーションが有効になりません
どうすれば改善できるか、教えて頂けないでしょうか?
439 :
デフォルトの名無しさん:2009/02/01(日) 21:35:16
最近のグラフィックカードはだいたい
どのくらいのテクスチャユニット数ですか。
単純にマルチテクスチャするときの枚数として知りたいんですが。
440 :
432:2009/02/01(日) 21:39:00
>>433 それでもあえてPBOを使う!
ところで、マップするって
VRAMからメインメモリに転送するという事?
441 :
432:2009/02/01(日) 21:49:45
DirectXのロックと同じというけれど
あれはVRAMに直接書き込んでいるの・・?
CPUがシステムメモリ以外に直接アクセスする手段はないの。
マップやロックは要するに、VRAM<->システムメモリで転送を行うこと。
読み出しならロック時にVRAMから転送。書き込みならアンロック時にVRAMに転送される感じ。
名前の似ているWindowsのメモリマップドファイルとは別物ね。
作業用のメモリかと思ってました
>>439 GeForce GTX280 だと4枚
445 :
432:2009/02/03(火) 22:13:32
>>442 なるほど
よくわかった、ありがとう
PBO1の内容を読みながら
PBO2に書き込む方法ってある?
一旦glGetBufferSubDataしないと無理そう
わかってねーだろw
PBO1もPBO2もマップすればいいじゃない
と、とても遅レス
PCによってgluUnProjectの挙動が違うので頭を抱えてたんだが…
グラフィックのアクセラレーションを切ったら正常になった.
コード以外に原因があるときの調査って大変だよねぇ.
glReadPixelでアルファ値をGL_BRA_EXTで取得してHBITMAPに変換
それをDCに貼り付けてUpdateLayeredWindowで表示してるんだけど
うまく半透明にならない
glClearColorでアルファを0にしといて背景を透明にして
その上に半透明の物体を重ねていく、で最終的に合計のアルファ値で
画面に加算した結果を表示するというようにやりたいんだけど
出来ないの?
できる
glReadPixelsで取得した値を直接BitmapにしてUpdateLayeredWindowに渡すんじゃなくて
いったんどこかに書き出してちゃんとアルファが取得できてるか確認したらどうかな
あと、描画した物でなくちゃんと透けるような値が入った配列をビットマップにして
ちゃんと透けるか確認する
glReadPixelsではちゃんと取得できてるが、CreateCompatibleDCで作ったDCが
24bitでアルファ無しになってて透けないことがあった
あと関係ないが、Chrome430GTではglReadPixelsがもの凄く重くて使い物にならなかったぜ
2^nのサイズ以外のバッファに読み込むと何故か遅くなるというバグはRadeon系であったよ
452 :
449:2009/02/09(月) 10:32:48
調べたらglReadPixelしたデータのアルファがFFになってた
ピクセルフォーマット定義
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
これが取得部分
glFinish();
glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadBuffer(GL_BACK);
glReadPixels(0, 0, w, h, GL_BGRA_EXT, GL_UNSIGNED_BYTE, buf);
glReadBuffer(GL_FRONT);
glPopClientAttrib();
何か間違ってる?
453 :
449:2009/02/09(月) 11:41:08
自己解決
ピクセルフォーマットのアルファビット数を1にしたら出来た
生の画像を非圧縮でテクスチャにしてるんだけど
同じサイズのを2枚やると失敗する
メタデータでもせいぜい5MBくらいだと思うけどGeforce上のRAMは1Gある
テクスチャのメモリって制限か何かあるの?
なんか知らんが俺も似た問題を抱えている。
しかも成功する時としない時がある。
9800GTXだったと思う。
メタデータ???('ω`)
失敗の内容を書かないとエスパー能力にも限界があるぜ
glGetErrorでエラーは出てないの?
ドライバでエラーチェックONにするのを忘れずに
なんかタイミングの問題みたいだ
描画中のコンテキストに対してユーザー操作の別スレッドで割り込んで
テクスチャを作ろうとするとこけるらしい
なんだ、ただの馬鹿か
煽ってるカスはほっといて…
>>458 複数スレッドには対応していないぞ。
マルチスレッドで操作するなら1スレッド1コンテキスト
共有コンテキストにすれば別コンテキストで作ったテクスチャも使えるしな
描画中のテクスチャをいじったらどうなるか知らん
ステンシルを作るときにあるポリゴンの外側を1にするとかって出来る?
全部1にして中を0にするとかは無しで
つ 両面ステンシル
FindWindowでやるしかないんじゃ
どこぞでDCFromWindowとか使うやり方みた気がする。
DCはHGLRCから取得。
467 :
デフォルトの名無しさん:2009/02/16(月) 19:59:04
上でスレッド関係の話が出てましたが便乗で質問。
あるスレッドで作ったテクスチャを別スレッドで描画することはできますか?
現状うまくいってないんですが、それがwglCopyContextの使い方が悪いのか、
あるいはそもそもレンダリングコンテキスト間でテクスチャの共有ができないのか、
よく分かっていないのです。
468 :
467:2009/02/16(月) 20:00:10
ウィンドウの端っこに座標軸(X軸Y軸Z軸)を描画したいんだけど、どうしたらいい?
オブジェクトを回転させたらいまいちうまくいかなくて困ってる・・・
オブジェクトを書くときは
glPushMatrixで微分を退避してglPopMatrixで戻すといいよ
というかそうしないとオブジェクトが複数重なったら計算がめんどいだけだ
>>468 それは描画しながらテクスチャを作ろうとした場合の話であって
最初にまとめて作られたテクスチャを別々のスレッドで利用するのはまた別の話だぞ
472 :
468:2009/02/17(火) 02:35:26
>>471 自分の用途に関しては以下のような感じでうまくいきました。
描画用スレッド内では↓こんな感じでテクスチャロード用スレッドを起動
HDC hdc = wglGetCurrentDC();
HGLRC hrc_for_loading_texture = wglCreateContext(hdc);
wglShareLists(hrc_for_rendering, hrc_for_loading_texture);
shared_ptr<ThreadObject> th(new ThreadObject(hdc, hrc_for_loading_texture);
boost::thread(*th);
テクスチャロード用スレッドは↓こんな感じ
ThreadObject::ThreadObject(HDC hdc, HGLRC hrc) : hdc_(hdc), hrc_(hrc) {} // コンテキストを受け取って
void ThreadObject::operator()(void) { // スレッド実行部
wglMakeCurrent(hdc_, hrc_);
・・・テクスチャのロード(glBindTextureとか)・・・
}
ThreadObject::~ThreadObject() {
wglMakeCurrent(hdc_, NULL);
wglDeleteContext(hrc_);
}
openGL +
すみません、途中投稿しました
openGL + GLUTでプログラムを組んでいるのですが、
起動中に表示されるコマンドプロンプトを表示させないようにする方法はないのでしょうか?
コンソールでビルドしてんだろw
>474
vcなら
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
OpenGLで使えるDXF読み込みとかが出来るライブラリでお勧めのものとかありませんか?
>>478 Delphi2005プログラミングテクニックVol10にそのまんまなコードがあるよ
ライブラリではないけど
>>469の続きなんだけど、特定のウィンドウ座標にオブジェクトの表示はできたけど、
-Z方向のオブジェクトが描画されない・・・どうしたらいいか教えて欲しい
いまはglOrthoで視体積を取って、gluUnProjectでウィンドウ隅に対応するワールド座標を取得、
取得した座標分だけglTranslarefでオブジェクトを移動してる
オブジェクトを移動してみたりしたけどいまいち上手くいかない
480 :
479:2009/02/19(木) 15:42:00
>>478 失礼
勝手にDelphiだと思い込んでた
481 :
480:2009/02/19(木) 16:04:32
おk
自己解決した
取得した座標分じゃなくて係数かけて減らしたら見えるようになった
無理やりな気がしないでもないけど
PixelBufferObject使うと本当にテクスチャの更新速度上がるの?
ARB_pixel_buffer_objectの仕様のOverviewによると
通常テクスチャ更新には最低1個のコピーが必要だけどそれが消せるので速いという理屈らしい
俺にはいまいちよくわからない
PBOにテクスチャじゃなく座標情報を渡して
その情報を元に一括で描画をさせると早いということでしょ
テクスチャ画像を生成する関数Fがあったとして、
glTexImg2DとかだとFを実行した結果をメモリに格納しておかないといけない。
けど、PBOだとglMapBufferでゲッツしたアドレスに対してFを実行すればメモリに画像を保存しなくても直接buffer objectに書き込めるという事だと思う。
本当にglMapBufferでGPUのメモリに直接読み書きできるような実装があるかどうかは知らないが、
仕様書によると
If the GL is able to map the buffer object’s data store into the client’s address space, MapBuffer returns the pointer value to the data store.
って書いてあるぽ。
>>484 Buffer objectをvertex buffer objectとして頂点情報を書き込んでレンダリングして結果をテクスチャに書き込むって事?
それだとPBOが無くてもVBOで事足りるじゃん。
http://www.songho.ca/opengl/gl_pbo.html イメージをmallocしたバッファなんかに一端格納するんじゃなくて、直接PBOに入れとけば
そこからVRAMへはOpenGLがノンブロッキングのDMA転送で送ってくれるということらしい。
ただ、さらに下のダブルバッファリングの例はOpenGLのレンダリングが最大何フレーム
遅延するかはわからないと思うから毎回新しいバッファを割り当ててやらないと
やっぱりブロッキングされる気がする
ドライバの実装方法次第だと思うけど
PBOのDMA転送というのをGPUが実装してないと意味がない
そのくらいだったらドライバで偽装してCPUでやってる可能性のが高いけど
あんまり適当な知識で語るなよお前ら。見てて恥ずかしい。
あんまり適当な知識で語るなよお前。見てて恥ずかしい。
茶化すだけのレスをつける人間がいるな・・・NGするからIDつけてくれ
492 :
491:2009/02/20(金) 19:11:16
IDじゃなかったコテハンかトリップ
493 :
デフォルトの名無しさん:2009/02/21(土) 19:02:43
int i = 1;
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
glLineWidth( i );
glBegin(GL_LINE_STRIP);
glEnd();
iが10以上だとi=10と認識されて描画されてしまう。
この限界値ってどうやって変更するんです?
スペックによるの??
ググッて5秒でわかることを何故調べない?
>>493 限界値は限界値なので、それ以上は無理なのですよ。
ビデオカードorドライバによって決まるます。
質問。
OpenGLで、ボーンアニメーション(スキンアニメーション)を扱うライブラリというのはありますか?
自前で作る前に、まずは実績のあるライブラリを探せ。とよく言われていたもので。
>>38の人が自前で実装していたのをみるに、「これ!」といったライブラリはまだないのでしょうか?
何故にDirectX?
実績のあるライブラリだろ?
実績があるのは知ってるけど,OpenGLから呼び出してちゃんと使えるの?
D3DXで頂点座標を計算→OpenGLで描画
無駄が多すぎるなw
俺は使ったこと無いんだけどソースも公開されてるOgreはどうよ。
あくまで推測だけど、d3d10のサンプルなら独自拡張を使わない限りgl3じゃないとおそらく無理だと思う
その世代だとシェーダは基本的にglsl一択、nVidiaのグラボならCgもアリ
MSAAの個別サンプルを取得する必要があるらしいからOpenGL2.1標準じゃ無理
3.0標準でもたぶん無理
GeForceでGL_NV_explicit_multisample拡張使えばいけそうな気がする
シェーダはとりあえずNVIDIAなGPUで動けばいいというならCg
Radeonでも動いて欲しいならGLSL
制限ついてもいいからIntelやちょっと古いGPUでも動いて欲しいならCgでarbvp1/arbfp1プロファイル
CgはランタイムDLLが必要だが、GLSLはドライバ依存でドライバがアレだと酷いことになる
一長一短だな
OpenGLって、スキニングアニメーションすら全部自前実装しなきゃならんのか?
いまどきすごいな
D3D以外でAPI側が提供してくれる環境ってあるの?
描画APIの仕事じゃないし何らおかしくないだろ
Direct3DでもD3DXとして分けてるくらいだ
510 :
504:2009/02/25(水) 23:14:08
OpenGL Extensions Viewerで見てみたら、
OpenGLのバージョンは2.1と表示されている・・。3.0は使用不可?
multisampleって名前に入っている拡張は
GL_ARB_multisample
GL_EXT_framebuffer_multisample
WGL_ARB_multisample
の3つだけだった。
>Radeonでも動いて欲しいならGLSL
RADEON HD 2600XT,Windows XPだからGLSLじゃないと無理なのか・・
シェーダーの記述は何を使う?RenderMonkey市か使ったこと無いんだが
OpenGL3.0だとglBeginとかglEndとかも使えなくなっちゃうらしいから
gl2.1と書いたのだけど・・
(そもそもどうやって移行するのか分からない)
>>510 OpenGL Extensions Viewerで表示されるバージョンは
通常のコンテキストでのGL_VERSIONだから2.1になってしまう。
9.1だとプログラムが落ちたけど、Catalyst 9.2からは3.0コンテキストを
カレントコンテキストにしてからGL_VERSIONを見ればちゃんと3.0になるよ。
もっともHD2xxxがOpenGL 3.0に対応してるかどうかは知らないけど。
>>511 前方互換コンテキストでなければ非推奨になった機能も使える。
int attribs[] = {
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 0,
// 前方互換コンテキストを作るときはコメントを外す
// WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
0, 0
};
HDC hdc = wglGetCurrentDC();
HGLRC hglrc = bShareData == GL_TRUE ? wglGetCurrentContext() : 0;
HGLRC hglrc3 = wglCreateContextAttribsARB(hdc, hglrc, attribs);
BOOL bCtx = wglMakeCurrent(hdc, hglrc3);
printf("OpenGL Version : %s\n", glGetString(GL_VERSION));
glx拡張は使ったことないんで誰かよろしく。
NV_explicit_multisample拡張はGeForceでも最近の物なのでRadeonでは対応なさそうだな
Extentions Viewerは3.0対応してれば3.0って返してくれるんじゃなかったっけ
最近のRadeonのドライバで3.0対応したからHD2400以上ならドライバ更新すればいけるはず
GLX だとこんな感じ
int nelem;
int fbattribs[] = {
GLX_RENDER_TYPE, GLX_RGBA_BIT, GLX_DOUBLEBUFFER,
GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None
};
GLXFBConfig *fbconf = glXChooseFBConfig(display, DefaultScreen(display), fbattribs, &nelem);
XVisualInfo *visual = glXGetVisualFromFBConfig(display, fbconf[0]);
...
int attribs[] = {
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 0,
//GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
0
};
GLXContext context = glXCreateContextAttribsARB(display, *fbconf, 0, 1, attribs);
glXMakeCurrent(display, window, context);
らしいよ
>>515 > Extentions Viewerは3.0対応してれば3.0って返してくれるんじゃなかったっけ
2.1コンテキストでGL_VERSIONやGL_[MAJOR/MINOR]_VERSIONを取っても2.1にしかならない。
そして既存のプログラムでは2.1コンテキストしか貰えないことが規格に明記されている。
The OpenGL® Graphics System: A Specification (Version 3.0 - August 11, 2008)
Appendix N
> Calling the older context creation commands will return an OpenGL 2.1 context.
現状では3.0コンテキスト作ってバージョン取得するソフトは皆無。
GPU Caps Viewerは1.7.0で対応予定。
GLSLで質問なんですが、バーテックスシェーダーから
フラグメントシェーダーにvaryingで値を渡すと
補間がかかって値が変わりますよね?
値を全く変えないでバーテックスシェーダーから
フラグメントシェーダーに値を渡すにはどうすればよいでしょうか?
変わらないならuniform変数で
全点通して変えないなら
>>519だが
補間して欲しくないということなら宣言にflatをつければよい
ただしOpenGL3.0(GLSL1.3)の機能だ
お二人ともレスどうもありがとうございます。
>>519 uniformでVS→FS出来たんですね。
uniformはアプリからVSやFSに値を渡すものだと思ってました。
今環境が無いので試せないので今度試してみます。
>>520 書いてませんでしたが今使ってるのは2.1です。
OpenGL3.0ではflatなんてのがあるんですね。
>>511 どっちかというと、赤本がどうなるのかが気になる。
いきなりVBOから始まるんじゃ入門者にとって敷居が高すぎるし…
523 :
sage:2009/02/28(土) 02:15:19
OpenGLのソースコードって公開されてないのかな?
mesa3d
>>518-521 uniform変数でVertexShader→FragmentShaderは無理だろ
そもそもuniform変数はShaderではread-onlyなんだし。
flatはVBOの最初の頂点の値がずっと有効になるってことなのかな。
それじゃ全点通して変わらないのと一緒=unformでアプリから渡すのと同じだから
三角形ごとに切り替わるのかな
glBegin(GL_TRIANGLES);
for (int i = 0; i < num_triangles; ++i) {
glNormal3fv(normals[i]); // トライアングル一つにつき
glVertex3fv(vertex[i][0]); // 法線を一つ指定
glVertex3fv(vertex[i][1]);
glVertex3fv(vertex[i][2]);
}
glEnd();
とか、
glBegin(GL_POINTS);
for (int i = 0; i < num_points; ++i) {
glColor4ubv(color[color_index[i]]); // 色と頂点で別の
glVertex3fv(vertex[vertex_index[i]]); // インデクスを使う
}
glEnd();
みたいな描画って、頂点配列でできますか?
今は困ってないけど、GL3で頂点配列しか使えなくなると、
この辺の柔軟性が無くて困るような・・・。
あ、GL2.1でもShadeModelをGL_FLATにすれば
gl_Colorとかでパラメータ渡せば補間無しにできるわ
GL3ではShadeModelがDeprecateだからflat使えということになるんだあ
>>527 そういう頂点配列をいちいち作ればいい
glBegin/glEndの中ではそういうことやってるんだろうな
>>527 GL_ARB_instanced_arrays / GL_EXT_bindable_uniform / Vertex Texture Fetch+GL_ARB_texture_float
/ GL_EXT_transform_feedbackで前処理 / CPUで前処理
お好きなのをどうぞ。そもそも3.0フルコンテキストならImmediateも使えると何度(ry
ゲームで一定のアニメーションをさせる時にPCによって性能が違うから
FPSが変わってくるけどアニメーションは一定の速度にしたいのだけど
60FPSなら1000/60msでタイマーで割り込みを掛けると約16msで
割り込み速度が追いつかなくてのろのろになるんだけど
普通はどうやってやるの?
スレッドでループさせて16ms間隔のSleepをさせるとか?
>>531 ゲームはFPSを一定にする必要は無いんじゃないか?
フルスクリーンにしてリフレッシュレートをAPIで変更する
1. 前のフレームから16ms経ったか調べる
2. Sleep(0)で一瞬寝る
3. 1に戻る
OpenGL関係ないやん
>>534 sleep時間ゼロだと、ビジーループにならないか?
WindowsではSleep(0)だと一旦他のプロセスに渡しはする
必要以上にCPU時間をとりはするけど思う程多くはないし
ゲームだったら多少無駄に喰うくらい問題ないだろう
vsync割り込みに描画関数を設定するのが正攻法なんだろうけどね。
WinAPIを良く知らないので的確なアドバイスができない。
さすがに、ここまで低レベルの処理はGLUTには無いだろうし。
538 :
531:2009/03/01(日) 12:21:31
FPSはアニメーションのフレーム数の意味
実際の描画フレームはもっといく
1秒間に60フレーム分の動作をさせて
描画は完全に独立したフレームにするから30だったり100だったりする
つーかゲームって普通そうだろ
>>ゲームだったら多少無駄に喰うくらい問題ないだろう
そうか?
vsyncつかうとリフレッシュレートが60じゃない場合に面倒じゃない?
リフレッシュレートが85とかだとゲームが速くなるってのも同人ならよくあるが…
フルスクリーンでリフレッシュレートをAPIで設定してvsync割り込みに同期して描画する
これが一番単純
>>538 画面同期しなくていいなら、自分が良く使う方法は
long FRAME=20; // ゲーム周期(ミリ秒)
long prev; // 一つ前の時刻
// ゲームループ
game(){
:
ゲーム処理;
:
long now=その環境のミリ秒単位現在時刻取得関数();
long wait=FRAME-(now-prev);
if(wait<0) wait=0; // 処理落ちした場合ウェイトなし
sleep(wait); // 指定したゲーム周期を待つ
prev=now; // 直前の時刻を更新
}
こんな感じ。
>>540 最近のノート用ゲフォ等では、低電力モード時にリフレッシュレート変更や
vsync同期非同期切替が出来なかったりする。
そんなものは動作保障外にすればよいのだ
オブジェクトの移動処理を
全てタイマーをもとにして行えばvsyncとか問題ない!
なんか、ゲーム製作板みたいな内容になってきたな。
OpenGLの話題となると、ゲームの話が多くなるのは当然といや当然かもしれないが。
compizみたいなのもあるっちゃあるがねえ
ゲームの流れになってるから便乗して聞いてしまう。
ゲームを作るときは飛行機とか車とかをオブジェクトにするのが普通だと思うけど、
表示するモデルの座標を保持するときって、同次行列にしてる?
それともxyz+クォータニオンにしてる?
同次行列を持っていたほうが柔軟で応用が効きそうな気はするんだが、そうなると
回転処理のときにクォータニオンを自分で実装しなきゃいけないからやや面倒で。
構造体または配列 [ x, y, z ]のメモリ配置が
列ベクトルないし純虚数のメモリ配置に直接マップできる状態なら、
どちらでも同じかなという気がする。
C99で<complex.h>が入ってたり、新言語でも複素数サポートが充実してるんで、
2次元の回転処理を大半複素数でやるようになってきたのだが、
ガウス平面上の回転も重視されるようになったのは最近とかなんとか。
まあ20世紀前半は物理学で線形代数が花盛りだったしなあと思うと、そんなものかもしれない。
>>549 サンクス。
548だが、考えた結果行列で持つことにした。
OpenGL自体との相性がいいしね。
>>550 四元数を自前実装するときに[ i, j, k, 1 ]にすれば、
そのメモリ配列そのままで四元数にできると思うよ
質問です
glTexSubImage2Dを使ってテクスチャ画像をアップデートできるみたいなんですが
gluBuild2DMipmapsで作成したテクスチャにglTexSubImage2Dをやるとうまくいかないんでしょうか?
gluBuild2DMipmapsで最初に読み込まれた画像から全然変化しないのです
全部のミップマップレベルを更新しないとだめよ
自前でやるのが面倒なら
GL_SGIS_generate_mipmap拡張があれば、テクスチャをバインドしたあとに
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
で自動ミップマップ生成が有効になる
あとはglTexSubImage2Dで全てのミップマップが更新されるんじゃないかな
554 :
552:2009/03/07(土) 20:38:47
すいません自己解決しました、根本的な解決ではありませんが
gluBuild2DMipmapsをglTexImage2Dに置き換えたら成功するようになりました
最近のglTexSubImage2Dはピクセル数が2のべき乗じゃなくても成功するんですね
>>553 前々から言われてるけど、RadeonはGL_GENERATE_MIPMAPもglGenerateMipmapも効かなくて困る。
うまくいってるって人の書き込みを参考にしてみたけどどれも駄目だった。
うまい次善策はないものだろうか。
>>554 つ GL_ARB_texture_non_power_of_two
556 :
デフォルトの名無しさん:2009/03/10(火) 22:26:00
手っ取り早くジオメトリシェーダーを使うにはどうすればいいですか?
XP+RADEON HD 2600XTで以前glewinfoで調べたときは、
GL_EXT_gpu_shader4はありましたがGL_ARB_geometry_shader4がありませんでした。
Catalyst 9.2にした後はビデオカードが壊れてしまい調べられませんでした。
XP + RADEON HD 4830 + 最新Catalystでは使えるんでしょうか?
手っ取り早くはGeForce買え
Catalyst 9.2でもジオメトリシェーダはまだっぽい
ようやく仕様が公開されたGL_AMD_vertex_shader_tessellatorの中に
GL_EXT_geometry_shader4との関係が書いてあるから早晩実装されるでしょう。
最初に2乗じゃないとだめだと決めた奴ってきっと馬鹿だ
>>559 そういうことは、テクスチャフェッチ/フィルタリングユニットのマイクロコードを書いてから言えw
計算機資源が豊富になったあとから後出し文句を言うのはフェアじゃない。
つか文句自体カッコ悪い。
windowsでインストールされているopenglのバージョンを知るにはどうしたらいいでしょう?
>>561 計算機資源豊富な今でも、2^nから外れるとパフォーマンスは急激に劣化するしなあ。
>>562 OpenGLのバージョンはGPUとそれのドライバで決まる
OpenGL Extensions Viewerとかどうぞ
>>560 その仕様が出来た頃はマイクロコードどころかFPGAとかで
実装していたわけで。テクスチャユニットが8個ならチップの
集まりが8組基盤の上に並んでいる。そういう時代。
物理的にロジックが実装されている以上柔軟性を持たせる
のにも限度があるから、2^nの制限もやむを得ないところ。
RealityEngine辺りの現物と論文を比べると結構面白い。
論文に書かれているブロックダイアグラムそのままにチップ
が大きな基盤に綺麗に並んでいるので非常に分かりやすい。
openglってbmp画像を読み込む命令ってないんすか
無いよ。全部自前でやるか、他の適当なライブラリ使って。
>>564 無事opengl3.0がフルに使えるようになりました。
ありがとう。
569 :
デフォルトの名無しさん:2009/03/16(月) 19:13:49
とりあえず、初心者は2.0の赤本を買っておけば大丈夫ですよね?。
あと、皆さんはどんな開発環境を使ってますか?。
赤本があればいいが、それで初心者でも安心かはよくわからない
開発環境は主にiMacでgccとVIM
OpenGL Profilerが非常に便利だ
WindowsマシンはVistaでGeForceとRadeonとChromeを適宜差し替え
WindowsでもgccとVIM、たまにデバッグ用にVisual Studio
gDEBuggerが欲しいけど高い
ははは
ひひひ
拡張機能を使い始めると赤本だけでは不十分な気がするのですが
(例えば、赤本に wglChoosePixelFormatARB() って載ってましたっけ…?)
拡張機能の学習にお勧めの書籍はありますでしょうか。
今のところ OpenGL Superbible あたりを買ってみようかと考えています。
Superbibleはサンプルが多めでちょっと範囲が広い赤本という感じだったな
拡張もある程度載ってるけど、応用的なものは少ない
基本的なものを知りたいならいい本だけどね
洋書いけるならMore OpenGL Game Programmingが結構面白かった
ちょっぴり古いけどまだ参考にはなると思う
575 :
573:2009/03/20(金) 20:56:45
>>574 ありがとうございます。そちらも入手してみます。
Visual C# 2008EEでC# OpenGL Framework(OpenGL v1.2.1)を使っています。今回行列演算の順序の確認や、挙動を理解するために以下のコードを書きました。
起動時にgl.Frustum(-client_aspect, client_aspect, -1.0, 1.0, 1.0, 100.0);で視体積を設定し、あとは描画のみです。(gl.Frush()など省略している部分もあります。)
gl.Translated(-1.0, 0.0, -3.0);
gl.Rotated(45, 0.0, 1.0, 0.0);
gl.PushMatrix();
gl.Rotated(-90, 0.0, 1.0, 0.0);
gl.Translated(2.0, 0.0, 0.0);
gl.Begin(gl.POLYGON);
{
gl.Vertex3d(-1.0, -1.0, 0.0);
gl.Vertex3d(-1.0, 1.0, 0.0);
gl.Vertex3d(1.0, 1.0, 0.0);
gl.Vertex3d(1.0, -1.0, 0.0);
}
gl.End();
gl.PopMatrix();
gl.Begin(gl.POLYGON);
{
gl.Vertex3d(-1.0, -1.0, 0.0);
gl.Vertex3d(-1.0, 1.0, 0.0);
gl.Vertex3d(1.0, 1.0, 0.0);
gl.Vertex3d(1.0, -1.0, 0.0);
}
gl.End();
これで視線に対し、y軸を中心に45度傾いた四角形が2つ左右対称に描画されると思うのですが、実際には右の四角形が手前に来ている感じになってしまいます。
どこが間違っているのでしょうか。
OpenGLを始めて日が浅く質問内容に不備があったり、意味不明なことをしていたりするかもしれませんが、よろしくお願いします。
>>570 すいません、ありがとうございます。
gccとvimですか、coolですね。
>>576 Matrix演算順の問題だね。移動のベクトルが回転の影響を受ける場合、
Translate->Rotate と Rotate->Translate は結果が違ってくる。
上記のコードだと、2つのglTranslateがY軸回転の前後にあるので、まさにその状況。
Modelview Matrixを取得して値を見てみながら動作を確認すれば理解しやすいかも。
>>578 ありがとうございます。行列確認しつつ試してみます。
>>576 今実際に逐次行列を確認しながら、実行してみたところ挙動を理解することができました。
TranslatedやRotatedはワールド座標ではなくモデル座標で動作するんですね。Rotatedがワールドでもモデルでも差があまりないためTranslatedもつられて勘違いしていました。
ありがとうございました。
立方体を作成し、それぞれの面に別々のテクスチャを貼り付けるプログラムを作成しました。
立方体は頂点配列や法線配列、テクスチャ座標配列を有効にして作成しています。
また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面でコの字を組み合わせたような状態になってしまい、他の色のテクスチャが反映されていません。
この描画処理が入る直前でテクスチャの中身を確認してみても、しっかり各色のテクスチャが格納されていました。
何が間違っているのでしょうか。お願いします。
自己解決しました。単にDrawArraysの引数が間違っていただけでした。スレ汚しすみませんでした。
585 :
デフォルトの名無しさん:2009/03/27(金) 11:56:22
質問です。
MaterialのGL_SHININESSの値(0〜128が範囲だそうです)についてなのですが、
これはライティング計算式においてどう扱われるのでしょうか。
Direct3Dと同等の描画になるように移植しているのですが、
Direct3DのMaterialのPowerにあたるものが、GL_SHININESSだと考えています。
Direct3DのPowerについては、下記のサイトに計算式がありました。
http://msdn.microsoft.com/ja-jp/library/cc373089.aspx ただ、こちらでは値の範囲が0〜正の無限大 となっているため、この値をそのままGL_SHININESSに入れても期待通りになりそうもありません。
赤本のライティング(照明処理)の章に計算式載ってる。パッと見、同じに見える
ありがとうございます。
ついでなので赤本も買ってみます
この画像では若干説明不足でした。現状例えば立法体なら、6面中4面では初期状態からマウスを下に動かせば上の画像における2番が見え、上に動かせば反対側、右に動かせば3番が、といった具合に回転させられます。
しかし3番においてマウスを下に動かすと2番の面が見えるわけではなく、視線(その時点でのモデルのx軸)を軸として回転する形になってしまいます。
四元数とか使う奴だな
592 :
デフォルトの名無しさん:2009/03/27(金) 21:17:56
スレッド間でのテクスチャの共有について質問があります。
描画用のスレッドAで以下のようにリストを共有して、
HGLRC hrc = wglCreateContext(hdc);
wglShareLists(hrc_old, hrc);
// hdcとhrc_oldはあらかじめ作っておいたものです
スレッドBで以下のようにテクスチャを作っています。
wglMakeCurrent(hdc, hrc); // hdcとhrcはスレッドAから渡されたコンテキスト
〜ここでテクスチャを生成〜
wglMakeCurrent(hdc, NULL);
wglDeleteContext(hrc);
スレッドB終了
で、スレッドBで作成したテクスチャはきちんと描画されるのですが、
CPU負荷が上がりっぱなしになります。
解放を忘れているコンテキストがあるのかもと思うのですが、
なにか間違えていますか?
ちなみに、スレッドBの最初のwglMakeCurrentを呼ばなければ
テクスチャも描画されない代わりに負荷も上がりません。
>>588 視界の右方/上方ベクトルを、適宜視点位置ベクトルに加え続ければいいよ
皆さんありがとうございます。クオータニオンを勉強してみたいと思います。
>>593 そんな感じですね。グーグルアースは画面上で渦状の回転も入りますがあんな感じというとわかりやすいでしょうか。
どの方向から見ていても横にドラッグすれば画面上で横向きに回転、縦にドラッグすれば縦向きに回転といった感じです。
>>594 申し訳ありません。まだまだ経験が浅くよく理解できないのですが、視界の右方、上方ベクトルというのはPROJECTION_MATRIXの中でしょうか。
>>592 新しいコンテキストはスレッドBで作った方がいいんじゃないだろうか
598 :
592:2009/03/28(土) 01:07:33
>>597 なるほど。元のレンダリングコンテキストをスレッドBに渡して、
スレッドBでwglCreateContextとwglShareListsを呼ぶわけですね。
今ソースが手元にないので明日試してみます。ありがとうございます。
599 :
592:2009/03/28(土) 17:29:16
>>597 うまくいきました!
スレッドB
hdc = wglGetCurrentDC();
hrc = wglCreateContext(hdc);
wglShareLists(hrc_base, hrc); // hrc_baseはスレッドAから受け取ったコンテキスト
wglMakeCurrent(hdc, hrc);
〜テクスチャ生成〜
wglMakeCurrent(hdc, NULL);
wglDeleteContext(hrc);
以上
600 :
592:2009/03/28(土) 17:42:32
すみません。やっぱり駄目でした…。
負荷は上がらなかったものの、肝心のテクスチャが描画されていませんでした。
wglShareListsは元のスレッドで呼ばないといけないということはないでしょうか。
今日は時間切れなので、後日もう少し試してみます。
透過ありのテクスチャを各面に貼り付けた立方体を描画したのですが、ある面から見ると背景の別の画像がひとつも見えず透過できていない一方、またある面では別の画像が1枚だけ見え、さらに他の面では2面(ry
といった感じに半端な透過処理になってしまっています。挙動を見た感じでは恐らく原因は、テクスチャ座標か各面のポリゴン座標の配置が時計廻りかそうでないかにあると思うのですがどうなんでしょう。
描画順序じゃね?
>>601 その状況からして、Depth TestでFailになっているからだね。
半透明の物体は、奥から手前にソートして描画しないとうまくいかないというのは認識してる?
>>602-603 ありがとうございます。奥から描画しないといけないとは知りませんでした。
ソートは面倒になりそうですね。
>>600 スレッドBでテクスチャを書き換え、スレッドAで表示するプログラム
作ったことあるけどこうしてた。
>>599だとwglCopyContext使ってなくね。
OldRC:複製元のレンダリングコンテキスト
RC:複製先の〃
DC:デバイスコンテキスト
スレッドB
//コンテキストを複製、ShareLists
RC = wglCreateContext(DC);
wglCopyContext(OldRC, RC, GL_ALL_ATTRIB_BITS);
wglShareLists(OldRC, RC);
//テクスチャを書き換え
wglMakeCurrent(DC, RC);
{...} //テクスチャの書き換え処理
//あと片付け
wglMakeCurrent(NULL, NULL); //不必要?
wglDeleteContext(RC);
606 :
592:2009/03/29(日) 13:57:10
>>605 同じようにしてみたんですが駄目でした。
605に挙げていただいたやり方は、下に上げた4つの組み合わせの中だと1番に該当すると思います。
ちなみに2番の例だとwglCopyContextを呼ばなくても描画はされました。
スレッドBでテクスチャ生成前にwglMakeCurrent(hdc, hrc)し、
生成後にwglMakeCurrent(NULL, NULL)とwglDeleteContext(hrc)を呼んでいます。
このwglMakeCurrentに渡すhdcとhrcの組み合わせについて結果を調べてみました。
1. hdcはAから引数で渡されたもの + hrcはBでwglCreateContext(とwglShareLists) ⇒ 描画NG + 負荷NG(高)
2. hdcはAから引数で渡されたもの + hrcはAでwglCreateContext(とwglShareLists)して引数で渡されたもの ⇒ 描画OK + 負荷NG
3. hdcはBでwglGetCurrentDCして得たもの + hrcはAでwglCreateContext(AでwglShareLists)して引数で渡されたもの ⇒ 描画NG + 負荷NG
4. hdcはBでwglGetCurrentDCして得たもの + hrcはBでwglCreateContext(BでwglShareLists) ⇒ 描画NG + 負荷OK(低)
描画がきちんとされるのは2番、ただし高負荷になります。
負荷が変に高くならないのは4番、ただし描画されません。(
>>599に挙げた例です)
うーん…。
>>606 うーん
>hrcはAでwglCreateContext(とwglShareLists)
>>329によると、OpenGLはコンテキストを生成したスレッドでAPIを呼ばないといけないらしいので
少なくともwglCreateContextはスレッドBでやらないといけないと思います。
>hdcはBでwglGetCurrentDCして得たもの
スレッドBでいきなりwglGetCurrentDCしても無効なハンドルが返るのでは。
とりあえずwgl*の関数の戻り値がエラーになっていないか調べてみてはどうでしょうか。
それでも分からなければ問題を再現できる最小限のソースコードのうpを
私のプログラムの場合だと
スレッドAでテクスチャを作成(glGenTextures)、
テクスチャの名前(というか番号)を関数でスレッドBに渡し
スレッドBで(wglMakeCurrent後)glTexSubImage2Dしています。
別にテクスチャを作成するのはAでもBでもどっちでも良さそうですが。
スレッドAでwglMakeCurrentして
複成元のレンダリングコンテキストに戻すのを忘れずに。
(でもGLUT使用時は描画前に勝手にやってくれるので必要ない?)
608 :
592:2009/03/30(月) 00:50:15
>>607 >>606の3番と4番が駄目な理由は
>>607で指摘された「スレッドBでいきなりwglGetCurrentDCしても無効なハンドルが返る」という理由でした。初歩的な間違いですみません。
つまり4番で負荷が高くならなかったのは、単にスレッドBでのwglCreateContextが失敗していたからでした。
それで
>>606の1番が描画されない理由は、wglShareLists(hrcA, hrcB)を呼んだときにリソース(hrcA)が使用中というエラーが原因でした。
試しにスレッドAでいったんwglMakeCurrent(hdc, NULL)として、
スレッドBでwglShareLists(hrcA, hrcB)を呼んでみたら、
リソースが使用中というエラーの替わりにハンドルが無効というエラーが出ましたが、
テクスチャはきちんと描画されました(描画前にスレッドAでwglMakeCurrent(hdc, hrcA)と戻しています)。
2番のやり方だとテクスチャは描画され、何もエラーは出ませんでした。
ところで
>>329の「OpenGLはRCを生成したスレッドでAPIを呼ばないといけない」というのは、
例えばwglの場合は「wglMakeCurrentを呼んでRCをアクティブにしたスレッドでAPIを呼ばないといけない」だったりしないでしょうか。
つまりRCを作るのは別のスレッドでもいい気がするのですが。
とりあえず別スレッドでテクスチャがきちんと生成できる条件はだいたいわかりました。
あとは負荷の問題…。
素朴な疑問なんだけど、wglのcontextはスレッドセーフなの?
610 :
デフォルトの名無しさん:2009/03/30(月) 01:21:04
C# で OpenGL を使うクラス作ってる人って結構いるけど
あれってどうやって.NETの窓につっこむようにできてるの?
.NETの窓でもHWNDとかHDCが取得できたと思う
>>609 例えば「スレッドセーフではない」というのはどういう状況ですか?
1つのレンダリングコンテキストに対して複数スレッドがwglMakeCurrentを呼ぶとまずいということですか?
>>612 GL自体が激しくステートマシンなので、
同じコンテキストに対し、あっちのスレッドでglBeginしてglEndする前にこっちのスレッドからglBeginしたりすると困ったことになる。
だからこういうのは、異なるスレッドが一つのコンテキストを共有できたりしないように規制したりするんだが、
wglの動作はよく知らん。
614 :
612:2009/03/30(月) 20:54:34
例えば異なるスレッドが同じRCに対してwglMakeCurrentを呼ぶと
要求されたリソースは使用中というエラーが返るけど、そういうことならスレッドセーフなのではないかな。
あるスレッドでアクティブなRCのリソースを異なるスレッドが共有するために
wglShareListsがあるわけだし。
WinのOpenGLはスレッドごとにコンテキストが分かれてるから、それぞれのスレッドに別のレンダリングコンテキストを与えればいい
二つのContext間で目的のテクスチャなりバッファなりが共有できてるのかが、残る疑問かなぁ
またマルチスレッドか
もう誰かテンプレ用にまとめ作っちゃいなYO!
619 :
592: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が重要)?
Windowsはmutexの替わりに何使うんだろ
>>619 おつ。
個人的には最後の項目が良くわからんなぁ。
さらにvistaだと、また別問題が幾つか残ってそうだけど。
例えば、vistaだと同じスレッドでもDCごとにRCを作ってやらなきゃならない気がする。
BeginPaintとGetDCで帰ってくるhDCが異なることがあるようで、ここも怪しいが。
俺の知識不足かもしれん。
またか。
景気が底を打つまで
そのまま冬眠させておいた方がいいな。
>>622 OpenGLは債権者のところに譲渡されるのかな?
無料のままだといいね
N+で見境無くコピペしてるやつがいるけど
あれは何が目的なんだろ
お前ら素人はSGIなんてしらねーだろ、俺知ってるからショックだぜ。
とかかなぁ。
てっきりエイプリルフールネタだと思ってたんだが
>>628 これで買収した会社がOpenGLから収益をあげようとして
第二のSCO訴訟が起こったら、また盛大な祭りになるんだろうなあ。
OpenGLの特許って何かあったっけ?
商標ならSGIだったと思うけど
glEnable(・・・・)等は必要になったときに指定するのか、それとも使用する場合には最初にまとめて指定するのか、どちらがいいのでしょうか。お願いします。
今回FBOでテクスチャを関連付けてオフスクリーンレンダリングを行う際に、glEnable(GL_TEXTURE_2D)を指定する位置によって生成されるテクスチャが違うもの(妙に明るさが違う)になってしまったもので。
・テクスチャの事前設定やFBOの生成前にglEnable(GL_TEXTURE_2D)を指定し、オフスクリーンレンダリングでテクスチャを生成後、オブジェクトに貼り付け画面に描画。→貼り付けられているテクスチャが妙に暗い。
・上記の設定、オフスクリーンレンダリングでテクスチャを生成後、glEnable(GL_TEXTURE_2D)を指定し、オブジェクトに貼り付け画面に描画。→恐らく正しいテクスチャが貼り付けられる。
オフスクリーンでレンダリングしたい絵にテクスチャが必要なら
enableするべきだし、必要ないならdisableするべきってだけの話では?
FBOにはglEnable(GL_TEXTURE_2D)は関係ないよ
glEnable(GL_TEXTURE_2D)は
テクスチャを今から行う描画に使うかどうかを指定するだけ
>>633-634 ありがとうございます。では明確に画面描画に使用する直前に指定したほうが問題はなさそうですね。
636 :
592: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側で削除すれば問題ないようです。
仕様上どうなのかはよくわかりませんが。
質問です
投影テクスチャーシャドウをやろうと思っていて問題がでました。
環境はOpenGLES1.1です。早い話がiPhoneです。
単に描画結果をテクスチャにし、平面の四角ポリゴンに映して影とするのはうまくいきました。
そこで、その発展形で、影を落としたいモデルのUVを自動生成しようとしました。
これだと影が落ちる側のモデルが凸凹していても、きれいに影がでますので。
最初は
glMatrixMode(GL_TEXTURE);
で光源の位置にカメラを置いた場合の行列を・・・とやっていたのですが、詳しく調べたところこれは
「UV座標を変換する行列を設定できる」というものらしく、合致しません。
次に、頂点座標をテクスチャ座標として使うための
GL_OBJECT_LINEAR
を使おうとしましたが、どうもES1.1には見当たらないようです。
OpenGLES1.1では、影が落ちるモデルのUV座標を自動生成するタイプの影は不可能なのでしょうか?
>>636 バイナリでもいいのでテストツールあげてくれたら、こちらでも検証するよ。
こちらはtypeSZで、同様にオンボintel&ゲフォ7400Mの切り替え式です。
639 :
592:2009/04/07(火) 20:47:31
640 :
592:2009/04/07(火) 21:12:43
連続ですみません。ATIのGPU+Vista64の環境で試せました。
テクスチャ更新後の負荷は高くなりませんでした。
やっぱりnVidiaのドライバーかなぁ…。
641 :
デフォルトの名無しさん:2009/04/07(火) 22:13:56
スキンメッシュとか簡単に表示できる?
>>639 638ではないがChrome 430GTとGeForce 9500GTで試してみた。どちらもVista32bit
Chromeの方は特に問題なく動いた
スペース連打すると当然それなりのCPUは使うがそれ程ではない
GeForceの方は最初起動した時は何度かスペース押したら100%どころかアプリが応答しなくなった
しかし強制終了して3回目以降はこちらも全く問題なく動くようになったので、うちの環境が怪しいだけかも
ドライバはちょっと古めの180.48
ドライバ設定のスレッドした最適化が怪しいかと思ったがオンでもオフでも自動でもかわらなかった
あんまり参考にならない情報ですまん
644 :
592:2009/04/07(火) 23:58:42
>>643 ありがとうございます!
稀にアプリが応答しなくなる原因ですが、描画用スレッドとテクスチャ生成用スレッドで、
テクスチャの読み書きを排他制御していないせいだと思います。
アップロード用に修正したときに省略しました。気にしないでください。
こちらで試せした結果は↓です。Vista32だと問題なく動くとすれば、Vista64のNVIDIAドライバーの問題かなぁ。
Vista64+NVIDIA Quadro FX1700(driver 7.15.11.6255)で×
Vista64+NVIDIA GeForce 9300M GS(driver 7.15.11.7449)で×
Vista64+ATI Radeon HD 4800(driver 8.522.1.1000)で○
Vista64+Intelオンボード4500MHDで○
もしドライバーの問題ならそれはそれで開発の方は進められるので幸いではあります。
645 :
638:2009/04/08(水) 00:05:00
>>639 テストしてみました。
typeSZ, OS:VistaSP1HOME, 表示モードは「Windows Vista ベーシック」
Mobile Intel(R) 945(オンボ)の場合
起動するだけでタスクマネージャーの表示(1秒更新)が固まるほどの負加。
CPU負荷というより描画だけが妨害されている感じ。
GeForce7400GM
スペースを数回押すだけでは負荷は特に無し。
1秒くらい押し続けると、test.exeがフリーズ。しかしCPU使用率は低いまま。
この場合はタスクマネージャーへの影響はなし。
ご参考になれば幸い。
追記Vistaha32bitです。
う〜ん、intelオンボの動作見てると、なんとなくドライバ以外の問題な気もするなぁ。
お節介でなければ今後もテスト付き合いますので。
647 :
638:2009/04/08(水) 00:15:57
更に追記。
素朴な疑問なんだけど、WM_PAINTでなぜBeginPaintしないの?
これだと無効領域がクリアされずにWM_PAINTが発生し続けないか?
単にそれで負荷になってる気もするんだけど。
コンパイルして確認していないので無責任な発言です。すまそ
648 :
592:2009/04/08(水) 02:11:16
>>647 描画はタイマーイベントで10msec間隔(main.cpp:76行目)で
InvalidateRectすることでWM_PAINTを発生させています。
しょぼいPCだと負荷になるかもしれませんが、今時のPCであれば無視できる程度かと。
>>645 スペースを押し続けると固まるのは、テクスチャ生成スレッドがわさわさ作られて、
各スレッドでのテクスチャ書き換えと元スレッドでのテクスチャ描画のタイミングが
ぶつかりやすくなる(変な表現ですが)ためだと思います。
ここは実際には排他制御してますので無視してください。
>>638さんの環境はやはりVista32なのですね。
Vista64+NVIDIAで大丈夫だったという人がいると一気に不安になれるのですが…。
サイドバイサイド構成がうんたらかんたら
>>648 >InvalidateRectすることでWM_PAINTを発生させています。
>しょぼいPCだと負荷になるかもしれませんが、今時のPCであれば無視できる程度かと。
いやいやそうじゃなくて、
WM_PAINTってのは無効領域が存在するときに繰り返し発生し続けるメッセージなんだよ。
すなわちWM_PAINTを一度で止めるためには無効領域をクリアしなきゃならない。
BeginPaintってのはそのクリアを担当する関数でもあるんだよ。
651 :
592:2009/04/08(水) 10:11:52
>>650 丁寧にありがとうございます。誤解してました。
つまり今のやり方だと10msecごとにWM_PAINTが呼ばれる+
無効領域を有効にしようと頻繁にWM_PAINTが呼ばれる、
という状況なわけですね。
OpenGLから離れちゃって申し訳ないですが勉強になりました。
652 :
638:2009/04/08(水) 14:54:40
>>651 どういたしまして。
修正後のテストも付き合いますのでどうぞ
まさかこのスレでS3スレ住民と出会うとは思わなかった
cygwinでglfwのサンプルをコンパイルするとwarningが出ます。
g++ lesson01.cpp -o lesson01 -lglfw -lglu32 -lopengl32
Warning: resolving _glClear by linking to _glClear@4
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups
どうすれば解決できるでしょうか。
>654
>Use --enable-stdcall-fixup to disable these warnings
では解決しないのか?
頂点のインデックス指定について悩んでいます。
ややこしい話なのでうまく伝わるかどうか自信が無いのですが、
たとえば、6面体のサイコロを描画したいときを考えます。
頂点は8つありますので、glBufferData()を使って8頂点を登録しました。
ところが、サイコロの場合、同じ頂点座標でも同じ法線や同じテクスチャ座標とは限りません。
どの面に所属する頂点かによって、テクスチャの参照座標や法線は変わってきます。
そのため、頂点インデクスは12三角面*3頂点で36頂点分を設定しました。
同じ頂点座標が何度も参照されるということです。
法線やテクスチャ座標も、頂点インデクスの分だけ設定しました。
で、glDrawElementsで描画したところ、形状は正常に表示できたのですが、
テクスチャと法線が見事に化けて、まともに表示できませんでした。
しばらく考えた末に、テクスチャや法線のパラメータは頂点インデクスではなく
頂点座標に所属してしまっていることに気が付き、
頂点インデクスの数だけ頂点座標を重複して登録するようにしたところ、正常な表示が可能となりました。
ただ、この場合だと重複頂点が大量に発生してしまい、同じ座標に対して何度も行列演算が行われているはずです。
サイコロくらいならいいのですが、表示するポリゴンが数万とかのオーダーになった場合、
GPUにかかる無駄な負荷が無視できなくなってくると考えられます。
テクスチャ座標や法線データを、頂点座標ではなく頂点インデックスに所属させる方法というものがあれば
教えて頂きたく、よろしくお願いいたします。
サイコロなら基本6x4の24頂点必要。ポリゴン間の法線やテクスチャ座標の共有が
頂点と同じであると判定できる場合のみ8頂点で済ませることができる。
658 :
656:2009/04/12(日) 01:02:51
>>657 やっぱりそうか…
ありがとうございます。
場合分けして展開するのもかなり面倒なので、頂点重複で持つことにします。
しかし、OpenGL初期のころのハードでは行列演算のコストがそんな安いわけではなかったのに、
こういう仕様になっているのが意外といえば意外です。
フラットシェーディングのときには、頂点が共有できないってことですし。
3DCGプログラミングの手法や概念の勉強をしたいのですが
OpenGLで低位の表現から始めるほうが有効でしょうか?
それとも3DCGエディタツールの仕様書を眺めて使うほうがいいでしょうか?
>>659 両方並行というがよいのではないでしょうか。
たとえば、OpenGLの赤本を読みながら、メタセコイアのmqoファイルのフォーマットを理解してみましょう。
別にVRMLでもDXFでも構わないですが、テクスチャやシェーディングなどをサポートしているほうがいいでしょう。
そのファイルフォーマットを画面に表示するにはどうすればいいのか考えてみましょう。
頂点座標や法線をどう保持すべきか、ポリゴンの概念を明示的に扱うべきかどうか、考えるべき点はたくさんあります。
文献やウェブサイトを最大限に活用しましょう。
この試行錯誤の過程で、対象のライブラリに関するノウハウを急速に蓄えることができます。
>>659に数年以上のプログラムの経験があれば、ファイルを読み込んで形状を画面に表示するところまでは、
比較的短期間に到達するでしょう。
では、パフォーマンスを出すにはどうすればいいか考えてみましょう。
できるだけ処理をGPU側にやらせるにはどうすればいいか考えてみましょう。
ファイルフォーマットを読み込んで画面に表示するプログラムを作ることで、
そのAPIセットのエッセンスをかなりの程度理解することができます。
>>660 丁寧な返答ありがとうございます.
あなたの提案に則った勉強をしようと思います.
さきほどMetasequoiaをインストールしてmpoファイルを見てみましたが
ずいぶんと可読性の高いフォーマットですね.
ありがとうございました.
>660
659ではないけど、すげーさんくす
さっそくやるわ。テンプレに入れて欲しいぐらい良い解答だった、おれにとって。
デプスについて質問なんですが
glDepthRangeには-1〜1の範囲の値しか設定できないのでしょうか?
絶対値で1以上の値を設定したら1になってしまうって事であってますか?
>>663 0<=zNear<=zFar<=1 でしょう。
zNearとzFarは逆転できるのかなぁ? やったことないや。
manpageには
Thus, the values accepted by glDepthRange are
both clamped to this range before they are accepted.
と書いてあるので、範囲外の値を指定しても0〜1にクランプされちゃうでしょうね。
OpenGLの初期化なんですけど、やたらと時間がかかる気がします。
大体15秒ほど掛かります(流石にこれはちょっと困る・・・)
SDLの初期化がOpenGLを使うフラグを建てたときだけ遅くなったり
MetasequoiaもOpenGL切り替えだけが偉い遅かったりするので
やっぱりこれってOpenGLを使う場合の問題なんではないか、と認識してます。
これの対策で考えられるのってどんなのがありそうですか?
もしや皆我慢して使っている?それともうちの環境だけなのかな?
・どのよびだしが遅いのか
・どの環境でも遅いのか
を調べる気概が欲しい
>>668 SDLですが
SDL_SetVideoMode(xResolution, yResolution, bitsPerPixel, SDL_OPENGL);
この関数が遅いところまでは分かってます。ここで固まるようです
GPUが対応してないとかいうオチ?
ウインドウ内ではなく画面内の自由な場所に対して描画がしたく、現在はアプリケーションのウインドウの後ろとなる部分をキャプチャしたものを背景画像として使うことで擬似的に再現しています。
しかし現在の方法ではPBOに転送した背景画像を毎フレームDrawPixelsで描画しているので、内容の割には無駄に負荷が高くなってしまいます。
何かもっと画期的な方法は存在するのでしょうか。よろしくお願いします。
アルファ付でオフスクリーンでレンダリングしたものを、レイヤードウィンドウに描画すればいいよ。
そんでもってPBOは使うな。
>>672 即レスありがとうございます。
レイヤードウインドウ試してみます。
674 :
デフォルトの名無しさん:2009/05/06(水) 18:19:59
OpenGL ESのいい参考書や参考になる定番サイトってないですか?
OpenGLプログラミングガイドの3.0対応版はいつ頃でるかなあ。
>>671ですが、レイヤードウインドウを用いて、それに対してオフスクリーンレンダリングの結果を描画することでスクリーンにダイレクトに描画することができました。
y座標を逆にして考える必要がありますが、テクスチャの読み込みや、最終的なレンダリング結果の画像出力の際に画像の上下反転を省くことができますね。
Vista T7500 2.2GHz 8600M GT、オフスクリーンレンダリング解像度256x256において、上限反転の有無でCPU使用率には15%ほどの差がありました。
openGLESでmqoを自前で読み込んで描画しているのですが
glDrawElementsで一括描画すると
頂点をインデックスで指定するので
1頂点=1UV座標となってしまいます、
同じ頂点で、違うUV指定のたくさんのポリゴンを描画するには、
glDrawArraysを複数回呼ぶしか無いのですか?
>>679 ありがとうございます。
forで、indexを何度も参照するぐらいだったら
高速化のために最初から
インデックスの数だけDirectXで言うTLVERTEXみたいなものを作るべきなのかもですね
FBOでデプスアタッチメントをDepthComponent32にするとデプスバッファは1ピクセルあたり32ビットになりますよね?
しかし、後でUnsignedByteで内容を配列に取得してみると256x256の解像度なのにも関わらず、65535までしかデータが埋まりません。
カラーバッファはUnsignedByteでもRGBA32ビット取得されますが、デプスバッファはUnsignedByteだと8ビット分しか取得されないのでしょうか。
また、UnsignedIntで取得してみると今度は262144まで、つまり32ビット分埋まりますが、内容を見てみると4バイトのうち2バイトは同じ値で残り2バイトは妙な値になっています。
これはつまりUnsignedByteで取得すると大体の深度値が返されるということなんでしょうか。
>>669 ピクセルフォーマットの設定値とグラボの相性でそうなる場合がある。
アルファブレンド使う場合でも24bitにしとくと上手く動いたりする。
32bitの深度値を指定しても内部では24bitってこともあるだろうしね
あとUNSIGNED_BYTEとかの指定はコンポーネント毎に何ビットか
RGBA8に対してUNSIGNED_BYTEなら1ピクセル4コンポーネントで32bitになるが
DEPTH_COMPONENTに対してUNSIGNED_BYTEなら1ピクセル1コンポーネントで8bitになってしまう
精度良く深度を扱いたいならDEPTH_COMPONENT32Fなんかの浮動小数点深度バッファを使うのがいいんじゃなかろうか
>>682-683 返事が遅くなりまして申し訳ありません。お返事ありがとうございます。
UnsignedIntで取得すると1ピクセル1コンポーネントでもIntが32bitであるため、しっかり262143まで埋まったんですかね。
で、4バイトのうち3バイトが深度値を表していて、残り1バイトは実際には24ビットで処理されているためにとりあえず3バイト目と同じ値で埋まっていると。
勝手にこういう解釈しましたが、間違いがありましたらご指摘よろしくお願いします。
>>684 何らかのアドバイスしたいけど、
正直グラボに依存する問題のような気がしてならないです。
テストツールとかをうpしてくださればうちの幾つかの環境で試してみますよ。
>>685 ありがとうございます。テスト用のファイルアップしました。
http://senduit.com/c88099 Display関数の最後にあるReadPixelsでデプスバッファの内容を取得しています。
OSはVistaでGPUは8600M GTで、ForceWareは185.85です。この環境ではバイト配列を渡してUnsignedIntで取得すると1バイト目と4バイト目が一緒の値になります。
>>686 あ、うん。
VC#使ってないので、せめてバイナリでテストできるもの頼むよ。
>>689 実験ありがたいのですが、文字化けしちゃってますね。
機会があれば再度別のところにでもあげてもらえれば幸いです。すみません。
図々しい
692 :
デフォルトの名無しさん:2009/05/13(水) 02:04:26
馬が一番小回りが利くからね。
まともな開発環境も持っていないのに必死にならんでいいよ
>>693 実験ありがとうございました。Go 7400でも実際には24bitのようですね。
>>697 余裕でできます。赤本レベルでもやってるような気がする。
VBOでも出来ますぜ。
というかOpenGLESは、DrawPrimitive,DrawIndexPrimitiveみたいなことでしか描画できんし
OpenGLのテクスチャは、
DirectXみたいにLockRect等での
高速に、メモリを直接操作は、出来ないのでしょうか?
glteximage2d
gltexsubimage2d
OpenGLからもそのうちimmediate modeが無くなるしな。
ありがとうございます
ttp://code.google.com/p/mobilesynth/ mobilesynth ってやつをちょっと触ってみたいなと思って落としてみました。
新規プロジェクトで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
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
こんなエラーが出ます。
落としてきたやつを書き出すとちゃんと書き出せますが、自分のプロジェクトにとりあえずクラスを置いてみただけのやつは上記のエラーが...
エラーの意味がよく分からないんですがなにか設定とか必用でしょうか?
初歩的な質問で失礼します。
OpenGLを導入してプログラミングを行おうと思ったのですが、glVertex2dを使っての二次元の描画がセグメンテーション違反になってしまいます。
具体的には、
ttp://www.komoto.org/opengl/ このサイトを参考にしてとりあえずサンプルプログラムをコンパイルしてみたのですが、
sample01の線の描画などが、実行するとセグメンテーション違反になってしまいます。
自分で点を描画だけのプログラムなど書いてみましたが同様でした。
sample02以降の3次元のプログラムに関しては問題なく動きます。
どなたか原因わかるかたいますでしょうか?
OpenGLの質問というより、開発環境とか、C言語とか、そっちレベルの話しなきがする。
3.0前方互換から始めるOpenGL入門とか需要無いかな?
708ですが、僕はシェーダーちまちまいじってるところと、あとESなんで、3.0まで手が伸びないっす
>>709 どの関数は使えなくなるから次からはこうしろ、とかならすごく興味ある
712 :
707:2009/05/28(木) 11:29:28
>>708 Fedoraで使っています。Mesaは別途インストールしました。
プログラムの問題についてはサンプルそのままなので、ちょっと自分には分かり兼ねます。今まで普通にプログラムを確聞には問題なかったのですが・・・
もしよろしければ、どの辺りを調べてみたら良いかなどアドバイス頂けますか?
関数登録の位置が、環境によっては関係するとか?
>>707 SIGSEGVで落ちてるなら、gdbで実行してスタックトレースくらい見てみろよ。
718 :
707:2009/05/29(金) 12:42:43
>>715 うまくいきませんでした・・・
インクルードは問題なく動いていると思うのですが。
>>716 関数の順序を入れ替えてみるということでしょうか?
>>717 gcbの使い方がまだよくわかっていないのですが、動かして見たところ
Program received signal SIGSEGV, Segmentation fault.
0x0033bebc in ?? () from /usr/lib/dri/i915_dri.so
というものが出てきました。何かヒントになりますでしょうか?
デバッグの仕方についてはもうちょっと勉強してみます・・・
>>718はgcbではなくgdbですね、訂正します。
>>718 よりによってi915かよ。Mesaに付属のglxgearsは動くのか?
まともなGPUの載ってるマシンなら普通に動くだろうな。
ちなみにSIGSEGVで落ちた場合はgdbのプロンプトでbtと打つと
スタックのバックトレースが見れるから、そこからスタックフレームを
up/downして変数の値等を調べる。
とりあえずbtしたらこうなりました。
#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.
これから自分でもエラーを調べてみます。
glFlush()コメントアウトしてみたら
色々ありがとうございます、会社のPCでちょっと土日は触れないので、家でも少し調べてみて月曜日にまた試してみるつもりです。
3Dなら問題なく描けるのに・・・!
725 :
デフォルトの名無しさん:2009/05/30(土) 17:45:41
最近、赤本を読み終わったのですがどうも全体的なOpenGLの概観がまだつかめていないらしく、コードをどうかいていけばよいのか曖昧なところがあります。
ゲームを一本通して作りながらOpenGLを学んでいく本は無いでしょうか?英語は読めませんが、洋書大丈夫です。
できれば、少しでもGLSLを使用しているとありがたいです。
727 :
デフォルトの名無しさん:2009/05/31(日) 03:18:54
画像の保存ってFLONTとBACKしかないんですか?
3Dの物体を他の角度から撮ったりしたいんですけどいい方法無いですかね
FBOを使えばいい
>>726 いいねえ。
このムービーだけ見せてクローンを作れというのは学生向けのいい課題になりそうだ。
3人チームで組ませて分担させればチームで作ることの訓練にもなりそうだ。
>>726 とん。いいもの知ったよ。
このワクワク感がやっぱり重要だよな
733 :
デフォルトの名無しさん:2009/05/31(日) 22:32:53
>>729 GL_AUXiってどんな効果があるんですか?調べてもよく分かりませんでした
ていうか普通はGL_AUXiより先にGL_ACCUMだなw
>>733 >>729ではないが、オフスクリーン描画用のバッファ。glDrawBuffer()して使う。
ただしドライバによっては描画が遅かったりするし、描画結果を利用するのに
一々glReadPixels()しないといけないから、今時のGPU(数年前ぐらいまで)を
使ってるならFBOを使うべき。テクスチャに直接描画出来るから無駄が無い。
725です。
>>726 ありがとうございます。
ぜひ、参考にしたいと思います!。
737 :
デフォルトの名無しさん:2009/06/01(月) 12:38:39
738 :
デフォルトの名無しさん:2009/06/01(月) 12:39:22
739 :
デフォルトの名無しさん:2009/06/02(火) 11:45:52
数年前に挫折したOpenGLを再び触ってみたんですが、
サンプルコードの切り貼りなのにテクスチャが貼れません('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につづく
glGenTextures( 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につづく
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);
glDisable( GL_TEXTURE_2D);
}
遅れましたが開発環境はVC2008, WinVistaですー
742 :
デフォルトの名無しさん:2009/06/02(火) 11:51:36
> glPixelStorei(GL_UNPACK_ALIGNMENT, 3);
二番目の引数を1でどうよ。
> test[i][j][0] = (GLbyte)255;
こんなことするならGLubyteとGL_UNSIGNED_BYTE使うべき。
いろいろする前にまずwglMakeCurrent()では
OpenGLの関数を呼ぶ場合は必ずレンダリングコンテキストが設定されている
必要がある。BeginPaint()の直後にwglMakeCurrent()を呼ぶべき。
簡単なプログラムを作ってVista環境で実行してみると、
ウィンドウの位置に関わらず、キャンバスがディスプレイの左上に表示されてしまいます。
それで、色々と試してみたのですが・・・
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);をしないとダメですよね・・・。
でもそれをすると、表示がおかしくなるんです。
こういった現象になった方か、正しい解決方法をご存知の方、居ませんか?
windowの位置とサイズに合わせてViewPort設定しなおすとかじゃだめなのかな?
hWndが0ではないとか、GetDCは正しい値を返してるかとか、GetLastError()とかはチェック済み?
みなさんアドバイスありがとうです!(`・ω・´)
>>742 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); で試してみましたが変わらずでした...
>>743 自分でもその記述にした意味がわからなかったので直しました('A`
>>744-745 wglMakeCurrent( hdc, hglrc);をHDC hdc = BeginPaint( hWnd, &ps)の後に
持っていってみましたが、やはり変化なしでした。
せっかくアドバイスいただいたのに活かせてなさげで申し訳ないです(´・ω・`)
750 :
749:2009/06/02(火) 17:20:30
>>739-741のコードを実行する前に、以下のコードで初期化をしています。
HGLRC 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);
}
glGetError()とかは調べてみた?
これ実行するとどうなんの?回転する白い板が出るの?
なんで描画のたびにglGenTexturesしてんの
つかこのサンプルコードはどこから?
俺はVista x64の環境だが何も問題がない。
コードが悪いのだからよく調べろ。
デバッグはお前の仕事だ。
753 :
749:2009/06/02(火) 18:25:29
>>753 初期化時にGL_INVALID_OPERATIONって、gl_init()以外で初期化してるってことかよ。
あまり小出しにされるとまともなアドバイスができんぞ。
>>754 いえ、gl_init()内のreturn wglCreateContext( hDC);の直前です。
語弊のある書き方でごめんなさいです。
>>755 それはおかしい。GL_INVALID_OPERATIONを発生させるのはgl*()関数だけだぞ。
wglは諦めてGLUT使った方が良いんじゃないか?
wglMakeCurrentより前でglGetErrorしてはダメといった意味でglGetErrorがGL_INVALID_OPERATIONなのでは
>>749 glTexParameteri達を最初のglBindTextureの後に移動して、
glTexImage2DをGL_UNSIGNED_BYTEにしてみ。255はsigned charでは扱えない
760 :
749:2009/06/02(火) 19:43:49
>>758 ちょっと考えはじめてましたw
>>749 うまく行きました!ありがとうございました(´;ω;`)
まずglTexParameterをglBindTextureの直後に移動したところポリゴンが表示されなくなり、
glTexImage2DのtypeをGL_UNSIGNED_BYTEにしたところ、
思惑どおり赤いテクスチャが貼られました!
glBindTextureはそれまでにglTexParameterに従うのかと思っていましたが、
glTexParameterを利用するのはglTexImage2Dで、BindTextureはパラメータをリセットしてしまうのかなあ、
とか推測しましたが、実際のところはよくわかりません('A`
ともかくうまく動くようになって助かりました!みなさんありがとうございました。
761 :
749:2009/06/02(火) 19:45:17
void 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;
}
}
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, test);
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.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);
}
HGLRC 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_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さんへの間違いです。
みなさんありがとうございました!
iPhoneのOpenGLESで
FBO使って裏で描画しているのですが
FBOを512x512だと普通に軽いのに
FBOを1024x1024にすると、重くなります。
画面サイズより大きいと重いとか
そういう仕様とかあるんですか?
回避方法ありますか?
>>764 それはGPUのfill能力が追いついていないだけだと思う。
>>760 TexParameterってのは、名前の通り、テクスチャごとに付随してるパラメータだよ。
BindTextureすると、バインドされたテクスチャに設定されてるパラメータが使われるよ。
だから、GenTexturesで新しく作ったテクスチャをバインドすると、そのテクスチャの
デフォルトのパラメータに従って動作するよ。何もパラメータを設定していないテクスチャの
TEXTURE_MIN_FILTERのデフォルト設定はNEAREST_MIPMAP_LINEARだから、表示するポリゴンや
ウィンドウの大きさによってテクスチャが出たり出なかったりするという罠にハマるよ。
ちなみにTexEnvの方は、テクスチャをフラグメントに適用するユニットの設定なので、
バインドするテクスチャを切り替えても設定は変わらないよ。
この辺は、パイプラインの仕組みを理解していれば、混乱しないできちんと区別できるようになるよ。
だよ。
るよ。
るよ。
るよ。
いよ。
るよ。
だるいよ。
よ!
Visual C++とGLUTである立体を回転や平行移動する課題を解いています
結果をprog.exeで表示することはできましたが画像として保存することができません
出力結果の保存、Excelへの挿入やコピーしてペイントに張り付ける方法はないのでしょうか?
上でFBOという言葉を見ましたがどこか求めているものと違う気がしたので書き込みました
print screen
>>771 まあPrintScreenが一番楽だな。プログラム的にやりたいなら、描画後に
glReadPixels()して、適当なライブラリを使って画像ファイルに保存すれば良い。
早いレス感謝です
恥ずかしいこんな方法があるとは・・
glReadPixels()は課題より複雑そうなので後々覚えることにします
VBOって全然オンボじゃ動かないね、3.Xからはこういう環境は切り捨てられるのか...。
OpenGL3.0とSDLで開発ってできるの?
VBO未サポートのオンボなんてIntelの845より前、S3のSavage系、今は亡きSiSくらいだと思うが。全然?
Windows 環境で FBO のカラーバッファをコンテキストなしのウィンドウに
Blit することはできるでしょうか?
ReadPixelsとかして一旦イメージをメモリに取得して
ビットマップにしてBitBltしてください
直接は無理
>>778 なるほど。
ReadPixels は遅そうなのでウィンドウ毎にシングルバッファのコンテキストを作って
CopyPixels か BlitFramebufferEXT でカラーデータを転送するようにします。
OpenGL + GLUT + C言語 + Visual C++ 2008 Express Edition にてソフトウェア開発を行っています。
開発に使用しているマシンはVAIO VGN-SZ92PSという機種で
(A)NVIDIA GeForce Go 7400 with NVIDIA TurboCache
(B)インテル グラフィックス・メディア・アクセラレータ 950 (チップセットに内蔵)
の2つのグラフィックアクセラレーターを切り替えることの出来るマシンです。
開発しているソフトウェアを(B)で動かしている分には問題は発生しないのですが、(A)で動かしている場合に限ってシステムダウンしてしまいます。
781 :
780: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
といった情報です。
不具合が発生するタイミングはバラバラで、特にマウス操作等何もせずに画面を放置しているだけでも上記の不具合が発生します。
782 :
780:2009/06/11(木) 17:30:42
GeForce Go 7400で用いているドライバのバージョンは8.4.9.1なのですが、
VAIO VGN-SZ92PS が2つのグラフィックアクセラレータを搭載する際に、
元のグラフィックドライバーに手を加えているらしく、NVIDIAのページで
最新ドライバにアップデートをすることも出来ない状況です。
これまでは、nvoglnt.dllに不具合があって開発したソフトウェア側の問題
ではないのであろうと、問題を放置してきたのですが、私がコーディングを
行う際にOpenGLの仕様範囲外のコーディングを行っている可能性もあるので
何とかして原因を突き止めたいのですが、どこから手を付けたらいいのか
困っている状況です。
問題点が絞りきれない質問で申し訳ありません。
同様の不具合に過去に遭遇した方がいて、「OpenGLの仕様範囲外のコーディング」等
、何かソフトウェア開発者側が原因でありそうな状況に心当たりがある方いましたら
アドバイスよろしくお願いします。
自分で作ったプログラムなら、デバッガを使ってどこで落ちてるか調べるとか、glGetErrorをチェックするとかは
784 :
780:2009/06/11(木) 19:36:14
>>783 アドバイスありがとうございます。
とりあえず、glGetError試してみます。
以上です。
終わっちゃったよ
786 :
780:2009/06/11(木) 21:33:29
>>785 すみません、メール等を書く時、癖で文末に「以上です。」って書いてるもので^^;とりあえず、デバッグコンパイルをしてコールスタックを調べてみたのですが、下記のような状況でした。
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;
}
GLSLもここでおk?
>>786 バッファオブジェクトの範囲外参照とかポインタの範囲外参照をするよう操作をしてしまうと落ちるかもね
でもそれ以外で普通にエラーが出る場合でもドライバによっては落ちるから困る
NVIDIAだとドライバの設定でOpenGLのエラー報告がOFFになってる場合もあるから忘れずに
>>787 GLSLはここだな
>>780 こちらのSZ91ではインテル側のバグが頻発で、とくに7400Goは不具合出ません。
もしあれでしたら、動作チェックくらいはできますよ。
といっても、おたくのソフト中でどの関数を呼んだときに落ちるのかが全く掛かれていないから、
>同様の不具合に過去に遭遇した方がいて、
といわれても困る
790 :
780:2009/06/12(金) 20:43:56
>>788 アドバイスありがとうございます。
> バッファオブジェクトの範囲外参照とかポインタの範囲外参照
このあたりのキーワードも参考にして調べてみます。
> NVIDIAだとドライバの設定でOpenGLのエラー報告がOFFになってる場合もあるから忘れずに
これは初耳でした。
791 :
780:2009/06/12(金) 20:45:53
>>789 > こちらのSZ91ではインテル側のバグが頻発で、とくに7400Goは不具合出ません。
> もしあれでしたら、動作チェックくらいはできますよ。
研究で開発している公開前のソフトウェアなので外部に出すのは少し難しいです。
でも、お心遣い本当にありがとうございます。
> といっても、おたくのソフト中でどの関数を呼んだときに落ちるのかが全く掛かれていないから、
> >同様の不具合に過去に遭遇した方がいて、
> といわれても困る
不具合の発生するタイミングが明確ではないですね、まったくおっしゃるとおりです^^;
今のところ分かっているのは、デバックモジュールを作って調査した結果が786に書いた結果で
以下の順に問題のモジュールが呼ばれているというところまでは分かりました。
kernel32->glut32->opengl32->nvoglnt
不具合のタイプが私の書いたコード内で何か関数を呼んだ時に落ちているのではなくてカーネル?から呼び出されているのかな?
GUIのプログラムだと、並列に何か処理しているのかな?・・・
この手の不具合が出た場合の解決方法を知らなくて、どうしたものか悩んでいたところです。
「落ちているモジュールの位置は同じでも、不具合が発生するタイミングがまるでバラバラ」
という特徴があるといえばあるのですが、確かにこれだけじゃアドバイスするのも困りますね^^;
どこかで
kernel32->glut32->opengl32->nvoglnt
の流れで参照している領域を私の書いたコードと共有している場所があってそこを破壊してるのかな・・・
ガベージコレクションとか見たいに不定期に実行される仕組みをOpenGLが何か持ってて、それが実行されたタイミングで不具合が出るとかなのかな・・・
皆さんアドバイス本当にありがとうございます。
参考にさせていただきます。
>>558のレスを見てATI+Catalyst9.5+Windows XPでも使えるようになるかと期待してたけど・・
使えないみたい?
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
ES専用スレって需要あるかなぁ
いやー・・・このスレだけで十分なんじゃないかな・・・
796 :
デフォルトの名無しさん:2009/06/15(月) 19:18:37
Visual C++Express EditionでGLUTを使えるようにしたいんですが、設定の仕方が分かりません。
教えてください。
どこまでわかったの?
さっき知ったんだが、glutSolidTeapot()てw吹いたw
有名なティーポットだよ
800 :
デフォルトの名無しさん:2009/06/16(火) 00:31:11
OpenGLES でオブジェクト座標からスクリーン座標ってみんなどう変換してる?
全然うまくいかないぜ。。。
>>800 OpenGL ES 1.x なら OpenGL と変わらないはずだよ。
>>801 ESはgluProject()が無いんだよ
mesaのソースを読んでgluProject()を自前で実装するとか
実装っていうか、たしかほとんどコピペでいけたよ。
>>800 ていうかさ、頂点の座標にモデルビュー行列掛けて、投影行列掛けて、wで割って、
ビューポート変換かければウインドウ座標出るよ。
OpenGLというか3Dグラフィックスの基本が分かってれば簡単だし、その位は理解
しておくべき。
glViewport( x, y, w, h ) の相当の行列は
[ w/2 0 0 w/2+x ]
[ 0 h/2 0 h/2+y ]
[ 0 0 -1/2 -1/2 ]
[ 0 0 0 1 ]
807 :
806:2009/06/16(火) 20:47:31
勘違いでした。クリップ空間ですでに +Z が前方向になっているので以下のようになります。
[ w/2 0 0 w/2+x ]
[ 0 h/2 0 h/2+y ]
[ 0 0 1/2 1/2 ]
[ 0 0 0 1 ]
OpenGLES1.1なんですが
2Dの画像を移動・回転・拡大縮小させつつ大量に描画するにはどうしたらいいですか?
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の部分が白く表示されてしまうようです。
どうすれば
809 :
デフォルトの名無しさん:2009/06/16(火) 23:43:04
結構人によって違うんだな。
俺はauxWireCorn使ってた
あ、それとダブルバッファの切り替えとか癖にした方がいい気がする。
まぁ俺も勉強中の身だけどw
auxって何年前のコードだよ。GLUTかGLU使ってくれ
812 :
780:2009/06/17(水) 09:25:22
>>796 1.以下のページから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
>>808 アルファテストいらなくね?
速度はダメになってから考える
メッシュを4角形の集まりにしてGL_QUADSで描画するのと、
3角形の集まりにしてGL_TRIANGLESで描画するのって、
パフォーマンス的にどうなんでしょうか?
よく、3角形の方が効率がいいみたいな話を聞いたりしますが、
実際のところどうなんでしょう..モデルデータは頂点の数が多く
なっても3角ポリゴンの集まりに分割にしといた方がいいので
しょうか?
お前らパーティクルどれぐらいで作れる?
5時間ぐらいって遅い方かな?
>>814 QUADS系は3.1で消えるんだよな。まあnvidiaを使ってる限りは安泰なんだが。
パフォーマンスはドライバによるだろうが、多分変わらないのが多いはず。
数が多いなら、なるべくTRIANGLE_STRIPを使うように頑張った方がいいぞ。
>>816 ありがとうございます。
ですか...3角形にしといた方が無難なようですね。
一つのレンダリングコンテキストの4つのフレームバッファ
GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT, GL_BACK_RIGHT
はそれぞれ別々の RGB ストレージを持っていると思いますが、
深度、ステンシル、αはこれらのバッファ間で共有されることが
あるでしょうか?
819 :
808:2009/06/18(木) 23:09:59
>>813 アルファテストは要らないんですか?なら
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
さえ入っていればできるんじゃないんでしょうか・・。何か足りない?
テクスチャ張らずに、ColorPointerを有効にしてポリゴンを表示したときはちゃんと半透明合成されたんですが。
もしかしてglTexEnvを使ったらちゃんと合成されるようになると思っていろいろ試していますが
やっぱりうまく行きません。
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
としたらテクスチャの色が変になりました。
やはり頂点カラーを指定するとその色で半透明合成されます。
どうすれば頂点カラーのアルファではなくてテクスチャのアルファが使われるようになるんでしょうか・・
それとテクスチャの特定の色を抜いたりできる機能はOpenGL ESにはあるんでしょうか。
あればこっちも試してみたいです。
>>820 glTexEnvf()でGL_DECALモードに設定すればアルファ抜き出来る。
赤本のglTexEnvf()の部分にあるテクスチャブレンド関数のテーブルを
よく見ておくこと。
よしわかった。すまんが訳してくれ。ちゃっちゃと
>>818 FRONT_LEFT、FRONT_RIGHT、BACK_LEFT、BACK_RIGHTはいずれもカラーバッファ
RGBAのみ個別に保持する
深度とステンシルは共有だよ
αは個別
>>819 glBlendFunc(GL_ZERO, GL_ONE)とかしたらどうなる?
>>808 基本的には
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
だけでブレンドできるはず。それでダメなら、ブレンド以外の問題なんじゃないかな。
とりあえず、アルファテストは切っておいて良いと思うます。
あとは、テクスチャの内部フォーマットがちゃんとGL_RGBA(又はその亜種)になってるか、
そもそもちゃんとテクスチャは適用されてるのか(αが0の部分が白くなる、とか明らかに
おかしいです)、あとは・・・なんだろう。他にチェックすることあったっけな?
あ、テスト段階ではTexEnvはGL_REPLACEにしとくのがいいかな。
スクリーンショットか、携帯で撮った写真でもなんでもいいから、実際の絵があると
少しは状況が分かるかも。
826 :
808:2009/06/20(土) 22:27:18
>>822 ここにあったんですか、見てみます
>>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→全部半透明
こんな感じなんです。
glTexImage2DでinternalフォーマットにGL_RGBA8とかRGBA系のフォーマット指定してる?
>>826 gDEBuggerってものがあるので体験版を試してみるといいかも
DirectXならPIXが無料で使えるんだけどね
InternalFormat,Format どちらにもGL_RGBAを指定しています。なのになぜ・・
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sizeX, sizeY, 0, gl.GL_RGBA, GL_UNSIGNED_BYTE, buffer);
試しに両方にGL_RGBを指定すると、壊れた画像が表示されました。
internalだけGL_RGBAにすると、なぜか真っ白になりました。
基本的なことだが一応各所にglGetError入れてエラー出てないか確認してくれ
あとは同じようなことやってるサンプルがあればそれとの違いをみつけるんだ
gDEBugger試してみましたが、別プロセスで起動するのか全くデバッグできません・・
glGetErrorもglTexImage2DとglTexEnvfの後は0でした。
あとはサンプル探しか・・
openglで貼るテクスチャオブジェクトを直接操作したい
例えばあるbmpを読み込んで、テクスチャオブジェクトにした状態で中の値を変化(どこどこのビットの色を変えたり)させたりしたい
こういう場合どこをどういじればいいの?
もっと言えば変化させたテクスチャオブジェクトをbmpに出力したりしたい
普通に上書きすればいいんじゃね?
テクスチャ初期化できるんなら難しいことじゃないと思うが。
テクスチャの中身をそのままいじるのはできないから
メモリ上で普通に変化させてglTexImage2DとかglTexSubImage2Dで更新するしかないね
取得はglGetTexImageだけど、メモリ上でいじるならいらん
>>834 subImageって任意の1ビットを任意の色に塗り替えることができる?
836 :
デフォルトの名無しさん:2009/06/24(水) 10:21:44
四角を書いてその上に写真を貼りたいのですが
どなたか教えてください。
テクスチャでぐぐれ
GL+CgFXで質問なんですけどCgのtexture型に相当するGL側のオブジェクトは何なのでしょうか。
sampler型に割り当てるのはglGenTextures()で作ったオブジェクトだし、
texture型に渡してみても不正なパラメタ的エラーメッセージ出すし。
sampler_stateでTextureを参照しているようなのに対してはテクスチャオブジェクトを直接渡しちゃっていいんでしょうか。
かなり初歩の初歩の質問ですみません。
本に例として書かれていたプログラムで下記の部分にエラーが出たのですが、
どこが間違っているのかわかりません。
エラーの出た箇所をピックアップしてみましたが、何処が間違えているのでしょうか・・・
1 glLineStipple(1, 0x0101);
2 drawOneLine(50.0, 125.0, 150.0, 125.0);
個人的にはdrawにはglが付かないといけないと思うのですが、
単にglをつけてもエラーが出てしまい疑問です・・・
後、やはりプログラム全て書き起こした方がよろしいでしょうか?
そのエラーメッセージがないとわかんない
>>832 OpenCVと組み合わせればBMPでもJPGでも一発で出力可能
glTexImage2D→IplImage
>>838 Cgのtexture型に相当するもの?
そんなものは無い!
しいていうならglTexImage2Dで指定するメモリ領域かな。
プログラム側ではtexture型のパラメータからファイル名とか種類(1〜3D, cube等)を取得して
そのtextureを参照しているsampler型のオブジェクトに対応するテクスチャにglTexImage2Dとかで画像を与えるのが普通ではないかと思う。
Cgは使った事あるけどCgFXのプログラム側はあまり作った事無いので間違ってたらごめん。
>>839 openglの関数にはすべてglの文字が付いてるから, drawOneLineって本の作者が作った関数か何かじゃないの!?
それとそのエラーはコンパイルエラー?リンクエラー?それともランタイムエラー?
>>841 OpenCV使わないでどうにかできないでしょうか?
844 :
838:2009/06/25(木) 07:48:11
>>842 なるほど、やはりOpenGLではtexture型メンバに何か与えて〜って訳じゃないんですね。
DirectXの場合のコードを見てたらsampler型じゃなくてtexture型のハンドル取得してそこにテクスチャを渡してたので気になったってたんですけど、
HLSLのtexture型を調べてたらテクスチャのサイズやメモリ〜とか書かれてて何渡したらいいのか判らなかったんです。
cgGetSamplerState*()やらcgSetSamplerState()を使って参考にすれば良いって事ですよね。
ライトなしで薄い赤を合成したら、普通に赤になったんですが
加算合成して、白くなるのって、ライトが効いてるからですか?
何と何を合成したんだよw
α値が20ぐらいのRGB=(255,0,0)のテクスチャを四角形に貼り付けて
クリックした箇所に表示するプログラムを作って試したんですが・・
G,B成分がないから、ですかね?
ブレンディングの設定を
なんか宇宙のかなたから途切れ途切れで届いた謎のメッセージみたいな質問だな
毎年恒例の、課題提出時期の質問ラッシュな予感!
>>843 OpenCV使わないでOpenCVより簡単に実装することは無理。
一番単純なBMPで保存するにしても、ヘッダ情報から自前で用意する
必要があるだろ。GL描画に追いつくほどの「高速」な画像バッファ
も確保しとかなくちゃならんし。
bmpの読み書きだけならわざわざopenCV使わんでもいいんじゃね
>>851 無理じゃないだろ。初学者はバッファとかヘッダとかもちゃんと
勉強したほうがいいんじゃね?それらをちゃんと把握してから、
OpenCVで簡単にやるのは構わないと思うが。
確かに、OpenCVと組み合わせればOpenGLの動きをリアルタイムでAVI
ファイルに保存することとかも簡単にできるけどな。
854 :
839:2009/06/26(金) 09:37:56
>>840>>842その通りでした、申し訳ありません・・・。エラーメッセージは
C:\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がおかしいと出ているのですが、何処がどう間違っているのか・・・
倉賀野、名前名前〜!
GLtest7.cの32行目のx1 x2 y1 y2が宣言されていない変数ですっていうエラーじゃね
C言語の1時間目から復習してください
つか、名前かっこいいなw
857 :
839:2009/06/26(金) 10:02:07
>>857 #define drawOne (x1,y1,x2,y2)
のところ
#define drawOne(x1,y1,x2,y2)
ってしてみて
たぶんマクロ関数の定義のしかたが悪いと思う
859 :
839:2009/06/26(金) 10:08:19
名前は申し訳ありません!
スルーして頂けると嬉しいです。
フルネームでやってるやつなんているのか
>>857 つーか、マクロにしないで関数にしろよ。
static void drawOneLine(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) {
glBegin(GL_INES);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
glEnd();
}
マルチバイト文字なユーザー名じゃない分何ぼかマシ
>>861 赤本のプログラムそのものだし、入門中にそこまで要求しちゃ酷。
つかマクロのがいいだろ。
>>839 プログラミングがおぼつかないうちは、赤本なら
>>866が貼ってくれたように
GLのサイトにソースがあるので、それをもとにいじり倒して理解していくのもいいと思う。
赤本を勉強する姿勢は大事なので、がんばってねー
868 :
デフォルトの名無しさん:2009/06/27(土) 14:39:25
C++で作ったOPENGLをつかったものを
JavaのGUIに表示する本やサイトを教えてください。
「C++で作ったOPENGLをつかったもの」
がプログラムなのかその出力物なのか何なのか想像が難しいんだが、あえて言うなら、そんぐらいググれよカスさん。
「C++で作ったOPENGLをつかったもの」とは
ライブラリーのようなものなのです。
そして、windows固有のAPIを使わないように作っておいて、
GUIをJavaにすることで機種に依存しないソフトウェアを
開発しようと考えています。
JavaからC++の関数を呼ぶには JNI を使ったやり方かなぁ。
でもC++のライブラリ自体は環境依存になると思うけど。
GUIにJavaを使おうというのが筋が悪すぎる。
素直にクロスプラットフォームなGUIツールキットを使っとけ。
か、Java3Dを使ってJavaオンリーで行くか
結論を言ってくださいよ。
選択肢
1 そんな方法は無い
2 分からない
3 教えるのが面倒
OpenGLで描画している各フレームをAVIとかの動画ファイルに
保存する方法を教えてください。
方法はある。
>>871で書いたJNIを使ったやり方。
だけど俺自身試したことないからちゃんと動くかどうかは定かではない。
あと、基本的にライブラリはOS間で可搬性はないのでどっちみち機種依存になると思う。
>>875 glReadPixels で何でも読み込める。
Q) 動画ファイル保存する方法を教えてください。
A) glReadPixels で何でも読み込める。
なんだこの珍問答はw
>>874 お前偉そうな奴だな。出来るに決まってるだろうが
ただしGUIとC++コードのインタラクションをすべてJNIでラッピング
するのが面倒なだけだ
怒らなくても。3でいいじゃん
>>875 グラボのS-Video出力からHDレコーダーに入れて動画ファイルとして保存
画面動画キャプチャソフトってのもあるよw
教えてるだろうが
JNI使えば可能、で分からないのか?
884 :
デフォルトの名無しさん:2009/06/27(土) 16:14:44
OpenGLの画像出力をどのようにして
Javaのグラフィックコンテキストに出力するのかを
ききたいのですよ。
なにいってんだおまえ
だからもう素直にJava3D使っとけって
処理速度を追求する私にとってJava3Dという選択肢はないのです。
>>879 >>882 お返事ありがとう。
いや、OpenGLで書いた絵をプログラムレベルで動画ファイルにしたいんです。
>>879がOpenCVですぐできるって言うから自分もやってみたくて、
具体的にはどうすればいいのかと。
>>887 処理速度を追求するならJavaはやめとけ
>>890 GUIの処理速度は多項式時間に抑えられるので
Javaでもよいのですよ。
>>891 Java3Dのソースでも読めば参考になるんじゃね?教えて君
>>884 だったら最初からもっと細かく書けよ。
そうじゃなくて、OpenGLで直接JavaのFrameに描画するんだ。
1.2の頃はAWTにあったクラスでWindowハンドルを取得出来たんだが、
今はもう無理なようだ。俺も偉そうなことを言ってさすがにそれは無いから
少し調べてみた。
JOGLにあるjavax.media.nativewindow.DefaultGraphicsDeviceを継承したクラスの
getHandle()でFrameのwindowハンドルを取れるな。あとは必要ならネイティブの
ウインドウを作ってMakeCurrent()すればOpenGLで好きに描画できる。
getHandle()を自分で実装したけりゃJOGLのソースでも見てくれ。
>>891 あまり知ったかするなよ。OpenGLを直接使うかJOGL経由で使うかの違いは
計算量的には定数項の違いに過ぎない。
896 :
895:2009/06/27(土) 17:32:39
あ、見つかった。AWT Native Interface (JAWT)を使えば簡単に
Windowハンドルが取れて、ネイティブコードからCanvasに直接描画可能。
JOGLも同じことをやってるはず。
お前ら、こんなコミュニケーション能力無い奴によく親身になれるな
こんな馬鹿に教えた自分が情けない
空気読めなさ杉
こんなスレにも
>>897のような基地外っているんだな
教える側にも問題大あり
>>897がこのような態度を取る気持ちもわからなくもないよ
どっちもどっちだな
そもそも教える側をそうさせたのは質問者の態度だけどな。
つまりスルーすべきだったということだな。
いいからキチガイは出てけよ
とキチガイが申しております。
答え教えてもらったのに粘着か
と粘着が申しております。
噛み付いてくるあたりキチガイの自覚はあるようだな
>>895 定数項じゃなくて係数じゃね?
まぁどのみち891は意味が分からんが。
GUI以外では多項式時間に収まらないような計算でもやってんのか?
>>902 どっちもどっちてwwww
897みたいなアフォの気持ちなんて分かるわけないだろ。
8 9 7 以 外 に は な 。
とにかく897にはもう触れるな
自演じゃないならな
914 :
839:2009/06/29(月) 16:02:49
皆さん丁寧な返答ありがとうございました
無事動かす事が出来ました。
今使っている本なのですがプログラムの
細かい解説が載っていなく、
ベタ打ちで打って動かして読み取く方法しか取れません。
良かったら初心者にオススメのopenGLの本何か無いでしょうか?
初心者なのでサイトも考えられますが、
自由に使えるネット環境では無いのでサイトではなく本で勉強したいです。
因みに今使っているのは
Mason Woo著者の
OpenGL Programming Guide です。
英語の本なのですが、アマゾンでこれしか見つからなくて…
キミはC言語の基礎からして怪しいような
glutで簡単な2D描画APIを習作として作ろうとしているのですが,glutMainLoopの呼び出しが不可避であることは分かりました
しかし,main文中で
(1) ウインドウを開く
(2) 図形の描画
(3) ウインドウを閉じる
の順番で処理を行いたいと考えています.
ウインドウを開くためにglutMainLoopを呼び出してしまうとそこから先の処理に進めません
メインスレッドの処理を中断させないために,glutMainLoop内の処理を別スレッドで行わせるといった事は可能なのでしょうか?
LVの低い質問で恐縮ですが,何かいい方法があればご教示願います.
glutMainLoopの中でその処理やれば良いじゃん
>>918 その程度ならGLUTで十分可能。
イベントドリブンプログラミングについてググれ。
>>919>>920 誤解を招いてしまったようなので追記します.
GUIベースのいわゆるお絵かきソフトではなく,プログラム中で計算した結果をグラフにして表示させるために用いたいと考えています.
int main(...)
{
init(...); // 初期化処理(glut初期化)
// TODO : 計算
drawLine(...); // 描画命令
close(...); // 終了処理
}
というようなプログラムが書けるAPIにしたいのですが,
initの中でglutの呼び出しおよびglutMainLoopの呼び出しを行ってしまうと,ウインドウは開きますがその先の処理に進めません.
やはりglutではこのような要求を満たすのは難しそうです.
・終了処理関数内でglutMainLoopを呼び出し,結果のみを表示する(妥協案)
・描画関数が呼ばれる毎に新しいウインドウを開き,古いウインドウを閉じる(一応現実的だが非効率)
・SDL等の別のAPIを用いる(妥協案2,win/linux両対応かつ複数ウインドウに対応しているglutは理想的)
・glutで作成したウインドウに,glutのコールバック関数を用いずに何らかの方法で図形を描画する
現在上記の選択肢のどれをとるかで迷っています.
だからglutのコールバック関数を用いて描けばいいだろ
うん、C初心者スレからやり直すべきだと思う
脳がコチコチに硬化してるぞ
その若さで哀れな……
素人ってすぐにスレッドとか言い出すよね、どこで聞きかじってくるんだか知らないけど。
これだけだとアレなので、床井先生の手抜きOpenGL入門の最初のほうを見てくると良いよ。
メインスレッドで何か計算していて, 別スレッドで計算途中の値をリアルタイムで表示したいってことかな?
メインスレッドでやっている処理をglutのIdleFunc内で実行できるようなループ処理にすれば1スレッドで実行可能じゃないか?
それが面倒ならメインスレッドを実行しながら別スレッドでglutMainLoopを実行し, display関数内でメインスレッドで処理しているデータを参照しながらグラフでも描画すればいいんでね?
確かglutMainLoopを抜けるにはexit関数しかなったと思うんだけどそれが嫌ならopenglutでも使ってみたら?
glutと似たようなAPIだけどメインループは自分で書けるよ。
>>926 レスありがとうございます.
用途的にはそういった事も想定しています.
計算処理をglutにコールバック関数として渡せば確かにリアルタイム表示は可能ですが,
>>921のような手順で処理ができるようなAPIを目指しているのでやはりglutに頼るわけには行かないようです.
ご紹介いただいたOpenGLUTを丁度漁っていたところなので,これを使って頑張ろうと思います.
GLUTでも書き方しだいでどうとでもなるだろ。
なんかイライラする。
言葉尻は丁寧なんだけど都合のいいレス以外読み飛ばしてる感があるな
処理の依存性の反転みたいなことがわかって書けないと、結局スレッドもしんどそうな。
あおりっぽいひとたちの言葉も、案外老婆心だなと思ったり。今回に関しては。
最近流れ悪いな。
こういうのを慇懃無礼というんだろうな
>>930 1行でその人が真に必要としているものを示しているわけだから煽りとも言えないだろう
>>921 「APIにしたい」「APIを目指す」とか意味の分からない用語を使ってるあたり、
OpenGL以前に学ぶべきことが多過ぎるような気がするけど・・・。
ま、それはともかく。
A→B→C という順番で処理をするなら、プログラムも
A;
B;
C;
というように書かないといけない・・・と思っているのだとしたら、いつまでたっても
GLUTに限らずイベントドリブンなツールキット/フレームワークは使えないよ。
>>921さんのやりたいことは、GLUTで十分に、簡単にできる。
たとえば
Calc();
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は誤解でもなんでもなく、ごくまっとうなアドバイスなのですよ。
>>921をよく読むと、彼はさ、
main(){
calc();
draw();
fin();
}
ってやりたい。そういう「API」を作りたいって言ってるみたいよ。
そこで、いやglutだとこうやって実装するのが正しい、とかそんなの関係ないの。
draw()で描画します、fin()で終了しますっていう「仕様」の「API」を作らねばならんらしい
ウィンドウがリサイズされたり再描画するイベントが起きたらどうするかって?さー?
結局glutのフレームワークとは相反するんだし、「glutではできない、全部自分で作ろう」っていうのが正解か
最近の流れは
>>850が正しいのかもね
一瞬で消えちゃいそうだな、ウインドウ
まぁ僕も、glutMainLoop()の下に後処理を書きたくて、
例外投げて脱出してみたりとか試したこともあったけどねw
debugビルドではうまくいったんだけど、releaseビルドでは落ちちゃったので諦めた。
あれは何故なんだろう?
あと、やったことないけど、setjmp/longjmpならいけるのかな?
GLUTも、glutExitMainLoop()とかあればいいのにね。何故無いのかなー。
>>936 でも
>>918がやりたいのはそういうことなんですよねぇ多分・・・。よく分からんけど。
GLUTソースあるだろ。読んだことないのか?
>>937 終了する以外にglutMainLoop抜けたい理由はないんだから、
終了イベントが来たら後処理してexitすればいいじゃん。
glutMainLoopの下に書かないといけない理由はないっしょ
というか、そこまでするくらいならglut使うのやめればいいのに
glutで間に合う、間に合わないに関わらず、古いglutを使うのは止めてglfwとか
open scene graphでも使った方がいいと思います。
きっと優しい
>>945がわかり易い日本語解説サイトを立ち上げてくれるだろう。たぶん。
>>939 んなこた言われなくても当たり前に分かってるよ。実際そう書いてるし。
ただ、下に「書かないといけない」理由は無くても、そう書ければ嬉しい場合はあるでしょ。
main関数内で作った自動変数のデストラクタを走らせたいとか、(918みたいに)init()とfin()を対応させたいとか。
現実問題としてglutExitMainLoop()は無いのだから918はGLUTに合わせた書き方をするべきだけど、
それとは別の問題として、なんでglutExitMainLoop()が無いのかな(あったらいいのに)と思った。というだけの話。
glutExitMainLoop()の実装に手間がかかるとも思えないし、他のGLUT APIとの間に
矛盾が出るわけでもないと思うんだけどなぁ。
・・・とか書くと確実に、「だったら自分でGLUT書けよw」とか言い出すやつが出てくるだろうけど
意味が無いからレスはしませんよとあらかじめ言っておく。
>>938 メンドクセーから読んだ事ないけど、読めばglutExitMainLoop()が無い理由とか分かんの?
>>941 GLUTより新しいのを使うべきというのはごもっとも。
そして
>>945に期待。
何をやりたいのか良くわからんが、なんでglutMainLoop()の外で何かやりたがるんだろう。
glutIldeFunc()やglutKeyboardFunc()、glutTimerFunc()などに、ユーザ定義の関数を渡してやれば
いいだけのような気がするんだが。
なんか簡単なことを変に難しく実装しようとしてない?
>>942 そもそもGLUTは学習用に作られたauxが古くさいから置き換えるために
書かれたAPIだからな。オリジナルの実装者はもうメンテナンスを放棄しているし
ライセンス上ソースを勝手に改変出来ないから色々な派生プロジェクトが出来た。
とは言っても所詮小さなツールを作る程度までのAPIだから別にそこまで
注目されなかったんだよ。
ちなみに、freeglutだとglutLeaveMainLoop()というそのものズバリな関数が
用意されているがな。
無い理由もクソも
単に設計段階でMainLoopを抜ける使い方は想定されてないってだけの話だろ。
そもそもFORTRANとANSIに準拠したCのライブラリなのに、デストラクタとかアホか。
I can read an easy Japanese.
必要な終了処理は、例えばescキーが押された時点でやるとかすればいいと思うんだが、
それか、atexit()やon_exit()で終了処理を登録するとか..
>>945 いや、デストラクタは単に現在glutExitMainLoop()が欲しい理由の一例として挙げただけで・・・
対応する前処理と後処理を、ソースの上で近い場所、同じ関数に置いておきたいっていうのは
プログラマとして当然湧いてくる欲求だろ。(「自動変数生成→デストラクタを走らせたい」も同じ)
要するに、なんで「MainLoopを抜ける使い方は想定されてない」んだろう?って話なんだよ。
まぁ、当初からそこまで真面目に考えられてなかった、てのは分かったけどさ。
なんでいちいちここまで書かないといけないのかな。
そういう事を考えたりとかしないわけ?
デストラクタって言葉尻だけ捕まえて噛み付くとか、まったくもってナンセンスだ。
抜ける使い方が想定されてないというよりは、「抜けるな」と主張してるように思えるけどね。
イベントループを抜けるってことは全てのウィンドウは閉じてるのだろうし、
画面にウィンドウが無いなら終了してください。mainには戻ってきませんので忘れ物の無いようにお願いします。
って言ってんだよ。そのほうが使いやすいし、間違いも起こりにくいでしょ
結局この質問者も荒らし?
> そういう事を考えたりとかしないわけ?
普通の人間なら、こんなどうにもならない事をずっとグダグダ考えてる
暇があったら、さっさとGLUTを使わないコードを書いてる。
>>949 個人的には同意しかねるけどなるほど、そういう主張と解釈するのもアリですかね・・・。
952 :
951:2009/07/04(土) 17:59:37
ああっ、間違えて途中で送っちゃった。
まぁ950から荒らし認定も頂いたことだしwwとりあえずここいらで消えますわん。
この前のじゃば男と同じ奴か?
じゃばダメ絶対
955 :
951:2009/07/04(土) 18:48:17
「真面目に考えられてなかった」とかすげえ自分本位な意見だな。
自分と違う考え方は全て間違ってるとでも言いたげな。
無意識に他人を見下してるタイプと見た。
お前のポリシーとglutのポリシーは合わないので、
さっさとglutから離れることをオススメするよ。
つーかあと、純粋に言動が気持ち悪いよお前。
真面目に考えられてないとか、お前mjkを馬鹿にしてんのか?
958 :
780: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()を呼び出しているのですが、ここをコメントアウトすることで落ちなくはなりました。
959 :
780: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を呼び出すというのはなんだか無限ループを作っているような感じがするのですが、こうすることの利点が何かあるのでしょうか?
>>959 AntTweakBarとやらを使った事無いし、落ちる原因にも思い当たらないのですが、最後の
>display関数の中でglutPostRedisplayを呼び出すというのはなんだか無限ループを作っているような感じがするのですが、こうすることの利点が何かあるのでしょうか?
の部分にだけコメントを。
「無限プール」てのは無限再帰呼び出しのことでしょうかね。
だとしたら、glutPostRedisplayの動作を勘違いしてるかも。
glutPostRedisplayはその中でdisplay関数を呼び出すわけじゃなく、GLUTに対して
「次に機会があったらメインループからdisplay関数を呼んで頂戴」というメモを書き残すだけで、
glutPostRedisplay関数自体からはすぐに処理が帰ってきます。
だからdisplay関数の中で呼んでも大丈夫だし、あちこちで複数回呼んでも大丈夫。
ちなみにGLUTに限らずどのライブラリでも、〜Post〜とかいう名前の関数は、似たような動作
(イベント等の登録だけして、すぐに処理は帰って来る)をすることが多いです。
・・・そのくらいのことはすでに分かってる、とかだったらゴメンナサイ。
display関数の中でglutPostRedisplayを呼ぶ利点といったら・・・再描画のタイミングを
あれこれ考えなくても、勝手に延々と再描画をし続けてくれることですかね。つまり手抜きw
AntTweakBarってちょっとおもしろそうだなと思ったので釣られてみる
>>958 まず言いたいのは、理由も無くコーディングしたり、ためしに1行消してみたら動いたとか、
そしたら違うバグが出たのでためしに2回呼んでみたけどダメだった。とかやめろ
それで偶然動くようになったプログラムとか怖くて使えないから。
glutPostRedisplay()は再描画マークをイベントキューに入れる(再描画を予約する)だけなので、
常に描画され続けているという無限ループにはなるけど問題はない。
利点はそうしないと、GUIを動かした時にGUIが再描画されないでしょ。(他にも方法はあるだろうが一番簡単)
glutPostRedisplayを消したら落ちなくなったのは描画する回数が圧倒的に減ったので落ちるまでの時間が延びただけだろう
それよりwindowB_display()を呼んでいるのはなんで?
マルチウィンドウならそっちのdisplay()もコールバック登録してあるんじゃないの
つか「・・・」ってとこに原因はないの?「・・・」とwindowB_display()をコメントアウトすれば動いたりせんか?w
962 :
780:2009/07/05(日) 14:49:58
>>960 >>961 コメントありがとうございます。
>>960 > ちなみにGLUTに限らずどのライブラリでも、〜Post〜とかいう名前の関数は、似たような動作(イベント等の登録だけして、すぐに処理は帰って来る)をすることが多いです。
おーなるほど
> ・・・そのくらいのことはすでに分かってる、とかだったらゴメンナサイ。
glutPostRedisplayに関しては助言いただいた動作をすることは理解していたのですが、
GLUT全体として上の〜Post〜的な関数一連が同じ動きをするとかすごく参考になります^^
> display関数の中でglutPostRedisplayを呼ぶ利点といったら・・・再描画のタイミングを
> あれこれ考えなくても、勝手に延々と再描画をし続けてくれることですかね。つまり手抜きw
そういう利点もあるか・・・なるほど
display関数で書いた最後の
if(windowB!=NULL)windowB_display();
は、windowAに対する処理にwindowBを連動させることを目的としているのですが
本来はwindowBに関係する処理の末端のみに記述するところを、windowAで行われた全ての処理から呼ばれるdisplay関数の中で記述すように書き換えたなんて経緯があります^^;
963 :
780:2009/07/05(日) 14:57:51
>>961 すみません、言葉が足りませんでした。
今回の不具合なのですが、自分のコードで書いた箇所での不具合ではなく、外部モジュールでエラーが発生しているタイプです。
外部モジュールを呼び出している親関数も自分の書いたコードからではなく、詳しくは
>>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回やってみました。
964 :
780:2009/07/05(日) 14:59:06
・・・でも再呼び出しされたdisplay関数がglutPostRedisplayをコールするから、空いた時間があったら常にdisplay関数が呼ばれるような状況になるのかな?
>glutPostRedisplayを消したら落ちなくなったのは描画する回数が圧倒的に減ったので落ちるまでの時間が延びただけだろう
まさにこんな状況ですね^^;
> それよりwindowB_display()を呼んでいるのはなんで?
> マルチウィンドウならそっちのdisplay()もコールバック登録してあるんじゃないの
「windowAにAntTweakBarで作ったボタンをおいて、各操作に対応した計算を行った後、計算結果をwindowBに出す。」
ということを行っています。
「windowAに対する操作に対してwindowBを書き換えたい」
ということを実装したくて、当初はwindowBに関わる全ての処理の最後でwindowB_display()をコールしていました。
ただ機能数が増えていくに従い、リファクタリング時に苦労するようになってきたので
windowAで操作が合ったら常にwindowAのディスプレイ関数が呼ばれるのでそこでコールすればいいかなと
ただ、windowBが存在しない状況でwindowAに操作を行っている状況も存在するので、
if(windowB!=NULL)windowB_display();
とすることで間違いが起きないかなと・・・つまり手抜きです^^;
> つか「・・・」ってとこに原因はないの?「・・・」とwindowB_display()をコメントアウトすれば動いたりせんか?w
同じ結果ですね〜^^;
961だが、なげーよ。
glutPostRedisplayが何をしてるのかを勝手に想像して勝手に削るなと。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だけのテストを行うべきでしょ
マルチウィンドウじゃないと駄目なの?
マルチビューポートならそんな問題は起きないけど。
967 :
780:2009/07/05(日) 21:36:48
>>965 カレントウィンドウの切り替えは
glutDisplayFunc(windowB_display);
を定義して
windowB_display()
{
glutSetWindow(windowB);
・・・
glutPostRedisplay();
}
といった感じでやってます。
> 同じ結果ってのは同じように落ちるってこと?「・・・」とwindowB_displayをやらないってことは実質AntTweakBar関係しかやってないってことじゃん
> それで落ちるってことは原因はAntTeakBarを用いたGUI部分にある可能性が高いのだから
> AntTeakBar以外の部分(多分あなたの研究の部分)を全部隔離して、GUIだけのテストを行うべきでしょ
隔離できるところまで隔離しきって試してみます。
>>966 当初はマルチビューポート的なコーディングをしていたのですが、画面制御(ユーザ好みにサイズ調整を行う等)の実装がきつくなってきたので、出力内容毎に窓を分けるようにしました。
Nurbsで作った曲面にテクスチャマッピングする方法を教えてください
どうテクスチャマッピングしたいのか教えてください
glBegin() ~ glEnd() などの描画をスクリーン用のバッファではなく、
テクスチャに対してレンダリングするにはどうすればよいでしょう?
FBO
クライアントメモリーを通さずに Windows のスクリーン全体の画像をテクスチャに転送する
方法はあるでしょうか?
クライアントメモリーって何?システムメモリを指しているなら無い。
>>973 OpenGL でいうクライアントが動作しているマシン側のシステムメモリのことです。
ウィンドウとレンダリングコンテキストの作り方によって glCopyTexImage2D()
で転送できるのではと思ったのですが無理ですかね。
デスクトップのイメージを取得するにはGDI経由以外ないから
どうやってもシステムメモリを使用する事になるよ。
FBOって拡張機能ですか?
>>976 OpenGL 3.0で標準入り。それ以前では拡張扱い(EXT_framebuffer_object)
キーボードを押すたびに物体が追加するようなプログラムはどうすればいいでしょうか?
レベルの低すぎる質問はやめてください
ゲーム的には
vector<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そのものとは関係ない質問だな
indekkusu ocha huita
こういう質問しちゃう人にそんなコード書いても理解してくれないと思うの
984 :
978:2009/07/11(土) 22:59:10
>>980 すいませんが実際にコンパイルできるソースを書いてくれませんか?
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); をコメントアウトすると
それまでの画面は変な形で残りますが
物体は最終的には回転できるようにしたりするのでよくないのです
な?
flag == 1 でした
>>980 コンパイルできるソースを書いてくれませんか?wwwwww
みんな、スルーしようか
980はスルーすんなよ?w
>>980もわざわざエラーだらけにして底意地が悪いとは思うが、
あんな短いコードを読んで理解できないならOpenGL以前の問題
実際、本人もそういうとるw
>>850の通りになったw
レベルの低い質問はスルーした方がいい。
氏ね
>>984 君が質問するべきはOpenGLスレじゃなくて、宿題スレだな。
ここはやり方を教えてくれる人はいても、答えを書いてくれる人はいない。
(つーか宿題スレ以外、「答えを書け」なんていう質問はどう考えても嫌われる。)
OK?