トップページ⇒tech
981コメント284KB

OpenGLスレ Part17

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/11/15(火) 18:45:31.83
クロスプラットフォームの3D API OpenGLに関する話題を扱うスレッド。
現在のバージョンは4.1
http://www.opengl.org/

== OpenGLと一緒に使われるツール&ライブラリ ==
苦労したくなかったらとりあえず入れとけ。
・glx:    XからOpenGLを使うためのライブラリ。普通は直接は使わず意識する事はない
・glut:   クロスプラットフォームなツールキット。でもさすがに古くさい
・glew:   これを入れないと拡張機能が使えないor使いにくい
・glxgears: 歯車が回るベンチマーク。-infoでOpenGLのバージョンが見られる。OpenGLの動作確認はこれで
・glxinfo:  自分の使っているカードのOpenGLの機能が全てリストアップされる。
・OpenTK  C#からOpenGLを簡単に使えるようになる。VC#の強力なIntellisenseとあわせてサクサク開発可能。

== 必読書 ==
・OpenGLプログラミングガイド 原著第5版 (通称赤本)
・OpenGL(R) Reference Manual (通称青本)
・OpenGL Shading Language (通称だいだい本)
・OpenGL(R) SuperBible: Comprehensive Tutorial and Reference
・OpenGL ES 2.0 プログラミングガイド
・GLUTによるOpenGL入門
・GLUTによるOpenGL入門2 テクスチャマッピング
あると便利。
・ゲームプログラミングのための3Dグラフィックス数学

== チュートリアルサイト ==
床井研究室: http://marina.sys.wakayama-u.ac.jp/~tokoi/oglarticles.html
OpenGL de プログラミング: http://wiki.livedoor.jp/mikk_ni3_92/
NeHe:    http://nehe.gamedev.net/

== 前スレ ==
OpenGLスレ Part16
http://hibari.2ch.net/test/read.cgi/tech/1309182662/
0232デフォルトの名無しさん2011/12/07(水) 19:43:08.10
いつも省略してたからthenっていう書き方が斬新に見えた
本来は if then elseなんだな
0233デフォルトの名無しさん2011/12/07(水) 19:45:51.25
>>232
スマン

>>231 は擬似コードのつもりだ
0234デフォルトの名無しさん2011/12/08(木) 23:59:15.80
ES 2.0でglEnable/glDisableのGL_MULTISAMPLEがなくなってますが、
途中でマルチサンプルのON/OFFを切り替えるのって
もうできなくなってしまったんでしょうか?
0235デフォルトの名無しさん2011/12/09(金) 21:31:02.67
スレチだけど状態遷移書いてるとyieldとか手軽につかえたらなーと思うなぁ
0236デフォルトの名無しさん2011/12/10(土) 00:43:40.49
long jumpでええやん
0237デフォルトの名無しさん2011/12/10(土) 03:28:12.94
libpclマジオススメ
0238デフォルトの名無しさん2011/12/10(土) 16:16:42.39
>>231
ありがとうございます。また質問させてください。
0239デフォルトの名無しさん2011/12/10(土) 20:23:17.92
>>236-237
うーんなるほど・・・
0240デフォルトの名無しさん2011/12/10(土) 21:11:47.73
これまでの流れで自分の理解度が不安になったんで質問します。
質問1)
OpenGL の行列が C=CM なので
原点から10離れた位置でZ軸で45度回転する場合の行列を求めるには
紙の上では
C:カレント行列 R:Z軸で45度回転 T:X軸に10移動 I:単位行列
C=I
C=C * R ローカル座標のZ軸で45度回転
C=C * T ローカル座標のZ軸で45度回転したX軸で10移動
C=((IR)T)=(I(RT))

コーディングでは
C=I
C=C * T or C *= T ローカル座標のX軸で10移動
C=C * R or C *= R X軸で10移動したローカル座標のZ軸で45度回転
C=((IT)R)=(I(TR)) or C= I * T * R
つまり、紙の上では C=IRT コーディングは C=ITR
で、正しいですか?
0241デフォルトの名無しさん2011/12/10(土) 21:12:29.51
質問2)
OpenGL の行列が C=CM なので
原点から10離れた位置でZ軸で45度回転する場合の行列を求めるには
C:カレント行列 R:Z軸で45度回転 T:X軸に10移動 I:単位行列
紙の上では
C=I
C=T * C 絶対座標系のX軸で10移動
C=R * C 絶対座標系のZ軸で45度回転
C =((RT)I)=(R(TI))

