OpenGLスレ Part12

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
クロスプラットフォーム 3D API OpenGLに関する話題を扱うスレッド。

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

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


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

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

- 過去スレ -
OpenGLスレ Part11
http://pc11.2ch.net/test/read.cgi/tech/1177523018/
2デフォルトの名無しさん:2008/09/12(金) 19:31:56
3デフォルトの名無しさん:2008/09/12(金) 19:33:12
- 補助ライブラリ -
■OpenGLコーディングの補助
・glew           http://glew.sourceforge.net/
OpenGL拡張の利用を簡便に。

■数値演算ライブラリ
・CwMtx library     http://www.xs4all.nl/~hkuiper/cwmtx/cwmtx.html
行列、ベクトル、クォータニオンの演算ライブラリ。LGPL。
・Matrix, vector and quaternion library 2.0       http://www.programmersheaven.com/zone3/cat415/26784.htm
配布ページの記述によれば無償で使えるらしい。ライセンスは未確認。
C++のメタテンプレート技法を多用しているので高速。APIとしての形も非常にシンプル。
・MathGL++       http://sourceforge.net/projects/mathgl-pp/
行列、ベクトル、クォータニオンなどの各種演算用ライブラリ。APIはOpenGLライク。LGPL。

■マルチプラットフォーム化・イベントやサウンドなどのハンドリング
・SDL           http://www.libsdl.org/index.php
定番。数多くの関連ライブラリが開発されている。現在のバージョンでは描画とイベントハンドリングを分離できないため、
描画がもたつくとイベント処理ももたつく。ライセンスはLGPL。
・Allegro         http://www.talula.demon.co.uk/allegro/
サポートしている機能、対応OSともにSDLに似ている。日本語資料は少ないが、Gift-wareという位の寛大なライセンスが魅力。
・GLFW          http://glfw.sourceforge.net/
キーボード、マウス、ジョイスティックなどのイベント処理、タイマ、マルチスレッド辺りのみをシンプルに抑えたマルチプラットフォームライブラリ。
サウンドやその他は他のライブラリと組み合わせたい場合は、こちらの方が競合などの問題が無く安心か。
・Java+jogl        https://jogl.dev.java.net/
OpenGLのJavaバインディング。現在のSun JavaVMがC++に肉薄した演算パフォーマンスを発揮している今、
Javaの豊富な標準ライブラリやSwing・Java2Dと連携できる事も考えると、今後はダークホース的選択肢に?
4デフォルトの名無しさん:2008/09/12(金) 19:34:54
■サウンド
・OpenAL          http://www.openal.org/
3Dサウンドライブラリ。マルチプラットフォーム。DirectXゲームでもサウンドはこれを使っているものも。MacOSXでは標準で入っている。

■その他
・OpenSceneGraph    http://www.openscenegraph.org/
シーングラフライブラリ。
・freetype          http://www.freetype.org/
ビットマップフォントやベクタフォントのレンダリングを行うライブラリ。

■フォント描画
・FTGL           http://homepages.paradise.net.nz/henryj/code/index.html#FTGL
Freetypeを利用したもの。マルチプラットフォーム。アウトラインフォント対応。日本語が使えるかは未確認。

■物理エンジン
・ODE:Open Dynamics Engine         http://ode.org/ode.html
オープンソース物理エンジン(GPL or BSD-Style License)
5デフォルトの名無しさん:2008/09/12(金) 19:38:40
http://wisdom.sakura.ne.jp/system/opengl/gl23.html

このサンプルコピペして実行してみたんですけど
ポリゴン部分が真っ白になるんです

他に何か設定必要なんですか?
6ahonoko:2008/09/12(金) 20:34:33
またまた質問です。

OpenGLとOpenCVのメリットやデメリットを教えて下さい。
OpenCVは、
 ・画像処理のAPIがすぐに使える。
 ・OpenGLと同様、直線を引いたりすることが出来る。
といった感じですよね。

OpenGLがOpenCVに比べて良い点とは何でしょう?

どちらを使用して、開発をするか検討中です。
よろしくお願いします。
7デフォルトの名無しさん:2008/09/12(金) 20:43:17
OpenCVは2D画像処理
OpenGLは3D
だろ
何開発するつもりなんだよ
8ahonoko:2008/09/12(金) 20:52:03
>>7
なるほど。

デバッグやアルゴリズムの確認・評価にOpenCVを使用することにし、
当初の予定通り、OpenGLで開発を進めていくことに致します。

ありがとうございます。
9デフォルトの名無しさん:2008/09/12(金) 23:40:39
>>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の限界なんでしょうか?
11デフォルトの名無しさん:2008/09/13(土) 18:25:12
>>10
得られた点列を曲線にするなどして入力を補間したらいいかと。
それで満足できなかったらWin32APIとかOSのAPIを直接叩けばいいと思うよ。
12デフォルトの名無しさん:2008/09/13(土) 19:21:42
ポイントスプライトは頂点がひとつしかありませんから
そのものを回転することはできませんよね…?
13デフォルトの名無しさん:2008/09/13(土) 19:49:14
そうですね
14デフォルトの名無しさん:2008/09/15(月) 05:43:11
OpenGLにてWin32APIの UpdateLayeredWindow(); 用の32bitのアルファ付き画像をレンダリングしたいのですが、
どうするのが簡単な方法でしょうか?

・BitmapのHDCにレンダリング(アルファ取れる?)
・glReadPixels

うーん
15デフォルトの名無しさん:2008/09/15(月) 09:09:30
>>14
普通にglTexImage2Dでテクスチャを作ればいいと思うけど、それじゃ何か問題があるの?
16デフォルトの名無しさん:2008/09/15(月) 09:56:23
OpenGL ESでColorDepthを32bitにするにはどうすれば良いのでしょうか?
17デフォルトの名無しさん:2008/09/15(月) 10:07:38
>>15
いや、GLでレンダリングした結果をWin32の半透明ウィンドウとして
使いたいという意味では?

>>14
その2つでは、glReadPixelでDIBに取得してBitBltのほうが適当かと、
32bits DIBに描画してBitBltは、MSのソフトウェア実装でGL描画が実行される
可能性が高いような。

GPUのピクセルフォーマットのサポート状況にもよるけど、PbufferSurfaceを作り、
そのHDCを使ってUpdateLayeredWindowもできるのかな?
18デフォルトの名無しさん:2008/09/15(月) 10:35:41
>>16
eglChooseConfigでEGL_BUFFER_SIZEに32を指定。
失敗した場合、その環境では32bitsのカラーバッファはサポートされていないことに
19デフォルトの名無しさん:2008/09/15(月) 22:38:46
人が作ったOpenGLアプリケーションをフックして画像を取得したいんですが、
glFlushをフックすればいいんでしょうか?

glFlush

glFlush
glReadPixels
画像を保存とかする
20デフォルトの名無しさん:2008/09/15(月) 23:59:36
つ GLIntercept
21デフォルトの名無しさん:2008/09/16(火) 13:23:02
行列スタックについて質問です。
glPushMatrix と glPopMatrix は便利なのですが、
・大きさを三倍にし30度傾けたモデルを、複数の場所に移動させて描画したい
という場合に行列の乗算の順番の問題からうまくできません。

glTranslatef
glRotatef
glScalef
draw

という順番に処理を行う(と思う)のですが…。これだとうまくglPushMatrixを活用できません
これが仮に逆だったら(乗算の前後関係が逆だったら)
glScalef
glRotatef
glPushMatrix
 glTranslatef
 draw
glPopMatrix
glPushMatrix
 glTranslatef
 draw
glPopMatrix
このように、非常に手軽だと思います。
何かこの手のやりようが他にあるのでしょうか?
22デフォルトの名無しさん:2008/09/16(火) 13:37:45
1. 描写する前にモデルを三倍にして30度傾けておく
1.1 CPUで
1.2 Transform Feedbackで
2. GLSLでなんとかする
2.1 三倍と30度をuniform変数に
2.2 せっかくなのでGeometry Instancingで
23デフォルトの名無しさん:2008/09/16(火) 13:45:33
>>22
1はモデルデータを書き換えてしまうわけですね。ちょっとこれだと、傾けたい角度が動的に変化する場合に負荷がきつそうですね
2はシェーダですね。(iPhoneでのOpneGL活用をやっているのですが)iPhoneにシェーダが使えたか確認してみます。

意外と行列操作そのものの機能が乏しいのでしょうか。
Direct3DにあるD3DXMATRIXのようなものも見当たりませんし、glTranslatefなどを使わず行列そのものを適用する方法も見つかりませんでした
glSetMatrix(float *matrix);
みたいなものがあれば、行列系は全部自前でやってしまうのですが・・・
24デフォルトの名無しさん:2008/09/16(火) 14:16:37
つglLoadMatrix*()
25デフォルトの名無しさん:2008/09/16(火) 14:49:44
>>9
いけました。
ありがとうございます^^
26デフォルトの名無しさん:2008/09/16(火) 15:03:10
>>24
!!
あとは自前で行列クラスを作れば良いですね。
ありがとうございました。

glRotatefなどの行列乗算が適用順番と逆順なのは、カメラ座標への変換(最後に行うべき変換)を最初に宣言させたいからですかね。
というか、適用昇順と逆順は結構使い分けたい場合が多いので、glTranslatefに2種欲しかったですね・・・
27デフォルトの名無しさん:2008/09/16(火) 20:01:46
>>23
> 傾けたい角度が動的に変化する場合に負荷がきつそうですね
ちょっと考えればそれは一概には言えないことに気づくはず。
28デフォルトの名無しさん:2008/09/17(水) 00:42:48
4ByteでGL_RGBA指定でテクスチャーを作っているのですが、
描画してもアルファの部分が抜かれません。
何か設定がいるのでしょうか?
29デフォルトの名無しさん:2008/09/17(水) 01:22:29
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
とかちゃんとやってるだろうか
30デフォルトの名無しさん:2008/09/17(水) 01:34:27
やってませんでした><
31デフォルトの名無しさん:2008/09/18(木) 23:10:57
一応これ置いときますね
32デフォルトの名無しさん:2008/09/18(木) 23:11:55
書き込んじまったorz

つ GL_ALPHA_TEST
33デフォルトの名無しさん:2008/09/19(金) 07:08:43
vbogl.tlbのedxさんめちゃくちゃいい人だ。メールしたら速攻返事きたw
3414:2008/09/20(土) 09:24:51
>>15-17
レス遅くなりました
やっぱり、glReadPixelになるのかあ。
画面に表示せずにでもバッファから取得できるものなのだろうか・・・
試してみたいと思います。
3514:2008/09/20(土) 09:27:26
x やっぱり、glReadPixelになるのかあ。
o やっぱり、ハードウェアきかせるには glReadPixelになるのかあ。

開発環境のマシンがドライバが古いせいでか、
glReadPixelがメッチャ遅いんですよね
ドライバ新しくしたら、WMPとかが真っ黒になったりするので、
古いのバージョンのドライバを使ってたりします。
Geforce6600だったと思うけど、ビデオカード買い換えるか・・・orz
36デフォルトの名無しさん:2008/09/20(土) 11:53:44
glReadPixelsが重いのは大抵のハードウェアで共通。
GF6600ならPBOなりFBOなり使え。
でもpbufferは勘弁な。
37デフォルトの名無しさん:2008/09/20(土) 13:53:09
38デフォルトの名無しさん:2008/09/20(土) 22:59:59
OpenGLでスキンメッシュボーンアニメーションを実装しているのですが、クォータニオンから回転行列への変換って一意じゃないのでしょうか?

一部のアニメーションフレームでボーンが360度一瞬クルッと回ってしまうというバグに困ってます。
39デフォルトの名無しさん:2008/09/20(土) 23:35:00
そのおかしなアニメーションの時のクォータニオンと変換した行列を調べて何がいけないのか原因をつきとめればいい
バグに困ったらデバッグしよう
40デフォルトの名無しさん:2008/09/21(日) 00:34:51
>>39
やっぱり地道なデバッグですよね。

デバッグしてたら少し原因が分かりかけてきました。
問題のフレームでクォータニオンの大きさが限りなく0に近くなっているようです。
自分の実装の仕方が悪いみたいです。ありがとうございました。
41デフォルトの名無しさん:2008/09/21(日) 21:30:20
重なる向きで正しい結果が出る実装は
Gemsに載ってる。
それでも反対向きの場合はダメだったはず
だけど、現実的にはあり得ないからOK
というやつだった。
42デフォルトの名無しさん:2008/09/25(木) 02:20:49
質問です
glDrawPixelsで背景を描いて
GL_BLENDをなど有効にしてglBeginなどでポリゴンを描いても
ポリゴン同士はアルファが効いてるんですが
背景がポリゴンから透けてないんです
他に設定がいるんでしょうか?
43デフォルトの名無しさん:2008/09/25(木) 03:22:02
解像度指定(640x480等)のフルスクリーンにするにはどうすればいいでしょうか?

44デフォルトの名無しさん:2008/09/25(木) 12:00:43
45デフォルトの名無しさん:2008/09/26(金) 13:50:21
glutGameModeString
46デフォルトの名無しさん:2008/09/26(金) 14:25:55
>>43
俺は、DirectDrawでやってるけど、
何故か一部のマシン(ノートPC)環境で画面が真っ黒になるという現象が
発生しているんだよなあ。

Windowモード→OpenGL初期化→表示、実行→フルスクリーンに切り替え→まっくら
→Windowモードにもどす→また表示される

なんとかしたいんだけどもねえ。
フルスクリーンになってから、最初期化しないといけないのかも
DirectXみたいにサーフェスロストとかってしないよな?OpenGLは。
そもそもWindowモードに戻したらまた表示されるのがわからんな。
47デフォルトの名無しさん:2008/09/28(日) 05:20:27
シェーダー系の処理について質問です

よくテクスチャにシーンをレンダリングして、
それにシェーダーでエフェクト処理をかけて画面に表示してるとかありますが、

テクスチャなどは2のn乗サイズがメジャーですが(512x512とか)
画面は4:3とかがメジャーだと思います(640:480とか)

そこで、
・縦横比が合わない出力バッファで、どう言う処理概念で出力しているのでしょうか?
・テクスチャと言う事は、最終的な処理は、画面全体に2Dポリゴン+レンダリングテクスチャ、とかになるのでしょうか?
48デフォルトの名無しさん:2008/09/28(日) 12:29:37
2のn乗サイズにならないテクスチャは
* OpenGL2.0以降かGL_ARB_texture_non_power_of_twoがあれば問題なく使える
* GL_ARB_texture_rectangleとかを使う
* でかい2のn乗サイズのテクスチャの一部だけ使う
のどれか
あと最終的には全画面を覆うポリゴンにシェーダなりでテクスチャにフィルタかけながら描画になるね
49デフォルトの名無しさん:2008/09/29(月) 19:29:56
誰か頼む・・・
OpenGLをHP-UXにインストールするにはどうすればいいか、
教えてくれ・・・

Solarisへのインストーラは直ぐに見つかったんだが、
HPのがどうしても見つからん
50デフォルトの名無しさん:2008/09/29(月) 21:28:11
HPにOpenGL使いたいがどうすればいいかと聞く方がよさそうな。
51デフォルトの名無しさん:2008/09/29(月) 23:12:35
OpenGLを用いてシミュレーションをしたいんですが,
バイナリ形式で書かれたSTLという拡張子のファイルを読み込むライブラリないし
データ形式に関して解説されている資料はありませんでしょうか?
52デフォルトの名無しさん:2008/09/30(火) 01:52:01
>>51
拡張子でぐぐれば拡張子辞典が出てくる。
STLを調べればStereoLithographyが見つかる。
あとは"StereoLithography file format"とかでぐぐる。


って、おい!
質問するから普通に検索しても見つかないのかと思ったら
stl file formatでヒットするじゃねーか。だいじょぶかw
まさか日本語じゃなきゃ分からないとか言わないよねw
53デフォルトの名無しさん:2008/09/30(火) 20:00:52
スプライト(矩形)表示したいんですけど、

座標を(-1.0,-1.0) - ( 1.0, 1.0) とかでなく、
ドット指定 (0,0) - (640,480) ってできないんですか?
54デフォルトの名無しさん:2008/09/30(火) 21:43:01
gluOrtho2Dとかでお好みの座標系を設定すればいいと思うよ
55デフォルトの名無しさん:2008/10/01(水) 00:02:37
GL_TEXTURE_MAG_FILTERで設定できるのはLINEARとNEARESTがあると思うのですが,
独自に(LINEARやNEARESTじゃないものを自分で定義)拡大時の補間方法を定義できないでしょうか。
56デフォルトの名無しさん:2008/10/01(水) 00:21:59
ピクセルシェーダで必要な数だけサンプリングして適当に混ぜ合わせればできる
t-pot バイラテラルフィルタでぐぐると具体例が
57デフォルトの名無しさん:2008/10/01(水) 09:56:50
>>53
俺はこんな感じでやってる
glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;
glOrtho(0, ScreenWidth, ScreenHeight, 0, -10000, 10000);

glMatrixMode(GL_MODELVIEW);
glPushMatrix;
glLoadIdentity;
58デフォルトの名無しさん:2008/10/04(土) 18:18:46
今更だけど動作検証用にvista導入して最新ドライバで
自作プログラムを動かしてみたら予想より良く動いて驚いた

ちなみにアプリはsm2.0世代ターゲット(ARBアセンブラシェーダ)、
グラボはゲフォ9600GTでD3D9の95%程度のFPSが出てた
ラデは知らん
59デフォルトの名無しさん:2008/10/04(土) 18:24:20
計算間違ってた、大体90%程度ね
60デフォルトの名無しさん:2008/10/05(日) 20:12:06
ttp://www.4gamer.net/games/043/G004345/20080825042/
カーマックに倣ってレンダリングスレッドを独立させてみたけど
苦労した割りにCPUファンがやかましくなっただけで別段早くならんかった

まあもともと1コアすら使い切ってなかったから当たり前なんだろうけど
61デフォルトの名無しさん:2008/10/07(火) 10:33:29
どなたかプログラミングの宿題
3〜4題(大学1年生レベル)のアルバイト
日当8千円くらいでやってくれる方いませんか?
62デフォルトの名無しさん:2008/10/07(火) 11:22:20
いません
63デフォルトの名無しさん:2008/10/07(火) 11:37:52
金出すなら学校のツテで探したほうが早いだろ
64デフォルトの名無しさん:2008/10/07(火) 12:24:55
>>60
計算スレッドとレンダリングスレッドを分けるのがナウい
一度やって懲りたけど
65デフォルトの名無しさん:2008/10/07(火) 12:41:58
描画するだけならともかく、ゲームになると結構いろんなところでCPUは食うから
分散させれるなさそうしたほうがいいんじゃ。ゲームの種類にもよるんだろうが。
まーシングルCPUでは無意味ですがね。
66デフォルトの名無しさん:2008/10/07(火) 12:54:30
>>61
ソースの書き方で大学1年レベルかどうかばれると思うよ
67デフォルトの名無しさん:2008/10/07(火) 13:10:15
>>66
ソースは枠があって、座標軸やらポリゴン構成やらの設定を
する部分だけすげかえるような感じなんです。
あまり詳しくかけないですが、工学系の院にいれらておる
法律家で、畑違いでちょっと困っているんです。
68デフォルトの名無しさん:2008/10/10(金) 11:16:55
VBOを使うときはまず初期化処理の段階でglBufferData()でバッファを確保しますよね

プログラム中でバッファを再び確保しなおしたい時(つまりデータを書き換えて再度送りたい時)
glBufferData()を呼び出して確保しなおしているのですが
この際,元々確保されていたバッファをクリアしなくて良いのでしょうか?
69デフォルトの名無しさん:2008/10/10(金) 23:51:49
バッファをテクスチャに、glBufferDataをglTexImage*に読み替えてみればわかると思うよ。
70デフォルトの名無しさん:2008/10/11(土) 19:46:05
最近OpenGL ESから勉強し始めて、なんとなくOPEN GLそのものは理解しました。

画面の表示をピクセル単位で制御しようとして、
今表示してるものは glReadPixels で取得するとこまでは成功しました。
で画像を弄くったあとに、表示しようと思ったら
OpenGL ESには、glDrawPixelsがなかった…

こういう場合どうするのが一般的なんでしょう。
ピクセルデータの入った配列から毎フレーム、glTexture2D作るんですか?

よろしくお願いします。
71デフォルトの名無しさん:2008/10/11(土) 21:35:47
Texture はあらかじめ作成しておいて、glBindTexture 後、
glTexSubImage2D で該当部を書き換えがおすすめ
72デフォルトの名無しさん:2008/10/11(土) 21:36:47
と、思ったけど、glTexSubImage2D が OpenGL ESにあるかどうかは知らない。
73デフォルトの名無しさん:2008/10/11(土) 22:29:43
>>71

glTexSubImage2D ありました!!
ちょっとこれから実験してみます。
ありがとうございます!!
74デフォルトの名無しさん:2008/10/12(日) 02:40:19
>>71

無事かけるようになりました thx!!です
75デフォルトの名無しさん:2008/10/13(月) 11:08:32
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
7675:2008/10/13(月) 11:39:33
書き忘れてましたが、モデルビュー行列とプロジェクション行列は一応単位行列に
してあります。単位行列になっているのが原因とは思えませんが…
77デフォルトの名無しさん:2008/10/13(月) 13:26:52
>>75
w < 0 は動作保証されない。正の値を使う。
7875:2008/10/13(月) 17:53:10
>>77
ということはw<0の時に正しく描画されたのはたまたまだったということですね。
喉のつっかえがとれてすっきりしました。
ありがとうございます。
79デフォルトの名無しさん:2008/10/15(水) 10:13:24
glutMainLoop()を使わずに自分で作ったfor文の中で、
glutDisplayFunc()で登録した関数呼び出したいんですが可能ですか?

glut使った場合は必ずglutMainLoopを使わないといけないの?
80デフォルトの名無しさん:2008/10/15(水) 11:53:22
つfreeglut
81デフォルトの名無しさん:2008/10/16(木) 03:10:13
みなさん、
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, 等々
が将来無くなるらしいですよ。
82デフォルトの名無しさん:2008/10/17(金) 22:21:58
シェーダでもOpenGLが自動的に設定してくれていたattribute変数やuniform変数が使えなくなるぞ
83デフォルトの名無しさん:2008/10/17(金) 23:24:49
ある程度真面目に作った場合はどれも使わなくなる機能だから消えるのは仕方ないかもれない
しかし敷居は上がるよな
その辺をフォローするライブラリみたいなのを用意してくれればいいんだが
OpenSceneGraphとかNVSGを使えとか言うのかな
84デフォルトの名無しさん:2008/10/18(土) 00:27:08
誰か固定機能パイプラインの関数と互換性のある関数を(OpenGLのちゃんとした関数で)実装したりしそうだけどな。

glBegin, glEndは実行効率は悪いだろうけどちょっと何かをレンダリングしたいときに
ささっとコードを書けて便利だよね。
85デフォルトの名無しさん:2008/10/18(土) 00:50:56
うわ、マジなのか。

初心者がまず最初に覚える関数じゃん。
敷居があがっちゃうな、確かに。
86デフォルトの名無しさん:2008/10/18(土) 00:55:28
まあ今までglNantoka()だったのがgluNantoka()に変わるだけだろうな
87デフォルトの名無しさん:2008/10/18(土) 08:02:07
えええええ
glBeginとかなくなったら、どうやって描画寸の???
88デフォルトの名無しさん:2008/10/18(土) 08:24:04
glPush・PopMatrix使って、中級者レベルになってきたんじゃね?って
俺はどうすればいいんですか><
89デフォルトの名無しさん:2008/10/18(土) 10:02:31
今でもドライバの中ではそれらの関数とかはvboなりに置き換えてからやっていたりするので、
>>86なだけだろうよ。変換する関数がもっと手前(ユーザー側)に出てくるだけ。
90デフォルトの名無しさん:2008/10/18(土) 10:33:00
http://www.devklog.net/2008/08/23/forward-compatible-opengl-3-entry-points/

Matrix 関連は shader uniforms あたりを使うことになるんですか?
91デフォルトの名無しさん:2008/10/18(土) 16:02:57
アホな質問ですみません
OpenGLに行列の乗算の関数ってありますか?
92デフォルトの名無しさん:2008/10/18(土) 16:07:52
すみません自己解決しました
glMultMatrix() ですね
93デフォルトの名無しさん:2008/10/19(日) 00:07:54
そのうちなくなるけどな
94デフォルトの名無しさん:2008/10/19(日) 12:48:47
>>89
もっと奥(シェーダ、GPU側)に行くんじゃないの
95デフォルトの名無しさん:2008/10/20(月) 01:18:51
ビットマップテクスチャにglColorで色加えることってできますよね(多分)。
glTexEnviを使って、ゴニャゴニャ弄ればいけるとは思うんですが、
組み合わせがよくわからず苦戦中です。

とりあえずアプローチは間違ってないでしょうか?
よろしくお願いします。

96デフォルトの名無しさん:2008/10/20(月) 17:42:39
乗算合成はできるけど加算合成は無理じゃね
97デフォルトの名無しさん:2008/10/20(月) 21:31:17
シェーダ使って足せばいいんじゃね
98デフォルトの名無しさん:2008/10/20(月) 22:23:17
シェーダだけ覚えてしまえば他のいろいろ面倒なことを完全スルーできるから楽だな
GMA950でGLSL使えなくて(´・ω・`)だったけどCg使えばいいしな
9995:2008/10/21(火) 00:45:52
なるほどです。シェーダ勉強しはじめます!!
ありがとうございます!!
100デフォルトの名無しさん:2008/10/22(水) 13:28:40
100get
101デフォルトの名無しさん:2008/10/23(木) 23:58:40
もうゴテゴテした固定機能パイプラインの関数なんて覚えなくていい。
vertex shaderでは値をそのまま通すだけ。
fragment shaderでは法線ベクトルを0〜1の範囲にスケーリングしてfragmentのcolorに設定する。
ただ、これだけでいいんだ。
102デフォルトの名無しさん:2008/10/24(金) 01:17:54
シェーダー使えればどんなに楽か。

使えないパソコンの方が圧倒的に多いだろ。
特にノーパソ。何とかしてくれ。
103デフォルトの名無しさん:2008/10/24(金) 01:21:56
つmacbook
104デフォルトの名無しさん:2008/10/24(金) 02:39:19
つソフトエミュ
105デフォルトの名無しさん:2008/10/24(金) 07:23:23
ARB_fragment_programならノートでも結構使えるよ
アセンブリ直接書くのはつらいからCg使うことになるだろうけど
使えるという程の速度が出ないと言うことなら仕方ないが
106デフォルトの名無しさん:2008/10/25(土) 09:06:58
何年遅れだよって感じだが
フォンシェーディングとシャドウマップで次世代な気分になった
ttp://www1.axfc.net/uploader/Li/so/18674.mp4

でも頂点シェーダからテクスチャにアクセスできないんで
仕方なくCPUでスキニングとか全然次世代じゃねぇ('A`)
107デフォルトの名無しさん:2008/10/25(土) 10:07:12
このぐらいのモデルならスキニングでテクスチャにアクセスする必要はないと思うが・・・
骨が指の関節にまで入ってたりでもするのか?
108デフォルトの名無しさん:2008/10/25(土) 17:34:18
いい感じに次世代な気分
でもノーマルマップとHDRが今の次世代(?)標準らしいぜ

スキニングはテクスチャ必要ないと思うけど
バーテックスシェーダのuniform変数の数が足りないなら
足りそうな所まででモデルを分けて描画という面倒な手もある
他には頂点座標の値を1次元テクスチャに書く方法でスキニングをピクセルシェーダでやるとか

まあ今はCPUもコア数余ってたりするから
余程頂点数が多くない限りスキニングはCPUでもいいんじゃないか
別スレッドでやればマルチコア対応で次世代気分だよ
109デフォルトの名無しさん:2008/10/26(日) 00:42:11
VRAMに頂点データ置いておいてGPUだけでボーン変形して
しかもそれをディスプレースメントマッピングしたりとか
表示だけならいいんだろうが当たり判定したい場合はどうするんだろうな
もしかして当たり判定もGPUでやる時代になるのか
110デフォルトの名無しさん:2008/10/26(日) 00:54:44
表示モデルとコリジョンモデルは分けておく
CUDAかなんかで一度実装すればCPU/GPUのどっちでも実行できるって世界が理想だけど
111デフォルトの名無しさん:2008/10/26(日) 09:21:11
> 表示モデルとコリジョンモデルは分けておく
だな
112デフォルトの名無しさん:2008/10/26(日) 14:58:51
めり込んだり貫通したりしても見なかったことにするというわけか

見た目そのままで判定したい場合はやっぱりCPUで頂点処理することになるはずなので
そのうち頂点シェーダは要らない子になるな
113デフォルトの名無しさん:2008/10/26(日) 15:35:31
今のシェーディングはピクセル単位だからそういう意味でも頂点「シェーダ」ではないしな
やるにしても頂点シェーダからジオメトリシェーダはOpenCLとかでの
汎用処理になっていくんじゃないかと思う
114デフォルトの名無しさん:2008/10/26(日) 16:43:37
表示に最適なデータ形式とコリジョンに最適なデータ形式は一致しない
表示とコリジョンのレベルを一致させるにしてもめりこみ対策をするにしても
やっぱり分離しておくほうがいろいろと便利
115デフォルトの名無しさん:2008/10/29(水) 18:46:12
ジョン・カーマックの宇宙船(?),飛行コンテストを制する
ttp://www.4gamer.net/games/000/G000000/20081029023/
116デフォルトの名無しさん:2008/10/29(水) 18:53:19
シェーダーってのが何なのか簡潔に教えてください><
調べてみたんですが、サンプルから入っていくのでよく分からない。

シェーダーを使うことによって得られる利点ってのは何なんですか?
CPUを使わないでGPUで演算?わけわかからん
117デフォルトの名無しさん:2008/10/29(水) 19:06:02
この連載を最初から順番に読めば分かる
ttp://journal.mycom.co.jp/column/graphics/001/index.html
118デフォルトの名無しさん:2008/10/29(水) 19:08:26
>>117
ありがとう。記事にバーチャ載ってて少しテンション上がった。
119デフォルトの名無しさん:2008/10/29(水) 19:35:49
あまりに正直な感想でちょっと笑ってしまった
でもまぁ大抵そういうところから入っていくんだよね
120デフォルトの名無しさん:2008/10/29(水) 22:18:16
普段は調子こいて「今シェーダーが熱い!」
とかいってるけど本当はよくわかってない俺にちょうどいい記事があるときいて
121デフォルトの名無しさん:2008/10/30(木) 00:11:30
>>115
ようやくかよw
まだあきらめてなかったんだな
122デフォルトの名無しさん:2008/10/30(木) 10:28:30
>>117
すばらしいまとめ。最初は歴史だけだったが、
後半から3Dのシェーダーがらみのパイプラインの詳しい解説。
ちと長いがw
123デフォルトの名無しさん:2008/10/30(木) 10:33:13
>>117
>>116じゃないけど、>>117を一通り読んだ俺にオススメのシェーダー本を教えてください
124デフォルトの名無しさん:2008/10/30(木) 10:49:49
個人的にはシェーダに関してはネットがあれば本を買う必要は全く感じないな
強いて言えば赤本でGLSLの解説が日本語で読める位か
125デフォルトの名無しさん:2008/10/30(木) 12:55:47
red book
126デフォルトの名無しさん:2008/10/31(金) 06:53:08
赤本は最近のだとシェーダーの説明してるの?
スゲーな…

オレンジ本って言うの?
OpenGL Shading Language
英語だし、内容が古いけど、これが一番詳しい気がする

後、More OpenGL Game Programmingは持って無いが気になる
127デフォルトの名無しさん:2008/10/31(金) 09:28:39
>>124-126
ありがとう
本が好きなんですw
過去スレ除いたら同じような質問が出てたので、それも参考にできました。
テンプレに入れといていい気がする。

赤本の英語版がPDFで読める?という情報も過去レスにあったのですが、
見つからない・・・

■書籍
・赤本(OpenGL1.5と2.0を網羅。シェーダーに関しても少し載っている)
Amazon.co.jp: OpenGLプログラミングガイド 原著第5版: OpenGL策定委員会, 松田 晃一: 本
http://www.amazon.co.jp/dp/4894717239
http://images-jp.amazon.com/images/P/4894717239.09.MZZZZZZZZZ.jpg

・古い赤本が無料で読める(英語)
http://www.opengl.org/documentation/red_book/ (1.1)
http://www.glprogramming.com/red/ (1.1)

・オレンジ本(シェーダー、GLSLに関して。英語。少しふるい)
Amazon.co.jp: Open Gl Shading Language: Marc Olano, Randi J. Rost, John M. Kessenich, Barthold Lichtenbelt: 洋書
http://www.amazon.co.jp/dp/0321197895
http://images-jp.amazon.com/images/P/0321197895.09.MZZZZZZZZZ.jpg

・Cgの本(Cgを使ったシェーダー入門本)
Amazon.co.jp: 3D‐CGプログラマーのためのリアルタイムシェーダー 理論と実践―「古典的ライティング・モデル」から「グローバル・イルミネーション」まで (I・O BOOKS): 金谷 一朗: 本
http://www.amazon.co.jp/dp/4777510875
http://images-jp.amazon.com/images/P/4777510875.09.MZZZZZZZZZ.jpg
128デフォルトの名無しさん:2008/10/31(金) 09:30:46
> 個人的にはシェーダに関してはネットがあれば本を買う必要は全く感じないな
具体的にはどの辺をよめばいいんでしょうか?
仕様書?
129デフォルトの名無しさん:2008/10/31(金) 21:59:21
OpenGLのプログラミングをこれからはじめようとしている初心者です(・・;)
質問があります。

WindowsVistaに対応しているGLUTは存在しないのでしょうか?
また,GLUTが使えない場合は,Win32を使ってプログラムするのが無難でしょうか?

よろしくお願いします。
130デフォルトの名無しさん:2008/10/31(金) 22:32:38
>>128
おいらはOpenGLで調べたいことがあったら、まずは仕様書読むようにしている。
仕様書読んでもよくわからんかったらググるか、それもでもわからんだらここで聞けばいいんでない。

>>129
まずはお手元のglutがvistaで動くか試す。
それが駄目ならfreeglut使うとかglfw, gluxとか使ってみてはどうだろうか。
Win32apiの勉強もしたいのなら、glut系のラブライブラリを使わずにやればいいけど
結構大変だと思う。
131デフォルトの名無しさん:2008/10/31(金) 23:53:27
おいらはOpenGLで調べたいことがあったら、まずはここで聞くようにしている。
ここで聞いてもよくわからんかったらググるか、それもでもわからんだら仕様書読めばいいんでない。
132デフォルトの名無しさん:2008/10/31(金) 23:58:50
最低の人間ですね
133デフォルトの名無しさん:2008/11/01(土) 00:46:26
>>130
ありがとうございます。m(_ _)m

やはり、公式にvistaまで対応しているglutは、ないんですかね。
windowsXPまで対応しているglutが動くか試してみます。
134デフォルトの名無しさん:2008/11/01(土) 16:32:41
俺はGLUT使ってないけど、SDLとかglfw使ったプログラムもVistaで問題無く動いてるよ
多分GLUTも動くはず
135デフォルトの名無しさん:2008/11/02(日) 03:58:37
赤本のためにglutが書かれる

glutがメンテされなくなったので
openglut, freeglut開始

glut互換なapiでは物足りないのでglfw開始

glut系がほとんどメンテされてないのでglux開始←今ここ

??
136デフォルトの名無しさん:2008/11/02(日) 13:14:30
約2年放置されてんじゃん
ttp://www-sop.inria.fr/reves/Sylvain.Lefebvre/glux/



・・・と思ったらこっち?Ogreの人らが作ってるのか
ttp://code.google.com/p/glux/
137デフォルトの名無しさん:2008/11/04(火) 00:56:12
OpenGL で Fetch4 使えたんで日記投下・・・と思ったけど日記にもならないほど簡単だった。
単に GLSL で vec4 texture4( sampler2D, vec2 ) を使うだけ。
左下基準で
r g
a b
の順番で4つ読んでくれる。
internalformat は DEPTH かつ FLOAT である必要はなくて、ALPHA4 とか1要素ものはなんでもおkだった。
3850、4850で動作確認。GPUSAによると2xxx以下じゃ動かないらしい。
GL_AMD_texture_texture4のドキュメントが出ないとわからないけど、ひょっとしたら2xxx以下は
DirectXみたいにglTexParameteri辺りで設定するとtexture2Dでいけるようになったりするのかもしれない。

2要素以上の internalformat に無理やり使うと一応テクスチャから読んではくれる。
但し読んでくれるのは1つだけで、テクスチャの内容を xy [ z [ w ] ]、vec4 を rgba であらわすと
・2要素
g = b = x
r = a = y
・3要素
r = y
g = z
b = x
a = 1
・4要素
r = y
g = z
b = x
a = w
ま、意味はないなw
138デフォルトの名無しさん:2008/11/05(水) 12:42:13
GLの色の丸め方について質問です。
浮動小数点値で色を指定してmビット深度のバッファにレンダリングする場合、
その丸め方について定式化された方法はあるのでしょうか。
灰色(L=0.5)を出そうとするとき、8bitバッファでは127/255になるか128/255になるかは決まっているのでしょうか。

ttp://www.opengl.org/registry/doc/glspec21.20061201.pdf
2.14.9 Final Color Processing
139デフォルトの名無しさん:2008/11/06(木) 01:24:49
そこを見る限りでは決まってはなさげ
大抵は切り捨てで127/255になりそうな気はするが
どうしても一致させたいなら整数テクスチャとか使った方がいいかもな
140デフォルトの名無しさん:2008/11/06(木) 10:38:59
ありがとうございます。
ATIだけ微妙な動作をしたので、
差を吸収するためにCPU側で整数化することにしました。
141デフォルトの名無しさん:2008/11/06(木) 19:53:57
VBで使ってみようと思ったら滅茶簡単でワロタ
142デフォルトの名無しさん:2008/11/08(土) 00:51:15
glut以外に、glutSolidCubeのような
物体を関数化してくれているライブラリとかありませんか?
143デフォルトの名無しさん:2008/11/08(土) 13:33:54
glDrawPixels() APIを使用して画像データを転送するとき、
次のような画像データを直接送ることができるのでしょうか?

RRRRR....
........................
GGGGG....
........................
BBBBB....
........................
144デフォルトの名無しさん:2008/11/08(土) 18:28:26
画面じゃなく、テクスチャに描画して
保存したいのですが、何かよいサンプルとかありますか?
145デフォルトの名無しさん:2008/11/08(土) 19:35:32
画面じゃないところに描画したりする方法まとめ

・PFD_DRAW_TO_BITMAP
・glReadPixels
・pbuffer拡張
・FBO(Frame Buffer Object)拡張

他にある?
146デフォルトの名無しさん:2008/11/08(土) 20:03:42
PBO
147デフォルトの名無しさん:2008/11/08(土) 21:19:41
・PFD_DRAW_TO_BITMAP
・glReadPixels
・glCopyTex[Sub]Image2D
・pbuffer拡張
・render texture拡張
・FBO(Frame Buffer Object)拡張
・PBO(Pixel Buffer Object)拡張
148デフォルトの名無しさん:2008/11/08(土) 22:24:43
たくさん出てきて涙目
149デフォルトの名無しさん:2008/11/08(土) 22:33:24
決定打はないのかよw
150デフォルトの名無しさん:2008/11/09(日) 00:37:01
決定打ねぇ。
PFD_DRAW_TO_BITMAPはWindowsべったりな上にアクセラレーション効かないし、
glReadPixelsはシステムメモリへの転送でCPU喰うしレンダリングパイプライン止まるし、
glCopyTex[Sub]Image2Dもパイプライン止まるしFBからテクスチャへの転送は大抵変換が必要で遅いし、
pbufferは多少古いIntelオンボも対応してるおかげで使える環境は多いけどコンテキスト切り替えとか不便&コスト高いし、
render textureは単にpbufferからテクスチャにコピーせずに済むだけだし、
FBOは比較的最近の環境を仮定するなら決定打だろうけど未だにノートPCだと使えない場合が多いし、
PBOは単にコピーのお手伝い拡張だし。

まぁ、選ぶならFBOだな。
151デフォルトの名無しさん:2008/11/09(日) 00:52:40
概要サンクス
152デフォルトの名無しさん:2008/11/09(日) 15:58:50
glutで「3Dオブジェクトを2Dとして変形」したいんですが方法あるでしょうか?

たとえばこんな例。
・オブジェクトは空き缶
・まずは空き缶を3Dオブジェクトとして回転量(Rotated)や視点(LookAt)を指定して
見え方を決める。この結果空き缶を真上から見た絵になったとする
・次にこの「真上から見た空き缶の絵」を「2D一枚絵として」
回転・拡大縮小したい
153デフォルトの名無しさん:2008/11/09(日) 16:13:13
描画結果をテクスチャにして描画
154デフォルトの名無しさん:2008/11/09(日) 16:47:21
回転はカメラのロールで、拡縮はglViewportで
155デフォルトの名無しさん:2008/11/09(日) 21:07:19
初心者です。セレクションモードに切り替えると座標系がズレて変になってしまうのですが、
自分の理解が足りなくて変な座標変換を間に挟んでいるのだと思います。
セレクションモードとレンダモードの切り替えにおける内部の動作を流れ図で教えてもらえませんか。
156デフォルトの名無しさん:2008/11/11(火) 12:36:22
>>155
内部動作とかよくしらんけど、関数呼び出し順序は、
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPickMatrix(...);
gluPerspective(...); or glOrtho(...);
とかしとけば、セレクションうまくいくと思うよ。
はずしてたらすまん。
157名無し:2008/11/13(木) 13:51:45
質問がございます。
1辺の長さが10の箱の中に直径がBの球(中心座標:x,y,z)がM個存在するとします。
3次元上で考え、箱の端では周期境界条件を採用しています。
球の中心の座標は箱内でS回の移動を繰り返すとします。
例えば球の中心の座標は次のように変化します。
座標はファイルQにまとめて書いてあるとします。
※(S+1)個のブロックが存在。(スペースで区切り)1個のブロックにM個のxyz座標が存在。
<ファイルQ>
1  2  3
2  3  4
 ・    
 ・
 ・

1  3  4
1  9  5
 ・
 ・
 ・
 
 ・
 ・
 ・
球が箱からはみ出ると周期境界条件によって、はみ出た部分だけ反対側から出てくるとします。
このようなM個の球のS回の移動の様子をOpenGLで表示することは可能でしょうか?
(表示するもの:球、箱)
可能ならばその方法について教えてもらえませんか?
(ファイルQの読み込み方法、球の直径もしくは半径の指定方法、周期境界条件を考慮した球の表示方法など)
ちなみにプログラムの記述言語はできればFortran77を使用したいと考えています。
158デフォルトの名無しさん:2008/11/13(木) 14:38:55
> はみ出た部分だけ反対側から出てくるとします。
この部分だけがGL的に面白い部分なので、
まずはただの球に衝突判定をつけて作ってみなさい。
159デフォルトの名無しさん:2008/11/13(木) 14:50:10
あとOpenGLはCで定義されていたはずだが、
Fortranだとマングリングを合わせればCの関数も呼べたと思う
まあ調べてみて
160デフォルトの名無しさん:2008/11/13(木) 15:20:29
これは凄い。
一見すると親切かつ丁寧な風に見えて、その実は回答の先送り投げっぱなしジャーマン。
宿題丸投げに対するパーフェクトな回答の見本だな。
久しぶりに職人の仕事を見た。
161デフォルトの名無しさん:2008/11/13(木) 21:41:16
危ねぇ…俺もシンセツダナーとか思いそうだった
162デフォルトの名無しさん:2008/11/14(金) 23:38:04
ワロタww
163デフォルトの名無しさん:2008/11/14(金) 23:56:03
3次元ベクトルの正規化をするような関数とかあります?
DXならD3DXVEC3DNORMALIZEとかいうのです
164デフォルトの名無しさん:2008/11/15(土) 01:19:10
ないから自分で書け
165デフォルトの名無しさん:2008/11/15(土) 01:19:16
ないので自分で作ってください
166デフォルトの名無しさん:2008/11/15(土) 01:22:51
質問するより自分で書いた方が早い
167デフォルトの名無しさん:2008/11/15(土) 01:24:13
d3dxのをそのまま使えばいい
168デフォルトの名無しさん:2008/11/15(土) 03:10:09
void DXならD3DXVEC3DNORMALIZEとかいうのです( vector3* vec )
{
float scalar = sqrt( vec->x * vec->x + vec->y * vec->y + vec->z * vec->z );

if( scalar == 0.0 ) return;

vec->x /= scalar;
vec->y /= scalar;
vec->z /= scalar;

}
169デフォルトの名無しさん:2008/11/15(土) 08:46:24
OpenGL使うのにD3DX使うのもなあ
まあ、俺も音鳴らすのにDirectSoundとか使ってるがw

マジレスすると、言語用に大抵、geometry関係のライブラリがフリーのがあるから
それを探してみたらどうかな?
170デフォルトの名無しさん:2008/11/15(土) 12:46:07
探すくらいなら自分で作ったほうがいいと思う派だが、あえて探すなら
信頼性の高い高速なgeometry関係のフリーのライブラリ = D3DX
171デフォルトの名無しさん:2008/11/15(土) 13:02:48
GLM(OpenGL Mathematics)とかいいんじゃない?
172デフォルトの名無しさん:2008/11/15(土) 13:11:51
NASMで実装します
173172:2008/11/15(土) 17:30:06
1677万回呼んでも差は0.7秒程度でした
確かに大体3分の1程度にはなりましたけど
骨折りですね

global fun

section .text
fun:
mov eax, [esp+4]
mov ebx, [esp+8]
movups xmm0, [ebx]
movaps xmm2, xmm0
mulps xmm0, xmm0
movaps xmm1, xmm0
shufps xmm0, xmm1, 0x4e
addps xmm0, xmm1
movaps xmm1, xmm0
shufps xmm1, xmm1, 0x11
addps xmm0, xmm1
rsqrtps xmm0, xmm0
mulps xmm2, xmm0
movups [eax], xmm2
ret
174デフォルトの名無しさん:2008/11/15(土) 18:13:02
SSE化で1/3縮んだのなら成功の部類じゃないか
そのコードだとむしろ遅くなりそうなものだけど・・・
175デフォルトの名無しさん:2008/11/15(土) 18:40:20
>そのコードだとむしろ遅くなりそうなものだけど・・・
そうなんすか?
とりあえず改良できると所あれば指摘してくださいな
176デフォルトの名無しさん:2008/11/15(土) 18:54:28
データのアラインメントを変えてmovupsを消す(可能なら4要素にする)
intrinsic関数で組んでインライン展開できるようにする
ループごと取り込んで関数呼び出しを消す
新しいSSE命令を使う(haddps/dpps)

特に関数呼び出しを消すのが重要。
177デフォルトの名無しさん:2008/11/15(土) 19:49:49
>>176
解答ありがとうございます

イントリンシック!そういうのもあるんですな
慣れないアセンブリより楽かも…
SSE3命令はCPUが対応してないから試せそうにありません
オンボロCPU乙ですねハハハ
178デフォルトの名無しさん:2008/11/16(日) 16:21:32
すごく初歩的な質問と思われるかもしれませんが
行列スタックでレンダリングしたものを
どのようにしたら色をつけることができますか?

glClearでは線に色が付くだけなってしまいます
179デフォルトの名無しさん:2008/11/16(日) 16:46:53
日本語でおk

glClearは画面消去だぞ
glClearじゃなくてglColor4fとかでは?
180デフォルトの名無しさん:2008/11/16(日) 17:36:47
>>179
うはぁ、ミスった
glClearじゃなくてglColor3fでした
181デフォルトの名無しさん:2008/11/16(日) 18:14:33
質問の意味がまったくわからないので勝手に妄想

色がついていないのではなく、表示されていないのだろう
PROJECTIONマトリックスが不適切で線に見える部分意外はクリッピングされているのでは
near/farの設定、MODELVIEWとのへの切り替え部分のチェック 

182デフォルトの名無しさん:2008/11/16(日) 21:11:52
はじめまして、質問させていただきます。
glGenTexturesでテクスチャを2個作って、
二つのテクスチャを画面に表示しようとしたのですが、
最初に表示したテクスチャが消えてしまいますorz
OpenGLで二つのテクスチャを一度に表示することは可能なのでしょうか?
もしくは、方法を教えていただけないでしょうか。
183デフォルトの名無しさん:2008/11/16(日) 21:12:21
基本立体を塗りつぶしたいんです
本やサイト読んでもイマイチ分からなくて
日本語下手ですみません
184デフォルトの名無しさん:2008/11/16(日) 21:26:25
>>182
glBindTextureの第二引数
185デフォルトの名無しさん:2008/11/16(日) 21:34:43
>>183
glColor
まずはlightingをしないで射影変換の正しさを確認して、光源を作るならそのあと
186デフォルトの名無しさん:2008/11/16(日) 22:05:11
>>184
ありがとうございます。

一応、glBindTextureの第2引数に別々のテクスチャ名を与えてるのですが、
それでも消えてしまいますorz
どうやら表示するときに消えてるのではなく、
2個目をBindしたときに消えてしまってるみたいです。
(glBindTextureを呼ぶだけで1個目のテクスチャが消えました)
187デフォルトの名無しさん:2008/11/16(日) 23:14:22
>>186
カプセル化してかなり忘れてたが、見直してみたら

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, ...);
glBegin(...);
glEnd();
glDisable(GL_TEXTURE_2D);

を逐一繰り返す構造になってた
glPushAttrib, glPopAttrib のテクスチャ関係も参考に
もし関数化してたら、一度関数化してないmainのみのストレートフォワードなテストコードを書くといいかも
カプセル化しない状態で人力コーディングするとスタックの積み下ろしを忘れてることがよくあるから
188デフォルトの名無しさん:2008/11/17(月) 00:07:07
>>187
ありがとうございます。
自己解決できました

OpenGLをはじめてほとんど時間が立ってないにもかかわらず、
カプセル化に挑戦したところ行き詰っていました。
原因に関してですが、
ぶっちゃけて簡単に言うと、
glBindTextureでテクスチャを切り替えた際に、
いくつかの設定が初期化されてしまうのと、
モードによって複数のテクスチャを同時に使えなくなってしまうことが原因でした。
189デフォルトの名無しさん:2008/11/17(月) 09:00:14
>>183
それだと線にしか色が付かないですよ
書く位置が悪いんですかね?
190デフォルトの名無しさん:2008/11/17(月) 10:07:49
glPolygonMode
GL_QUADS
191デフォルトの名無しさん:2008/11/17(月) 11:30:17
日本語が下手ならコードを晒せ
192デフォルトの名無しさん:2008/11/17(月) 13:38:13
193デフォルトの名無しさん:2008/11/17(月) 18:36:33
ブラウザ上でOpenglを動かす方法教えれ
194デフォルトの名無しさん:2008/11/17(月) 18:51:31
プラグインを自分で書く
これしかない
195デフォルトの名無しさん:2008/11/17(月) 20:17:55
>>193
Unity3d
196デフォルトの名無しさん:2008/11/18(火) 15:56:33
VRAMの使用状況を取得するAPIは無いのでしょうか?
197デフォルトの名無しさん:2008/11/19(水) 00:23:11
無いよ
見るだけならNVPerfKit入れたりとかして見ることはできる
ATIなら普通にドライバ入れた時点でパフォーマンスカウンタ見れるのかな?
そうでなくどの環境でもプログラムから残り容量取るって話なら大分難しいと思う
198デフォルトの名無しさん:2008/11/19(水) 12:28:44
GL_ATI_meminfo は仕様が公開されていないの?
199デフォルトの名無しさん:2008/11/19(水) 12:49:36
俺もglATI.hを読んで見たが壮絶に意味不だった…
200デフォルトの名無しさん:2008/11/19(水) 18:25:03
DirectXならVRAM使用量見れるのにねー
201デフォルトの名無しさん:2008/11/19(水) 23:53:55
VRAMみたいな特定のハードに依存したインターフェースはおかしいだろ、GL的に考えて…
202デフォルトの名無しさん:2008/11/20(木) 03:41:20
>>200
IDirect3DDevice9::GetAvailableTextureMem ?
これは、VRAMじゃなくテクスチャに使える容量だお
203デフォルトの名無しさん:2008/11/20(木) 15:10:06
glTexImage2D で作ったテクスチャに
直接アクセスしたいのですが、どうしたらいいでしょうか?
204デフォルトの名無しさん:2008/11/20(木) 23:27:22
>>202
DirectDraw::getAvailableTotalMemのことじゃね?
205デフォルトの名無しさん:2008/11/21(金) 13:12:20
>>203
テクスチャの中身ってこと?
それは無理なので書き換えるにはglTexSubImage2Dを呼んで下さい
読み出すならglGetTexImage
PixelBufferObjectを使えば比較的高速にやりとりできるはず

>>204
DirectDrawってVistaとかでもちゃんとそれ使えるのか?
Direct3DでエミュレーションとかになっててAvailableTextreMemと同じような気がする
206デフォルトの名無しさん:2008/11/21(金) 14:09:22
openglで描画した画像を、見え方はそのままで描画される角度のみを変更したいのですが、どうしたらよいでしょうか?

glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 0.001f, 150.0f);
gluLookAt(a1,a2,a3,b1,b2,b3,c1,c2,c3);
を、
d1=b1-a1
d2=b2-a2
d3=c3-a3
として
glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 0.001f, 150.0f);
glTranslatef(a1,a2,a3);
glRotatef(30,d1,d2,d3);
glTranslatef(-a1,-a2,-a3);
gluLookAt(a1,a2,a3,b1,b2,b3,c1,c2,c3);
と変更しました。

本来はc1、c2、c3を変更するところなのですが、
視点の位置、注視点の位置、視野の上方向が毎回変わるので、
できればそれらの設定によらず画像だけの回転を行いたいと思っています。
207206:2008/11/21(金) 14:12:47
失礼しました、206の
glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 0.001f, 150.0f);
glTranslatef(a1,a2,a3);
glRotatef(30,d1,d2,d3);
glTranslatef(-a1,-a2,-a3);
gluLookAt(a1,a2,a3,b1,b2,b3,c1,c2,c3);
のように変更したところ、ちんちくりんな軸を中心に回転しているようで、
確認したい目標のオブジェクトの形まで変わってしまいます。

上記でまずいところがありましたらご指摘をお願いします。
208デフォルトの名無しさん:2008/11/21(金) 14:34:38
glOrthoの直後にgluLookAtを持ってくる
これじゃだめかな?
209206:2008/11/21(金) 14:41:37
>>208
( д ) ゜ ゜
うわぉ ありがとうございます
行列の順番を勘違いしてました
本当にありがとうございます
210デフォルトの名無しさん:2008/11/22(土) 01:38:06
任意の座標(例えば重心)をとおる軸を中心として回転させるにはどうやればいいですか。
重心座標が(3,4,5)としたらx=3を中心としてy軸周りに回転させるようにとか
211デフォルトの名無しさん:2008/11/22(土) 01:43:36
x方向に-3だけ平行移動して、原点中心の回転をして、x方向に+3だけ平行移動する、ってのはどう?
212デフォルトの名無しさん:2008/11/22(土) 01:50:39
回転軸を頻繁に変えるというのでなければ、
メインメモリ側に構造体を保持しておいて、
必要に応じてCPUで平行移動させてからディスプレイリストを作るのもよい
213デフォルトの名無しさん:2008/11/22(土) 06:45:30
9600GT+WGL_ARB_multisampleを使ってアンチエイリアシングをやってて
glDisable(GL_MULTISAMPLE)で一時的に無効にしようとしてもなぜか効かないんだけど原因わかる人いる?

同じことをD3D9でやったらちゃんと期待通りに動くから
ハードウェアの仕様じゃないみたいだけどよくわからん
214213:2008/11/22(土) 08:20:37
自己解決?

x8以下だとちゃんと機能してx16,x32だと効かないぽい
意味不
215デフォルトの名無しさん:2008/11/22(土) 12:24:06
MSAAx32とか設定できんのか?
それはともかく単なるドライバのバグではないかと
暇があったらNVIDIAに文句言ってやるといいかもしれない
216デフォルトの名無しさん:2008/11/23(日) 11:24:39
>>211,212
どうもありがとうございました。
217デフォルトの名無しさん:2008/11/25(火) 18:54:26
複数枚の画像を合成したいと思っています。
例えばプリクラで顔写真の周りをハート型で縁取ったりしていますが、
ああいう感じである画像の上に透過pngを表示したいということです。
最終的には画像の上にフリーハンドで線を引けるようにして、
教科書の上に落書きするみたいな機能を実装しようと思っています。

テクスチャの上で2枚合成すればいけるだろうと思って、
透過pngと普通の画像と2枚用意してプログラムを組んでみたのですが、

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData2);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData); ← 透過png

としているのですが、spriteDataのみが表示されてspriteData2は完全に上書きされてしまいます。
これはspriteDataのデータがきちんと透過データとして読み込めていないのでしょうか?
そもそもやり方が間違っているのでしょうか?
もしやり方が間違っている場合、本来どういう方法で実装すべきなのか、
ググるキーワード位でもいいので教えていただけると幸いです。
218デフォルトの名無しさん:2008/11/25(火) 19:01:58
つ マルチテクスチャ、glActiveTexture

でもこの場合、テクスチャ切り替えて2回描画すればおkな気もする
219217:2008/11/26(水) 13:47:16
>>218
教えてくださってありがとうございます。
調べてみます(・∀・)
220デフォルトの名無しさん:2008/11/27(木) 12:55:35
pixel to pixelの合成だから、実時間で変動させたり市内なら
アルファ値つき重ね合わせくらいはCPU側で実装するのも手だな
221デフォルトの名無しさん:2008/11/27(木) 22:30:59
>217
まだテクスチャの基本的な使い方からわかってないみたいだから
床井先生のサイトを見てみるといいと思う
222デフォルトの名無しさん:2008/11/30(日) 11:10:48
超初心者です
床井先生のサイトが落ちてるので。。。
上のサンプル使わせていただくと

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData2);
この3引数”GL_RGBA”internalFormatとtypeで何が違うんでしょう
bmpをOpenCVで読み込んだとき読み込んだファイルの形式がtypeなのはわかるのですが
internalFormatって何奴でしょう。ここが間違えていると画面が真っ白で表示されない…理由を知りたいのです。

馬鹿な質問なのは重々承知しております、
解説webとか知っていたら教えてください。

223デフォルトの名無しさん:2008/11/30(日) 11:23:46
formatとtypeはメモリの中に画像がどのように格納されてるか
internalformatはそれを元にどんなテクスチャを作るか
を指定するんだよー。
224デフォルトの名無しさん:2008/12/01(月) 11:05:05
画面に三角形や四角形を書いてライトを当てているのですが、
glScaleで拡大すると暗くなって、glScaleで縮小すると明るくなります。
法線ベクトルも頂点ベクトルと共に拡大縮小されるのなら、まだわかるのですが、
法線ベクトルだけ逆になっているようでよくわかりません。
これはOpenGLの仕様ということなのでしょうか?
225デフォルトの名無しさん:2008/12/01(月) 13:59:06
そーです
例えば物体をX方向だけに2倍拡大するとき、法線も同じようにX方向に2倍拡大したら、向きが変になるでしょう
まぁ何も考えず glEnable(GL_NORMALIZE) しておけばわりと幸せ
226デフォルトの名無しさん:2008/12/01(月) 14:00:38
つ glEnable(GL_NORMALIZE);

逆になるのは、たとえば平面をY軸に縮小すると頂点は小さくなるけど、法線ベクトルは起つため
法線は転地逆行列変換(かも)
227デフォルトの名無しさん:2008/12/01(月) 14:04:49
>>224
仕様です。
法線ベクトルはモデルビューの逆行列が掛けられます。
仕様書のNormal Transformationのとこに書いてあります。
228デフォルトの名無しさん:2008/12/01(月) 20:34:28
>>225>>226>>227
ありがとうございます。
よく考え直したらその通りでしたね。仕様もわかりました。
229デフォルトの名無しさん:2008/12/02(火) 05:05:36
>>223
ありがとうございます。
するとinternalformatはglutInitDisplayMode(GLUT_RGB);
で指定した値に矛盾してはいけないという理解でよろしいでしょうか
他に制限事項とかございましたら、ご教授してくださいませ
230デフォルトの名無しさん:2008/12/02(火) 09:43:08
ディスプレイモードとテクスチャフォーマットは何の関係もない
231デフォルトの名無しさん:2008/12/02(火) 21:27:06
"OpenGL 2.0 専用スレ"にも書いたんだが、
OpenGLnのmain関数をスレッドで呼び出して使おうと思っているのだが、display()関数のオブジェクトカラーを引数で渡した値で更新したいんだ。
マルチスレッドで値を渡すことはできるのだが、OpenGL側でどうやって、display()関数に値を綿したらいいのかわらかない。

つまり、
プログラム1 --> OpenGLプログラム(スレッドで生成)
  ▼       ▼
 値の更新     色変更
  ▼       ▼
 値の更新     色変更
  …       …
ってことをしたいんだ。

これはできないのか?
232デフォルトの名無しさん:2008/12/02(火) 21:30:15
意味が分からん
グローバル変数使えばいいんじゃね
233デフォルトの名無しさん:2008/12/02(火) 21:53:32
>232
使いたくないんだよ。
234デフォルトの名無しさん:2008/12/02(火) 22:40:46
openGL関係なしに排他制御してスレッド間で変数共有できてるなら、それを使えばいいんじゃない
display()ってGLUTの話?
235デフォルトの名無しさん:2008/12/02(火) 23:06:09
>234
スレッドには、ポインタを引数として渡してる。
それじゃ具合悪い?

>display()・・・のくだり
え?GLUT?おれが使ってるのってOpenGLじゃなかったのか。。。
確かに、ヘッダで、glut.hってのを読み込んでるが、OpenGLとばかり思ってた。

236デフォルトの名無しさん:2008/12/02(火) 23:31:20
>>235
GLUTはあくまでglを気軽に使うためのユーティリティだから……
gl関係なくただのスレッド間データ受け渡しの問題だし、
むしろスレッドを管理するAPIについてのスレで聞いた方が良いのではないかな。
237デフォルトの名無しさん:2008/12/02(火) 23:41:52
glutSetWindowDataとglutGetWindowDataをお探しか?
freeglutやOpenGLUTになるけど。
238デフォルトの名無しさん:2008/12/02(火) 23:49:31
boost::bindでインスタンスとメソッドを一緒にして
glutDisplayFunc()に渡してやったらダメかな
239デフォルトの名無しさん:2008/12/03(水) 03:18:45
>236
>237
>238
知らない言葉が多すぎるから答えようがないけど、
あがったキーワードをググってみる。