コーディングでは
C=I
C=C * T or C *= T 絶対座標系のX軸で10移動
C=C * R or C *= R X軸で10移動した絶対座標系のZ軸で45度回転
C=((IT)R)=(I(TR)) or C= I * T * R
つまり、紙の上では C=RTI コーディングは C=ITR
で、正しいですか?
紙の上ではC=MC をコーディングではC=CM で計算しているので
行列の計算順は質問1)と同じですが、行列TやRの算出方法は
今回はたまたま同じ行列TやRが使えるだけで 質問1)と異なりますよね?
0242デフォルトの名無しさん2011/12/11(日) 09:54:37.99
>つまり、紙の上では C=IRT コーディングは C=ITR
>で、正しいですか?

正しいわけないだろ
0243デフォルトの名無しさん2011/12/11(日) 12:28:27.29
>>240-241
紙の上ってどういう意味?

>>242
何が悪いか言わずに正しいわけないだけ言うのって内容を理解してない人間がよくやる
0244デフォルトの名無しさん2011/12/11(日) 12:40:56.23
今からまた行ベクトルだ列だ転置だ左手だってはじめるのかw
0245デフォルトの名無しさん2011/12/11(日) 12:49:30.33
はあフレームバッファの始点を左上にしたい
0246デフォルトの名無しさん2011/12/11(日) 14:16:09.57
また阿呆が暴れてるのか。消えろよ 240
0247デフォルトの名無しさん2011/12/11(日) 14:47:23.17
紙の上ってのが良くわからんが C=IRT コーディングは C=TRI じゃねぇの?
右から計算するなら
0248デフォルトの名無しさん2011/12/11(日) 14:58:12.26
一部のandroid機種だとGL_INFO_LOG_LENGTHの値って常に0が返ってくるのね…

おのれー!
0249デフォルトの名無しさん2011/12/11(日) 16:29:34.26
紙の上=学校で習った数学での習慣を使った手計算の時の順序では、
ってことじゃないの?

ここは勉強出来ない、数学出来ない、ライブラリのリファレンス読んでわかったつもりの
ニートとクズの吹き溜まりだから、真面目な質問しても答え返ってこないよ
>>242-247 みたいなレスしか返せない。 さらにバカだと >>246 みたいな頭のおかしいレスになるし。

ちなみに俺は、数学弱いのでよくわからないw
0250デフォルトの名無しさん2011/12/11(日) 16:49:04.80
>>249はなんで書き込んだんだ?
0251デフォルトの名無しさん2011/12/11(日) 17:17:43.47
>>240
紙のRやTもOpenGLでは転置になるから同じR T ではない点に注意
(R * T)の転置 = Tの転置 * Rの転置
という関係があるので逆になるように見える。
縦書きと横書きの違いでしかない
つかずっと同じ話してるので、自分で実際にプログラム作って確認してみたらいいよ
0252デフォルトの名無しさん2011/12/11(日) 18:17:41.79
>>251
OpenGLでは転置になるとかウソ書くからまた混乱する初心者が増えるんだよ・・・。
OpenGLの主な(?)ドキュメントは列ベクトル表記を採用しているというだけの話だろ。
0253デフォルトの名無しさん2011/12/11(日) 18:33:20.71
>>252
その通りです。すいません。
0254デフォルトの名無しさん2011/12/11(日) 19:32:11.05
>>247は合ってると思うけどw
学校で習った数学での習慣を使った手計算の時の順序が
OpenGLでは逆になるという事だ
0255デフォルトの名無しさん2011/12/11(日) 19:48:22.38
紙の上とは
>>249氏のとうりです。
>紙の上=学校で習った数学での習慣を使った手計算の時の順序では、

>>247
確かにです。

>>254
皆さん、有難うございます。
0256デフォルトの名無しさん2011/12/11(日) 20:05:03.67
数学こそ列ベクトルが基本じゃないか