240デフォルトの名無しさん:2008/12/03(水) 06:09:36
>236
>237
>238

239です。
とりあえず、pthread_createの引数で渡したポインタを
glut( ) -> init( ) を経由して、 glutでスコープできる変数に渡す
で、やりたいことができました。

参考になったサンプルに出会うときに、キーワードが役立ちました。ども。
241217:2008/12/05(金) 17:27:21
前回質問して教えていただいた後、マルチテクスチャは大まかに理解して、2つのテクスチャを貼り付けることに成功しました。
次に線を引いてみようと思って、テクスチャを2枚表示したサンプルに付け加えて以下のソースを書いたのですが、
線のみが表示されてテクスチャが画面に出なくなってしまいました。

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texname[0]);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //テクスチャ0表示

glBindTexture(GL_TEXTURE_2D, texname[1]);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //テクスチャ1表示

// 以下を追記 したら線しか出なくなった
GLfloat vertex[20];
for(int i = 0; i < 10; i++){
vertex[2 * i] = 0.1 * i;
vertex[2 * i + 1] = 0.1 * i;
}
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2 , GL_FLOAT , 0 , vertex);
glDrawArrays(GL_LINE_STRIP, 0, 10);
glFlush();

やりたいのは画像に落書きする機能の実装なので、
画像の前に線が引ければよく、画像自体に書き込む必要はないのですが、(とはいっても最終的にその結果を保存したいのですが)
この場合は直接画面に線を引くのではなく、テクスチャにレンダリングしてから表示しないといけないのでしょうか?
それとも何かが欠けているだけでこのまま直接描画できるのでしょうか?
質問ばっかりですみませんが、教えていただけると幸いです。
使っているのはOpenGL ES ver1.1です。
242デフォルトの名無しさん:2008/12/05(金) 17:44:07
・デプスバッファをクリアしてないので2度目以降の描画でデプステストが失敗して表示されない
・線分描画で頂点配列を変更したあとそのまま三角形を書こうとしてしている
243デフォルトの名無しさん:2008/12/05(金) 20:29:07
すみません、質問っす
テクスチャを貼ったトライアングルでフェードイン表示みたいなことをしたいばあい、どの機能を使えばいいでしょうか?
244デフォルトの名無しさん:2008/12/05(金) 20:31:18
アルファブレンド使え
頂点カラーかマテリアルのアルファ要素で何とかなったはずだ
245241:2008/12/05(金) 23:37:16
>>242
どうもありがとうございます。
ググってみたところ、一つ目の内容については内容は分かりました。
方法としては、描画と描画の間に glClear(GL_DEPTH_BUFFER_BIT); を挟めばいいんですよね?
ただ、二つ目の点についてはよくわかりませんでした。
ttp://wisdom.sakura.ne.jp/system/opengl/gl9.html
等、頂点配列を変更したあとそのまま描画しているように見えるのですが・・・
飲み込みが悪くてすみません。もう少し教えていただけないでしょうか。
246242じゃないけど:2008/12/06(土) 00:09:06
(二点目について)
線分を描画する直前に、glVertexPointerで頂点配列の指定を"vertex"配列に変更してるでしょ?
で、次のフレームを描画するときもずっとその指定が続いてるわけ。
つまりテクスチャ0/1を描画するつもりでglDrawArraysを発行しても、
参照してる頂点配列が"vertex"配列になったままだから、線分と同じ位置に
GL_TRIANGLE_STRIPで描画されちゃってると。
(プログラム見る限り、頂点が一直線だから実際は縮退して描画されないだろうけど)

テクスチャを描く前に、もう一回、テクスチャを描画するための頂点配列を設定するべし。
247241:2008/12/06(土) 00:25:37
あ、そうか、次に描画するときにvertex配列の指定が解除されてないから、
vertex配列の上にテクスチャが表示されちゃって線しか出ないってことなんですね。
なんだかまだらで変な色の線だなぁ、バグかなぁと思ってたら、
あれはテクスチャ画像の色が出てたんですね。
やっともやもやが取れました。調べてやってみます。
>>242 さん >>246 さん、どうもありがとうございました。
248デフォルトの名無しさん:2008/12/06(土) 22:38:52
GL_BGRAとかGL_BGRってVS2005に入ってるヘッダでは定義されてないんですが、
この定数ってどこで配布されてるヘッダに存在するんですか?
249デフォルトの名無しさん:2008/12/06(土) 22:41:47
俺はglewのを使ってる
250デフォルトの名無しさん:2008/12/06(土) 22:45:41
OpenGL総本山のExtension Registryのページにglext.hがあったはずだが。
あれでもいいし、最新でなくてよいのならglewのでもいい。
251デフォルトの名無しさん:2008/12/06(土) 23:05:04
>>249-250
どうもありがとう。取ってきます。
252デフォルトの名無しさん:2008/12/07(日) 23:44:04
マルチスレッドってOPENGLの描画を各スレッドでウインドウ作って
GLの描画処理やらせたら 
シングルスレッドでに2画面描画するより速くなるの?
253デフォルトの名無しさん:2008/12/08(月) 00:00:45
複数のハードウェアスレッドが使用可能なら早くなる可能性はある
セレロンみたいなシングルコアCPUだと同期処理が必要になる分確実に遅くなる
254デフォルトの名無しさん:2008/12/08(月) 01:18:54
はぁ?
255デフォルトの名無しさん:2008/12/08(月) 01:46:22
↑ケチつけるだけで具体的には何も書けない馬鹿
256デフォルトの名無しさん:2008/12/08(月) 08:01:16
GPUに空きがあれば速くなる可能性はあるよ
その場合スレッド毎にコンテキスト作れってNVが言ってた気がする
めんどうにはなるね
257デフォルトの名無しさん:2008/12/09(火) 03:33:02
グラボがGeForce 9300M GSとチップセット内臓の4500MHDを切り替え可能なVaioのノートを使っています。
JavaのOpenGLで、最大化ボタンを押したらフルスクリーン表示するプログラムを作ったんだけれど、

4500MHDの方ではフルスクリーン後も正常に描画されるのに、
GeForceの方ではフルスクリーン後に画面が真白になってしまって描画されません。

真白なのに、キーイベント等は正常で画面内にクリッカブルなボタンとかを作っておけばちゃんとクリックできるし、
第一、エラーが出ないのでどこが問題なのか良く分かりません。
描画している処理自体はきちんと呼び出されているのですが、画面上に表示されていないという感じです。

これってグラボのドライバのせいなんでしょうか?
チップセット内臓のグラボが描画できて、より高性能なはずのGeForceがダメという状況に戸惑ってます。

258デフォルトの名無しさん:2008/12/09(火) 03:48:48
つ glGetError
259デフォルトの名無しさん:2008/12/09(火) 03:56:42
俺は旧Direct3Dで言うデバイスロストが怖いから
ChangeDisplaySettingsとか呼ぶ度にコンテキストから全て作り直してる
260デフォルトの名無しさん:2008/12/09(火) 20:57:37
>>257
俺も知り合いのノートPC(DELL、geforceかどうか不明)で
フルスクリーン後に画面が真っ黒(多分ウインドウの背景色)になる現象に悩まされてます。
フルスクリーン解除するとまた見えるようになるんだよな。
なぞだ。

DirectXにある >>259 の言うデバイスロストだと、
通常はロスト後はフルスクリーン解除してもロストしたままだったはずなのだが、
うちの問題が起こる環境だと復帰するんだよね・・・。

まあ、一番確実なのは、全て作り直すことなんだろうけど。
時間がなくて試せてない
261デフォルトの名無しさん:2008/12/09(火) 20:58:47
わかりにくくてスマソ

> 通常はロスト後はフルスクリーン解除してもロストしたままだったはずなのだが、
> うちの問題が起こる環境だと復帰するんだよね・・・。

通常はロスト後はフルスクリーン解除してもロストしたままで
フルスクリーンから復帰しても見えないままだったはず。
262デフォルトの名無しさん:2008/12/09(火) 20:59:58
というわけで、全部コンテキストから作り直しなりなんなりで
上手く回避できたら報告キボン
263デフォルトの名無しさん:2008/12/09(火) 21:21:50
GeForce 8400Mを乗せたVAIOでGeForce側で起動するとどうもOpenGL
が不安定なので悩まされた事がある。
それこそフリーズや、フルスクリーン画面がバーコード状態になったり。
サポート出そうにも再現条件がはっきりしないので、半ばムキになって
SpecViewPrefを走らせたま酒飲んで寝たら、翌朝にはもう二度と起動
しなくなっていた。
264デフォルトの名無しさん:2008/12/10(水) 03:14:02
VAIOがあやしいのか?
俺も3Dビューアーを作っているんだが、VAIOのGeForce Go 6200 で画面が何も描画されない現象を
最近報告された。フルスクリーンではなく通常表示。
様々なグラボや内臓チップセットで動作確認して問題なかったのに。
原因もまったく思い当たらない。
ドライバ更新くらいしか手がないのだろうか?
265デフォルトの名無しさん:2008/12/10(水) 03:35:04
いや〜、自分の場合は完全にGeForce Goの問題だったと思う。
初期はOpenGLの高負荷時にWindowsの画面がフリーズする
程度だったけど、末期には起動直後のBIOSの段階から緑色の
バーコード模様やピンク色の市松模様とか表示されていたので。
完全に憶測だけど、NVidiaのリコールとの関連かなと思った。

ちなみにSpecViewPerfによってGeForce Goの不具合は再現率
100%になったので(なにせ起動しない)、はれてVAIOはサポセン
行き->マザボ交換(無償)となったのでした。
保証が切れるギリギリだったので結構やばかったです。
266257:2008/12/10(水) 04:02:59
>> 258
gl.getError()しても、エラー無いみたいなんですよねぇ・・・。

>> 259
はい、僕もコンテキストから作り直してるんですが、ウィンドウをフルスクリーンモードにすると何故か真白に・・・。
謎です・・・。
フルスクリーンモードに切り替えた後にコンテキストを作り直してるのですが・・・。
GraphicsDevice#setFullScreenWindow(Window w)を呼び出すと真白現象になっちゃいます・・・。

>> 260
同じ現象っぽいですね・・・。
フルスクリーンモードにして真白の状態の後、フルスクリーン解除してウィンドウ画面にしたら描画も復帰します。

>> 263
うーむ。GeForceのモバイル用はOpenGLに弱いのでしょうか・・・。
267260:2008/12/10(水) 08:12:09
おJavaか。
しかし、そっちはコンテキストから作り直しているんだね。
そちらもウインドウにもどしたら復帰するとすると同じ現象か。

あ、あと 安価する時は、>>258 みたいにスペースいれないでくれ頼む
268デフォルトの名無しさん:2008/12/16(火) 00:14:51
すいません初心者なんですがOpenGLにはある特定のキーの状態を取得する関数はありますか。
windowsプログラミングのGetAsyncKeyState('J') 的な。
269デフォルトの名無しさん:2008/12/16(火) 00:18:41
コールバック関数を使ってキーの状態をフラグに保存するとかしか方法はないのでしょうか
その場合にメインループとコールバック関数でフラグ変数に対して競合がおきるなどの問題はありますでしょうか
270デフォルトの名無しさん:2008/12/16(火) 00:35:43
描画以外はOpenGLの仕事ではない
271デフォルトの名無しさん:2008/12/16(火) 01:29:51
ではLinuxではどうやってキーの状態を調べればよいですか
272デフォルトの名無しさん:2008/12/16(火) 01:33:01
ここは警察じゃないよ
273デフォルトの名無しさん:2008/12/16(火) 01:33:12
GLUTでも使っとけ。
274デフォルトの名無しさん:2008/12/16(火) 10:20:22
>キーの状態

OpenGLは、グラフィックスハードウェアに対して描画命令を発行する以外のことは
本当に何一つできませんよ。キー入力はもちろん、ベクトルや行列の計算だって
自前で(あるいは他の何らかの手段で)やる必要があります。

OpenGLに全く関係の無い話題である以上、ここで質問しても期待される答えが
帰ってくる可能性は低いかと。Linuxのスレなりなんなり、適切な場へ移動した方が
良いのではないでしょうか。

てか、それくらい、ぐぐればいくらでも答えが引っ掛かりそうなもんですが・・・。
275デフォルトの名無しさん:2008/12/16(火) 15:57:16
OpenGLを1から学びたいんですが、お勧めのサイトは?
PBOやFBOについても学びたいです。
276デフォルトの名無しさん:2008/12/16(火) 17:25:41
>>275
床井先生のとことかかな。
277デフォルトの名無しさん:2008/12/16(火) 18:20:16
床井先生のとこ今年頭から更新再開してたのに今頃気づいたw
278デフォルトの名無しさん:2008/12/16(火) 22:34:02
glBegin(GL_LINES)や(GL_POINTS)で描画するような点や線の色や質感に関しては
ライティングを有効にした場合はどのように設定するのでしょうか?
いままでライティングを無効にしていたプログラムではglColor系の関数で色を付けていたのですが、
これではライティングした際に色が抜けてしまうようなので、何かしらの方法で色を付けたいと思うのですが
279デフォルトの名無しさん:2008/12/16(火) 22:35:11
つ マテリアル
280デフォルトの名無しさん:2008/12/17(水) 22:07:59
GLUTによる「手抜き」OpenGL入門
http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html

これかな?なかなかよいまとめですね

スクリーンショットがもっとあったらもっとよかった
281デフォルトの名無しさん:2008/12/17(水) 22:19:55
すみません、質問なんですが、回転の変換行列からクォータニオンって求められますか?
ttp://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040321
にあるqrot(rt, tq);の逆向きの変換がしたいんですが、どうしたらいいんでしょうか?
282デフォルトの名無しさん:2008/12/17(水) 23:36:59
クォータニオンの虚部の符号を反転?
283デフォルトの名無しさん:2008/12/21(日) 11:37:19
現在、glutを使ってOpenGLを勉強しているのですが、Win32APIを使ったほうがいいのでしょうか?
glutを使わずにWin32APIを使うメリットはありますか?
284デフォルトの名無しさん:2008/12/21(日) 12:14:31
Win32APIの方が、フレームバッファの細かい設定とかできるね。
勉強中ならそこまで必要ないだろうし、GLUTでいいんじゃない?
Win32APIを使うのは、Win32APIじゃないとできないことをやりたくなってからで十分かと。
てかGL以外に考えるべきことを増やすのはかえって良くないと思う。
やりたいことに集中して、他の事はシンプルに済まそう。
285デフォルトの名無しさん:2008/12/21(日) 22:29:40
#include <GL/glut.h>
#include <dshow.h>
のようにして、glut-3.7.6とDirectShowを同時利用しようとしたら、次のようなコンパイルエラーが出ます。
どうすれば治りますか?

c:\program files\microsoft visual studio 9.0\vc\include\stdlib.h(371) : error C2381: 'exit' : 再定義 ; __declspec(noreturn) が異なります。
c:\documents and settings\裕\my documents\visual studio 2008\projects\glut-3.7.6\include\gl\glut.h(146) : 'exit' の宣言を確認してください。
c:\program files\microsoft visual studio 9.0\vc\include\stdlib.h(371) : warning C4985: 'exit': 前の宣言に属性が存在しません。
c:\documents and settings\裕\my documents\visual studio 2008\projects\glut-3.7.6\include\gl\glut.h(146) : 'exit' の宣言を確認してください。
286デフォルトの名無しさん:2008/12/21(日) 23:01:47
includeの順番のような気もするけど
「error C2381 exit」でググってみたら
287デフォルトの名無しさん:2008/12/22(月) 01:24:41
2.0専用スレに誤爆してしまいました orz

OpenGLでは各色の値の範囲が0〜1ですが、これってGDI上での0〜255の範囲に
リニアに一致する訳じゃないのでしょうか?
256*256のコンテキストを作り、全面ぴったりのポリゴンを張って、フラグメントシェーダーから

  gl_FragColor = vec4(gl_TexCoord[0].s, gl_TexCoord[0].s, gl_TexCoord[0].s, gl_TexCoord[0].t);

として色とアルファの増え方を見てみたのですが、どうもジャギっててきれいに0〜255の範囲で
増えてるわけではないみたいなのですが…
コンテキストと同じサイズのGL_NEARESTなテクスチャを張った場合はちゃんと256*256の範囲
全体が張られているのでテクスチャ座標がずれてるわけでもないみたいです。

上の式で得られたレンダリング結果↓
http://www3.uploda.org/uporg1873748.png
288デフォルトの名無しさん:2008/12/22(月) 11:45:51
流れの速いアップロードにファイルを置く馬鹿。
289デフォルトの名無しさん:2008/12/22(月) 11:47:07
アップローダをアップロードと書いてしまう馬鹿。
290デフォルトの名無しさん:2008/12/22(月) 23:32:44
>>287
普通は、リニアに対応するはずだけど。
レンダリング結果が見れないので、もう一度うpぷりーず!
(できればついでにソースも。)
291デフォルトの名無しさん:2008/12/23(火) 05:11:39
glReadPixelで数値にして見てみたら?
292デフォルトの名無しさん:2008/12/23(火) 20:06:55
例えば(10,0,0) (0,10,0) (0,0,10)・・ 原点が端のような
立方体があって、(0,0,10)を回転中心にして回転させたいのですが、どうすればよいのでしょうか?

for(;;){
glTranslatef(0,0,-10);// 原点に移動
glRotatef(10,1,0,0); // X軸を中心に回転
glTranslatef(0,0,10);// 元に戻す
draw();
}
とするとどんどんY座標がずれてきます。これを計算で戻すか、
使い方が悪いのか教えてください。

293デフォルトの名無しさん:2008/12/23(火) 20:40:07
回転したい点を原点に持ってきて回転させて戻せば?
294デフォルトの名無しさん:2008/12/23(火) 20:52:49
今は回転中心を原点に持っているつもりなのですが、<<292 では
持っていってないですか? わかっていません。
295デフォルトの名無しさん:2008/12/23(火) 20:59:44
どんどんずれていくのは、それはずれを蓄積しているからだろw
ループの最初で座標を初期化せい
296デフォルトの名無しさん:2008/12/23(火) 21:28:32
-Y座標方向にどんどんずれていくのですが、
1回転による座標系のずれを計算して、そのずれ分移動して元の位置関係に
あわせるということでしょうか?
それは計算しなければなりませんか? 関数はないでしょうか?
297デフォルトの名無しさん:2008/12/23(火) 22:36:48
>Use glPushMatrix and glPopMatrix to save and restore the unrotated coordinate system.
俺も勉強し始めたばかりでよく知らないんだけど、これとかどうよ?
298デフォルトの名無しさん:2008/12/23(火) 23:21:39
それは使えないかと思います。 回転させてそれを描画しないといけないので。
(なにかまちがっていますかね。。)
299デフォルトの名無しさん:2008/12/24(水) 00:07:32
すいません 教えてください
MAXで作ったアニメーションデータをOpenGLESで読み込んで動かしたいのですが、
調べたところCOLLADAがありましたが、C++のコードなんです。
組込み系でC++に対応していないため、C言語がいいんですけれども
何か解決案をご存知の方いますでしょうか?
おかしなこといってたらすいません・・・
300デフォルトの名無しさん:2008/12/24(水) 00:31:28
>>292
・座標変換は座標(縦ベクトル)に左から変換行列を掛ける
・変換行列の操作は右から行列を掛ける
301デフォルトの名無しさん:2008/12/24(水) 01:08:54
>>298
glPushMatrix();
glTranslatef(0,0,-10);
glRotatef(10.0 * n, 1,0,0);
glTranslatef(0,0,10);
draw();
glPopMatrix();
とかは?
302デフォルトの名無しさん:2008/12/24(水) 01:53:14
>>299
C++でCOLLADAからカスタムフォーマットを吐くものを作って、
カスタムフォーマットを再生するものはCで作る。
C++をCでラップしてもいいけど、XMLをそのまま扱うのは重いので
組み込みならなおさら事前に変換する方がよろしいかと。
303デフォルトの名無しさん:2008/12/24(水) 02:49:08
>>301
それ以前の問題で、変換前の座標を p、変換行列を上から M1, M2, M3 とすると、
変換後の座標は

 p' = M1 M2 M3 p

になるんだってば
304デフォルトの名無しさん:2008/12/24(水) 22:23:16
>>300, 303
その言い方じゃ、分かって貰えないんじゃないだろうか・・・。

>>292
移動と回転を組み合わせる、って発想は合ってるよ。
ただ、変換の順番が間違ってる。もし(0, 0, cz)を中心に回転させたいなら、↓こうする。
for(;;){
 glTranslatef(0,0, cz); // 元に戻す
 glRotatef(10,1,0,0); // X軸を中心に回転
 glTranslatef(0,0, -cz);// 原点に移動
 draw();
}
(コメントの順番に注目!)

で、こういう変換は>>295の言うとおり誤差が溜まっていくので、↓こうするともあべたー。
for(ループカウンタをiとする){
 glLoadIdentity();
 glTranslatef(0,0, cz); // 元に戻す
 glRotatef(10 * i とか ,1,0,0); // X軸を中心に回転
 glTranslatef(0,0, -cz);// 原点に移動
 draw();
}
(glLoadIdentity()の代わりにglPushMatrix()とglPopMatrix()を使ってもいいよ!)
305デフォルトの名無しさん:2008/12/24(水) 22:31:25
>>299
それはちょっと難しそうだなー・・・。

仕事でやるなら、Mascot Capsule とかの、既存の3Dエンジンを利用することを考えたほうがいいと思う。
(そもそもMAXでないといけないのかとか、ワークフローの最初から考え直した方が。)

趣味でやるなら、302の方法を支持します。
勉強することすごく多くて大変だけどねー。楽しいよねー。

・・・てか、組み込み系とはいえ、3Dモデルのアニメーションをさせるような分野で
C++が使えない!?というのがまず信じられないという心持ちですよ。
306デフォルトの名無しさん:2008/12/24(水) 22:52:37
ドリームky・・・おっとこんなクリスマスイブに誰か来たようだ
307デフォルトの名無しさん:2008/12/25(木) 00:14:38
>>302,305
レスありがとうございます
そういう考え方がありますね!頭が固いもので考えつかなかったです汗
libxmlやらCG言語やら絡んでてややこしいっす。ここらへんはあんまり見ないで
データ保持しているドキュメントクラスだけ見ればいいのかもしれないですが
とりあえず挑戦してみます!

あと、ドローソフトで作った頂点座標などのデータをOpenGLに
ドンと投げて楽して描画したいだけなんで、
MAXじゃないとだめってこともないですが、普及率が高い分、拡張性も高くて
3dsファイルはデータの損失が少ないなどの話も聞いたもので。
まだ歴史が浅い分野なもので手探り状態っす
Mascot Capsuleなんてものがあるんですね。導入できるのか分からないですが
もうちょっと調べてみます
308デフォルトの名無しさん:2008/12/25(木) 17:36:29
OpenGL ESもいいですか?

トライアングルの1頂点が画面の外に出ると光源計算してくれないって現象で困ってます.
アンビエントは入るのですが,はみ出した頂点だけでは無く,トライアングル全体が暗くなります.
GL_TRIANGLE_FANでもGL_TRIANGLE_STRIPでも同じ症状です.
3つの頂点全部が画面内に入ると計算してくれます.

何かヒントになる事でも結構ですのでアレじゃね?みたいなのがあればお願いします.
309デフォルトの名無しさん:2008/12/25(木) 20:07:11
ドライバーのバグでは?動作環境は何ですか?
310デフォルトの名無しさん:2008/12/25(木) 20:32:10
iPhoneと言うかiPhone SDKに付いてるiPhoneシミュレータなんすけど.
サンプルには光使ってるの無いし,もしかして出来ないなんて事有るんすかね?

311デフォルトの名無しさん:2008/12/25(木) 21:15:23
・OpenGLの関数(gl*という名前の関数)のドキュメントって何処にあるんですか?
出来れば日本語のをお願いします。
・glutの最新版ってバージョンいくつですか?今3.7.6が入っています。
312デフォルトの名無しさん:2008/12/25(木) 21:39:44
.orgにスペックからなにからあるけど、英語。翻訳は金かかるからな…。
glutはfreeglutの2.6がそろそろでようとしている模様。
313デフォルトの名無しさん:2008/12/25(木) 22:15:53
このスレなんかここ数ヶ月元気だよな
314311:2008/12/25(木) 23:50:45
>>312
ありがとうございます。ドキュメントは英語で我慢します・・。
glutのバージョンを訊いたのは
ttp://wisdom.sakura.ne.jp/system/opengl/gl23.html
の一番上にあるプログラムが動かなかったからです。
何故かテクスチャが貼られず、白いままになってしまいます。なぜでしょうか?
freeglutの2.4に変えてみても同じでした。
他のOpenGLを使うアプリケーションは普通に動作します。
315デフォルトの名無しさん:2008/12/26(金) 00:02:05
>glTexImage2D(
>GL_TEXTURE_2D , 0 , 3 , TEXSIZE , TEXSIZE ,
>0 , GL_RGB , GL_UNSIGNED_BYTE , bits
>);

3番目の引数を3からGL_RGBに変えて味噌
316デフォルトの名無しさん:2008/12/26(金) 11:00:02
>>310
もうちっとでiPhone SDKが入るマシンが来るので来たら試してみるわ
ってか、シミュレータの不具合の可能性があるかも知れん。実機で再現するか確かめてみ。
シミュレータのバグと確定した場合はバグレポしておいて。
317デフォルトの名無しさん:2008/12/26(金) 17:00:28
>>311
個人的にはやはり「赤本」がベスト。
手元に一冊あると便利で勉強にもなるけど、高いよね・・・
318デフォルトの名無しさん:2008/12/26(金) 22:00:57
俺も学ぶのに赤本は最高だと思うんだけど、
関数のドキュメントとしては青本の方がいいんじゃないか?

そういえば前スレに日本語manのリンクがあったけど
今見たらgluとglXのものしかないな…
319デフォルトの名無しさん:2008/12/26(金) 22:09:52
時節がら、大学入試の問題集の話かと思ったよw
320デフォルトの名無しさん:2008/12/27(土) 17:19:01
VCで開発してるけど、VC上でのデバッグ実行では普通に動くけど
リリースビルドするとカタカタ動く。
原因は初期化忘れとかあるみたいだけど、こういうの経験ない?
原因はなんですか?
321デフォルトの名無しさん:2008/12/27(土) 18:17:13
エスパーすると、初期化忘れだな
322デフォルトの名無しさん:2008/12/27(土) 20:06:27
やっぱり初期化忘れなのかな。
ただ回転させてるだけの処理でリリースはカクカクする。
初期化忘れはない・・と思ってるけど。あるのかな。
323311: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
324311:2008/12/27(土) 22:50:23
プロジェクトのファイル全部入れてしまいましたが
入れ忘れあったのでビルドできません・・
CTextureRenderer.cppとmain.cppだけ見てください
325デフォルトの名無しさん:2008/12/27(土) 22:51:17
GL_TEXTURE_MIN_FILTERのデフォルト値はなぜかGL_NEAREST_MIPMAP_LINEARなので
環境によってはミップマップを設定しないとテクスチャが表示されない
326デフォルトの名無しさん:2008/12/27(土) 23:44:45
>一旦memcpyでムービーの内容を適当なバッファにコピーしてから、
>ポリゴンの描画を行う前にglTexSubImage2Dで更新していますが
>負荷が大きいようです。

普通にテクスチャ更新すりゃいいだろ。なんで無駄なコピーやっているんだ?
327デフォルトの名無しさん:2008/12/27(土) 23:47:43
そうしたらなぜかGL_INVALID_OPERATIONが・・
328デフォルトの名無しさん:2008/12/27(土) 23:54:03
glBindTexture(GL_TEXTURE_2D, TexName);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TEXSIZE_X, TEXSIZE_Y, GL_BGR_EXT, GL_UNSIGNED_BYTE, pSampleBuffer);
printf("Error:%d\n", glGetError());
glBindTexture(GL_TEXTURE_2D, 0); //UnBind

これをDoRenderSample内でやるとGL_INVALID_OPERATIONが
329デフォルトの名無しさん:2008/12/27(土) 23:56:34
なんか知らんが、OpenGLにはコンテキストを生成したスレッドでAPI呼ばないといけない制限があるから、
スレッド違いで失敗してるんでね?サンプルごとキューにでも投げてGLのスレッドで処理するようしとくとか。
こんな基本的な事は承知だったらすまね。
330デフォルトの名無しさん:2008/12/28(日) 03:45:51
>>328
テクスチャーサイズが2のn乗になってないが、大丈夫なのか?
331330:2008/12/28(日) 04:11:42
と思ったが、write()ではうまくいってるのか。

呼ぶタイミングを見ようと思ったら、DoRenderSample()を呼び出している
箇所が見つからない。どうなってる?
332デフォルトの名無しさん:2008/12/28(日) 14:11:09
Gluxってなんか面白そうじゃんって調べたらLGPLなのに静的リンクライブラリだった
「自由に使って欲しいからGPLじゃなくてLGPLにしたんだぜ」
って書いてあったけど、これだと全然自由じゃないよな?

LGPLって動的リンクならゆるいけど、静的リンクだとソース公開だったよな
俺が勘違いしてるのか?
333デフォルトの名無しさん:2008/12/28(日) 14:40:10
ソースコードはあるからライセンスに従って適当に使えばいいだろ。
334デフォルトの名無しさん:2008/12/28(日) 15:00:31
静的リンクでもいいようだぞ
中身読んでないから知らんが
ttp://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License
335デフォルトの名無しさん:2008/12/28(日) 20:01:22
なんかちょっと伝わってないみたいだから整理してみる

俺が望んでいること
→Gluxをライブラリとして使いたいが、全ソース公開は勘弁して欲しい
 公式には「自由に使える」と書いてあるが、LGPLなのであまり自由ではない(詳細は下記)

LGPLのソース公開条件
→動的リンク(*.dll)ならソース公開は不要だが、リバースエンジニアリングを許可する必要がある
 静的リンク(*.libとか*.a)ならソース and/or オブジェクトファイルの公開が必要

んで俺が試してみたところ、DLL化は無理だった(ライブラリ内にmain関数への参照があるから)
要するに静的リンクするしかないので、ソース公開は避けられないんじゃないか?
というのが問題なんだ
336デフォルトの名無しさん:2008/12/28(日) 23:33:32
main関数を共有ライブラリにおけない環境の不幸を呪うがいい
337デフォルトの名無しさん:2008/12/29(月) 00:26:23
「and/or」は都合のいいほうに解釈するんだ
つまりオブジェクトファイルだけ公開すれば良いんだ
338デフォルトの名無しさん:2008/12/29(月) 01:02:27
ソース見てみたが簡単にDLL化できそうだけどな
339デフォルトの名無しさん:2008/12/29(月) 01:12:16
>>335
軽くソースを読んでみただけなので不適当なところがあっても勘弁して下さい。

概略はgluxPlatform.cppでコンソールアプリ用とGUIアプリ用のmain関数の
ひな形が実装されていて、ユーザ定義のmain関数はgluxPlatform.h内の
#defineでglux_Mainへとリネーム、上記のひな形main内から適切なタイミング
でglux_Mainを呼び出す、という形ですね。

で、ひな形main関数の名前がmainだったりWinMainだったりするのでDLL化
が出来ない、と。