写像 f1, f2, f3 (対応する変換行列は M1, M2, M3)を考えたときに
列ベクトル [x; y] に f1, f2, f3 を順番に適用すると、

[x'; y'] = f3(f2(f1([x; y])))
    = M3 M2 M1 [x; y]

同様のことを行ベクトルで書くと、

[x' y'] = [x y] t(M1) t(M2) t(M3)   t(・)は転置

というだけの話だろ
というか、変換行列であることを無視して単なる行列演算の話をしても無意味
0257デフォルトの名無しさん2011/12/11(日) 20:14:05.98
数学、OpenGL=列ベクトル
C/C++の配列=行ベクトル
だから逆順に掛けるんだよ
0258デフォルトの名無しさん2011/12/11(日) 22:50:04.22
>>257
ハァ??????
0259デフォルトの名無しさん2011/12/12(月) 00:19:00.50
ここは自分の中の知識を相手に伝えることの出来ない人間と相手の言っていることを理解しようともしない人間の巣窟ですね
0260デフォルトの名無しさん2011/12/12(月) 00:21:37.57
さすがに>>257は、わざわざ頓珍漢な事を書いて場を荒らそうとしてるとしか思えないレベル。
0261デフォルトの名無しさん2011/12/12(月) 17:02:57.84
glutで作った二つのウィンドウに,
glDrawArraysを用いて全く同じ物を描画しようとすると,
エラーでプログラムが落ちてしまいます.
ウィンドウが一つの時は問題なく描画できています.
頂点の数は2^24個程なのですが,何か制限があるのでしょうか?
頂点の数を減らしても駄目でした.
0262デフォルトの名無しさん2011/12/12(月) 17:53:24.12
>>261
昔のことなんで間違ってるかもしれないが
テクスチャとか頂点配列ってウィンドウごとに固有じゃなかったっけ
0263デフォルトの名無しさん2011/12/12(月) 22:12:10.54
2つのスレッドが同じ所を参照しようとして… とか
いや適当だが
0264デフォルトの名無しさん2011/12/12(月) 22:52:59.22
クリティカルセクション
0265デフォルトの名無しさん2011/12/12(月) 23:00:25.39
wglShareLists
0266デフォルトの名無しさん2011/12/13(火) 00:38:39.68
glutでウィンドウ2つ作れることに驚いた
02672612011/12/14(水) 10:56:15.94
返信ありがとうございました.
検討したところ,>>262の方の言う通りでした.
VBOを二つ用意しても,予め二つ確保した場合では描画されず,
もう一つのウィンドウを作成したあとにもう一つのVBOを確保してやる必要がありました.
皆様,御助言ありがとうございました.
0268デフォルトの名無しさん2011/12/14(水) 14:49:13.76
>>267
それを共有するようにするのが>>265のwglShareListsだったり
glut使ってるとすんなりは無理かもしれないけど
0269デフォルトの名無しさん2011/12/14(水) 17:02:23.81
三次元中にGL_QUADSにglcolorで色をつけて描画したいのですが
線のみ色が変わります。塗りつぶすにはどうすればいいでしょうか?
0270デフォルトの名無しさん2011/12/14(水) 17:15:35.56
glPolygonMode 辺りを
0271デフォルトの名無しさん2011/12/14(水) 17:47:43.58
C#でOpenGLを使うのも悪くないと思えてきてしまった。
少なくとも、MFCで四苦八苦するのはもうイヤだし。
OpenGL Menu http://t.co/4BrpJVuT
0272デフォルトの名無しさん2011/12/14(水) 18:24:05.83
>>270
それを使って塗りつぶせました。
ありがとうございます。
0273デフォルトの名無しさん2011/12/14(水) 20:50:01.98
短縮URLやめようぜ
0274デフォルトの名無しさん2011/12/14(水) 21:19:57.20
なんで?
0275デフォルトの名無しさん2011/12/14(水) 21:50:46.83
>>271
MFC使わなきゃいいだけじゃね
stl と boost と自分の過去資産(win32ハンドリング含む)があればまったく不要