となると、まずgluxPlatform.h内のmainをリネームする#defineを削除、次に
gluxPlatform.cpp内のひな形メインをConsoleInit, WinInitなど無難な名前に
付け替えて、ユーザ定義のmain等から明示的に呼び出す形にすれば良い
のでは。glux_Mainはこの際にポインタとして渡してやれば良いと思います。

で、DLL化のための上記の修正を行うpatchを作成して、LGPLで公開。
DLL化版のgluxもLGPLとなりますから、これを動的リンクするプログラムの
ソースを公開する必要は無くなるはずです。
340デフォルトの名無しさん:2008/12/29(月) 01:36:59
>>335
ttp://www.gnu.org/copyleft/lesser.html
LGPL v3だとこんな感じだ

4. Combined Works.
d) Do one of the following:
 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, ...

このライセンスはライブラリ部分に相当する最小限のソース・バイナリコードにのみ感染し適用される。その範囲内での感染はGNU GPL第6項と同様の方法で行う。
「glux使いました」と書いてgluxの入手先を明示しておけばおkなライセンス。
341デフォルトの名無しさん:2008/12/29(月) 11:05:45
>>339
細かいレスありがとう
大体そんな感じでやったら出来たよ
数行程度の修正で間に合った

サンプルコードを元に改造していったんだけど
エラーが出ると予告無しに終了するって仕様のせいで時間がかかったわ

>>340
LGPL v2.1って明記されてるんだけど、そういう場合でも
v3だと読みかえていいのか?
342デフォルトの名無しさん:2008/12/29(月) 13:10:05
>>340
> 「glux使いました」と書いてgluxの入手先を明示しておけばおkなライセンス。
全然違う。

>>341
よくない。
またLGPLとGPLでもソース配布についての規定は少し違う。

gluxを同梱するか、自分のソフトと同じダウンロード場所から自分で配布する必要がある。
343311:2008/12/29(月) 21:22:24
>>330
2のn乗でないテクスチャはうちの環境ではサポートされています。
>>331
レンダラーフィルタとしてグラフに挿入すれば
後はDoRenderSample()を呼ぶのはDirectShowが勝手にやってくれるみたいです。

>>329
初めて知りました。OpenGL使い始めて長くないので・・
どんなプログラムを書けば実現できるのでしょうか?
「OpenGL マルチスレッド」でググってみましたが、よく分かりません。
344デフォルトの名無しさん:2008/12/29(月) 21:57:13
OpenGLのAPIが実行されるスレッドを1つになるようにコーディングする。
DirectShowのコードは別スレッドで実行されてるだろ?
345デフォルトの名無しさん:2008/12/29(月) 23:34:33
すいません、全然やり方わからないですorz
どんな関数とかを使えば?
346デフォルトの名無しさん:2008/12/30(火) 00:02:07
VS std以上を使っていると思うが、ブレークポイントで停止させたりすると、スレッドの一覧でどのスレッドか状態がわかるだろ?
Expressだとスレッドは確認できなかったかな。というかExpressはデバッグ機能は貧弱すぎて使い物にならん。
スレッド間でデータを受け渡しする機構なんかは適当にやれ。マルチスレッドを理解していれば簡単だろう。
347デフォルトの名無しさん:2008/12/30(火) 00:05:13
DirectShowが管理するスレッドがDoRenderSampleを呼ぶならその中ではGLのコマンドは使えない
そんだけ
348デフォルトの名無しさん:2008/12/30(火) 01:40:44
俺が大昔に書いたらしいMovieTextureなるクラスのソース見たけどmemcpy使ってるな
349デフォルトの名無しさん:2008/12/30(火) 07:55:00
>>348
今ならどう書く?
350デフォルトの名無しさん:2008/12/30(火) 12:28:05
OpenGL API を呼ぶ部分をクリティカルセクションで排他制御すれば
別スレッドから OpenGL API を呼んでも問題ないと思うんだけど。
351デフォルトの名無しさん:2008/12/30(火) 13:34:11
コンテキストがスレッドごとに違うので
排他制御してもうまくいかないと思う。
352デフォルトの名無しさん:2008/12/30(火) 16:52:56
>>351
ウインドウが1つならスレッドが違ってもデバイスコンテキストは同じじゃね?
353デフォルトの名無しさん:2008/12/30(火) 17:30:33
デバイスコンテキストじゃなくてGLのコンテキストだろう。
354デフォルトの名無しさん:2008/12/30(火) 18:44:35
>>350 >>352 GLの常識を知らないならROMっとけよw
355デフォルトの名無しさん:2008/12/30(火) 21:53:42
>>354
あ〜あ…
356デフォルトの名無しさん:2008/12/30(火) 22:02:07
常識を知らずに、自分が常識を知らないということを知ることはできない
357デフォルトの名無しさん:2008/12/31(水) 08:27:42
常識もなにも、試してみれば分かることだと思うけど‥‥
358デフォルトの名無しさん:2008/12/31(水) 16:16:52
>>357
プログラマとして、その考え方は危険だろ。
「たまたまうまくいってた」だけ、ってのが往々にしてあるし。
特にOpenGLは。

……ええ、こないだそれで長時間悩むハメになりましたさ。
359311:2008/12/31(水) 22:59:28
マルチスレッドなプログラムなんて組んだことありません。
使っているのはVisual C++ 2008 Express Editionです。

・・・コンテキスト?
wglCopyContextを使えばいいんでしょうか?
360デフォルトの名無しさん:2008/12/31(水) 23:11:02
頑張れ。学ぶんだ。今年もあと1時間弱あるから、なんとか。
361デフォルトの名無しさん:2009/01/01(木) 18:23:35
今年もまだ8740時間はあるからがんばろう
362デフォルトの名無しさん:2009/01/02(金) 01:44:29
>>361
そう表現すると、やけに少なそうに見えるな。焦燥感を煽るにはいいかも知れん。
363デフォルトの名無しさん:2009/01/02(金) 15:28:56
>>361
あのゲームやこのゲームで数百時間浪費することがいかに愚かか実感しました
364デフォルトの名無しさん:2009/01/02(金) 15:37:41
寝る時間 8時間、飯食う時間 1時間半としても、今年はまだ 5292.5時間もある。
がんばろうな。
365311:2009/01/02(金) 21:45:35
ttp://uproda.2ch-library.com/src/lib086808.zip.shtml
コンテキストをコピーしてみましたが、駄目でした・・

・Windows SDK
・Active Template Library
・GLUT
・Irrlichtのinclude

ビルドするのにこれらが要ります。
366デフォルトの名無しさん:2009/01/02(金) 21:48:39
これはアレだ。頭の弱い子には無理かもしれんね。
367デフォルトの名無しさん:2009/01/02(金) 22:04:50
諦めてmemcpy使うかD3Dに乗り換えるかしたほうがいいぞ
後学のためにやってるなら止めないが
368デフォルトの名無しさん:2009/01/02(金) 22:58:02
諦めんなよ…
諦めんなよ、お前!!
どうしてそこでやめるんだ、そこで!!
もう少し頑張ってみろよ!
ダメダメダメダメ、諦めたら
周りのこと思えよ、応援してる人たちのこと思ってみろって。
あともうちょっとのところなんだから。
俺だってこのマイナス10度のところ、しじみが取れるって頑張ってんだよ!
ずっとやってみろ!必ず目標を達成できる!
だからこそNever Give Up!!
369311:2009/01/02(金) 23:27:13
wglCopyContextが何故かfalseを返しています・・
それ以前にこの方法が使えるのかどうか分かりませんが

wglCopyContext(OrigCt, CopyCt, GL_ALL_ATTRIB_BITS)
370デフォルトの名無しさん:2009/01/03(土) 01:37:24
つ wglShareLists
371デフォルトの名無しさん:2009/01/03(土) 03:14:15
>349
memcpy使う代わりにメインスレッドと同期を取ってコピー元のポインタを投げてやる、ってのを思いついた
ちゃんと動くかわからんけど試してみる気も無いw
372デフォルトの名無しさん:2009/01/03(土) 22:27:09
>>329 で答え出てるのに、それを実行できないなんてただの無能だろ。
まずはVS std以上を買ってちゃんと勉強すべきだ。
お年玉貰っただろ?
373デフォルトの名無しさん:2009/01/03(土) 23:26:15
ならスレッド毎にコンテキストを作れば。ここらへん参考にならね
ttp://support.microsoft.com/kb/128122
ttp://support.microsoft.com/kb/128122/ja
374デフォルトの名無しさん:2009/01/03(土) 23:52:09
>>373
お前も死ねw
375デフォルトの名無しさん:2009/01/04(日) 03:27:54
つまりOpenGLを初期化したスレッドでのみ
glHogehoge()を呼べばいいんでしょ
376デフォルトの名無しさん:2009/01/04(日) 12:07:25
>>373
うん、たしかに参考にならないwww
377デフォルトの名無しさん:2009/01/04(日) 12:18:25
勘違いしてた。>>373はスルーしてください orz
378311:2009/01/04(日) 22:31:35
>>369はコピー先でwglCreateContextしていなかった
せいでした・・>>365でもwglShareListsは使っていますが、
ムービー再生前にwglMakeCurrentしてなかったので動きませんでした。

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

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

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

以前うpしたコードで
memcpyではなく
tmp = pSampleBuffer
のようにしても動くようですがサイズのでかい動画で音が途切れるのは
これでは直りませんでした。なんでだろう?
DoRenderSample()の外でテクスチャへの書き込み処理をしたらいかんのか
379デフォルトの名無しさん:2009/01/05(月) 00:53:34
質問なのですが、3次元空間内において四角領域にカメラ画像を描写して、
マウスとかでグリグリしていろんな方向から見えるようにしたいなと考えています。

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

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

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

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

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

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

参考になるサイトとかでも教えていただけるとありがたいです。
380デフォルトの名無しさん:2009/01/05(月) 01:26:52
glDrawPixelsの実装はテクスチャ&ポリゴンだった希ガス。
昔スプライトっぽくglDrawPixelsで描画しようと試行錯誤した経験があるのだが、シェーダーとか色々影響した。
なので、glDrawPixels前にステートやシェーダーの設定をし直す必要がある。
ちなみに画像表示するならテクスチャでやるのがパフォーマンスがよい。
381デフォルトの名無しさん:2009/01/06(火) 12:20:53
iPhoneのOpenGL ESについてなんですが、iPhoneアプリ開発スレで聞いても誰も分からなかったようなので、
マルチポストのようですみませんがここでもう一度質問させてください。
iPhoneに載っているバージョンのOpenGL ESではGL_LINE_SMOOTHが利かないようなんですが、
ttp://discussions.apple.com/thread.jspa?threadID=1611394&tstart=120
この場合アンチエイリアスをかけるにはどうすればいいんでしょうか?
他に、座標点列をペシェ曲線みたいに補完してくれるライブラリとかがあったらそっちも教えていただきたいです。
よろしくお願いします。
382デフォルトの名無しさん:2009/01/06(火) 19:55:33
初めて投稿させていただきます。

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

環境は
WindowsVista
c++
glut
です。

よろしくお願いいたします。
383デフォルトの名無しさん:2009/01/06(火) 23:35:48
適当にax+by+cz=Lを満たす点を選ぶのが効率的な気もするけど

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

って、結局、言ってる事は382,383と変わらないなこりゃ。
「0の例外処理」って何だろう?
・Nを球面上で連続に動かした時、平面を張る二つのベクトルも連続して動く
・Nを決めたとき、平面を張る二つのベクトルは一意に決まる
の二つを同時に満たすことは不可能だから、不連続な関数でも使わない限りは
何らかの場合分けが必ず必要になるよ。
385デフォルトの名無しさん:2009/01/07(水) 23:49:59
↑「必ず必要」て。ボケてるね。orz

もう寝る!
386デフォルトの名無しさん:2009/01/09(金) 15:37:01
iPhone開発でOpenGL(ES1.1)を初めて触っています。
3Dではなく2D用として作ってるんですが、
2Dの描画したオブジェクト同士が重なっているかを調べる
ようないい方法はあるんでしょうか?
やはり、自力で重なっているか(衝突しているか)を
調べないとだめですよね?
387デフォルトの名無しさん:2009/01/09(金) 15:44:33
>>386
「ピックアップ OpenGL」でググると良いよ
388デフォルトの名無しさん:2009/01/09(金) 16:37:42
>> 387

なんか難しそうだけどやってみます!
サンクスです!
389デフォルトの名無しさん:2009/01/09(金) 18:07:10
>>387
悉皆判定したいので実は向かないと予想
390デフォルトの名無しさん:2009/01/09(金) 18:38:33
>> 387

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

>> 389

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

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

なので、ピックアップを矩形Aに合わせて回転させて調べる
ということかなと思ったんです。
393386:2009/01/12(月) 18:57:20
ってかOpenGL ES(iPhone)って
セレクションがそもそもないですね。。。
やっぱりスクリーン座標から実際に計算しないとダメな気がしました。
394デフォルトの名無しさん:2009/01/13(火) 13:45:46
印刷用に高解像度レンダリングしたいんだけど、そういうときってどうしてる?
TBitmapに描画しようと思ったら激遅らしいし、
BitBltじゃディスプレイ解像度よりあげられないしで、
正直どうしようか迷ってる・・・
395デフォルトの名無しさん:2009/01/13(火) 18:54:23
レンダリングする領域を分割して適当に繋げればいいんでないかな
396394:2009/01/13(火) 20:35:48
>>395
そりゃそうだ
何で気づかないかな・・・
397デフォルトの名無しさん:2009/01/13(火) 20:41:39
3Dだとパースがあるから割とむずいよ
398394:2009/01/13(火) 22:31:43
>>397
正射影でやるからパースは割りと考えなくていいかもしれない
そうでもない?
399デフォルトの名無しさん:2009/01/13(火) 22:40:48
FBOじゃだめなん?
400デフォルトの名無しさん:2009/01/13(火) 23:00:57
GameProgrammingGemsの2と4に高解像度レンダリングについての項目があるので参考までに
401デフォルトの名無しさん:2009/01/14(水) 00:17:41
>>397
パースがあるとか関係ないよ簡単だよ。

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


領域分割に対して何も利点無さそうだけど、ジッタドレンダリングした後に
ピクセルを組み替えてもいいかもね。
あ、それだとMIPMAPのレベルが適切にならないか・・・。
402デフォルトの名無しさん:2009/01/14(水) 00:43:06
ああglだと行列いじらなくてもビューポートの切り替えだけでできるのか
d3dだと範囲外を指定するとレンダリングされないんで勘違いしてた
403デフォルトの名無しさん:2009/01/14(水) 01:09:40
お前どっちもちゃんと仕様を理解してねーだろw
404デフォルトの名無しさん:2009/01/14(水) 20:16:52
お絵かきアプリを作ってるんですが、
スペックの低いモバイルマシンだと線が増えてくるとラグくなってきます。
画面更新毎に全ての線を描画し直しているのが問題だと思うのですが、
過去に引いた線はテクスチャとして残しておいて、
一気に書き込んでしまうというようなことはどうすればできるのでしょうか?
405デフォルトの名無しさん:2009/01/14(水) 20:43:42
2D上書きならわざわざGL使う必要もないし、テクスチャにレンダリング内容をコピーしたい、またはオフレンダリングしたいならすればいいだけだろう。
FBOでググレカス
406デフォルトの名無しさん:2009/01/14(水) 23:53:25
>>404
なんでわざわざOPENGLでやろうと思ったんだ?
要はペイントでいいわけだろ?
407デフォルトの名無しさん:2009/01/15(木) 00:36:20
いや、GLを2Dのペイントやドローに使うのも、十分にアリだと思うんだけど・・・。楽だし。
ピクセルごとの細かい制御をしようとすると難しいけど、シェーダ前提なら色々できるし。

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

一番単純に考えると、単に画面をクリアするのをやめて、シングルバッファで重ね描きしていけば
いいんだけど・・・VISTAとかみたいなスマートな画面ドライバモデルじゃないと、重なったウィンドウに
内容を破壊されちゃうかな。
408デフォルトの名無しさん:2009/01/15(木) 00:56:13
なんとなくiPhoneかなと思った俺
409デフォルトの名無しさん:2009/01/15(木) 02:24:57
逆に、OpenGL ESでプログラムできる実機が手軽に手に入るハードって
iPhone/iPod touch以外にあるんかいな
410デフォルトの名無しさん:2009/01/15(木) 20:35:37
Visual C++でCRectTrackerを使って画像内にドラッグで大きさ、位置が
変更可能な矩形を描画しようとしてるんですが、
矩形内の色が白に塗り潰されてしまいます。
枠だけ描画というのはどうやったらできるんでしょうか。

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

OpenGLを使わずに描画したビットマップ上では枠だけ描画されたので、
OpenGLの問題かと思いこちらで質問させていただきました。
411デフォルトの名無しさん:2009/01/15(木) 23:04:22
で、ソースは?
エスパーじゃないんだから「お前の使い方が悪い」としか言えんぞ
412デフォルトの名無しさん:2009/01/16(金) 01:09:21
OpenGLの問題というよりOpenGL以前の問題のような
413デフォルトの名無しさん:2009/01/16(金) 04:00:14
>>410
塗りつぶされるのは、ポリゴンになってるからだ
矩形の枠だけなら、ラインで引いたほうがいいと思う
414デフォルトの名無しさん:2009/01/16(金) 09:49:00
>>410
OpenGLの描画の上にGDIで描画しちゃダメ
枠線もOpenGLで描いてください
415410:2009/01/16(金) 13:49:20
>>411-414

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

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

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

OpenGLでCRectTrackerと同様の機能のものを作るのは難しいでしょうか。
416デフォルトの名無しさん:2009/01/17(土) 05:16:56
ソース見る気は毛頭ないがSetPixelFormatでGDIフラグたてとけ。
417410:2009/01/18(日) 01:51:10
>>416
ありがとうございます。
なんとかやってみます。
418デフォルトの名無しさん:2009/01/18(日) 13:58:02
あーもしかしたら…矩形描画時にブラシで上書きしてんだっけか。
NULL_BRUSH選択してから矩形かいてみ。
419デフォルトの名無しさん:2009/01/18(日) 19:33:36
それで動いたとしてもVistaではOpenGL描画の上にGDI描画は御法度だからな

OpenGLで描くなら普通にGL_LINESなんかで線描いてglBlendFuncで描画先反転させるかな
420デフォルトの名無しさん:2009/01/21(水) 01:28:06
ボーン用のウェイトを塗り塗りするアプリを作りたいんだけど、
ぬりぬりするためには、どうしたらいいのでしょうか、
セレクションバッファ使えばできるような気がするけど、
塗り塗りしてるようなサンプルとかってどこかにないですかね、
よろしくおねがいします。
421デフォルトの名無しさん:2009/01/22(木) 13:20:32
glTexImage2D() の internalformat 引数に与えた値と、その時生成したテクスチャの
glGetTexLevelParameteriv( ... GL_TEXTURE_INTERNAL_FORMAT ... ) が返す値は
必ず一致するでしょうか?
422デフォルトの名無しさん:2009/01/23(金) 06:38:45
必ずしも一致しません
423デフォルトの名無しさん:2009/01/27(火) 23:43:14
ちょいと質問

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

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

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

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

読み込んだ配列の中身を書き出してみたら
一応期待した通りの値が入ってるんだ。わけわかめ
424デフォルトの名無しさん:2009/01/28(水) 00:00:31
配列の中身が正しいなら、1.jは関係無いところでまちがってるってことでしょ
普通にファイルから読んだデータで2.からやってみるとかで確認してみれば
425デフォルトの名無しさん:2009/01/28(水) 00:06:53
テクスチャがEnableになってないとか
TexGenをEnableにしっぱなしだったとか
426デフォルトの名無しさん:2009/01/30(金) 10:36:17
オブジェクトがビューポートの中に入っているかどうかを判定する方法はありますか?
視点変更をした際に,対象物が視野から外れてるかどうかを判定したいのですが….
427デフォルトの名無しさん:2009/01/30(金) 16:48:33
XPなんだけどデスクトップ上にキャラを書き出すってことは出来る?
例えば3Dモデルのハエを画面じゅう飛び回らせたり
428デフォルトの名無しさん:2009/01/30(金) 17:26:45
xroach を思い出したわ
429デフォルトの名無しさん:2009/01/30(金) 17:34:52
xroach懐かしい。
groachなんてあるんだな。
430デフォルトの名無しさん:2009/01/30(金) 19:07:03
質問があります。

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

431デフォルトの名無しさん:2009/01/30(金) 21:03:35
432デフォルトの名無しさん:2009/01/30(金) 23:51:53
glMapBufferって
VRAMにCPUから直接かけるの?
433デフォルトの名無しさん:2009/01/31(土) 00:15:50
PBOだっけ?DirectXのロックと同じだ。
で、FBOのほうがパフォーマンスいいよっと。使いやすいし。
434デフォルトの名無しさん:2009/01/31(土) 01:27:48
>>426
gluUnproject()をうまく使えばなんとかなる?

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

Windowsのスクリーンセーバー起動の場合は、OpenGLが有効にならないバグ等あるのでしょうか?
原因をご存じの方が、いらっしゃいましたらお答えいただけると幸いです。
437デフォルトの名無しさん:2009/02/01(日) 18:33:35
分かるけどスレ違いだから教えない
438デフォルトの名無しさん:2009/02/01(日) 21:03:37
>>437
Windows環境でOpenGLを使用してスクリーンセーバーを作成しました
しかしハードウェアアクセラレーションが有効になりません
どうすれば改善できるか、教えて頂けないでしょうか?
439デフォルトの名無しさん:2009/02/01(日) 21:35:16
最近のグラフィックカードはだいたい
どのくらいのテクスチャユニット数ですか。
単純にマルチテクスチャするときの枚数として知りたいんですが。
440432:2009/02/01(日) 21:39:00
>>433
それでもあえてPBOを使う!

ところで、マップするって
VRAMからメインメモリに転送するという事?
441432:2009/02/01(日) 21:49:45
DirectXのロックと同じというけれど
あれはVRAMに直接書き込んでいるの・・?
442デフォルトの名無しさん:2009/02/01(日) 21:56:38
CPUがシステムメモリ以外に直接アクセスする手段はないの。
マップやロックは要するに、VRAM<->システムメモリで転送を行うこと。
読み出しならロック時にVRAMから転送。書き込みならアンロック時にVRAMに転送される感じ。
名前の似ているWindowsのメモリマップドファイルとは別物ね。
443デフォルトの名無しさん:2009/02/02(月) 10:55:07
作業用のメモリかと思ってました
444デフォルトの名無しさん:2009/02/02(月) 16:52:21
>>439
GeForce GTX280 だと4枚
445432:2009/02/03(火) 22:13:32
>>442
なるほど
よくわかった、ありがとう

PBO1の内容を読みながら
PBO2に書き込む方法ってある?
一旦glGetBufferSubDataしないと無理そう
446デフォルトの名無しさん:2009/02/03(火) 22:53:34
わかってねーだろw
447デフォルトの名無しさん:2009/02/07(土) 12:08:24
PBO1もPBO2もマップすればいいじゃない
と、とても遅レス
448デフォルトの名無しさん:2009/02/08(日) 08:56:19
PCによってgluUnProjectの挙動が違うので頭を抱えてたんだが…
グラフィックのアクセラレーションを切ったら正常になった.

コード以外に原因があるときの調査って大変だよねぇ.
449デフォルトの名無しさん:2009/02/08(日) 14:03:28
glReadPixelでアルファ値をGL_BRA_EXTで取得してHBITMAPに変換
それをDCに貼り付けてUpdateLayeredWindowで表示してるんだけど
うまく半透明にならない
glClearColorでアルファを0にしといて背景を透明にして
その上に半透明の物体を重ねていく、で最終的に合計のアルファ値で
画面に加算した結果を表示するというようにやりたいんだけど
出来ないの?
450デフォルトの名無しさん:2009/02/08(日) 15:26:41
できる
glReadPixelsで取得した値を直接BitmapにしてUpdateLayeredWindowに渡すんじゃなくて
いったんどこかに書き出してちゃんとアルファが取得できてるか確認したらどうかな
あと、描画した物でなくちゃんと透けるような値が入った配列をビットマップにして
ちゃんと透けるか確認する
glReadPixelsではちゃんと取得できてるが、CreateCompatibleDCで作ったDCが
24bitでアルファ無しになってて透けないことがあった

あと関係ないが、Chrome430GTではglReadPixelsがもの凄く重くて使い物にならなかったぜ
451デフォルトの名無しさん:2009/02/08(日) 16:42:11
2^nのサイズ以外のバッファに読み込むと何故か遅くなるというバグはRadeon系であったよ
452449: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();
何か間違ってる?
453449:2009/02/09(月) 11:41:08
自己解決
ピクセルフォーマットのアルファビット数を1にしたら出来た
454デフォルトの名無しさん:2009/02/10(火) 08:07:33
生の画像を非圧縮でテクスチャにしてるんだけど
同じサイズのを2枚やると失敗する
メタデータでもせいぜい5MBくらいだと思うけどGeforce上のRAMは1Gある
テクスチャのメモリって制限か何かあるの?
455デフォルトの名無しさん:2009/02/10(火) 15:39:26
なんか知らんが俺も似た問題を抱えている。
しかも成功する時としない時がある。
9800GTXだったと思う。
456デフォルトの名無しさん:2009/02/10(火) 20:32:07
メタデータ???('ω`)
457デフォルトの名無しさん:2009/02/10(火) 23:37:58
失敗の内容を書かないとエスパー能力にも限界があるぜ
glGetErrorでエラーは出てないの?
ドライバでエラーチェックONにするのを忘れずに
458デフォルトの名無しさん:2009/02/11(水) 22:03:03
なんかタイミングの問題みたいだ
描画中のコンテキストに対してユーザー操作の別スレッドで割り込んで
テクスチャを作ろうとするとこけるらしい
459デフォルトの名無しさん:2009/02/12(木) 00:11:28
なんだ、ただの馬鹿か
460デフォルトの名無しさん:2009/02/12(木) 00:29:39
煽ってるカスはほっといて…

>>458
複数スレッドには対応していないぞ。
461デフォルトの名無しさん:2009/02/12(木) 23:04:46
マルチスレッドで操作するなら1スレッド1コンテキスト
共有コンテキストにすれば別コンテキストで作ったテクスチャも使えるしな
描画中のテクスチャをいじったらどうなるか知らん
462デフォルトの名無しさん:2009/02/14(土) 20:14:01
ステンシルを作るときにあるポリゴンの外側を1にするとかって出来る?
全部1にして中を0にするとかは無しで
463デフォルトの名無しさん:2009/02/14(土) 20:59:43
つ 両面ステンシル
464デフォルトの名無しさん:2009/02/15(日) 18:53:36
glutCreateWindowで作ったウィンドウのタイトルバー消すのはどうやるんですか?

ttp://groups.yahoo.co.jp/group/opengl-jp/messages/851?viscount=-15&expand=1
ぐぐって出てきたこの方法やろうと思ったんですがウィンドウハンドルの取得が
「glutCreateWindowから返ってくるint値がウィンドウハンドル」ではないみたいで。
465デフォルトの名無しさん:2009/02/15(日) 19:04:17
FindWindowでやるしかないんじゃ
466デフォルトの名無しさん:2009/02/15(日) 23:08:26
どこぞでDCFromWindowとか使うやり方みた気がする。
DCはHGLRCから取得。
467デフォルトの名無しさん:2009/02/16(月) 19:59:04
上でスレッド関係の話が出てましたが便乗で質問。
あるスレッドで作ったテクスチャを別スレッドで描画することはできますか?
現状うまくいってないんですが、それがwglCopyContextの使い方が悪いのか、
あるいはそもそもレンダリングコンテキスト間でテクスチャの共有ができないのか、
よく分かっていないのです。
468467:2009/02/16(月) 20:00:10
>>458を見落としてました。>>467はいったんなかったことに…。
もう少し考えます。
469デフォルトの名無しさん:2009/02/17(火) 00:02:04
ウィンドウの端っこに座標軸(X軸Y軸Z軸)を描画したいんだけど、どうしたらいい?
オブジェクトを回転させたらいまいちうまくいかなくて困ってる・・・
470デフォルトの名無しさん:2009/02/17(火) 00:35:29
オブジェクトを書くときは
glPushMatrixで微分を退避してglPopMatrixで戻すといいよ
というかそうしないとオブジェクトが複数重なったら計算がめんどいだけだ
471デフォルトの名無しさん:2009/02/17(火) 01:03:25
>>468
それは描画しながらテクスチャを作ろうとした場合の話であって
最初にまとめて作られたテクスチャを別々のスレッドで利用するのはまた別の話だぞ
472468:2009/02/17(火) 02:35:26
>>471
自分の用途に関しては以下のような感じでうまくいきました。

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

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

473デフォルトの名無しさん:2009/02/18(水) 19:04:22
openGL +
474デフォルトの名無しさん:2009/02/18(水) 19:05:01
すみません、途中投稿しました
openGL + GLUTでプログラムを組んでいるのですが、
起動中に表示されるコマンドプロンプトを表示させないようにする方法はないのでしょうか?
475デフォルトの名無しさん:2009/02/18(水) 19:40:02
>>474
それは開発環境の問題じゃないの?
476デフォルトの名無しさん:2009/02/18(水) 19:52:42
コンソールでビルドしてんだろw
477デフォルトの名無しさん:2009/02/18(水) 20:00:36
>474
vcなら
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
478デフォルトの名無しさん:2009/02/19(木) 02:15:37
OpenGLで使えるDXF読み込みとかが出来るライブラリでお勧めのものとかありませんか?
479デフォルトの名無しさん:2009/02/19(木) 15:41:14
>>478
Delphi2005プログラミングテクニックVol10にそのまんまなコードがあるよ
ライブラリではないけど

>>469の続きなんだけど、特定のウィンドウ座標にオブジェクトの表示はできたけど、
-Z方向のオブジェクトが描画されない・・・どうしたらいいか教えて欲しい
いまはglOrthoで視体積を取って、gluUnProjectでウィンドウ隅に対応するワールド座標を取得、
取得した座標分だけglTranslarefでオブジェクトを移動してる
オブジェクトを移動してみたりしたけどいまいち上手くいかない
480479:2009/02/19(木) 15:42:00
>>478
失礼
勝手にDelphiだと思い込んでた
481480:2009/02/19(木) 16:04:32
おk
自己解決した

取得した座標分じゃなくて係数かけて減らしたら見えるようになった
無理やりな気がしないでもないけど
482デフォルトの名無しさん:2009/02/19(木) 22:38:18
PixelBufferObject使うと本当にテクスチャの更新速度上がるの?
483デフォルトの名無しさん:2009/02/19(木) 23:37:28
ARB_pixel_buffer_objectの仕様のOverviewによると
通常テクスチャ更新には最低1個のコピーが必要だけどそれが消せるので速いという理屈らしい
俺にはいまいちよくわからない
484デフォルトの名無しさん:2009/02/20(金) 00:52:58
PBOにテクスチャじゃなく座標情報を渡して
その情報を元に一括で描画をさせると早いということでしょ
485デフォルトの名無しさん:2009/02/20(金) 02:32:04
テクスチャ画像を生成する関数Fがあったとして、
glTexImg2DとかだとFを実行した結果をメモリに格納しておかないといけない。
けど、PBOだとglMapBufferでゲッツしたアドレスに対してFを実行すればメモリに画像を保存しなくても直接buffer objectに書き込めるという事だと思う。
本当にglMapBufferでGPUのメモリに直接読み書きできるような実装があるかどうかは知らないが、
仕様書によると
If the GL is able to map the buffer object’s data store into the client’s address space, MapBuffer returns the pointer value to the data store.
って書いてあるぽ。

486デフォルトの名無しさん:2009/02/20(金) 02:38:16
>>484
Buffer objectをvertex buffer objectとして頂点情報を書き込んでレンダリングして結果をテクスチャに書き込むって事?
それだとPBOが無くてもVBOで事足りるじゃん。
487デフォルトの名無しさん:2009/02/20(金) 03:17:40
http://www.songho.ca/opengl/gl_pbo.html
イメージをmallocしたバッファなんかに一端格納するんじゃなくて、直接PBOに入れとけば
そこからVRAMへはOpenGLがノンブロッキングのDMA転送で送ってくれるということらしい。

ただ、さらに下のダブルバッファリングの例はOpenGLのレンダリングが最大何フレーム
遅延するかはわからないと思うから毎回新しいバッファを割り当ててやらないと
やっぱりブロッキングされる気がする
488デフォルトの名無しさん:2009/02/20(金) 06:18:35
ドライバの実装方法次第だと思うけど
PBOのDMA転送というのをGPUが実装してないと意味がない
そのくらいだったらドライバで偽装してCPUでやってる可能性のが高いけど
489デフォルトの名無しさん:2009/02/20(金) 14:58:14
あんまり適当な知識で語るなよお前ら。見てて恥ずかしい。
490デフォルトの名無しさん:2009/02/20(金) 16:29:49
あんまり適当な知識で語るなよお前。見てて恥ずかしい。




491デフォルトの名無しさん:2009/02/20(金) 19:08:29
茶化すだけのレスをつける人間がいるな・・・NGするからIDつけてくれ
492491:2009/02/20(金) 19:11:16
IDじゃなかったコテハンかトリップ
493デフォルトの名無しさん:2009/02/21(土) 19:02:43
int i = 1;
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
glLineWidth( i );
glBegin(GL_LINE_STRIP);
glEnd();

iが10以上だとi=10と認識されて描画されてしまう。
この限界値ってどうやって変更するんです?
スペックによるの??
494デフォルトの名無しさん:2009/02/21(土) 19:17:14
ググッて5秒でわかることを何故調べない?
495デフォルトの名無しさん:2009/02/21(土) 21:15:47
>>493
限界値は限界値なので、それ以上は無理なのですよ。
ビデオカードorドライバによって決まるます。
496デフォルトの名無しさん:2009/02/23(月) 10:50:37
質問。
OpenGLで、ボーンアニメーション(スキンアニメーション)を扱うライブラリというのはありますか?
自前で作る前に、まずは実績のあるライブラリを探せ。とよく言われていたもので。

>>38の人が自前で実装していたのをみるに、「これ!」といったライブラリはまだないのでしょうか?
497デフォルトの名無しさん:2009/02/23(月) 12:21:48
>>496
D3DX
498デフォルトの名無しさん:2009/02/23(月) 12:43:50
何故にDirectX?
499デフォルトの名無しさん:2009/02/23(月) 12:55:40
実績のあるライブラリだろ?
500デフォルトの名無しさん:2009/02/23(月) 12:59:05
実績があるのは知ってるけど,OpenGLから呼び出してちゃんと使えるの?
501デフォルトの名無しさん:2009/02/23(月) 13:29:44
D3DXで頂点座標を計算→OpenGLで描画
502デフォルトの名無しさん:2009/02/23(月) 17:04:54
無駄が多すぎるなw
俺は使ったこと無いんだけどソースも公開されてるOgreはどうよ。
503デフォルトの名無しさん:2009/02/23(月) 18:56:26
>>496
FBX SDK
504デフォルトの名無しさん:2009/02/24(火) 23:22:47
ttp://developer.download.nvidia.com/SDK/10/direct3d/samples.html
Stencil Routed K-BufferってOpenGL2.1でも出来る?
シェーダー書くときは何を使うべき?
505デフォルトの名無しさん:2009/02/24(火) 23:37:34
あくまで推測だけど、d3d10のサンプルなら独自拡張を使わない限りgl3じゃないとおそらく無理だと思う
その世代だとシェーダは基本的にglsl一択、nVidiaのグラボならCgもアリ
506デフォルトの名無しさん:2009/02/24(火) 23:40:40
MSAAの個別サンプルを取得する必要があるらしいからOpenGL2.1標準じゃ無理
3.0標準でもたぶん無理
GeForceでGL_NV_explicit_multisample拡張使えばいけそうな気がする

シェーダはとりあえずNVIDIAなGPUで動けばいいというならCg
Radeonでも動いて欲しいならGLSL
制限ついてもいいからIntelやちょっと古いGPUでも動いて欲しいならCgでarbvp1/arbfp1プロファイル
CgはランタイムDLLが必要だが、GLSLはドライバ依存でドライバがアレだと酷いことになる
一長一短だな
507デフォルトの名無しさん:2009/02/25(水) 17:27:48
OpenGLって、スキニングアニメーションすら全部自前実装しなきゃならんのか?
いまどきすごいな
508デフォルトの名無しさん:2009/02/25(水) 17:34:54
D3D以外でAPI側が提供してくれる環境ってあるの?
509デフォルトの名無しさん:2009/02/25(水) 20:49:37
描画APIの仕事じゃないし何らおかしくないだろ
Direct3DでもD3DXとして分けてるくらいだ
510504:2009/02/25(水) 23:14:08
OpenGL Extensions Viewerで見てみたら、
OpenGLのバージョンは2.1と表示されている・・。3.0は使用不可?

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

>Radeonでも動いて欲しいならGLSL
RADEON HD 2600XT,Windows XPだからGLSLじゃないと無理なのか・・
シェーダーの記述は何を使う?RenderMonkey市か使ったこと無いんだが
511デフォルトの名無しさん:2009/02/25(水) 23:33:14
OpenGL3.0だとglBeginとかglEndとかも使えなくなっちゃうらしいから
gl2.1と書いたのだけど・・
(そもそもどうやって移行するのか分からない)
512デフォルトの名無しさん:2009/02/25(水) 23:38:42
>>510
OpenGL Extensions Viewerで表示されるバージョンは
通常のコンテキストでのGL_VERSIONだから2.1になってしまう。
9.1だとプログラムが落ちたけど、Catalyst 9.2からは3.0コンテキストを
カレントコンテキストにしてからGL_VERSIONを見ればちゃんと3.0になるよ。
もっともHD2xxxがOpenGL 3.0に対応してるかどうかは知らないけど。
513デフォルトの名無しさん:2009/02/25(水) 23:48:18
>>511
前方互換コンテキストでなければ非推奨になった機能も使える。

int attribs[] = {
  WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
  WGL_CONTEXT_MINOR_VERSION_ARB, 0,
  // 前方互換コンテキストを作るときはコメントを外す
  // WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
  0, 0
};
HDC hdc = wglGetCurrentDC();
HGLRC hglrc = bShareData == GL_TRUE ? wglGetCurrentContext() : 0;
HGLRC hglrc3 = wglCreateContextAttribsARB(hdc, hglrc, attribs);
BOOL bCtx = wglMakeCurrent(hdc, hglrc3);
printf("OpenGL Version : %s\n", glGetString(GL_VERSION));
514デフォルトの名無しさん:2009/02/25(水) 23:51:51
glx拡張は使ったことないんで誰かよろしく。
515デフォルトの名無しさん:2009/02/26(木) 06:25:36
NV_explicit_multisample拡張はGeForceでも最近の物なのでRadeonでは対応なさそうだな
Extentions Viewerは3.0対応してれば3.0って返してくれるんじゃなかったっけ
最近のRadeonのドライバで3.0対応したからHD2400以上ならドライバ更新すればいけるはず
516デフォルトの名無しさん:2009/02/26(木) 09:56:05
GLX だとこんな感じ

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

...

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

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

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

現状では3.0コンテキスト作ってバージョン取得するソフトは皆無。
GPU Caps Viewerは1.7.0で対応予定。
518デフォルトの名無しさん:2009/02/27(金) 21:53:02
GLSLで質問なんですが、バーテックスシェーダーから
フラグメントシェーダーにvaryingで値を渡すと
補間がかかって値が変わりますよね?
値を全く変えないでバーテックスシェーダーから
フラグメントシェーダーに値を渡すにはどうすればよいでしょうか?
519デフォルトの名無しさん:2009/02/27(金) 22:24:16
変わらないならuniform変数で
520デフォルトの名無しさん:2009/02/27(金) 22:47:48
全点通して変えないなら>>519だが
補間して欲しくないということなら宣言にflatをつければよい
ただしOpenGL3.0(GLSL1.3)の機能だ
521デフォルトの名無しさん:2009/02/28(土) 00:46:01
お二人ともレスどうもありがとうございます。

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

>>520
書いてませんでしたが今使ってるのは2.1です。
OpenGL3.0ではflatなんてのがあるんですね。
522デフォルトの名無しさん:2009/02/28(土) 01:48:56
>>511
どっちかというと、赤本がどうなるのかが気になる。
いきなりVBOから始まるんじゃ入門者にとって敷居が高すぎるし…
523sage:2009/02/28(土) 02:15:19
OpenGLのソースコードって公開されてないのかな?
524デフォルトの名無しさん:2009/02/28(土) 03:07:26
mesa3d
525デフォルトの名無しさん:2009/02/28(土) 07:11:38
>>518-521
uniform変数でVertexShader→FragmentShaderは無理だろ
そもそもuniform変数はShaderではread-onlyなんだし。
526デフォルトの名無しさん:2009/02/28(土) 09:44:54
flatはVBOの最初の頂点の値がずっと有効になるってことなのかな。
それじゃ全点通して変わらないのと一緒=unformでアプリから渡すのと同じだから
三角形ごとに切り替わるのかな
527デフォルトの名無しさん:2009/02/28(土) 22:13:16
glBegin(GL_TRIANGLES);
for (int i = 0; i < num_triangles; ++i) {
  glNormal3fv(normals[i]);  // トライアングル一つにつき
  glVertex3fv(vertex[i][0]); // 法線を一つ指定
  glVertex3fv(vertex[i][1]);
  glVertex3fv(vertex[i][2]);
}
glEnd();

とか、

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

みたいな描画って、頂点配列でできますか?
今は困ってないけど、GL3で頂点配列しか使えなくなると、
この辺の柔軟性が無くて困るような・・・。
528デフォルトの名無しさん:2009/02/28(土) 22:13:50
あ、GL2.1でもShadeModelをGL_FLATにすれば
gl_Colorとかでパラメータ渡せば補間無しにできるわ
GL3ではShadeModelがDeprecateだからflat使えということになるんだあ
529デフォルトの名無しさん:2009/02/28(土) 22:16:49
>>527
そういう頂点配列をいちいち作ればいい
glBegin/glEndの中ではそういうことやってるんだろうな
530デフォルトの名無しさん:2009/02/28(土) 23:50:31
>>527
GL_ARB_instanced_arrays / GL_EXT_bindable_uniform / Vertex Texture Fetch+GL_ARB_texture_float
/ GL_EXT_transform_feedbackで前処理 / CPUで前処理

お好きなのをどうぞ。そもそも3.0フルコンテキストならImmediateも使えると何度(ry
531デフォルトの名無しさん:2009/03/01(日) 10:35:05
ゲームで一定のアニメーションをさせる時にPCによって性能が違うから
FPSが変わってくるけどアニメーションは一定の速度にしたいのだけど
60FPSなら1000/60msでタイマーで割り込みを掛けると約16msで
割り込み速度が追いつかなくてのろのろになるんだけど
普通はどうやってやるの?
スレッドでループさせて16ms間隔のSleepをさせるとか?
532デフォルトの名無しさん:2009/03/01(日) 11:09:11
>>531
ゲームはFPSを一定にする必要は無いんじゃないか?
533デフォルトの名無しさん:2009/03/01(日) 11:10:31
フルスクリーンにしてリフレッシュレートをAPIで変更する
534デフォルトの名無しさん:2009/03/01(日) 11:44:46
1. 前のフレームから16ms経ったか調べる
2. Sleep(0)で一瞬寝る
3. 1に戻る
OpenGL関係ないやん
535デフォルトの名無しさん:2009/03/01(日) 12:03:06
>>534
sleep時間ゼロだと、ビジーループにならないか?
536デフォルトの名無しさん:2009/03/01(日) 12:12:55
WindowsではSleep(0)だと一旦他のプロセスに渡しはする
必要以上にCPU時間をとりはするけど思う程多くはないし
ゲームだったら多少無駄に喰うくらい問題ないだろう
537デフォルトの名無しさん:2009/03/01(日) 12:19:39
vsync割り込みに描画関数を設定するのが正攻法なんだろうけどね。
WinAPIを良く知らないので的確なアドバイスができない。

さすがに、ここまで低レベルの処理はGLUTには無いだろうし。
538531:2009/03/01(日) 12:21:31
FPSはアニメーションのフレーム数の意味
実際の描画フレームはもっといく
1秒間に60フレーム分の動作をさせて
描画は完全に独立したフレームにするから30だったり100だったりする
つーかゲームって普通そうだろ

>>ゲームだったら多少無駄に喰うくらい問題ないだろう
そうか?
539デフォルトの名無しさん:2009/03/01(日) 12:25:14
vsyncつかうとリフレッシュレートが60じゃない場合に面倒じゃない?
リフレッシュレートが85とかだとゲームが速くなるってのも同人ならよくあるが…
540デフォルトの名無しさん:2009/03/01(日) 12:26:16
フルスクリーンでリフレッシュレートをAPIで設定してvsync割り込みに同期して描画する
これが一番単純
541デフォルトの名無しさん:2009/03/01(日) 12:32:07
>>538
画面同期しなくていいなら、自分が良く使う方法は

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

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

こんな感じ。
542デフォルトの名無しさん:2009/03/01(日) 13:18:17
>>541
とりあえずそれでやってみる
543デフォルトの名無しさん:2009/03/01(日) 20:36:24
>>540
最近のノート用ゲフォ等では、低電力モード時にリフレッシュレート変更や
vsync同期非同期切替が出来なかったりする。
544デフォルトの名無しさん:2009/03/01(日) 20:41:57
そんなものは動作保障外にすればよいのだ
545デフォルトの名無しさん:2009/03/01(日) 22:52:01
オブジェクトの移動処理を
全てタイマーをもとにして行えばvsyncとか問題ない!
546デフォルトの名無しさん:2009/03/01(日) 23:14:38
なんか、ゲーム製作板みたいな内容になってきたな。
OpenGLの話題となると、ゲームの話が多くなるのは当然といや当然かもしれないが。
547デフォルトの名無しさん:2009/03/02(月) 13:26:45
compizみたいなのもあるっちゃあるがねえ
548デフォルトの名無しさん:2009/03/04(水) 22:36:20
ゲームの流れになってるから便乗して聞いてしまう。

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

同次行列を持っていたほうが柔軟で応用が効きそうな気はするんだが、そうなると
回転処理のときにクォータニオンを自分で実装しなきゃいけないからやや面倒で。
549デフォルトの名無しさん:2009/03/06(金) 18:15:50
構造体または配列 [ x, y, z ]のメモリ配置が
列ベクトルないし純虚数のメモリ配置に直接マップできる状態なら、
どちらでも同じかなという気がする。
C99で<complex.h>が入ってたり、新言語でも複素数サポートが充実してるんで、
2次元の回転処理を大半複素数でやるようになってきたのだが、
ガウス平面上の回転も重視されるようになったのは最近とかなんとか。
まあ20世紀前半は物理学で線形代数が花盛りだったしなあと思うと、そんなものかもしれない。
550デフォルトの名無しさん:2009/03/06(金) 22:42:28
>>549
サンクス。
548だが、考えた結果行列で持つことにした。
OpenGL自体との相性がいいしね。
551デフォルトの名無しさん:2009/03/06(金) 22:51:54
>>550
四元数を自前実装するときに[ i, j, k, 1 ]にすれば、
そのメモリ配列そのままで四元数にできると思うよ
552デフォルトの名無しさん:2009/03/07(土) 17:36:09
質問です
glTexSubImage2Dを使ってテクスチャ画像をアップデートできるみたいなんですが
gluBuild2DMipmapsで作成したテクスチャにglTexSubImage2Dをやるとうまくいかないんでしょうか?

gluBuild2DMipmapsで最初に読み込まれた画像から全然変化しないのです
553デフォルトの名無しさん:2009/03/07(土) 19:04:49
全部のミップマップレベルを更新しないとだめよ
自前でやるのが面倒なら
GL_SGIS_generate_mipmap拡張があれば、テクスチャをバインドしたあとに
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
で自動ミップマップ生成が有効になる
あとはglTexSubImage2Dで全てのミップマップが更新されるんじゃないかな
554552:2009/03/07(土) 20:38:47
すいません自己解決しました、根本的な解決ではありませんが

gluBuild2DMipmapsをglTexImage2Dに置き換えたら成功するようになりました
最近のglTexSubImage2Dはピクセル数が2のべき乗じゃなくても成功するんですね
555デフォルトの名無しさん:2009/03/07(土) 22:31:19
>>553
前々から言われてるけど、RadeonはGL_GENERATE_MIPMAPもglGenerateMipmapも効かなくて困る。
うまくいってるって人の書き込みを参考にしてみたけどどれも駄目だった。
うまい次善策はないものだろうか。

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

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

XP + RADEON HD 4830 + 最新Catalystでは使えるんでしょうか?
557デフォルトの名無しさん:2009/03/11(水) 00:11:24
手っ取り早くはGeForce買え
Catalyst 9.2でもジオメトリシェーダはまだっぽい
558デフォルトの名無しさん:2009/03/11(水) 00:33:14
ようやく仕様が公開されたGL_AMD_vertex_shader_tessellatorの中に
GL_EXT_geometry_shader4との関係が書いてあるから早晩実装されるでしょう。
559デフォルトの名無しさん:2009/03/11(水) 23:53:12
最初に2乗じゃないとだめだと決めた奴ってきっと馬鹿だ
560デフォルトの名無しさん:2009/03/12(木) 01:05:27
>>559
そういうことは、テクスチャフェッチ/フィルタリングユニットのマイクロコードを書いてから言えw
561デフォルトの名無しさん:2009/03/12(木) 18:04:23
計算機資源が豊富になったあとから後出し文句を言うのはフェアじゃない。
つか文句自体カッコ悪い。
562デフォルトの名無しさん:2009/03/15(日) 12:35:41
windowsでインストールされているopenglのバージョンを知るにはどうしたらいいでしょう?
563デフォルトの名無しさん:2009/03/15(日) 14:18:02
>>561
計算機資源豊富な今でも、2^nから外れるとパフォーマンスは急激に劣化するしなあ。
564デフォルトの名無しさん:2009/03/15(日) 14:19:28
>>562
OpenGLのバージョンはGPUとそれのドライバで決まる
OpenGL Extensions Viewerとかどうぞ
565デフォルトの名無しさん:2009/03/15(日) 18:04:49
>>560
その仕様が出来た頃はマイクロコードどころかFPGAとかで
実装していたわけで。テクスチャユニットが8個ならチップの
集まりが8組基盤の上に並んでいる。そういう時代。
物理的にロジックが実装されている以上柔軟性を持たせる
のにも限度があるから、2^nの制限もやむを得ないところ。

RealityEngine辺りの現物と論文を比べると結構面白い。
論文に書かれているブロックダイアグラムそのままにチップ
が大きな基盤に綺麗に並んでいるので非常に分かりやすい。
566デフォルトの名無しさん:2009/03/15(日) 18:32:38
openglってbmp画像を読み込む命令ってないんすか
567デフォルトの名無しさん:2009/03/15(日) 19:21:22
無いよ。全部自前でやるか、他の適当なライブラリ使って。
568デフォルトの名無しさん:2009/03/15(日) 23:12:27
>>564
無事opengl3.0がフルに使えるようになりました。
ありがとう。
569デフォルトの名無しさん:2009/03/16(月) 19:13:49
とりあえず、初心者は2.0の赤本を買っておけば大丈夫ですよね?。



あと、皆さんはどんな開発環境を使ってますか?。
570デフォルトの名無しさん:2009/03/18(水) 00:08:08
赤本があればいいが、それで初心者でも安心かはよくわからない

開発環境は主にiMacでgccとVIM
OpenGL Profilerが非常に便利だ
WindowsマシンはVistaでGeForceとRadeonとChromeを適宜差し替え
WindowsでもgccとVIM、たまにデバッグ用にVisual Studio
gDEBuggerが欲しいけど高い
571デフォルトの名無しさん:2009/03/19(木) 10:34:24
ははは
572デフォルトの名無しさん:2009/03/19(木) 12:15:03
ひひひ
573デフォルトの名無しさん:2009/03/19(木) 13:06:00
拡張機能を使い始めると赤本だけでは不十分な気がするのですが
(例えば、赤本に wglChoosePixelFormatARB() って載ってましたっけ…?)
拡張機能の学習にお勧めの書籍はありますでしょうか。
今のところ OpenGL Superbible あたりを買ってみようかと考えています。
574デフォルトの名無しさん:2009/03/20(金) 00:20:20
Superbibleはサンプルが多めでちょっと範囲が広い赤本という感じだったな
拡張もある程度載ってるけど、応用的なものは少ない
基本的なものを知りたいならいい本だけどね
洋書いけるならMore OpenGL Game Programmingが結構面白かった
ちょっぴり古いけどまだ参考にはなると思う
575573:2009/03/20(金) 20:56:45
>>574
ありがとうございます。そちらも入手してみます。
576デフォルトの名無しさん:2009/03/24(火) 00:34:59
Visual C# 2008EEでC# OpenGL Framework(OpenGL v1.2.1)を使っています。今回行列演算の順序の確認や、挙動を理解するために以下のコードを書きました。
起動時にgl.Frustum(-client_aspect, client_aspect, -1.0, 1.0, 1.0, 100.0);で視体積を設定し、あとは描画のみです。(gl.Frush()など省略している部分もあります。)

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

これで視線に対し、y軸を中心に45度傾いた四角形が2つ左右対称に描画されると思うのですが、実際には右の四角形が手前に来ている感じになってしまいます。
どこが間違っているのでしょうか。
OpenGLを始めて日が浅く質問内容に不備があったり、意味不明なことをしていたりするかもしれませんが、よろしくお願いします。
577デフォルトの名無しさん:2009/03/24(火) 00:37:02
>>570
すいません、ありがとうございます。

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

上記のコードだと、2つのglTranslateがY軸回転の前後にあるので、まさにその状況。
Modelview Matrixを取得して値を見てみながら動作を確認すれば理解しやすいかも。
579デフォルトの名無しさん:2009/03/24(火) 10:12:30
>>578
ありがとうございます。行列確認しつつ試してみます。
580デフォルトの名無しさん:2009/03/24(火) 19:54:06
>>576
今実際に逐次行列を確認しながら、実行してみたところ挙動を理解することができました。
TranslatedやRotatedはワールド座標ではなくモデル座標で動作するんですね。Rotatedがワールドでもモデルでも差があまりないためTranslatedもつられて勘違いしていました。
ありがとうございました。
581デフォルトの名無しさん:2009/03/25(水) 08:07:51
モデル座標系とかワールド座標系とかの区別はOpenGL自体にはないよ
そこはどこからどこまでがモデル座標系なのかワールド座標系なのか自分で管理しないとだめ

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

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

これで描画処理を実行してみたところ、レッド3面とシアン3面でコの字を組み合わせたような状態になってしまい、他の色のテクスチャが反映されていません。
この描画処理が入る直前でテクスチャの中身を確認してみても、しっかり各色のテクスチャが格納されていました。
何が間違っているのでしょうか。お願いします。
584デフォルトの名無しさん:2009/03/26(木) 17:53:53
自己解決しました。単にDrawArraysの引数が間違っていただけでした。スレ汚しすみませんでした。
585デフォルトの名無しさん:2009/03/27(金) 11:56:22
質問です。

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

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

Direct3DのPowerについては、下記のサイトに計算式がありました。
http://msdn.microsoft.com/ja-jp/library/cc373089.aspx
ただ、こちらでは値の範囲が0〜正の無限大 となっているため、この値をそのままGL_SHININESSに入れても期待通りになりそうもありません。
586デフォルトの名無しさん:2009/03/27(金) 12:52:07
赤本のライティング(照明処理)の章に計算式載ってる。パッと見、同じに見える
587デフォルトの名無しさん:2009/03/27(金) 14:32:47
ありがとうございます。
ついでなので赤本も買ってみます
588デフォルトの名無しさん:2009/03/27(金) 19:20:04
http://kissho.xii.jp/1/src/1jyou69631.png
マウスのドラッグにより物体を見たままに回転させたいのですが、上記のような動作をさせている良いサンプルなどはないでしょうか。
589デフォルトの名無しさん:2009/03/27(金) 20:28:09
この画像では若干説明不足でした。現状例えば立法体なら、6面中4面では初期状態からマウスを下に動かせば上の画像における2番が見え、上に動かせば反対側、右に動かせば3番が、といった具合に回転させられます。
しかし3番においてマウスを下に動かすと2番の面が見えるわけではなく、視線(その時点でのモデルのx軸)を軸として回転する形になってしまいます。
590デフォルトの名無しさん:2009/03/27(金) 20:33:00
四元数とか使う奴だな
591デフォルトの名無しさん:2009/03/27(金) 21:13:39
592デフォルトの名無しさん:2009/03/27(金) 21:17:56
スレッド間でのテクスチャの共有について質問があります。
描画用のスレッドAで以下のようにリストを共有して、

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

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

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

で、スレッドBで作成したテクスチャはきちんと描画されるのですが、
CPU負荷が上がりっぱなしになります。
解放を忘れているコンテキストがあるのかもと思うのですが、
なにか間違えていますか?
ちなみに、スレッドBの最初のwglMakeCurrentを呼ばなければ
テクスチャも描画されない代わりに負荷も上がりません。
593デフォルトの名無しさん:2009/03/27(金) 21:50:46
>>588-589
ttp://zoome.jp/kontonsoft/diary/3/
このビデオでやってるみたいな回転をしたいってことですか?
これはタッチパネル操作だけど
594デフォルトの名無しさん:2009/03/27(金) 21:54:21
>>588
視界の右方/上方ベクトルを、適宜視点位置ベクトルに加え続ければいいよ
595デフォルトの名無しさん:2009/03/27(金) 22:00:13
皆さんありがとうございます。クオータニオンを勉強してみたいと思います。
>>593
そんな感じですね。グーグルアースは画面上で渦状の回転も入りますがあんな感じというとわかりやすいでしょうか。
どの方向から見ていても横にドラッグすれば画面上で横向きに回転、縦にドラッグすれば縦向きに回転といった感じです。
596デフォルトの名無しさん:2009/03/27(金) 23:00:02
>>594
申し訳ありません。まだまだ経験が浅くよく理解できないのですが、視界の右方、上方ベクトルというのはPROJECTION_MATRIXの中でしょうか。
597デフォルトの名無しさん:2009/03/27(金) 23:53:27
>>592
新しいコンテキストはスレッドBで作った方がいいんじゃないだろうか
598592:2009/03/28(土) 01:07:33
>>597
なるほど。元のレンダリングコンテキストをスレッドBに渡して、
スレッドBでwglCreateContextとwglShareListsを呼ぶわけですね。
今ソースが手元にないので明日試してみます。ありがとうございます。
599592: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);

以上
600592:2009/03/28(土) 17:42:32
すみません。やっぱり駄目でした…。
負荷は上がらなかったものの、肝心のテクスチャが描画されていませんでした。
wglShareListsは元のスレッドで呼ばないといけないということはないでしょうか。
今日は時間切れなので、後日もう少し試してみます。
601デフォルトの名無しさん:2009/03/28(土) 21:08:16
透過ありのテクスチャを各面に貼り付けた立方体を描画したのですが、ある面から見ると背景の別の画像がひとつも見えず透過できていない一方、またある面では別の画像が1枚だけ見え、さらに他の面では2面(ry
といった感じに半端な透過処理になってしまっています。挙動を見た感じでは恐らく原因は、テクスチャ座標か各面のポリゴン座標の配置が時計廻りかそうでないかにあると思うのですがどうなんでしょう。
602デフォルトの名無しさん:2009/03/28(土) 22:09:24
描画順序じゃね?
603デフォルトの名無しさん:2009/03/28(土) 22:18:53
>>601
その状況からして、Depth TestでFailになっているからだね。
半透明の物体は、奥から手前にソートして描画しないとうまくいかないというのは認識してる?
604デフォルトの名無しさん:2009/03/28(土) 22:47:49
>>602-603
ありがとうございます。奥から描画しないといけないとは知りませんでした。
ソートは面倒になりそうですね。
605デフォルトの名無しさん:2009/03/28(土) 23:28:19
>>600
スレッドBでテクスチャを書き換え、スレッドAで表示するプログラム
作ったことあるけどこうしてた。>>599だとwglCopyContext使ってなくね。

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

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

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

//あと片付け
wglMakeCurrent(NULL, NULL); //不必要?
wglDeleteContext(RC);
606592:2009/03/29(日) 13:57:10
>>605
同じようにしてみたんですが駄目でした。
605に挙げていただいたやり方は、下に上げた4つの組み合わせの中だと1番に該当すると思います。
ちなみに2番の例だとwglCopyContextを呼ばなくても描画はされました。

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


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

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

うーん…。
607デフォルトの名無しさん:2009/03/29(日) 21:52:45
>>606
うーん

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

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

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

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

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

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

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

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

609デフォルトの名無しさん:2009/03/30(月) 01:16:24
素朴な疑問なんだけど、wglのcontextはスレッドセーフなの?
610デフォルトの名無しさん:2009/03/30(月) 01:21:04
C# で OpenGL を使うクラス作ってる人って結構いるけど
あれってどうやって.NETの窓につっこむようにできてるの?
611デフォルトの名無しさん:2009/03/30(月) 01:29:06
.NETの窓でもHWNDとかHDCが取得できたと思う
612デフォルトの名無しさん:2009/03/30(月) 01:47:55
>>609
例えば「スレッドセーフではない」というのはどういう状況ですか?
1つのレンダリングコンテキストに対して複数スレッドがwglMakeCurrentを呼ぶとまずいということですか?

613デフォルトの名無しさん:2009/03/30(月) 13:39:50
>>612
GL自体が激しくステートマシンなので、
同じコンテキストに対し、あっちのスレッドでglBeginしてglEndする前にこっちのスレッドからglBeginしたりすると困ったことになる。
だからこういうのは、異なるスレッドが一つのコンテキストを共有できたりしないように規制したりするんだが、
wglの動作はよく知らん。
614612:2009/03/30(月) 20:54:34
例えば異なるスレッドが同じRCに対してwglMakeCurrentを呼ぶと
要求されたリソースは使用中というエラーが返るけど、そういうことならスレッドセーフなのではないかな。
あるスレッドでアクティブなRCのリソースを異なるスレッドが共有するために
wglShareListsがあるわけだし。
615デフォルトの名無しさん:2009/03/30(月) 22:09:22
WinのOpenGLはスレッドごとにコンテキストが分かれてるから、それぞれのスレッドに別のレンダリングコンテキストを与えればいい
616デフォルトの名無しさん:2009/03/31(火) 10:24:08
二つのContext間で目的のテクスチャなりバッファなりが共有できてるのかが、残る疑問かなぁ
617デフォルトの名無しさん:2009/03/31(火) 21:20:16
>>608

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

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

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

参考URL
the best is yet to be: テクスチャを異なるレンダリングコンテキスト間で共有するにはなどなど・・・
http://corvette.blogzine.jp/blog/2005/08/post_f3c1.html
618デフォルトの名無しさん:2009/03/31(火) 21:27:55
またマルチスレッドか
もう誰かテンプレ用にまとめ作っちゃいなYO!
619592:2009/03/31(火) 23:56:13
テンプレになるかどうかわからないけれど、これまでの自分なりの理解。

・OpenGLの関数(glBegin等)はカレントのレンダリングコンテキストに対して実行される。
・OpenGLではスレッドごとにカレントのRC(レンダリングコンテキスト)を与えないといけない(例えばwglMakeCurrent)。
・異なるスレッドが同じRCに対してwglMakeCurrentを呼ぼうとするとエラー(GetLastErrorは「リソース使用中」と返す)。
・別のスレッド(つまり別のRC)で作成したテクスチャやディスプレイリストは使えない。
・使いたい場合には複数のRCでリソースを共有しないといけない(例えばwglShareLists)。
・別のスレッドでカレントなRCをwglShareListsに渡そうとするとエラー(GetLastErrorは「リソース使用中」と返す)。
 例えばhrc1がスレッド1でカレントとして、スレッド2がwglShareLists(hrc1, hrc2)を呼んだらエラー。
・解決方法としては、wglShareListsに渡したいRCを一旦カレントからはずせばOK?
 例えばスレッド1でwglMakeCurrent(NULL, NULL)→スレッド2でwglShareLists(hrc1, hrc2)→スレッド1でwglMakeCurrent(hdc, hrc1)
 ↑実はこれをしたらハンドルが無効のエラーが出た(でも一見してまともに動いてる風)
 あるいはスレッド1でwglShareLists(hrc1, hrc2)→スレッド2でwglMakeCurrent(hdc, hrc2)
 ↑これはエラーもなくまともに動いている風
・wglCreateContextはどのスレッドで呼んでもいい(wglMakeCurrentが重要)?
620デフォルトの名無しさん:2009/04/01(水) 08:16:17
Windowsはmutexの替わりに何使うんだろ
621デフォルトの名無しさん:2009/04/01(水) 19:12:37
>>619
おつ。
個人的には最後の項目が良くわからんなぁ。

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

俺の知識不足かもしれん。
622デフォルトの名無しさん:2009/04/01(水) 20:22:37
米シリコン・グラフィックス、連邦破産法11条の適用を申請
http://jp.reuters.com/article/domesticFunds/idJPnTK834789220090401

ワロタ
623デフォルトの名無しさん:2009/04/01(水) 20:36:01
またか。
景気が底を打つまで
そのまま冬眠させておいた方がいいな。
624デフォルトの名無しさん:2009/04/01(水) 22:41:39
>>622
OpenGLは債権者のところに譲渡されるのかな?
無料のままだといいね
625デフォルトの名無しさん:2009/04/02(木) 00:57:38
N+で見境無くコピペしてるやつがいるけど
あれは何が目的なんだろ
626デフォルトの名無しさん:2009/04/02(木) 18:49:22
お前ら素人はSGIなんてしらねーだろ、俺知ってるからショックだぜ。
とかかなぁ。
627デフォルトの名無しさん:2009/04/02(木) 19:31:08
SGIは有名だろ
ttp://www.sgi.org/
628デフォルトの名無しさん:2009/04/02(木) 22:33:53
既出だけど

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

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

シリコングラフィックスは、OpenGLの開発元であり、「Open」と冠しているもののあくまで「オー
プン仕様」であり、またクロノスグループという団体に管理を移管しているものの特許などの
権利は全て同社が保有しており、同技術を採用しているPLAYSTATION3への影響が懸念される。
http://gamerbook.net/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9:2009/04/01:%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%81%8C%E7%B5%8C%E5%96%B6%E7%A0%B4%E7%B6%BB
629デフォルトの名無しさん:2009/04/03(金) 01:17:02
てっきりエイプリルフールネタだと思ってたんだが
630デフォルトの名無しさん:2009/04/04(土) 00:11:49
>>628
これで買収した会社がOpenGLから収益をあげようとして
第二のSCO訴訟が起こったら、また盛大な祭りになるんだろうなあ。
631デフォルトの名無しさん:2009/04/04(土) 00:29:02
OpenGLの特許って何かあったっけ?
商標ならSGIだったと思うけど
632デフォルトの名無しさん:2009/04/04(土) 00:43:18
glEnable(・・・・)等は必要になったときに指定するのか、それとも使用する場合には最初にまとめて指定するのか、どちらがいいのでしょうか。お願いします。

今回FBOでテクスチャを関連付けてオフスクリーンレンダリングを行う際に、glEnable(GL_TEXTURE_2D)を指定する位置によって生成されるテクスチャが違うもの(妙に明るさが違う)になってしまったもので。
・テクスチャの事前設定やFBOの生成前にglEnable(GL_TEXTURE_2D)を指定し、オフスクリーンレンダリングでテクスチャを生成後、オブジェクトに貼り付け画面に描画。→貼り付けられているテクスチャが妙に暗い。
・上記の設定、オフスクリーンレンダリングでテクスチャを生成後、glEnable(GL_TEXTURE_2D)を指定し、オブジェクトに貼り付け画面に描画。→恐らく正しいテクスチャが貼り付けられる。
633デフォルトの名無しさん:2009/04/04(土) 09:10:34
オフスクリーンでレンダリングしたい絵にテクスチャが必要なら
enableするべきだし、必要ないならdisableするべきってだけの話では?
634デフォルトの名無しさん:2009/04/04(土) 11:18:05
FBOにはglEnable(GL_TEXTURE_2D)は関係ないよ
glEnable(GL_TEXTURE_2D)は
テクスチャを今から行う描画に使うかどうかを指定するだけ
635デフォルトの名無しさん:2009/04/04(土) 12:37:41
>>633-634
ありがとうございます。では明確に画面描画に使用する直前に指定したほうが問題はなさそうですね。
636592:2009/04/05(日) 02:26:02
マルチスレッドのテクスチャ共有で負荷が高くなる理由がおそらくわかりました。
自分の環境はVista+SonyのVaioZ(GPUがintelオンボードとnVidiaを切り替え可能という機種)なんですが、
GPUをnVidiaからオンボードに切り替えたら負荷が高くなるという現象は出なくなりました。
nVidiaのチップとVistaのドライバー関連の問題のような気がします。

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

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

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

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

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

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

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

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

638デフォルトの名無しさん:2009/04/06(月) 22:45:11
>>636
バイナリでもいいのでテストツールあげてくれたら、こちらでも検証するよ。
こちらはtypeSZで、同様にオンボintel&ゲフォ7400Mの切り替え式です。
639592:2009/04/07(火) 20:47:31
>>638
かたじけない。
アップロードするのは初めてでちょっと不安ですが、↓に置いてみました。
DLキーはgl、ソース付きのzipファイルです。
http://uproda.2ch-library.com/lib117505.zip.shtml

起動するとブルーのテクスチャが見えるはずですが、
スペースキーを押すとテクスチャを更新します(見た目は変わりません)。
このときに負荷が高くなります。
nVidiaのGPUが載ったデスクトップ(Vista64)でも試してみましたが、やはり負荷が高くなりました。
640592:2009/04/07(火) 21:12:43
連続ですみません。ATIのGPU+Vista64の環境で試せました。
テクスチャ更新後の負荷は高くなりませんでした。
やっぱりnVidiaのドライバーかなぁ…。
641デフォルトの名無しさん:2009/04/07(火) 22:13:56
スキンメッシュとか簡単に表示できる?
642デフォルトの名無しさん:2009/04/07(火) 22:22:49
>>641
自前で実装です^^
643デフォルトの名無しさん:2009/04/07(火) 23:20:42
>>639
638ではないがChrome 430GTとGeForce 9500GTで試してみた。どちらもVista32bit
Chromeの方は特に問題なく動いた
スペース連打すると当然それなりのCPUは使うがそれ程ではない
GeForceの方は最初起動した時は何度かスペース押したら100%どころかアプリが応答しなくなった
しかし強制終了して3回目以降はこちらも全く問題なく動くようになったので、うちの環境が怪しいだけかも
ドライバはちょっと古めの180.48
ドライバ設定のスレッドした最適化が怪しいかと思ったがオンでもオフでも自動でもかわらなかった

あんまり参考にならない情報ですまん
644592: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で○

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

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

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

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

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

お節介でなければ今後もテスト付き合いますので。
647638:2009/04/08(水) 00:15:57
更に追記。
素朴な疑問なんだけど、WM_PAINTでなぜBeginPaintしないの?
これだと無効領域がクリアされずにWM_PAINTが発生し続けないか?
単にそれで負荷になってる気もするんだけど。

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

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

>>638さんの環境はやはりVista32なのですね。
Vista64+NVIDIAで大丈夫だったという人がいると一気に不安になれるのですが…。
649デフォルトの名無しさん:2009/04/08(水) 02:17:46
サイドバイサイド構成がうんたらかんたら
650デフォルトの名無しさん:2009/04/08(水) 03:50:43
>>648
>InvalidateRectすることでWM_PAINTを発生させています。
>しょぼいPCだと負荷になるかもしれませんが、今時のPCであれば無視できる程度かと。

いやいやそうじゃなくて、
WM_PAINTってのは無効領域が存在するときに繰り返し発生し続けるメッセージなんだよ。
すなわちWM_PAINTを一度で止めるためには無効領域をクリアしなきゃならない。
BeginPaintってのはそのクリアを担当する関数でもあるんだよ。
651592:2009/04/08(水) 10:11:52
>>650
丁寧にありがとうございます。誤解してました。
つまり今のやり方だと10msecごとにWM_PAINTが呼ばれる+
無効領域を有効にしようと頻繁にWM_PAINTが呼ばれる、
という状況なわけですね。
OpenGLから離れちゃって申し訳ないですが勉強になりました。
652638:2009/04/08(水) 14:54:40
>>651
どういたしまして。
修正後のテストも付き合いますのでどうぞ
653デフォルトの名無しさん:2009/04/08(水) 21:32:29
まさかこのスレでS3スレ住民と出会うとは思わなかった
654デフォルトの名無しさん:2009/04/10(金) 23:32:35
cygwinでglfwのサンプルをコンパイルするとwarningが出ます。
g++ lesson01.cpp -o lesson01 -lglfw -lglu32 -lopengl32
Warning: resolving _glClear by linking to _glClear@4
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups
どうすれば解決できるでしょうか。
655デフォルトの名無しさん:2009/04/11(土) 11:15:15
>654
>Use --enable-stdcall-fixup to disable these warnings
では解決しないのか?
656デフォルトの名無しさん:2009/04/11(土) 23:54:36
頂点のインデックス指定について悩んでいます。
ややこしい話なのでうまく伝わるかどうか自信が無いのですが、
たとえば、6面体のサイコロを描画したいときを考えます。

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

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

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

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

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

テクスチャ座標や法線データを、頂点座標ではなく頂点インデックスに所属させる方法というものがあれば
教えて頂きたく、よろしくお願いいたします。
657デフォルトの名無しさん:2009/04/12(日) 00:58:26
サイコロなら基本6x4の24頂点必要。ポリゴン間の法線やテクスチャ座標の共有が
頂点と同じであると判定できる場合のみ8頂点で済ませることができる。
658656:2009/04/12(日) 01:02:51
>>657
やっぱりそうか…
ありがとうございます。
場合分けして展開するのもかなり面倒なので、頂点重複で持つことにします。

しかし、OpenGL初期のころのハードでは行列演算のコストがそんな安いわけではなかったのに、
こういう仕様になっているのが意外といえば意外です。
フラットシェーディングのときには、頂点が共有できないってことですし。
659デフォルトの名無しさん:2009/04/12(日) 03:52:28
3DCGプログラミングの手法や概念の勉強をしたいのですが
OpenGLで低位の表現から始めるほうが有効でしょうか?
それとも3DCGエディタツールの仕様書を眺めて使うほうがいいでしょうか?
660デフォルトの名無しさん:2009/04/12(日) 12:13:46
>>659
両方並行というがよいのではないでしょうか。
たとえば、OpenGLの赤本を読みながら、メタセコイアのmqoファイルのフォーマットを理解してみましょう。
別にVRMLでもDXFでも構わないですが、テクスチャやシェーディングなどをサポートしているほうがいいでしょう。

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

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

ファイルフォーマットを読み込んで画面に表示するプログラムを作ることで、
そのAPIセットのエッセンスをかなりの程度理解することができます。
661デフォルトの名無しさん:2009/04/12(日) 19:04:05
>>660
丁寧な返答ありがとうございます.
あなたの提案に則った勉強をしようと思います.
さきほどMetasequoiaをインストールしてmpoファイルを見てみましたが
ずいぶんと可読性の高いフォーマットですね.
ありがとうございました.
662デフォルトの名無しさん:2009/04/14(火) 00:13:58
>660
659ではないけど、すげーさんくす
さっそくやるわ。テンプレに入れて欲しいぐらい良い解答だった、おれにとって。
663デフォルトの名無しさん:2009/04/21(火) 12:09:49
デプスについて質問なんですが
glDepthRangeには-1〜1の範囲の値しか設定できないのでしょうか?
絶対値で1以上の値を設定したら1になってしまうって事であってますか?
664デフォルトの名無しさん:2009/04/21(火) 12:39:43
ttp://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/depthrange.html

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

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


ttp://oshiro.bpe.es.osaka-u.ac.jp/people/staff/imura/computer/OpenGL/coordinates/disp_content
OpenGL では、glViewport で x, y 座標の、glDepthRange で z 座標のマッピング先を指定する。glDepthRange は普通指定する必要はない。
665デフォルトの名無しさん:2009/04/22(水) 08:23:35
>>663
0<=zNear<=zFar<=1 でしょう。
zNearとzFarは逆転できるのかなぁ? やったことないや。
manpageには
 Thus, the values accepted by glDepthRange are
 both clamped to this range before they are accepted.
と書いてあるので、範囲外の値を指定しても0〜1にクランプされちゃうでしょうね。
666デフォルトの名無しさん:2009/05/01(金) 07:23:00
[OpenGL] シェーダでポインタ
ttp://www.kumaryu.net/cgi-bin/diary/?date=20090428#p02
DX11の機能一部先取りした形なんだろうか
667デフォルトの名無しさん:2009/05/05(火) 13:07:10
OpenGLの初期化なんですけど、やたらと時間がかかる気がします。
大体15秒ほど掛かります(流石にこれはちょっと困る・・・)

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

これの対策で考えられるのってどんなのがありそうですか?
もしや皆我慢して使っている?それともうちの環境だけなのかな?
668デフォルトの名無しさん:2009/05/05(火) 16:08:13
・どのよびだしが遅いのか
・どの環境でも遅いのか
を調べる気概が欲しい
669デフォルトの名無しさん:2009/05/05(火) 23:00:38
>>668
SDLですが

SDL_SetVideoMode(xResolution, yResolution, bitsPerPixel, SDL_OPENGL);

この関数が遅いところまでは分かってます。ここで固まるようです
670デフォルトの名無しさん:2009/05/06(水) 00:17:36
GPUが対応してないとかいうオチ?
671デフォルトの名無しさん:2009/05/06(水) 10:47:37
ウインドウ内ではなく画面内の自由な場所に対して描画がしたく、現在はアプリケーションのウインドウの後ろとなる部分をキャプチャしたものを背景画像として使うことで擬似的に再現しています。
しかし現在の方法ではPBOに転送した背景画像を毎フレームDrawPixelsで描画しているので、内容の割には無駄に負荷が高くなってしまいます。
何かもっと画期的な方法は存在するのでしょうか。よろしくお願いします。
672デフォルトの名無しさん:2009/05/06(水) 12:49:00
アルファ付でオフスクリーンでレンダリングしたものを、レイヤードウィンドウに描画すればいいよ。
そんでもってPBOは使うな。
673デフォルトの名無しさん:2009/05/06(水) 13:08:53
>>672
即レスありがとうございます。
レイヤードウインドウ試してみます。
674デフォルトの名無しさん:2009/05/06(水) 18:19:59
OpenGL ESのいい参考書や参考になる定番サイトってないですか?
675デフォルトの名無しさん:2009/05/07(木) 08:23:02
676デフォルトの名無しさん:2009/05/07(木) 21:05:21
OpenGLプログラミングガイドの3.0対応版はいつ頃でるかなあ。
677デフォルトの名無しさん:2009/05/07(木) 22:14:39
>>671ですが、レイヤードウインドウを用いて、それに対してオフスクリーンレンダリングの結果を描画することでスクリーンにダイレクトに描画することができました。
y座標を逆にして考える必要がありますが、テクスチャの読み込みや、最終的なレンダリング結果の画像出力の際に画像の上下反転を省くことができますね。
Vista T7500 2.2GHz 8600M GT、オフスクリーンレンダリング解像度256x256において、上限反転の有無でCPU使用率には15%ほどの差がありました。
678デフォルトの名無しさん:2009/05/08(金) 00:19:29
openGLESでmqoを自前で読み込んで描画しているのですが

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

同じ頂点で、違うUV指定のたくさんのポリゴンを描画するには、
glDrawArraysを複数回呼ぶしか無いのですか?
679デフォルトの名無しさん:2009/05/08(金) 00:27:26
680デフォルトの名無しさん:2009/05/08(金) 00:39:31
>>679
ありがとうございます。

forで、indexを何度も参照するぐらいだったら
高速化のために最初から
インデックスの数だけDirectXで言うTLVERTEXみたいなものを作るべきなのかもですね
681デフォルトの名無しさん:2009/05/08(金) 18:32:46
FBOでデプスアタッチメントをDepthComponent32にするとデプスバッファは1ピクセルあたり32ビットになりますよね?
しかし、後でUnsignedByteで内容を配列に取得してみると256x256の解像度なのにも関わらず、65535までしかデータが埋まりません。
カラーバッファはUnsignedByteでもRGBA32ビット取得されますが、デプスバッファはUnsignedByteだと8ビット分しか取得されないのでしょうか。
また、UnsignedIntで取得してみると今度は262144まで、つまり32ビット分埋まりますが、内容を見てみると4バイトのうち2バイトは同じ値で残り2バイトは妙な値になっています。
これはつまりUnsignedByteで取得すると大体の深度値が返されるということなんでしょうか。
682デフォルトの名無しさん:2009/05/09(土) 02:19:36
>>669
ピクセルフォーマットの設定値とグラボの相性でそうなる場合がある。
アルファブレンド使う場合でも24bitにしとくと上手く動いたりする。
683デフォルトの名無しさん:2009/05/10(日) 20:49:31
32bitの深度値を指定しても内部では24bitってこともあるだろうしね
あとUNSIGNED_BYTEとかの指定はコンポーネント毎に何ビットか
RGBA8に対してUNSIGNED_BYTEなら1ピクセル4コンポーネントで32bitになるが
DEPTH_COMPONENTに対してUNSIGNED_BYTEなら1ピクセル1コンポーネントで8bitになってしまう
精度良く深度を扱いたいならDEPTH_COMPONENT32Fなんかの浮動小数点深度バッファを使うのがいいんじゃなかろうか
684デフォルトの名無しさん:2009/05/10(日) 21:47:42
>>682-683
返事が遅くなりまして申し訳ありません。お返事ありがとうございます。
UnsignedIntで取得すると1ピクセル1コンポーネントでもIntが32bitであるため、しっかり262143まで埋まったんですかね。
で、4バイトのうち3バイトが深度値を表していて、残り1バイトは実際には24ビットで処理されているためにとりあえず3バイト目と同じ値で埋まっていると。
勝手にこういう解釈しましたが、間違いがありましたらご指摘よろしくお願いします。
685デフォルトの名無しさん:2009/05/11(月) 01:14:09
>>684
何らかのアドバイスしたいけど、
正直グラボに依存する問題のような気がしてならないです。
テストツールとかをうpしてくださればうちの幾つかの環境で試してみますよ。
686デフォルトの名無しさん:2009/05/11(月) 22:52:13
>>685
ありがとうございます。テスト用のファイルアップしました。
http://senduit.com/c88099
Display関数の最後にあるReadPixelsでデプスバッファの内容を取得しています。
OSはVistaでGPUは8600M GTで、ForceWareは185.85です。この環境ではバイト配列を渡してUnsignedIntで取得すると1バイト目と4バイト目が一緒の値になります。
687デフォルトの名無しさん:2009/05/11(月) 23:34:14
>>686
あ、うん。
VC#使ってないので、せめてバイナリでテストできるもの頼むよ。
688デフォルトの名無しさん:2009/05/12(火) 00:09:55
>>687
http://senduit.com/0e0c03
かなり適当に作ったので取得押してからが少し時間かかります。
取得を押すと128x128の解像度で描画した結果のデプスバッファの内容を取得します。
動かなかったりしたら申し訳ありません。その際は一人で頑張りますw
689デフォルトの名無しさん:2009/05/12(火) 00:48:11
>>688
テキストファイルに貼り付けておきました。
テスト環境はVista32, GeForce7400Goです。
http://senduit.com/8ffae7

Intelのオンボードでも試してみたかったけど、
FBO非対応だったのですみません。
690デフォルトの名無しさん:2009/05/12(火) 23:45:49
>>689
実験ありがたいのですが、文字化けしちゃってますね。
機会があれば再度別のところにでもあげてもらえれば幸いです。すみません。
691デフォルトの名無しさん:2009/05/13(水) 00:06:20
図々しい
692デフォルトの名無しさん:2009/05/13(水) 02:04:26
馬が一番小回りが利くからね。
693デフォルトの名無しさん:2009/05/13(水) 02:27:18
>>690
なぜ文字化けしたんだろうか
http://www.dotup.org/uploda/www.dotup.org23789.zip.html
694デフォルトの名無しさん:2009/05/13(水) 02:50:13
まともな開発環境も持っていないのに必死にならんでいいよ
695デフォルトの名無しさん:2009/05/14(木) 00:05:13
>>693
実験ありがとうございました。Go 7400でも実際には24bitのようですね。
696デフォルトの名無しさん:2009/05/14(木) 00:21:18
ttp://developer.nvidia.com/object/nv_ogl_texture_formats.html
NVIDIAの全部のGPUで32bit Depthを指定しても24bitになるね
697デフォルトの名無しさん:2009/05/19(火) 23:18:27
OpenGLにはこのページに書いてあるような事はできますか?
DX9では頂点の各要素を別々に定義したりできるみたいですが
http://marupeke296.com/DXG_No53_DrawUsingStream.html
698デフォルトの名無しさん:2009/05/19(火) 23:32:21
>>697
余裕でできます。赤本レベルでもやってるような気がする。
VBOでも出来ますぜ。
699デフォルトの名無しさん:2009/05/20(水) 12:56:52
というかOpenGLESは、DrawPrimitive,DrawIndexPrimitiveみたいなことでしか描画できんし
700デフォルトの名無しさん:2009/05/21(木) 20:17:11
OpenGLのテクスチャは、
DirectXみたいにLockRect等での
高速に、メモリを直接操作は、出来ないのでしょうか?
701デフォルトの名無しさん:2009/05/21(木) 20:24:22
glteximage2d
gltexsubimage2d
702デフォルトの名無しさん:2009/05/21(木) 20:29:24
OpenGLからもそのうちimmediate modeが無くなるしな。
703デフォルトの名無しさん:2009/05/21(木) 20:48:16
ありがとうございます
704デフォルトの名無しさん:2009/05/26(火) 00:05:28
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

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

こんなエラーが出ます。
落としてきたやつを書き出すとちゃんと書き出せますが、自分のプロジェクトにとりあえずクラスを置いてみただけのやつは上記のエラーが...
エラーの意味がよく分からないんですがなにか設定とか必用でしょうか?
705デフォルトの名無しさん:2009/05/26(火) 00:13:08
>>704
スレ違い
706デフォルトの名無しさん:2009/05/26(火) 12:48:20
>>705
>>>704
>スレ違い

激しくスレ違いでした。。。
707デフォルトの名無しさん:2009/05/27(水) 14:56:10
初歩的な質問で失礼します。
OpenGLを導入してプログラミングを行おうと思ったのですが、glVertex2dを使っての二次元の描画がセグメンテーション違反になってしまいます。
具体的には、
ttp://www.komoto.org/opengl/
このサイトを参考にしてとりあえずサンプルプログラムをコンパイルしてみたのですが、
sample01の線の描画などが、実行するとセグメンテーション違反になってしまいます。
自分で点を描画だけのプログラムなど書いてみましたが同様でした。
sample02以降の3次元のプログラムに関しては問題なく動きます。
どなたか原因わかるかたいますでしょうか?
708デフォルトの名無しさん:2009/05/27(水) 22:25:05
OpenGLの質問というより、開発環境とか、C言語とか、そっちレベルの話しなきがする。
709デフォルトの名無しさん:2009/05/27(水) 23:31:49
3.0前方互換から始めるOpenGL入門とか需要無いかな?
710デフォルトの名無しさん:2009/05/28(木) 01:11:02
708ですが、僕はシェーダーちまちまいじってるところと、あとESなんで、3.0まで手が伸びないっす
711デフォルトの名無しさん:2009/05/28(木) 02:59:33
>>709
どの関数は使えなくなるから次からはこうしろ、とかならすごく興味ある
712707:2009/05/28(木) 11:29:28
>>708
Fedoraで使っています。Mesaは別途インストールしました。
プログラムの問題についてはサンプルそのままなので、ちょっと自分には分かり兼ねます。今まで普通にプログラムを確聞には問題なかったのですが・・・

もしよろしければ、どの辺りを調べてみたら良いかなどアドバイス頂けますか?
713デフォルトの名無しさん:2009/05/28(木) 14:33:10
>>712
ソースうp汁
714デフォルトの名無しさん:2009/05/28(木) 15:28:40
715デフォルトの名無しさん:2009/05/28(木) 17:58:50
ソースのL.17-18を
#include<GLUT/glut.h>
//#include<GL/gl.h>

に変換したらあとは普通にビルド&ラン出来たぞ、エラーもなく
Macでだけど

http://alkn.net/gazou2/src/1243501035283.png
716デフォルトの名無しさん:2009/05/28(木) 18:05:22
関数登録の位置が、環境によっては関係するとか?
717デフォルトの名無しさん:2009/05/28(木) 18:07:37
>>707
SIGSEGVで落ちてるなら、gdbで実行してスタックトレースくらい見てみろよ。
718707: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

というものが出てきました。何かヒントになりますでしょうか?
デバッグの仕方についてはもうちょっと勉強してみます・・・
719デフォルトの名無しさん:2009/05/29(金) 12:45:08
>>718はgcbではなくgdbですね、訂正します。
720デフォルトの名無しさん:2009/05/29(金) 12:50:43
>>718
よりによってi915かよ。Mesaに付属のglxgearsは動くのか?
まともなGPUの載ってるマシンなら普通に動くだろうな。

ちなみにSIGSEGVで落ちた場合はgdbのプロンプトでbtと打つと
スタックのバックトレースが見れるから、そこからスタックフレームを
up/downして変数の値等を調べる。
721デフォルトの名無しさん:2009/05/29(金) 16:57:32
とりあえず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.

これから自分でもエラーを調べてみます。
722デフォルトの名無しさん:2009/05/29(金) 17:12:39
glFlush()コメントアウトしてみたら
723デフォルトの名無しさん:2009/05/29(金) 21:10:37
使ってるGPUは何?

glFlush()に問題があるわけないし、どう考えてもi915のDRIドライバに問題が
あるとしか思えない。

Fedoraに入ってるのがどの程度新しいか分からないが、新しいDRIドライバを
入れてみるとか試行錯誤するしかないな。
とりあえずここのでも入れてみれば?
http://intellinuxgraphics.org/2009Q1.html
724デフォルトの名無しさん:2009/05/30(土) 15:37:36
色々ありがとうございます、会社のPCでちょっと土日は触れないので、家でも少し調べてみて月曜日にまた試してみるつもりです。
3Dなら問題なく描けるのに・・・!
725デフォルトの名無しさん:2009/05/30(土) 17:45:41
最近、赤本を読み終わったのですがどうも全体的なOpenGLの概観がまだつかめていないらしく、コードをどうかいていけばよいのか曖昧なところがあります。
ゲームを一本通して作りながらOpenGLを学んでいく本は無いでしょうか?英語は読めませんが、洋書大丈夫です。

できれば、少しでもGLSLを使用しているとありがたいです。
726デフォルトの名無しさん:2009/05/30(土) 18:06:59
>>725
PixelCityという夜景シミュレータみたいなのがあって、開発工程の説明があるから
おすすめ。プログラム内でビルなどを全部生成しているからゲームとは多少違うが、
その辺を無視してもコードも1万行無いし、色々参考になる部分が多いはず。
ただ、まだWindowsでしか動かないかもしれない。

デモムービー(ここに置いてあるコードは多分古い)
http://code.google.com/p/pixelcity/

ソースコード
http://github.com/skeeto/pixelcity/tree/master

開発工程の説明
http://www.shamusyoung.com/twentysidedtale/?p=2940
727デフォルトの名無しさん:2009/05/31(日) 03:18:54
画像の保存ってFLONTとBACKしかないんですか?
3Dの物体を他の角度から撮ったりしたいんですけどいい方法無いですかね
728デフォルトの名無しさん:2009/05/31(日) 03:29:29
FBOを使えばいい
729デフォルトの名無しさん:2009/05/31(日) 11:20:02
>>727
GL_AUXiもあるでよ。
730デフォルトの名無しさん:2009/05/31(日) 15:08:11
>>726
いいねえ。
このムービーだけ見せてクローンを作れというのは学生向けのいい課題になりそうだ。
3人チームで組ませて分担させればチームで作ることの訓練にもなりそうだ。
731デフォルトの名無しさん:2009/05/31(日) 17:32:47
>>726
これは素晴らしい
732デフォルトの名無しさん:2009/05/31(日) 19:16:48
>>726
とん。いいもの知ったよ。
このワクワク感がやっぱり重要だよな
733デフォルトの名無しさん:2009/05/31(日) 22:32:53
>>729
GL_AUXiってどんな効果があるんですか?調べてもよく分かりませんでした
734デフォルトの名無しさん:2009/05/31(日) 23:35:56
ていうか普通はGL_AUXiより先にGL_ACCUMだなw
735デフォルトの名無しさん:2009/06/01(月) 02:40:43
>>733
>>729ではないが、オフスクリーン描画用のバッファ。glDrawBuffer()して使う。
ただしドライバによっては描画が遅かったりするし、描画結果を利用するのに
一々glReadPixels()しないといけないから、今時のGPU(数年前ぐらいまで)を
使ってるならFBOを使うべき。テクスチャに直接描画出来るから無駄が無い。
736デフォルトの名無しさん:2009/06/01(月) 07:09:45
725です。

>>726
ありがとうございます。
ぜひ、参考にしたいと思います!。
737デフォルトの名無しさん:2009/06/01(月) 12:38:39
>>745
ありがとうございます
738デフォルトの名無しさん:2009/06/01(月) 12:39:22
安価ミス
>>735
ありがとうございます
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につづく
740デフォルトの名無しさん:2009/06/02(火) 11:47:30

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につづく
741デフォルトの名無しさん:2009/06/02(火) 11:49:01
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でどうよ。
743デフォルトの名無しさん:2009/06/02(火) 12:04:12
> test[i][j][0] = (GLbyte)255;
こんなことするならGLubyteとGL_UNSIGNED_BYTE使うべき。
744デフォルトの名無しさん:2009/06/02(火) 12:29:07
いろいろする前にまずwglMakeCurrent()では
745デフォルトの名無しさん:2009/06/02(火) 13:03:00
OpenGLの関数を呼ぶ場合は必ずレンダリングコンテキストが設定されている
必要がある。BeginPaint()の直後にwglMakeCurrent()を呼ぶべき。
746デフォルトの名無しさん:2009/06/02(火) 15:50:47
簡単なプログラムを作って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);をしないとダメですよね・・・。
でもそれをすると、表示がおかしくなるんです。
こういった現象になった方か、正しい解決方法をご存知の方、居ませんか?
747デフォルトの名無しさん:2009/06/02(火) 16:28:22
windowの位置とサイズに合わせてViewPort設定しなおすとかじゃだめなのかな?
748デフォルトの名無しさん:2009/06/02(火) 16:56:00
hWndが0ではないとか、GetDCは正しい値を返してるかとか、GetLastError()とかはチェック済み?
749デフォルトの名無しさん:2009/06/02(火) 17:16:12
みなさんアドバイスありがとうです!(`・ω・´)

>>742
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); で試してみましたが変わらずでした...

>>743
自分でもその記述にした意味がわからなかったので直しました('A`

>>744-745
wglMakeCurrent( hdc, hglrc);をHDC hdc = BeginPaint( hWnd, &ps)の後に
持っていってみましたが、やはり変化なしでした。

せっかくアドバイスいただいたのに活かせてなさげで申し訳ないです(´・ω・`)
750749: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);
}
751デフォルトの名無しさん:2009/06/02(火) 18:10:12
glGetError()とかは調べてみた?
これ実行するとどうなんの?回転する白い板が出るの?
なんで描画のたびにglGenTexturesしてんの
つかこのサンプルコードはどこから?
752デフォルトの名無しさん:2009/06/02(火) 18:12:51
俺はVista x64の環境だが何も問題がない。
コードが悪いのだからよく調べろ。
デバッグはお前の仕事だ。
753749:2009/06/02(火) 18:25:29
>>751
レンダリング時のglGetErrorは確認していて0っぽかったのですが、
初期化時に0x502(GL_INVALID_OPERATION?)が発生しているみたいです。
まだ詳しくはわかりませんが、手がかりが掴めてちょっと気が楽になりました!
ありがとうございます(`・ω・´)

毎フレームGenTexturesしてるのは、最初は初期化時に一度だけやっていたのですが、
そこが問題かもしれないなーと思って描画の直前に設定してみた名残です。

コードは以下のページに掲載されているものを切り張りしてます。
ttp://d.hatena.ne.jp/yaakaito/20090228/1235836453
ttp://wisdom.sakura.ne.jp/system/opengl/gl23.html

>>752
32bitですが、そもそも別アプリケーションでテクスチャが使えることは確認しているので、
どこに問題があるのかなーと悩んでるところです(´・ω・`)
754デフォルトの名無しさん:2009/06/02(火) 18:44:24
>>753
初期化時にGL_INVALID_OPERATIONって、gl_init()以外で初期化してるってことかよ。
あまり小出しにされるとまともなアドバイスができんぞ。
755デフォルトの名無しさん:2009/06/02(火) 19:02:17
>>754
いえ、gl_init()内のreturn wglCreateContext( hDC);の直前です。
語弊のある書き方でごめんなさいです。
756デフォルトの名無しさん:2009/06/02(火) 19:13:53
>>755
それはおかしい。GL_INVALID_OPERATIONを発生させるのはgl*()関数だけだぞ。
757デフォルトの名無しさん:2009/06/02(火) 19:29:02
>>756
main関数の冒頭でglGetErrorを読んでみましたが、
やはりGL_INVALIDE_OPERATIONSでした。
調べてみたところ、
glGetError自体がエラーを出してる?可能性があるらしいです。

だとすると初期化時に呼んでも仕方ないかもしれないですが、
レンダリング時だとGL_NO_ERRORですし・・・

ttp://groups.yahoo.co.jp/group/opengl-jp/message/3280?expand=1
> 2. エラーが発生していればその原因を取り除く。(glGetError()
> は呼び出して良いところと悪いところがあり、悪いところだと
> glGetError() 自体でエラーが発生するので注意)
758デフォルトの名無しさん:2009/06/02(火) 19:34:20
wglは諦めてGLUT使った方が良いんじゃないか?
759デフォルトの名無しさん:2009/06/02(火) 19:35:21
wglMakeCurrentより前でglGetErrorしてはダメといった意味でglGetErrorがGL_INVALID_OPERATIONなのでは

>>749
glTexParameteri達を最初のglBindTextureの後に移動して、
glTexImage2DをGL_UNSIGNED_BYTEにしてみ。255はsigned charでは扱えない
760749:2009/06/02(火) 19:43:49
>>758
ちょっと考えはじめてましたw

>>749
うまく行きました!ありがとうございました(´;ω;`)

まずglTexParameterをglBindTextureの直後に移動したところポリゴンが表示されなくなり、
glTexImage2DのtypeをGL_UNSIGNED_BYTEにしたところ、
思惑どおり赤いテクスチャが貼られました!

glBindTextureはそれまでにglTexParameterに従うのかと思っていましたが、
glTexParameterを利用するのはglTexImage2Dで、BindTextureはパラメータをリセットしてしまうのかなあ、
とか推測しましたが、実際のところはよくわかりません('A`

ともかくうまく動くようになって助かりました!みなさんありがとうございました。
761749: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;
    }
  }
762デフォルトの名無しさん:2009/06/02(火) 19:46:21
  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);


}
763デフォルトの名無しさん:2009/06/02(火) 19:47:35
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さんへの間違いです。
みなさんありがとうございました!
764デフォルトの名無しさん:2009/06/02(火) 21:32:27
iPhoneのOpenGLESで
FBO使って裏で描画しているのですが
FBOを512x512だと普通に軽いのに
FBOを1024x1024にすると、重くなります。
画面サイズより大きいと重いとか
そういう仕様とかあるんですか?
回避方法ありますか?
765デフォルトの名無しさん:2009/06/02(火) 21:38:38
>>764
それはGPUのfill能力が追いついていないだけだと思う。
766デフォルトの名無しさん:2009/06/03(水) 06:46:30
VistaでOpenGL使うなら
http://www.opengl.org/pipeline/article/vol003_7/
を読んでおくといいね。デスクトップコンポジションを無効にしない方法
(PFD_SUPPORT_COMPOSITION)やその他の注意が色々書いてあるから初学者には
参考になると思う。
767デフォルトの名無しさん:2009/06/03(水) 13:17:38
>>760
TexParameterってのは、名前の通り、テクスチャごとに付随してるパラメータだよ。
BindTextureすると、バインドされたテクスチャに設定されてるパラメータが使われるよ。
だから、GenTexturesで新しく作ったテクスチャをバインドすると、そのテクスチャの
デフォルトのパラメータに従って動作するよ。何もパラメータを設定していないテクスチャの
TEXTURE_MIN_FILTERのデフォルト設定はNEAREST_MIPMAP_LINEARだから、表示するポリゴンや
ウィンドウの大きさによってテクスチャが出たり出なかったりするという罠にハマるよ。