と言う俺は最近 Python+OpenGLが楽しい。直書きそのまま実行でGLSLのテスト出来るってのが、
スクラッチ&ビルドで実験コード書いてる時、超絶楽ちんぽん
0276デフォルトの名無しさん2011/12/15(木) 03:07:36.75
>>274
文字数にシビアな制限があるわけでもないし、
短縮だとどこへのリンクかURLから予測できないからクリックしずらい
0277デフォルトの名無しさん2011/12/15(木) 09:16:56.06
t.coだからtwitterのつぶやきをコピペしたんだろ。
0278デフォルトの名無しさん2011/12/16(金) 18:14:51.33

OpenGLって、ジオメトリインスタンシングを自動でやるのですか。

ディスプレイリストだったら、APIの仕様としてまとめて送るというのは知ってますが
ジオメトリまでやってるとは聞いた事がありません。
0279デフォルトの名無しさん2011/12/16(金) 18:29:18.90
glDrawElementsInstanced
0280デフォルトの名無しさん2011/12/16(金) 19:30:39.69
インスタンシングを勉強すると、1体しか出なくても
それで出してしまう

関数ポインタを習った後、何でもかんでも関数ポインタ使って実装したのと同じ
0281デフォルトの名無しさん2011/12/16(金) 19:51:58.10
インスタンシングが必要ない程度には早いって大昔に聞いたけど専用の拡張もできてたんだな
0282デフォルトの名無しさん2011/12/16(金) 20:02:18.47
やっぱ効果あるよ
30フレームすら維持できないくらいに頂点を増した状態でインスタンシングすると
60フレームにビターッと張り付く

0283デフォルトの名無しさん2011/12/18(日) 09:37:33.50
自分はカメラは3次元空間に配置するオブジェクトだからモデルビューに置くものだと思ってるけど
みんなはプロジェクションビューとモデルビューどっちに置く?
0284デフォルトの名無しさん2011/12/18(日) 10:15:36.87
お前は一体何を逝ってるんだw
0285デフォルトの名無しさん2011/12/18(日) 12:02:02.53
>>283
曖昧にしか理解していないか、
またはもの凄く話しを省略して話している?

自分が言った内容の詳細を説明してみろ
0286デフォルトの名無しさん2011/12/18(日) 14:07:21.36
ジオメトリだけ考えるならカメラ操作を投影行列の方でやってもいいんだろうけど、
それだとライティングやクリッピングその他、色々うまく動かなくなるよね。
0287デフォルトの名無しさん2011/12/18(日) 14:17:20.92
283=286だな
お前の理解はまったくダメダメなので
あと3回OpenGLの教科書を読み直せ
0288デフォルトの名無しさん2011/12/18(日) 18:05:43.34
>>286
まさかとは思うが、モデルビューとプロジェクションビューって言う、
プログラム的にまったく作りの異なる別の何かが存在してるとか思ってる?
あと、まさかカメラって言う、プログラム的に独立した、
何か曖昧なオブジェクトが存在してると思ってる?
02892862011/12/18(日) 18:28:08.72
いや283じゃありませんが。
お二人とも、想像力豊かなコトでw
0290デフォルトの名無しさん2011/12/18(日) 18:59:56.56
つかプロジェクションビューってなに
0291デフォルトの名無しさん2011/12/18(日) 20:02:32.63



「ここは茶臼山でしょうか?」

↓

関西人「ちゃうス」
0292デフォルトの名無しさん2011/12/18(日) 20:20:45.45
今どきのOpenGLで
自前で行列管理してる話とかじゃないのかしら
0293デフォルトの名無しさん2011/12/18(日) 22:51:23.18
こうするか
glMatrixMode(GL_PROJECTION);
gluLookAt(up_.x, up_.y, up_.x, eye_.x, eye_.y, eye_.z, center_.x, center_.y, center_.z);

こうするかって話じゃねーの?
glMatrixMode(GL_MODELVIEW);
gluLookAt(up_.x, up_.y, up_.x, eye_.x, eye_.y, eye_.z, center_.x, center_.y, center_.z);
0294デフォルトの名無しさん2011/12/18(日) 22:52:00.44
いや違うか
0295デフォルトの名無しさん2011/12/19(月) 08:43:44.81
いやそうでしょ
多分
0296デフォルトの名無しさん2011/12/19(月) 11:40:52.17
・glx:    XからOpenGLを使うためのライブラリ。普通は直接は使わず意識する事はない
・glut:   クロスプラットフォームなツールキット。でもさすがに古くさい
・glew:   これを入れないと拡張機能が使えないor使いにくい
・glxgears: 歯車が回るベンチマーク。-infoでOpenGLのバージョンが見られる。OpenGLの動作確認はこれで
・glxinfo:  自分の使っているカードのOpenGLの機能が全てリストアップされる。
・OpenTK  C#からOpenGLを簡単に使えるようになる。VC#の強力なIntellisenseとあわせてサクサク開発可能。


OpenGLちゅんは、なんでこんなに分家しとるん?

いちいちめんどくさいだろ。
1つで全部できるようなもんないのか
0297デフォルトの名無しさん2011/12/19(月) 11:50:10.15
いや違うカテゴリーのものを一緒にされてもw
0298デフォルトの名無しさん2011/12/19(月) 11:56:34.57
>>296
一人や一箇所が全部作ってる訳じゃないから。 分家してるとか、そういう事じゃないんだよ。LinuxやUnixのOSとかもそうだけど。
コンピュータの世界にあるライブラリや製品の多くがそうなように、それぞれバラバラに、
誰かがいつか思いついて開発して、そして増えて広がっただけ。 またはプロダクトの設計上、疎結の関係にして切り離したりしてるだけ

俺らが、他人の生み出した物を使わせてもらう分際で、それすらめんどくさいと思うのなら、
むしろ自分で一つにまとめたライブラリでも作って自分で使うか、または世界に発表して、標準化しておくれ。
誰にでもそうやって、高名を得るチャンスは平等にあるんだから
0299デフォルトの名無しさん2011/12/19(月) 12:04:05.26
>>296 阿呆か。
0300デフォルトの名無しさん2011/12/19(月) 12:16:28.84
分家というならESの方よね
0301デフォルトの名無しさん2011/12/19(月) 13:23:01.03
>>296
わらったw
0302デフォルトの名無しさん2011/12/19(月) 15:19:18.34
今は glm なんかもあるしなあ。
0303デフォルトの名無しさん2011/12/19(月) 18:32:49.87
これってnvidiaドライバのバグ?
glGetActiveUniformARBでシェーダ側の変数名を得ると
シェーダ側の変数が"uniform mat4 JointTransform[62];"の時
amd "JointTransform"
nvidia "JointTransform[0]"
と返ってくる
0304デフォルトの名無しさん2011/12/19(月) 20:35:01.94
>>296
>1つで全部できるようなもんないのか

いいとこに気がついたね
誰もそういうのを作ってないんだよ お前が作ればいいじゃん
0305デフォルトの名無しさん2011/12/20(火) 08:14:09.99
>>303
バグかどうか知らんけどうちでもそうなる。
もう随分前からずっとそうなので、そういうもんだと思ってやってる。
0306デフォルトの名無しさん2011/12/20(火) 10:50:30.42
>>304
だな。
そしてglなんとかがまた一つ増えるw
0307デフォルトの名無しさん2011/12/21(水) 05:31:10.57
魔方陣GLGL
0308デフォルトの名無しさん2011/12/21(水) 12:54:40.15
でも何で「glなんとか」なのか___

接頭詞としてglつけろ”という決まりでもあるのか。