ちなみにTexEnvの方は、テクスチャをフラグメントに適用するユニットの設定なので、
バインドするテクスチャを切り替えても設定は変わらないよ。
この辺は、パイプラインの仕組みを理解していれば、混乱しないできちんと区別できるようになるよ。
768デフォルトの名無しさん:2009/06/03(水) 14:19:31
だよ。
るよ。
るよ。
るよ。
いよ。
るよ。
769デフォルトの名無しさん:2009/06/03(水) 14:55:03
だるいよ。
770デフォルトの名無しさん:2009/06/03(水) 15:29:09
よ!
771デフォルトの名無しさん:2009/06/07(日) 02:37:47
Visual C++とGLUTである立体を回転や平行移動する課題を解いています
結果をprog.exeで表示することはできましたが画像として保存することができません
出力結果の保存、Excelへの挿入やコピーしてペイントに張り付ける方法はないのでしょうか?
上でFBOという言葉を見ましたがどこか求めているものと違う気がしたので書き込みました
772デフォルトの名無しさん:2009/06/07(日) 02:38:33
print screen
773デフォルトの名無しさん:2009/06/07(日) 02:50:46
>>771
まあPrintScreenが一番楽だな。プログラム的にやりたいなら、描画後に
glReadPixels()して、適当なライブラリを使って画像ファイルに保存すれば良い。
774デフォルトの名無しさん:2009/06/07(日) 03:19:27
早いレス感謝です
恥ずかしいこんな方法があるとは・・
glReadPixels()は課題より複雑そうなので後々覚えることにします
775デフォルトの名無しさん:2009/06/08(月) 08:51:58
VBOって全然オンボじゃ動かないね、3.Xからはこういう環境は切り捨てられるのか...。