glグレネードランチャーとかいうの作ったら、略称がglglになるじゃねえか。
0309デフォルトの名無しさん2011/12/21(水) 13:41:33.49
ARB48
0310デフォルトの名無しさん2011/12/21(水) 23:23:43.19
メンバーが抜けたり消えたりする
0311デフォルトの名無しさん2011/12/21(水) 23:52:38.10
えっ、それ減る一方
0312デフォルトの名無しさん2011/12/22(木) 01:45:12.94
SDLだってSFMLだってあるんですよ!
つかSFMLすげえな。SDLだったらSDL_imageやSDL_mixerが必要なところをこれひとつで全部賄えるなんて
0313デフォルトの名無しさん2011/12/22(木) 09:41:14.44
GLSLのfragment shaderでmain関数の中のfor文の打ち切り条件式に
uniform変数を使うと挙動がおかしくなるんですけど
uniform int n;
for(int i = 0 ; i < n ; i++){...
こんなの
これなんなんでしょうね
main関数以外でも同じようなことやってるんですがそっちは別段なんともないんですよね
0314デフォルトの名無しさん2011/12/22(木) 09:57:30.13
floatでシェーダーに渡して中でintにキャストしたら安定した
なんだこれ・・・
0315デフォルトの名無しさん2011/12/22(木) 10:37:55.73
Uniform変数にintって使えたっけ?
標準では無理だった気がする。まだベンダー拡張じゃなかったか
0316デフォルトの名無しさん2011/12/22(木) 11:16:54.55
あ、一応glew使ってます
あとGLSLは#version 120
0317デフォルトの名無しさん2011/12/22(木) 18:47:56.90
1.2じゃ駄目だった気が
0318デフォルトの名無しさん2011/12/24(土) 03:01:22.09
glGetUniformLocation
glUniform
0319デフォルトの名無しさん2011/12/25(日) 02:25:27.39
シェーダで使うライトの数はコンパイル時に決定するから外部変数にはできないのかー
なんか回避方法ないかねこれ
0320デフォルトの名無しさん2011/12/25(日) 09:35:52.68
floatで渡せよ。何いってんだ
0321デフォルトの名無しさん2011/12/25(日) 11:30:17.68
普通(?)のGLSLのライトの数はfloatで渡せばいいんだけど、
WebGLのGLSLはループ回数(の上限)がコンパイル時に決まらないといけないから
for (int i=0; i<8; ++i) {
 if (i >= num_lights) continue;
 ...
}
みたいな書き方になったりする。
0322デフォルトの名無しさん2011/12/25(日) 12:06:40.62
>>321
WebGL って OpenGL を JavaScript から使うバインダか何かじゃなかったか。
Python から OpenGL を使う PyOpenGL みたいな、要は
ほにゃららから OpenGL を使う 何とか、みたいなそういう立場の物。

なので、先に WebGL の話だけど、って前提置いてから話さないと、
君が一人で思ってる事なんて、誰にも伝わらないよ
0323デフォルトの名無しさん2011/12/25(日) 12:19:42.96
使う上限を予め決めといてライティング結果をライト毎に加算すればいい
使わないライトは0になる値を入れておけば問題ない
0324デフォルトの名無しさん2011/12/25(日) 12:22:04.66
素人考えだけど、テクスチャマップのファイルに
データとしてライトの情報を入れて、シェーダー側で参照ってできんの?
0325デフォルトの名無しさん2011/12/25(日) 12:29:37.33
ライトマップか投影テクスチャのどっちの意味かわからんけどできるよ
03263212011/12/25(日) 12:29:58.56
>>322
何を勘違いしてるのか知らないけど。
俺は319じゃないし、単にこういうこともあるって書いただけだよ。

>>324
できる。
0327デフォルトの名無しさん2011/12/25(日) 12:33:44.10
>>324
浮動小数点フォーマットのテクスチャファイルに、長い行列の要素放り込んで
シェーダ側でそれを参照、とかは珍しくない話。だが、

>データとしてライトの情報を入れて

これがどこまでを想定してるのが曖昧なので、YesともNoとも言いにくい

自分が使いたい情報で、かつUniform変数で渡してられないほどの分量があった時、
かつ浮動小数点フォーマットのテクスチャが使える環境なら、そういう手段を取る事もあるでしょう、って話
0328デフォルトの名無しさん2011/12/25(日) 12:36:30.60
>>326
じゃあそれを最初に言えよ。>>319-321 の流れみたら、普通に本人だと思うだろうが。
なんでお前も前提置いて話せないの?
お前が一人で思ってる事なんて、誰にも伝わらな… あれ?デジャブ?
0329デフォルトの名無しさん2011/12/25(日) 12:47:04.90
>>328
恥ずかしかったのは分かるがそう開き直られてもな。
お前みたいなアホの事まで考慮して書き込む気は無い。
0330デフォルトの名無しさん2011/12/25(日) 12:47:16.38
>>321
どうでもいいけどそこはbreakじゃだめなん?用途しだいか?でもcontinueである場合ってないよな?
0331デフォルトの名無しさん2011/12/25(日) 12:50:47.04
>>330
なんだったけかな…よく覚えてないけど、breakだとうまく動かなかったような。
■ このスレッドは過去ログ倉庫に格納されています