OpenGL3.0とSDLで開発ってできるの?
776デフォルトの名無しさん:2009/06/08(月) 10:00:30
VBO未サポートのオンボなんてIntelの845より前、S3のSavage系、今は亡きSiSくらいだと思うが。全然?
777デフォルトの名無しさん:2009/06/09(火) 14:04:56
Windows 環境で FBO のカラーバッファをコンテキストなしのウィンドウに
Blit することはできるでしょうか?
778デフォルトの名無しさん:2009/06/10(水) 00:01:05
ReadPixelsとかして一旦イメージをメモリに取得して
ビットマップにしてBitBltしてください
直接は無理
779デフォルトの名無しさん:2009/06/10(水) 13:34:02
>>778
なるほど。
ReadPixels は遅そうなのでウィンドウ毎にシングルバッファのコンテキストを作って
CopyPixels か BlitFramebufferEXT でカラーデータを転送するようにします。
780デフォルトの名無しさん:2009/06/11(木) 17:27:43
OpenGL + GLUT + C言語 + Visual C++ 2008 Express Edition にてソフトウェア開発を行っています。
開発に使用しているマシンはVAIO VGN-SZ92PSという機種で
 (A)NVIDIA GeForce Go 7400 with NVIDIA TurboCache
 (B)インテル グラフィックス・メディア・アクセラレータ 950 (チップセットに内蔵)
の2つのグラフィックアクセラレーターを切り替えることの出来るマシンです。

開発しているソフトウェアを(B)で動かしている分には問題は発生しないのですが、(A)で動かしている場合に限ってシステムダウンしてしまいます。
781780: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
といった情報です。
不具合が発生するタイミングはバラバラで、特にマウス操作等何もせずに画面を放置しているだけでも上記の不具合が発生します。
782780:2009/06/11(木) 17:30:42
GeForce Go 7400で用いているドライバのバージョンは8.4.9.1なのですが、
VAIO VGN-SZ92PS が2つのグラフィックアクセラレータを搭載する際に、
元のグラフィックドライバーに手を加えているらしく、NVIDIAのページで
最新ドライバにアップデートをすることも出来ない状況です。
これまでは、nvoglnt.dllに不具合があって開発したソフトウェア側の問題
ではないのであろうと、問題を放置してきたのですが、私がコーディングを
行う際にOpenGLの仕様範囲外のコーディングを行っている可能性もあるので
何とかして原因を突き止めたいのですが、どこから手を付けたらいいのか
困っている状況です。

問題点が絞りきれない質問で申し訳ありません。
同様の不具合に過去に遭遇した方がいて、「OpenGLの仕様範囲外のコーディング」等
、何かソフトウェア開発者側が原因でありそうな状況に心当たりがある方いましたら
アドバイスよろしくお願いします。
783デフォルトの名無しさん:2009/06/11(木) 18:32:32
自分で作ったプログラムなら、デバッガを使ってどこで落ちてるか調べるとか、glGetErrorをチェックするとかは
784780:2009/06/11(木) 19:36:14
>>783 アドバイスありがとうございます。
とりあえず、glGetError試してみます。

以上です。
785デフォルトの名無しさん:2009/06/11(木) 21:17:34
終わっちゃったよ
786780: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;
}
787デフォルトの名無しさん:2009/06/12(金) 00:28:53
GLSLもここでおk?
788デフォルトの名無しさん:2009/06/12(金) 01:55:40
>>786
バッファオブジェクトの範囲外参照とかポインタの範囲外参照をするよう操作をしてしまうと落ちるかもね
でもそれ以外で普通にエラーが出る場合でもドライバによっては落ちるから困る
NVIDIAだとドライバの設定でOpenGLのエラー報告がOFFになってる場合もあるから忘れずに

>>787
GLSLはここだな
789デフォルトの名無しさん:2009/06/12(金) 16:17:18
>>780
こちらのSZ91ではインテル側のバグが頻発で、とくに7400Goは不具合出ません。
もしあれでしたら、動作チェックくらいはできますよ。

といっても、おたくのソフト中でどの関数を呼んだときに落ちるのかが全く掛かれていないから、
>同様の不具合に過去に遭遇した方がいて、
といわれても困る
790780:2009/06/12(金) 20:43:56
>>788
アドバイスありがとうございます。
> バッファオブジェクトの範囲外参照とかポインタの範囲外参照
このあたりのキーワードも参考にして調べてみます。
> NVIDIAだとドライバの設定でOpenGLのエラー報告がOFFになってる場合もあるから忘れずに
これは初耳でした。
791780:2009/06/12(金) 20:45:53
>>789
> こちらのSZ91ではインテル側のバグが頻発で、とくに7400Goは不具合出ません。
> もしあれでしたら、動作チェックくらいはできますよ。
研究で開発している公開前のソフトウェアなので外部に出すのは少し難しいです。
でも、お心遣い本当にありがとうございます。

> といっても、おたくのソフト中でどの関数を呼んだときに落ちるのかが全く掛かれていないから、
> >同様の不具合に過去に遭遇した方がいて、
> といわれても困る
不具合の発生するタイミングが明確ではないですね、まったくおっしゃるとおりです^^;
今のところ分かっているのは、デバックモジュールを作って調査した結果が786に書いた結果で
以下の順に問題のモジュールが呼ばれているというところまでは分かりました。
 kernel32->glut32->opengl32->nvoglnt
不具合のタイプが私の書いたコード内で何か関数を呼んだ時に落ちているのではなくてカーネル?から呼び出されているのかな?
GUIのプログラムだと、並列に何か処理しているのかな?・・・
この手の不具合が出た場合の解決方法を知らなくて、どうしたものか悩んでいたところです。
「落ちているモジュールの位置は同じでも、不具合が発生するタイミングがまるでバラバラ」
という特徴があるといえばあるのですが、確かにこれだけじゃアドバイスするのも困りますね^^;
どこかで
 kernel32->glut32->opengl32->nvoglnt
の流れで参照している領域を私の書いたコードと共有している場所があってそこを破壊してるのかな・・・
ガベージコレクションとか見たいに不定期に実行される仕組みをOpenGLが何か持ってて、それが実行されたタイミングで不具合が出るとかなのかな・・・
皆さんアドバイス本当にありがとうございます。
参考にさせていただきます。
792デフォルトの名無しさん:2009/06/12(金) 21:02:03
793デフォルトの名無しさん:2009/06/14(日) 23:09:28
>>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
794デフォルトの名無しさん:2009/06/15(月) 02:00:33
ES専用スレって需要あるかなぁ
795デフォルトの名無しさん:2009/06/15(月) 02:18:50
いやー・・・このスレだけで十分なんじゃないかな・・・
796デフォルトの名無しさん:2009/06/15(月) 19:18:37
Visual C++Express EditionでGLUTを使えるようにしたいんですが、設定の仕方が分かりません。
教えてください。
797デフォルトの名無しさん:2009/06/15(月) 19:40:53
どこまでわかったの?
798デフォルトの名無しさん:2009/06/15(月) 21:19:10
さっき知ったんだが、glutSolidTeapot()てw吹いたw
799デフォルトの名無しさん:2009/06/15(月) 22:38:15
有名なティーポットだよ
800デフォルトの名無しさん:2009/06/16(火) 00:31:11
OpenGLES でオブジェクト座標からスクリーン座標ってみんなどう変換してる?
全然うまくいかないぜ。。。
801デフォルトの名無しさん:2009/06/16(火) 13:18:49
>>800
OpenGL ES 1.x なら OpenGL と変わらないはずだよ。
802デフォルトの名無しさん:2009/06/16(火) 15:11:54
>>801
ESはgluProject()が無いんだよ
803デフォルトの名無しさん:2009/06/16(火) 15:38:51
mesaのソースを読んでgluProject()を自前で実装するとか
804デフォルトの名無しさん:2009/06/16(火) 18:10:02
実装っていうか、たしかほとんどコピペでいけたよ。
805デフォルトの名無しさん:2009/06/16(火) 18:31:29
>>800
ていうかさ、頂点の座標にモデルビュー行列掛けて、投影行列掛けて、wで割って、
ビューポート変換かければウインドウ座標出るよ。
OpenGLというか3Dグラフィックスの基本が分かってれば簡単だし、その位は理解
しておくべき。
806デフォルトの名無しさん:2009/06/16(火) 19:27:17
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 ]
807806: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 ]
808デフォルトの名無しさん:2009/06/16(火) 22:56:22
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
Visual C++でOPENGLのGLUTを使い円錐を作ってみました。
GLUTのHPにある例題の立方体を元に作り直しました。
一応、表示はされるのですがあっているのでしょうか?
勉強し始めたばかりで、よくわかっていません。


http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9475.txt
810デフォルトの名無しさん:2009/06/17(水) 08:07:27
結構人によって違うんだな。

俺はauxWireCorn使ってた
あ、それとダブルバッファの切り替えとか癖にした方がいい気がする。

まぁ俺も勉強中の身だけどw
811デフォルトの名無しさん:2009/06/17(水) 08:34:59
auxって何年前のコードだよ。GLUTかGLU使ってくれ
812780: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
813デフォルトの名無しさん:2009/06/17(水) 22:19:55
>>808
アルファテストいらなくね?
速度はダメになってから考える
814デフォルトの名無しさん:2009/06/17(水) 23:17:14
メッシュを4角形の集まりにしてGL_QUADSで描画するのと、
3角形の集まりにしてGL_TRIANGLESで描画するのって、
パフォーマンス的にどうなんでしょうか?
よく、3角形の方が効率がいいみたいな話を聞いたりしますが、
実際のところどうなんでしょう..モデルデータは頂点の数が多く
なっても3角ポリゴンの集まりに分割にしといた方がいいので
しょうか?
815デフォルトの名無しさん:2009/06/17(水) 23:24:55
お前らパーティクルどれぐらいで作れる?

5時間ぐらいって遅い方かな?
816デフォルトの名無しさん:2009/06/17(水) 23:37:44
>>814
QUADS系は3.1で消えるんだよな。まあnvidiaを使ってる限りは安泰なんだが。

パフォーマンスはドライバによるだろうが、多分変わらないのが多いはず。
数が多いなら、なるべくTRIANGLE_STRIPを使うように頑張った方がいいぞ。
817デフォルトの名無しさん:2009/06/17(水) 23:42:27
>>816
ありがとうございます。
ですか...3角形にしといた方が無難なようですね。
818デフォルトの名無しさん:2009/06/18(木) 21:42:38
一つのレンダリングコンテキストの4つのフレームバッファ
GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT, GL_BACK_RIGHT
はそれぞれ別々の RGB ストレージを持っていると思いますが、
深度、ステンシル、αはこれらのバッファ間で共有されることが
あるでしょうか?
819808: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);
としたらテクスチャの色が変になりました。
820デフォルトの名無しさん:2009/06/18(木) 23:20:59
やはり頂点カラーを指定するとその色で半透明合成されます。
どうすれば頂点カラーのアルファではなくてテクスチャのアルファが使われるようになるんでしょうか・・
それとテクスチャの特定の色を抜いたりできる機能はOpenGL ESにはあるんでしょうか。
あればこっちも試してみたいです。
821デフォルトの名無しさん:2009/06/18(木) 23:43:57
>>820
glTexEnvf()でGL_DECALモードに設定すればアルファ抜き出来る。
赤本のglTexEnvf()の部分にあるテクスチャブレンド関数のテーブルを
よく見ておくこと。
822デフォルトの名無しさん:2009/06/18(木) 23:48:23
>>820
ESの仕様が気になるなら、ここで聞くよりまず仕様書に当たるべき。
pdfで公開されているんだから。

http://www.khronos.org/registry/gles/
823デフォルトの名無しさん:2009/06/19(金) 00:00:56
よしわかった。すまんが訳してくれ。ちゃっちゃと
824デフォルトの名無しさん:2009/06/19(金) 00:47:42
>>818
FRONT_LEFT、FRONT_RIGHT、BACK_LEFT、BACK_RIGHTはいずれもカラーバッファ
RGBAのみ個別に保持する
深度とステンシルは共有だよ
αは個別

>>819
glBlendFunc(GL_ZERO, GL_ONE)とかしたらどうなる?
825デフォルトの名無しさん:2009/06/19(金) 01:51:42
>>808
基本的には
 glEnable(GL_BLEND);
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
だけでブレンドできるはず。それでダメなら、ブレンド以外の問題なんじゃないかな。
とりあえず、アルファテストは切っておいて良いと思うます。

あとは、テクスチャの内部フォーマットがちゃんとGL_RGBA(又はその亜種)になってるか、
そもそもちゃんとテクスチャは適用されてるのか(αが0の部分が白くなる、とか明らかに
おかしいです)、あとは・・・なんだろう。他にチェックすることあったっけな?
あ、テスト段階ではTexEnvはGL_REPLACEにしとくのがいいかな。

スクリーンショットか、携帯で撮った写真でもなんでもいいから、実際の絵があると
少しは状況が分かるかも。
826808: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→全部半透明
こんな感じなんです。
827デフォルトの名無しさん:2009/06/20(土) 22:34:48
glTexImage2DでinternalフォーマットにGL_RGBA8とかRGBA系のフォーマット指定してる?
828デフォルトの名無しさん:2009/06/20(土) 22:45:17
>>826
gDEBuggerってものがあるので体験版を試してみるといいかも
DirectXならPIXが無料で使えるんだけどね
829デフォルトの名無しさん:2009/06/20(土) 22:50:54
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にすると、なぜか真っ白になりました。
830デフォルトの名無しさん:2009/06/21(日) 01:49:22
基本的なことだが一応各所にglGetError入れてエラー出てないか確認してくれ
あとは同じようなことやってるサンプルがあればそれとの違いをみつけるんだ
831デフォルトの名無しさん:2009/06/21(日) 13:12:17
gDEBugger試してみましたが、別プロセスで起動するのか全くデバッグできません・・
glGetErrorもglTexImage2DとglTexEnvfの後は0でした。
あとはサンプル探しか・・
832デフォルトの名無しさん:2009/06/23(火) 21:36:07
openglで貼るテクスチャオブジェクトを直接操作したい
例えばあるbmpを読み込んで、テクスチャオブジェクトにした状態で中の値を変化(どこどこのビットの色を変えたり)させたりしたい
こういう場合どこをどういじればいいの?
もっと言えば変化させたテクスチャオブジェクトをbmpに出力したりしたい
833デフォルトの名無しさん:2009/06/23(火) 22:36:21
普通に上書きすればいいんじゃね?
テクスチャ初期化できるんなら難しいことじゃないと思うが。
834デフォルトの名無しさん:2009/06/23(火) 23:03:24
テクスチャの中身をそのままいじるのはできないから
メモリ上で普通に変化させてglTexImage2DとかglTexSubImage2Dで更新するしかないね
取得はglGetTexImageだけど、メモリ上でいじるならいらん
835デフォルトの名無しさん:2009/06/24(水) 02:49:18
>>834
subImageって任意の1ビットを任意の色に塗り替えることができる?
836デフォルトの名無しさん:2009/06/24(水) 10:21:44
四角を書いてその上に写真を貼りたいのですが
どなたか教えてください。
837デフォルトの名無しさん:2009/06/24(水) 19:02:00
テクスチャでぐぐれ
838デフォルトの名無しさん:2009/06/24(水) 20:07:06
GL+CgFXで質問なんですけどCgのtexture型に相当するGL側のオブジェクトは何なのでしょうか。
sampler型に割り当てるのはglGenTextures()で作ったオブジェクトだし、
texture型に渡してみても不正なパラメタ的エラーメッセージ出すし。
sampler_stateでTextureを参照しているようなのに対してはテクスチャオブジェクトを直接渡しちゃっていいんでしょうか。
839デフォルトの名無しさん:2009/06/24(水) 23:00:54
かなり初歩の初歩の質問ですみません。
本に例として書かれていたプログラムで下記の部分にエラーが出たのですが、
どこが間違っているのかわかりません。
エラーの出た箇所をピックアップしてみましたが、何処が間違えているのでしょうか・・・

1 glLineStipple(1, 0x0101);
2 drawOneLine(50.0, 125.0, 150.0, 125.0);

個人的にはdrawにはglが付かないといけないと思うのですが、
単にglをつけてもエラーが出てしまい疑問です・・・
後、やはりプログラム全て書き起こした方がよろしいでしょうか?
840デフォルトの名無しさん:2009/06/24(水) 23:14:42
そのエラーメッセージがないとわかんない
841デフォルトの名無しさん:2009/06/24(水) 23:43:49
>>832
OpenCVと組み合わせればBMPでもJPGでも一発で出力可能
glTexImage2D→IplImage
842デフォルトの名無しさん:2009/06/24(水) 23:46:12
>>838
Cgのtexture型に相当するもの?
そんなものは無い!

しいていうならglTexImage2Dで指定するメモリ領域かな。
プログラム側ではtexture型のパラメータからファイル名とか種類(1〜3D, cube等)を取得して
そのtextureを参照しているsampler型のオブジェクトに対応するテクスチャにglTexImage2Dとかで画像を与えるのが普通ではないかと思う。

Cgは使った事あるけどCgFXのプログラム側はあまり作った事無いので間違ってたらごめん。

>>839
openglの関数にはすべてglの文字が付いてるから, drawOneLineって本の作者が作った関数か何かじゃないの!?
それとそのエラーはコンパイルエラー?リンクエラー?それともランタイムエラー?
843デフォルトの名無しさん:2009/06/25(木) 03:39:48
>>841
OpenCV使わないでどうにかできないでしょうか?
844838:2009/06/25(木) 07:48:11
>>842
なるほど、やはりOpenGLではtexture型メンバに何か与えて〜って訳じゃないんですね。
DirectXの場合のコードを見てたらsampler型じゃなくてtexture型のハンドル取得してそこにテクスチャを渡してたので気になったってたんですけど、
HLSLのtexture型を調べてたらテクスチャのサイズやメモリ〜とか書かれてて何渡したらいいのか判らなかったんです。
cgGetSamplerState*()やらcgSetSamplerState()を使って参考にすれば良いって事ですよね。
845デフォルトの名無しさん:2009/06/25(木) 11:28:31
ライトなしで薄い赤を合成したら、普通に赤になったんですが
加算合成して、白くなるのって、ライトが効いてるからですか?
846デフォルトの名無しさん:2009/06/25(木) 21:05:09
何と何を合成したんだよw
847デフォルトの名無しさん:2009/06/25(木) 21:30:03
α値が20ぐらいのRGB=(255,0,0)のテクスチャを四角形に貼り付けて
クリックした箇所に表示するプログラムを作って試したんですが・・
G,B成分がないから、ですかね?
848デフォルトの名無しさん:2009/06/25(木) 21:47:20
ブレンディングの設定を
849デフォルトの名無しさん:2009/06/26(金) 01:14:52
なんか宇宙のかなたから途切れ途切れで届いた謎のメッセージみたいな質問だな
850デフォルトの名無しさん:2009/06/26(金) 01:22:49
毎年恒例の、課題提出時期の質問ラッシュな予感!
851デフォルトの名無しさん:2009/06/26(金) 02:41:45
>>843
OpenCV使わないでOpenCVより簡単に実装することは無理。
一番単純なBMPで保存するにしても、ヘッダ情報から自前で用意する
必要があるだろ。GL描画に追いつくほどの「高速」な画像バッファ
も確保しとかなくちゃならんし。
852デフォルトの名無しさん:2009/06/26(金) 03:31:57
bmpの読み書きだけならわざわざopenCV使わんでもいいんじゃね
853デフォルトの名無しさん:2009/06/26(金) 03:56:04
>>851
無理じゃないだろ。初学者はバッファとかヘッダとかもちゃんと
勉強したほうがいいんじゃね?それらをちゃんと把握してから、
OpenCVで簡単にやるのは構わないと思うが。

確かに、OpenCVと組み合わせればOpenGLの動きをリアルタイムでAVI
ファイルに保存することとかも簡単にできるけどな。
854839: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がおかしいと出ているのですが、何処がどう間違っているのか・・・
855デフォルトの名無しさん:2009/06/26(金) 09:44:42
倉賀野、名前名前〜!
856デフォルトの名無しさん:2009/06/26(金) 09:44:51
GLtest7.cの32行目のx1 x2 y1 y2が宣言されていない変数ですっていうエラーじゃね
C言語の1時間目から復習してください
つか、名前かっこいいなw
857839:2009/06/26(金) 10:02:07
後、具体的に何処が間違っているかと言うのがわからないので、
プログラムベタ張りさせて下さい。

ttp://www12.ocn.ne.jp/~h01a09bk/index.html
858デフォルトの名無しさん:2009/06/26(金) 10:08:08
>>857
#define drawOne (x1,y1,x2,y2)
のところ
#define drawOne(x1,y1,x2,y2)
ってしてみて
たぶんマクロ関数の定義のしかたが悪いと思う
859839:2009/06/26(金) 10:08:19
名前は申し訳ありません!
スルーして頂けると嬉しいです。
860デフォルトの名無しさん:2009/06/26(金) 10:53:09
フルネームでやってるやつなんているのか
861デフォルトの名無しさん:2009/06/26(金) 12:29:08
>>857
つーか、マクロにしないで関数にしろよ。
static void drawOneLine(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) {
glBegin(GL_INES);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
glEnd();
}
862デフォルトの名無しさん:2009/06/26(金) 13:43:45
マルチバイト文字なユーザー名じゃない分何ぼかマシ
863デフォルトの名無しさん:2009/06/26(金) 16:10:27
>>861
赤本のプログラムそのものだし、入門中にそこまで要求しちゃ酷。
つかマクロのがいいだろ。
864デフォルトの名無しさん:2009/06/26(金) 18:39:20
>>859
ネタじゃないのかw
865デフォルトの名無しさん:2009/06/26(金) 20:55:12
初心者なら関数にした方が分かりやすいし、エラーとかで困らないと思う。
あと、コードは見やすく書いた方が上達するよ。
おかしなインデント、スペース、改行はだめ。
http://www.dotup.org/uploda/www.dotup.org172961.c
866デフォルトの名無しさん:2009/06/27(土) 01:27:28
そうだけど独学で俺流インデントとか俺流関数変換とかもなぁ。最初は丸写しでいいんじゃね
>>839
赤本なら自分で入力しないでコピペしてきたほうが楽だよ
http://www.opengl.org/resources/code/samples/redbook/lines.c
867デフォルトの名無しさん:2009/06/27(土) 04:44:55
>>839
プログラミングがおぼつかないうちは、赤本なら>>866が貼ってくれたように
GLのサイトにソースがあるので、それをもとにいじり倒して理解していくのもいいと思う。

赤本を勉強する姿勢は大事なので、がんばってねー
868デフォルトの名無しさん:2009/06/27(土) 14:39:25
C++で作ったOPENGLをつかったものを
JavaのGUIに表示する本やサイトを教えてください。
869デフォルトの名無しさん:2009/06/27(土) 14:46:32
「C++で作ったOPENGLをつかったもの」
がプログラムなのかその出力物なのか何なのか想像が難しいんだが、あえて言うなら、そんぐらいググれよカスさん。
870デフォルトの名無しさん:2009/06/27(土) 14:48:07
「C++で作ったOPENGLをつかったもの」とは
ライブラリーのようなものなのです。
そして、windows固有のAPIを使わないように作っておいて、
GUIをJavaにすることで機種に依存しないソフトウェアを
開発しようと考えています。
871デフォルトの名無しさん:2009/06/27(土) 14:55:42
JavaからC++の関数を呼ぶには JNI を使ったやり方かなぁ。
でもC++のライブラリ自体は環境依存になると思うけど。
872デフォルトの名無しさん:2009/06/27(土) 14:56:59
GUIにJavaを使おうというのが筋が悪すぎる。
素直にクロスプラットフォームなGUIツールキットを使っとけ。
873デフォルトの名無しさん:2009/06/27(土) 15:01:50
か、Java3Dを使ってJavaオンリーで行くか
874デフォルトの名無しさん:2009/06/27(土) 15:05:52
結論を言ってくださいよ。
選択肢
1 そんな方法は無い
2 分からない
3 教えるのが面倒
875デフォルトの名無しさん:2009/06/27(土) 15:10:11
OpenGLで描画している各フレームをAVIとかの動画ファイルに
保存する方法を教えてください。
876デフォルトの名無しさん:2009/06/27(土) 15:12:17
方法はある。>>871で書いたJNIを使ったやり方。
だけど俺自身試したことないからちゃんと動くかどうかは定かではない。
あと、基本的にライブラリはOS間で可搬性はないのでどっちみち機種依存になると思う。
877デフォルトの名無しさん:2009/06/27(土) 15:18:39
>>875
glReadPixels で何でも読み込める。
878デフォルトの名無しさん:2009/06/27(土) 15:24:38
Q) 動画ファイル保存する方法を教えてください。
A) glReadPixels で何でも読み込める。

なんだこの珍問答はw
879デフォルトの名無しさん:2009/06/27(土) 15:52:24
>>875
すぐ上に解決法が上がってるだろ。よく読め。
>>853
880デフォルトの名無しさん:2009/06/27(土) 16:01:48
>>874
お前偉そうな奴だな。出来るに決まってるだろうが
ただしGUIとC++コードのインタラクションをすべてJNIでラッピング
するのが面倒なだけだ
881デフォルトの名無しさん:2009/06/27(土) 16:06:24
怒らなくても。3でいいじゃん
882デフォルトの名無しさん:2009/06/27(土) 16:08:30
>>875
グラボのS-Video出力からHDレコーダーに入れて動画ファイルとして保存
画面動画キャプチャソフトってのもあるよw
883デフォルトの名無しさん:2009/06/27(土) 16:11:00
教えてるだろうが
JNI使えば可能、で分からないのか?
884デフォルトの名無しさん:2009/06/27(土) 16:14:44
OpenGLの画像出力をどのようにして
Javaのグラフィックコンテキストに出力するのかを
ききたいのですよ。
885デフォルトの名無しさん:2009/06/27(土) 16:26:28
なにいってんだおまえ
886デフォルトの名無しさん:2009/06/27(土) 16:35:21
だからもう素直にJava3D使っとけって
887デフォルトの名無しさん:2009/06/27(土) 16:36:09
処理速度を追求する私にとってJava3Dという選択肢はないのです。
888デフォルトの名無しさん:2009/06/27(土) 16:36:27
>>879 >>882
お返事ありがとう。
いや、OpenGLで書いた絵をプログラムレベルで動画ファイルにしたいんです。
>>879がOpenCVですぐできるって言うから自分もやってみたくて、
具体的にはどうすればいいのかと。
889デフォルトの名無しさん:2009/06/27(土) 16:57:58
>>888
スレ違いっぽいが、ここのサンプルでもみてやってみれば
http://opencv.jp/sample/video_io.html
890デフォルトの名無しさん:2009/06/27(土) 16:58:00
>>887 処理速度を追求するならJavaはやめとけ
891デフォルトの名無しさん:2009/06/27(土) 17:01:26
>>890
GUIの処理速度は多項式時間に抑えられるので
Javaでもよいのですよ。
892デフォルトの名無しさん:2009/06/27(土) 17:04:27
>>888
OpenCVのスレッドへGO!

【Intel】OpenCV総合スレ【画像処理】2
http://pc12.2ch.net/test/read.cgi/tech/1230511656/
893デフォルトの名無しさん:2009/06/27(土) 17:14:14
>>891
Java3Dのソースでも読めば参考になるんじゃね?教えて君
894デフォルトの名無しさん:2009/06/27(土) 17:18:18
>>893
うーん、残念。
895デフォルトの名無しさん:2009/06/27(土) 17:18:22
>>884
だったら最初からもっと細かく書けよ。
そうじゃなくて、OpenGLで直接JavaのFrameに描画するんだ。

1.2の頃はAWTにあったクラスでWindowハンドルを取得出来たんだが、
今はもう無理なようだ。俺も偉そうなことを言ってさすがにそれは無いから
少し調べてみた。
JOGLにあるjavax.media.nativewindow.DefaultGraphicsDeviceを継承したクラスの
getHandle()でFrameのwindowハンドルを取れるな。あとは必要ならネイティブの
ウインドウを作ってMakeCurrent()すればOpenGLで好きに描画できる。
getHandle()を自分で実装したけりゃJOGLのソースでも見てくれ。

>>891
あまり知ったかするなよ。OpenGLを直接使うかJOGL経由で使うかの違いは
計算量的には定数項の違いに過ぎない。
896895:2009/06/27(土) 17:32:39
あ、見つかった。AWT Native Interface (JAWT)を使えば簡単に
Windowハンドルが取れて、ネイティブコードからCanvasに直接描画可能。
JOGLも同じことをやってるはず。
897デフォルトの名無しさん:2009/06/27(土) 17:35:39
>>896
その回答でOK。
898デフォルトの名無しさん:2009/06/27(土) 17:36:12
お前ら、こんなコミュニケーション能力無い奴によく親身になれるな
899デフォルトの名無しさん:2009/06/27(土) 17:38:53
こんな馬鹿に教えた自分が情けない
900デフォルトの名無しさん:2009/06/27(土) 17:43:22
空気読めなさ杉
901デフォルトの名無しさん:2009/06/27(土) 17:51:21
こんなスレにも>>897のような基地外っているんだな
902デフォルトの名無しさん:2009/06/27(土) 17:58:01
教える側にも問題大あり
>>897がこのような態度を取る気持ちもわからなくもないよ
どっちもどっちだな
903デフォルトの名無しさん:2009/06/27(土) 18:01:39
そもそも教える側をそうさせたのは質問者の態度だけどな。
つまりスルーすべきだったということだな。
904デフォルトの名無しさん:2009/06/27(土) 18:04:46
>>903の言う通りだな。
905デフォルトの名無しさん:2009/06/27(土) 18:05:17
>>902が正論!
906デフォルトの名無しさん:2009/06/27(土) 18:08:40
>>881が既に言ってるだろ
907デフォルトの名無しさん:2009/06/27(土) 18:12:21
いいからキチガイは出てけよ
908デフォルトの名無しさん:2009/06/27(土) 18:14:33
とキチガイが申しております。
909デフォルトの名無しさん:2009/06/27(土) 18:20:57
答え教えてもらったのに粘着か
910デフォルトの名無しさん:2009/06/27(土) 18:27:38
と粘着が申しております。
911デフォルトの名無しさん:2009/06/27(土) 19:40:56
噛み付いてくるあたりキチガイの自覚はあるようだな
912デフォルトの名無しさん:2009/06/28(日) 13:03:16
>>895
定数項じゃなくて係数じゃね?
まぁどのみち891は意味が分からんが。
GUI以外では多項式時間に収まらないような計算でもやってんのか?

>>902
どっちもどっちてwwww
897みたいなアフォの気持ちなんて分かるわけないだろ。

 8 9 7 以 外 に は な 。
913デフォルトの名無しさん:2009/06/28(日) 19:08:06
とにかく897にはもう触れるな
自演じゃないならな
914839:2009/06/29(月) 16:02:49
皆さん丁寧な返答ありがとうございました
無事動かす事が出来ました。

今使っている本なのですがプログラムの
細かい解説が載っていなく、
ベタ打ちで打って動かして読み取く方法しか取れません。

良かったら初心者にオススメのopenGLの本何か無いでしょうか?
初心者なのでサイトも考えられますが、
自由に使えるネット環境では無いのでサイトではなく本で勉強したいです。
915デフォルトの名無しさん:2009/06/29(月) 16:06:29
因みに今使っているのは
Mason Woo著者の
OpenGL Programming Guide です。
英語の本なのですが、アマゾンでこれしか見つからなくて…
916デフォルトの名無しさん:2009/06/29(月) 16:27:25
キミはC言語の基礎からして怪しいような
917デフォルトの名無しさん:2009/06/29(月) 16:43:35
>>915
その本は俗に赤本(Redbook)といってopenGLのバイブル的本。その本で細かい解説が載ってないというのはどうかと。
ただC言語の本じゃないので、処理の流れまでは説明してない。あくまでもopenGLの本だから。

ちょっと高いけど日本語版もあるので、日本語で読んでみたら?
http://www.amazon.co.jp/dp/4894717239
赤本が最初からじゃ重いというなら、別の本を買うのもいいかもしれんけど、自分が入門したころは赤本しかなかったのでよくわからん
絶対にネットじゃ嫌だってなら、床井氏の本とかいいんじゃない。安いし
http://www.amazon.co.jp/dp/4777511340

あと866にも書いたけど、赤本のサンプルプログラムはネットにあるのでベタ打ちしなくても動かせるよ
http://www.opengl.org/resources/code/samples/redbook/
918デフォルトの名無しさん:2009/07/01(水) 03:49:01
glutで簡単な2D描画APIを習作として作ろうとしているのですが,glutMainLoopの呼び出しが不可避であることは分かりました

しかし,main文中で
 (1) ウインドウを開く
 (2) 図形の描画
 (3) ウインドウを閉じる
の順番で処理を行いたいと考えています.
ウインドウを開くためにglutMainLoopを呼び出してしまうとそこから先の処理に進めません
メインスレッドの処理を中断させないために,glutMainLoop内の処理を別スレッドで行わせるといった事は可能なのでしょうか?

LVの低い質問で恐縮ですが,何かいい方法があればご教示願います.

919デフォルトの名無しさん:2009/07/01(水) 08:16:24
glutMainLoopの中でその処理やれば良いじゃん
920デフォルトの名無しさん:2009/07/01(水) 16:45:55
>>918
その程度ならGLUTで十分可能。
イベントドリブンプログラミングについてググれ。
921デフォルトの名無しさん:2009/07/02(木) 04:01:39
>>919>>920
誤解を招いてしまったようなので追記します.
GUIベースのいわゆるお絵かきソフトではなく,プログラム中で計算した結果をグラフにして表示させるために用いたいと考えています.

int main(...)
{
init(...); // 初期化処理(glut初期化)
// TODO : 計算
drawLine(...); // 描画命令
close(...); // 終了処理
}

というようなプログラムが書けるAPIにしたいのですが,
initの中でglutの呼び出しおよびglutMainLoopの呼び出しを行ってしまうと,ウインドウは開きますがその先の処理に進めません.
やはりglutではこのような要求を満たすのは難しそうです.

・終了処理関数内でglutMainLoopを呼び出し,結果のみを表示する(妥協案)
・描画関数が呼ばれる毎に新しいウインドウを開き,古いウインドウを閉じる(一応現実的だが非効率)
・SDL等の別のAPIを用いる(妥協案2,win/linux両対応かつ複数ウインドウに対応しているglutは理想的)
・glutで作成したウインドウに,glutのコールバック関数を用いずに何らかの方法で図形を描画する

現在上記の選択肢のどれをとるかで迷っています.
922デフォルトの名無しさん:2009/07/02(木) 05:36:26
だからglutのコールバック関数を用いて描けばいいだろ
923デフォルトの名無しさん:2009/07/02(木) 06:45:35
うん、C初心者スレからやり直すべきだと思う
924デフォルトの名無しさん:2009/07/02(木) 08:27:37
脳がコチコチに硬化してるぞ
その若さで哀れな……
925デフォルトの名無しさん:2009/07/02(木) 08:52:37
素人ってすぐにスレッドとか言い出すよね、どこで聞きかじってくるんだか知らないけど。
これだけだとアレなので、床井先生の手抜きOpenGL入門の最初のほうを見てくると良いよ。
926デフォルトの名無しさん:2009/07/02(木) 23:18:15
メインスレッドで何か計算していて, 別スレッドで計算途中の値をリアルタイムで表示したいってことかな?
メインスレッドでやっている処理をglutのIdleFunc内で実行できるようなループ処理にすれば1スレッドで実行可能じゃないか?
それが面倒ならメインスレッドを実行しながら別スレッドでglutMainLoopを実行し, display関数内でメインスレッドで処理しているデータを参照しながらグラフでも描画すればいいんでね?
確かglutMainLoopを抜けるにはexit関数しかなったと思うんだけどそれが嫌ならopenglutでも使ってみたら?
glutと似たようなAPIだけどメインループは自分で書けるよ。
927デフォルトの名無しさん:2009/07/03(金) 01:14:40
>>926
レスありがとうございます.
用途的にはそういった事も想定しています.

計算処理をglutにコールバック関数として渡せば確かにリアルタイム表示は可能ですが,
>>921のような手順で処理ができるようなAPIを目指しているのでやはりglutに頼るわけには行かないようです.
ご紹介いただいたOpenGLUTを丁度漁っていたところなので,これを使って頑張ろうと思います.
928デフォルトの名無しさん:2009/07/03(金) 01:23:08
GLUTでも書き方しだいでどうとでもなるだろ。
なんかイライラする。
929デフォルトの名無しさん:2009/07/03(金) 03:30:11
言葉尻は丁寧なんだけど都合のいいレス以外読み飛ばしてる感があるな
930デフォルトの名無しさん:2009/07/03(金) 04:14:31
処理の依存性の反転みたいなことがわかって書けないと、結局スレッドもしんどそうな。
あおりっぽいひとたちの言葉も、案外老婆心だなと思ったり。今回に関しては。
最近流れ悪いな。
931デフォルトの名無しさん:2009/07/03(金) 07:31:05
こういうのを慇懃無礼というんだろうな
932デフォルトの名無しさん:2009/07/03(金) 13:22:47
>>930
1行でその人が真に必要としているものを示しているわけだから煽りとも言えないだろう
933デフォルトの名無しさん:2009/07/04(土) 00:33:57
>>921
「APIにしたい」「APIを目指す」とか意味の分からない用語を使ってるあたり、
OpenGL以前に学ぶべきことが多過ぎるような気がするけど・・・。
ま、それはともかく。

A→B→C という順番で処理をするなら、プログラムも
 A;
 B;
 C;
というように書かないといけない・・・と思っているのだとしたら、いつまでたっても
GLUTに限らずイベントドリブンなツールキット/フレームワークは使えないよ。
>>921さんのやりたいことは、GLUTで十分に、簡単にできる。
934デフォルトの名無しさん:2009/07/04(土) 00:34:39
たとえば
 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は誤解でもなんでもなく、ごくまっとうなアドバイスなのですよ。
935デフォルトの名無しさん:2009/07/04(土) 07:49:40
>>921をよく読むと、彼はさ、
main(){
calc();
draw();
fin();
}
ってやりたい。そういう「API」を作りたいって言ってるみたいよ。
そこで、いやglutだとこうやって実装するのが正しい、とかそんなの関係ないの。
draw()で描画します、fin()で終了しますっていう「仕様」の「API」を作らねばならんらしい
ウィンドウがリサイズされたり再描画するイベントが起きたらどうするかって?さー?
結局glutのフレームワークとは相反するんだし、「glutではできない、全部自分で作ろう」っていうのが正解か
最近の流れは>>850が正しいのかもね
936デフォルトの名無しさん:2009/07/04(土) 12:15:53
一瞬で消えちゃいそうだな、ウインドウ
937デフォルトの名無しさん:2009/07/04(土) 14:23:53
まぁ僕も、glutMainLoop()の下に後処理を書きたくて、
例外投げて脱出してみたりとか試したこともあったけどねw
debugビルドではうまくいったんだけど、releaseビルドでは落ちちゃったので諦めた。
あれは何故なんだろう?
あと、やったことないけど、setjmp/longjmpならいけるのかな?

GLUTも、glutExitMainLoop()とかあればいいのにね。何故無いのかなー。

>>936
でも>>918がやりたいのはそういうことなんですよねぇ多分・・・。よく分からんけど。
938デフォルトの名無しさん:2009/07/04(土) 14:35:44
GLUTソースあるだろ。読んだことないのか?
939デフォルトの名無しさん:2009/07/04(土) 14:44:26
>>937
終了する以外にglutMainLoop抜けたい理由はないんだから、
終了イベントが来たら後処理してexitすればいいじゃん。
glutMainLoopの下に書かないといけない理由はないっしょ
940デフォルトの名無しさん:2009/07/04(土) 15:02:08
というか、そこまでするくらいならglut使うのやめればいいのに
941デフォルトの名無しさん:2009/07/04(土) 16:41:42
glutで間に合う、間に合わないに関わらず、古いglutを使うのは止めてglfwとか
open scene graphでも使った方がいいと思います。
きっと優しい>>945がわかり易い日本語解説サイトを立ち上げてくれるだろう。たぶん。
942デフォルトの名無しさん:2009/07/04(土) 17:03:50
>>939
んなこた言われなくても当たり前に分かってるよ。実際そう書いてるし。
ただ、下に「書かないといけない」理由は無くても、そう書ければ嬉しい場合はあるでしょ。
main関数内で作った自動変数のデストラクタを走らせたいとか、(918みたいに)init()とfin()を対応させたいとか。
現実問題としてglutExitMainLoop()は無いのだから918はGLUTに合わせた書き方をするべきだけど、
それとは別の問題として、なんでglutExitMainLoop()が無いのかな(あったらいいのに)と思った。というだけの話。

glutExitMainLoop()の実装に手間がかかるとも思えないし、他のGLUT APIとの間に
矛盾が出るわけでもないと思うんだけどなぁ。
・・・とか書くと確実に、「だったら自分でGLUT書けよw」とか言い出すやつが出てくるだろうけど
意味が無いからレスはしませんよとあらかじめ言っておく。

>>938
メンドクセーから読んだ事ないけど、読めばglutExitMainLoop()が無い理由とか分かんの?

>>941
GLUTより新しいのを使うべきというのはごもっとも。
そして>>945に期待。
943デフォルトの名無しさん:2009/07/04(土) 17:12:07
何をやりたいのか良くわからんが、なんでglutMainLoop()の外で何かやりたがるんだろう。
glutIldeFunc()やglutKeyboardFunc()、glutTimerFunc()などに、ユーザ定義の関数を渡してやれば
いいだけのような気がするんだが。
なんか簡単なことを変に難しく実装しようとしてない?
944デフォルトの名無しさん:2009/07/04(土) 17:13:16
>>942
そもそもGLUTは学習用に作られたauxが古くさいから置き換えるために
書かれたAPIだからな。オリジナルの実装者はもうメンテナンスを放棄しているし
ライセンス上ソースを勝手に改変出来ないから色々な派生プロジェクトが出来た。
とは言っても所詮小さなツールを作る程度までのAPIだから別にそこまで
注目されなかったんだよ。

ちなみに、freeglutだとglutLeaveMainLoop()というそのものズバリな関数が
用意されているがな。
945デフォルトの名無しさん:2009/07/04(土) 17:17:04
無い理由もクソも
単に設計段階でMainLoopを抜ける使い方は想定されてないってだけの話だろ。
そもそもFORTRANとANSIに準拠したCのライブラリなのに、デストラクタとかアホか。
946デフォルトの名無しさん:2009/07/04(土) 17:18:28
I can read an easy Japanese.
947デフォルトの名無しさん:2009/07/04(土) 17:26:33
必要な終了処理は、例えばescキーが押された時点でやるとかすればいいと思うんだが、
それか、atexit()やon_exit()で終了処理を登録するとか..

948デフォルトの名無しさん:2009/07/04(土) 17:29:59
>>945
いや、デストラクタは単に現在glutExitMainLoop()が欲しい理由の一例として挙げただけで・・・
対応する前処理と後処理を、ソースの上で近い場所、同じ関数に置いておきたいっていうのは
プログラマとして当然湧いてくる欲求だろ。(「自動変数生成→デストラクタを走らせたい」も同じ)
要するに、なんで「MainLoopを抜ける使い方は想定されてない」んだろう?って話なんだよ。
まぁ、当初からそこまで真面目に考えられてなかった、てのは分かったけどさ。

なんでいちいちここまで書かないといけないのかな。
そういう事を考えたりとかしないわけ?
デストラクタって言葉尻だけ捕まえて噛み付くとか、まったくもってナンセンスだ。
949デフォルトの名無しさん:2009/07/04(土) 17:34:01
抜ける使い方が想定されてないというよりは、「抜けるな」と主張してるように思えるけどね。
イベントループを抜けるってことは全てのウィンドウは閉じてるのだろうし、
画面にウィンドウが無いなら終了してください。mainには戻ってきませんので忘れ物の無いようにお願いします。
って言ってんだよ。そのほうが使いやすいし、間違いも起こりにくいでしょ
950デフォルトの名無しさん:2009/07/04(土) 17:48:44
結局この質問者も荒らし?

> そういう事を考えたりとかしないわけ?
普通の人間なら、こんなどうにもならない事をずっとグダグダ考えてる
暇があったら、さっさとGLUTを使わないコードを書いてる。
951デフォルトの名無しさん:2009/07/04(土) 17:56:11
>>949
個人的には同意しかねるけどなるほど、そういう主張と解釈するのもアリですかね・・・。
952951:2009/07/04(土) 17:59:37
ああっ、間違えて途中で送っちゃった。

まぁ950から荒らし認定も頂いたことだしwwとりあえずここいらで消えますわん。
953デフォルトの名無しさん:2009/07/04(土) 18:08:34
この前のじゃば男と同じ奴か?
954デフォルトの名無しさん:2009/07/04(土) 18:43:52
じゃばダメ絶対
955951:2009/07/04(土) 18:48:17
いやちょっと待て、消えるつもりだったけど他の人まで一緒にされたんじゃ困るから一応書いておく
>>933>>934>>937>>942>>948>>951>>952
が僕ね。てかどこをどう読めばじゃばの人と同じに見えんの? ・・・見えるんですかそうですか。('A`)
956デフォルトの名無しさん:2009/07/04(土) 19:17:03
「真面目に考えられてなかった」とかすげえ自分本位な意見だな。
自分と違う考え方は全て間違ってるとでも言いたげな。
無意識に他人を見下してるタイプと見た。

お前のポリシーとglutのポリシーは合わないので、
さっさとglutから離れることをオススメするよ。

つーかあと、純粋に言動が気持ち悪いよお前。
957デフォルトの名無しさん:2009/07/04(土) 19:35:19
真面目に考えられてないとか、お前mjkを馬鹿にしてんのか?
958780: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()を呼び出しているのですが、ここをコメントアウトすることで落ちなくはなりました。
959780: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を呼び出すというのはなんだか無限ループを作っているような感じがするのですが、こうすることの利点が何かあるのでしょうか?
960デフォルトの名無しさん:2009/07/05(日) 12:37:30
>>959
AntTweakBarとやらを使った事無いし、落ちる原因にも思い当たらないのですが、最後の
>display関数の中でglutPostRedisplayを呼び出すというのはなんだか無限ループを作っているような感じがするのですが、こうすることの利点が何かあるのでしょうか?
の部分にだけコメントを。

「無限プール」てのは無限再帰呼び出しのことでしょうかね。
だとしたら、glutPostRedisplayの動作を勘違いしてるかも。
glutPostRedisplayはその中でdisplay関数を呼び出すわけじゃなく、GLUTに対して
「次に機会があったらメインループからdisplay関数を呼んで頂戴」というメモを書き残すだけで、
glutPostRedisplay関数自体からはすぐに処理が帰ってきます。
だからdisplay関数の中で呼んでも大丈夫だし、あちこちで複数回呼んでも大丈夫。
ちなみにGLUTに限らずどのライブラリでも、〜Post〜とかいう名前の関数は、似たような動作
(イベント等の登録だけして、すぐに処理は帰って来る)をすることが多いです。
・・・そのくらいのことはすでに分かってる、とかだったらゴメンナサイ。

display関数の中でglutPostRedisplayを呼ぶ利点といったら・・・再描画のタイミングを
あれこれ考えなくても、勝手に延々と再描画をし続けてくれることですかね。つまり手抜きw
961デフォルトの名無しさん:2009/07/05(日) 12:47:26
AntTweakBarってちょっとおもしろそうだなと思ったので釣られてみる

>>958
まず言いたいのは、理由も無くコーディングしたり、ためしに1行消してみたら動いたとか、
そしたら違うバグが出たのでためしに2回呼んでみたけどダメだった。とかやめろ
それで偶然動くようになったプログラムとか怖くて使えないから。

glutPostRedisplay()は再描画マークをイベントキューに入れる(再描画を予約する)だけなので、
常に描画され続けているという無限ループにはなるけど問題はない。
利点はそうしないと、GUIを動かした時にGUIが再描画されないでしょ。(他にも方法はあるだろうが一番簡単)
glutPostRedisplayを消したら落ちなくなったのは描画する回数が圧倒的に減ったので落ちるまでの時間が延びただけだろう

それよりwindowB_display()を呼んでいるのはなんで?
マルチウィンドウならそっちのdisplay()もコールバック登録してあるんじゃないの
つか「・・・」ってとこに原因はないの?「・・・」とwindowB_display()をコメントアウトすれば動いたりせんか?w
962780: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関数の中で記述すように書き換えたなんて経緯があります^^;
963780: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回やってみました。
964780: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
同じ結果ですね〜^^;
965デフォルトの名無しさん:2009/07/05(日) 15:42:27
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だけのテストを行うべきでしょ
966デフォルトの名無しさん:2009/07/05(日) 15:42:59
マルチウィンドウじゃないと駄目なの?
マルチビューポートならそんな問題は起きないけど。
967780:2009/07/05(日) 21:36:48
>>965
カレントウィンドウの切り替えは
glutDisplayFunc(windowB_display);
を定義して
windowB_display()
{
glutSetWindow(windowB);
・・・
glutPostRedisplay();
}
といった感じでやってます。

> 同じ結果ってのは同じように落ちるってこと?「・・・」とwindowB_displayをやらないってことは実質AntTweakBar関係しかやってないってことじゃん
> それで落ちるってことは原因はAntTeakBarを用いたGUI部分にある可能性が高いのだから
> AntTeakBar以外の部分(多分あなたの研究の部分)を全部隔離して、GUIだけのテストを行うべきでしょ
隔離できるところまで隔離しきって試してみます。

>>966
当初はマルチビューポート的なコーディングをしていたのですが、画面制御(ユーザ好みにサイズ調整を行う等)の実装がきつくなってきたので、出力内容毎に窓を分けるようにしました。
968デフォルトの名無しさん:2009/07/06(月) 01:02:51
Nurbsで作った曲面にテクスチャマッピングする方法を教えてください
969デフォルトの名無しさん:2009/07/06(月) 02:13:34
どうテクスチャマッピングしたいのか教えてください
970デフォルトの名無しさん:2009/07/09(木) 01:50:50
glBegin() ~ glEnd() などの描画をスクリーン用のバッファではなく、
テクスチャに対してレンダリングするにはどうすればよいでしょう?
971デフォルトの名無しさん:2009/07/09(木) 01:53:03
FBO
972デフォルトの名無しさん:2009/07/09(木) 21:11:44
クライアントメモリーを通さずに Windows のスクリーン全体の画像をテクスチャに転送する
方法はあるでしょうか?
973デフォルトの名無しさん:2009/07/09(木) 22:27:45
クライアントメモリーって何?システムメモリを指しているなら無い。
974デフォルトの名無しさん:2009/07/10(金) 00:52:53
>>973
OpenGL でいうクライアントが動作しているマシン側のシステムメモリのことです。

ウィンドウとレンダリングコンテキストの作り方によって glCopyTexImage2D()
で転送できるのではと思ったのですが無理ですかね。
975デフォルトの名無しさん:2009/07/10(金) 01:04:08
デスクトップのイメージを取得するにはGDI経由以外ないから
どうやってもシステムメモリを使用する事になるよ。
976デフォルトの名無しさん:2009/07/10(金) 13:49:14
FBOって拡張機能ですか?
977デフォルトの名無しさん:2009/07/10(金) 14:17:12
>>976
OpenGL 3.0で標準入り。それ以前では拡張扱い(EXT_framebuffer_object)
978デフォルトの名無しさん:2009/07/11(土) 02:00:29
キーボードを押すたびに物体が追加するようなプログラムはどうすればいいでしょうか?
979デフォルトの名無しさん:2009/07/11(土) 02:19:32
レベルの低すぎる質問はやめてください
980デフォルトの名無しさん:2009/07/11(土) 02:20:02
ゲーム的には

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そのものとは関係ない質問だな
981デフォルトの名無しさん:2009/07/11(土) 07:35:50
indekkusu ocha huita
982デフォルトの名無しさん:2009/07/11(土) 09:12:14
>>980
これ今自分で書いたの?
983デフォルトの名無しさん:2009/07/11(土) 09:29:52
こういう質問しちゃう人にそんなコード書いても理解してくれないと思うの
984978: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); をコメントアウトすると
それまでの画面は変な形で残りますが
物体は最終的には回転できるようにしたりするのでよくないのです
985デフォルトの名無しさん:2009/07/11(土) 23:09:42
な?
986デフォルトの名無しさん:2009/07/11(土) 23:13:29
flag == 1 でした
987デフォルトの名無しさん:2009/07/11(土) 23:14:59
>>980
コンパイルできるソースを書いてくれませんか?wwwwww
988デフォルトの名無しさん:2009/07/11(土) 23:29:14
みんな、スルーしようか
989デフォルトの名無しさん:2009/07/11(土) 23:42:40
980はスルーすんなよ?w
990デフォルトの名無しさん:2009/07/12(日) 00:39:28
次スレは>>995頼む
991デフォルトの名無しさん:2009/07/12(日) 01:12:56
>>980もわざわざエラーだらけにして底意地が悪いとは思うが、
あんな短いコードを読んで理解できないならOpenGL以前の問題
992デフォルトの名無しさん:2009/07/12(日) 03:51:56
実際、本人もそういうとるw
993デフォルトの名無しさん:2009/07/12(日) 04:39:00
>>850の通りになったw
レベルの低い質問はスルーした方がいい。
994デフォルトの名無しさん:2009/07/12(日) 05:14:03
氏ね
995デフォルトの名無しさん:2009/07/12(日) 10:02:03
996デフォルトの名無しさん
>>984
君が質問するべきはOpenGLスレじゃなくて、宿題スレだな。
ここはやり方を教えてくれる人はいても、答えを書いてくれる人はいない。
(つーか宿題スレ以外、「答えを書け」なんていう質問はどう考えても嫌われる。)
OK?