必読書は改定したい。 == 必読書 == -- CG入門 -- OpenGL以前の普遍的なCGの概念。 CG-ARTS協会の3冊は初心者向け。あとの2冊は上級者向け。 ・コンピュータグラフィックス (CG-ARTS協会) ・ビジュアル情報処理 (CG-ARTS協会) ・ディジタル映像表現 (CG-ARTS協会) ・ゲーム制作者になるための3Dグラフィックス技術 ・ビジュアルコンピューティング 3次元CGによる画像生成 -- 初心者用 -- ・GLUTによるOpenGL入門 ・GLUTによるOpenGL入門2 テクスチャマッピング ・OpenGL ES 2.0 プログラミングガイド -- 上級者用 -- ・OpenGL Shading Language (橙本) ・Shader Xシリーズ ・GPU Gemsシリーズ ・GPU Proシリーズ
-- モダンなOpenGL -- シェーダーベースの最新のOpenGLの学習 ・OpenGL 4.0 Shading Language Cookbook ・OpenGL SuperBible: Comprehensive Tutorial and Reference ・OpenGL 4.0 グラフィックシステム -- 数学 -- ・ゲームプログラミングのための3Dグラフィックス数学 ・実例で学ぶゲーム3D数学 ・ゲーム開発のための数学・物理学入門 -- 過去の遺物 -- 有名だが古いバージョンのOpenGLをもとに書かれているためすでに時代遅れ 通常は買う必要はない ・OpenGLプログラミングガイド 原著第5版 (赤本) ・OpenGL Reference Manual (青本)
赤本を遺物にして、openGLと関係ない本を必読はちょっと賛同できない
赤本なんて2011年にもなって読む本じゃないだろ 訳本はOpenGL 2.1だぞ 古い仕様のOpenGLを学ぶのにもわかりやすい本ではないし。 昔はあれしかなかったからあれを薦めていたが 2011年にもなってあれをすすめるのは老害だけ
俺が今OpenGLの包括的な学習書として1冊すすめるならOpenGL SuperBibleだな シェーダーベースのモダンなOpenGLでもっとも詳しく解りやすく書かれている。 日本語で読めるいい本はないね。 特にシェーダーベースの本が絶望的にない。 というわけで床井先生頼んだ!!
>>9 一理あるとは思うけど、
最新を追うだけが全てじゃないよ
ちょっと聞きたいんだが、いまどきの現場では OpenGLで2Dのゲームを作る場合にもシェーダー使っているんだろうか。
>>11 が、古きを知るために赤本がいいかというと違うと思う。
いずれにせよ赤本は時代遅れ
赤本をすすめる人間は信用できない
そもそも本なんて要らない
>>13 4x1対応の赤本が出たら手のひら返すんでしょ?
OpenGLなんて実際に使われているの?
使われてるよ
カーナビとか3Dじゃないけど使ってるねえ あとCADとか
glVertexAttribPointer()があればglEnableVertexAttribArray()は不要だと思うのですが、どうして分かれているのでしょう?
キーボードのpとoが壊れた時も使えるからかな
22 :
デフォルトの名無しさん :2011/11/19(土) 16:30:05.75
へえ
24 :
デフォルトの名無しさん :2011/11/21(月) 04:44:52.22
釣り針大き過ぎて無理
28 :
デフォルトの名無しさん :2011/11/21(月) 10:55:26.12
天才よ、ぱぱっと書いてやれ
>>24 以前から何度も書き込んでる奴か?
ネタとしても面白くないからいい加減失せてね。
これって物理エンジン使ったら簡単じゃね?
よく見たら2Dだった
GLSL触って間もないんですが glBlendFuncと同じようなこと(フラグメントシェーダで描画先のピクセルの色を取って合成みたいな) をGLSLで行いたいんですけどこれってできますか? 「描画先のピクセルの色を取って」の部分がどうすればできるのか分からないんですが
描画先のピクセルを参照することは出来ない。
んなわきゃない。 描画先のメモリを参照すればいいだけだ。
残念ながらできない
君、できないの?
37 :
デフォルトの名無しさん :2011/11/22(火) 18:38:47.74
盛り上がってまいりました!
できないことの証明は難しいが、できることの証明は簡単なはずだ まあGLSLで出来るかはわからないが描写先をフレームバッファオブジェクトにしておけば、 そしてテクスチャーバッファーにしておけば、普通にアクセスできるはず これレンダーバッファーではできないよね?レンダーバッファーは普通のGL関数でアクセスする専用ってことかね
普通の?画像処理と同じ要領なのね やりたいことがわからないけど、まあそれがわかれば解決策も容易にわかるはず
>>32 例外的だけど、tegraとか、一部のタイル系モバイルGPUではできるみたいよ。
参考 : NV_shader_framebuffer_fetch
GLEWライセンス見たけど要は修正BSDライセンス?
結局フラグメントシェーダからレンダーバッファを参照するのは不可能、でFA?
>>43 現在のほとんどのハードウェアでは出来ない。
>>41 のような例外は、レンダーバッファ(の一部)がシェーダから近い位置にレイアウトされているから。
OpenGLでOIT実装したいとおもってるんですが、DirectXでいうところのAppendBufferってOpenGLだとなにになりすか? あと、OpenGLのDirectX11相当の機能についてよいリンクなどあったら教えてください。
32=45? A-Bufferとかで検索すればヒントが得られるんじゃないかな
>>46 ありがとうございます、32ではありません。
EXT_shader_image_load_storeという拡張が欲しい仕様にみえます、OpenGL拡張の仕様書ページみながら頑張ってみます。
しかしNvidia拡張の魔改造ぶりはすごいですね、NV_shader_buffer_store...
もうデファクトスタンダードでいいよ
魔改造と言うか、元々HWベンダですし と言うか、大昔はハードウェアごとに全部ソフトウェアとか違ってた訳ですし
それは規格がなかった時代の話で今はOpenGLという規格があるのに自分勝手にはみ出してるって話だろ
まぁクロノスがグラボ作ってる訳でもないしな。
あ、魔改造は褒め言葉です。;-/ 次のプロファイルではARBのシェーダでもポインタとか使えるようになっているといいな。
なぜOpenGLは行列を逆ハンドサイドから掛けないといけない仕様にしたんでしょうか? わざわざ逆順に掛けて行く必要があるしC++のoperatorとも相性悪いしどうしても解せません
あっちが逆なんだよ
行列を掛ける方向と右手系左手系は関係ないし OpenGLはC++のoperatorの定義なんてしてないし 気に入らないなら適当なラッパー書けばいいだけ
>>55 右手系左手系は関係ないけど転置してるから右から掛けないといけないですよね
C++のoperator、例えば*は左結合なので右から掛けるという規則がすごく気持ち悪いです
確かに数学で出てくるアフィン変換行列と同じ形式ですがプログラミング言語から使うんだから
わざわざ扱いにくい形式を採用しなくても良かったのでは?と疑問に思っています
なんでこんなことに?
なら転地しないで左から掛ければいいじゃない。 CPUでなにを計算するかなんてOpenGLの知ったこっちゃないよ
59 :
58 :2011/11/25(金) 02:30:02.56
あ、ごめん、言葉足らずで変な言い方になった・・・。 「行列を左から掛けるのだと」のくだりは、ベクトルに対して行列を左から掛けるって意味じゃなく、 v'=vMに対してさらにローカルな変換を追加するときに新しい行列Nを v'=vNM とMの左に掛けるって意味でした。
ということはその場合はglRotate*等は混在できなくて 全てglLoadMatrixd*/glMultMatrix*で自前でするということ?
なんで突然glRotateが使えなくなんの。 とりあえず自分でコード書いて確かめてみなよ
>>60 なんかそもそも行列の演算とその使い方が分かってない感じ・・・かな。
もっと具体的に、どういう事をしたい時にどう困ってるのかが分かれば、
解決策も出ると思うんだけど。
とりあえずOpenGL(DirectX)の行列に関する仕様はおおかたの使い方において
妥当なようになっているし、大半の人は(多分)困ってないよ。
それはともかく そろそろ OpenGL の行列関数は使わない方がいいような気はする
使わないっていうか今の4.x系列は使えないだろ GLSL側でcolumn-majorで定義したのが許せない せっかく0から定義したのになぜバカな仕様を引きずるのか...
>>62 glRotate*等が内部で掛けている行列は列ベクトルへ掛ける用なので
自前で右へ右へ掛けていくために行ベクトル用の行列を作って掛けていったものに対して使うと当然結果おかしくなっちゃいますよね?
うわあめんどい・・・
>>61 自分のソースのglRotateしてる部分を回転行列の転置行列をgMultiMatrixするように置き換えれば使えない理由が分かります確かめてください
>>66 俺は何も困ってないし、何一つ疑問は無いので確かめないよ?w
>>66 右手左手座標系の違いはあるけど、
glTranslatef( x, y, 0 );
って書く替わりに
D3DXMATRIX mat;
D3DXMatrixTranslation( &mat, x, y, 0 );
glMultMatrixf(&mat.m[0][0]);
って書いても動くよね。
逆だ転置だって言うけど、どっちもマトリックスのメモリ配置は同じでxが入るのは*(m+12)
自分で書くなら、自分が使いやすいように実装したらいいんじゃね
>>65 >glRotate*等が内部で掛けている行列は列ベクトルへ掛ける用なので
違います。
>自前で右へ右へ掛けていくために行ベクトル用の行列を作って掛けていったものに対して使うと当然結果おかしくなっちゃいますよね?
おかしいのはあなたの考え方です。
58のURLは読みましたか?
その内容は理解できますか?できませんか?どっち??
>>69 >>58 はoperatorの解釈を変えるだの変換をかませだの書いてありますが
言ってることはそれでOKですか?
列中心か行中心かはデータの話でマトリクスの掛け算の定義は変わらないのは当たり前の話で
その上で自前の行中心の行列をかけてる途中で列中心の行列を掛けてしまうglRotate*をそのまま呼び出すことは出来ないよね?めんど。って話をしてるんですけどちゃんと聞いてますか?
>>70 自前の行列をそのままglRotatefを呼べるようなデータの配列順にしとけばめんどくないよって話
うん、マジでゴメン。
理解できてない人に理解できてるかどうか聞いても意味無かった。
しかしこれどう言えば分かってもらえるのか分からん・・・。
>
>>58 はoperatorの解釈を変えるだの変換をかませだの書いてありますが
>言ってることはそれでOKですか?
違います。
というかそんなことはどうでもいいです。
えっと確認なんですが、英語は読めますか?
>列中心か行中心かはデータの話でマトリクスの掛け算の定義は変わらないのは当たり前の話で
「データの話で」の意味が不明。
>その上で自前の行中心の行列をかけてる途中で列中心の行列を掛けてしまうglRotate*をそのまま呼び出すことは出来ないよね?めんど。って話をしてるんですけどちゃんと聞いてますか?
それが誤解なのだと、58に貼ったURLに書いてあるんですが…。
>>72 何一つ情報増えてないよね
自分で説明できないなら書かなきゃいいのに。
65 の人の誤解を言葉で正すことは不可能だと思うな。
自分が理解できないからって情報が無いと考えるのはダメだよ。 58に十分な情報があるのに。 ええとまず、そうだな、最低限のところだけ言うとすると、 glRotate(やその他)は、列優先の行列を掛けるのではないし、列ベクトルに掛けるための行列を作るのでもない。 まずここが分からないと話にならないんだけど・・・ なぜあなたは、OpenGLの行列命令が扱う行列は列優先で、列ベクトルに掛けるものだと思っているのですか?
数学の話とAPIの話とC言語の話と好みの話がごっちゃになってるんだな
薄々感じるのは、
>>53 ,56が問題にしたいのは実は行だの列だのって話じゃなくて、
v'=Mvという変換の状態に対してglRotate系を発行すると、生成された行列Rが v'=MRv と掛かるコト
(
>>53 ,56は v'=RMv となって欲しいと思っている)なんじゃないかと・・・。
「自前の行列」ってことはどっかでglLoadMatrixしてんでしょ じゃあglRotateのあとにglMultiMatrixすりゃいいんじゃねえの?
面倒なので3x3行列で書きます。 自作予定のMatrixクラスではx軸回転する場合DirectX(行中心行列)のように |1 0 0| |0 cos sin| |0 -sin cos| を掛けるのに対して、OpenGL(列中心行列)のglRotateは |1 0 0| |0 cos -sin| |0 sin cos| を掛けやがるから共存できねー って話です。
>>78 glLoadMatrixする直前に変換行列を転置させるから
glFlush直前ならOKなんですけど、変換途中に使うとなると
行列のLoadとGet時で転置を計2回やる必要があってやっぱり不便だなーと
x glFlush直前 o 描画関数呼び出し前
>>79 だからその配列を同じにすれば共存できるでしょって話でしょ
上は
m[0]=1; m[1]= 0; m[2]= 0;
m[3]=0; m[4]= c; m[5]= s;
m[6]=0; m[7]=-s; m[8]= c;
下は
m[0]=1; m[3]= 0; m[6]= 0;
m[1]=0; m[4]= c; m[7]=-s;
m[2]=0; m[5]= s; m[8]= c;
全く一緒
実際DirectXとOpenGLは同じなんだよ。
>>79 そもそもの話だけど行列そのものには行優先も列優先も無くて
2次元の行列を1次元の配列に格納するのが行優先なのか列優先なのかって話なので、
「行中心行列」「列中心行列」みたいな単語を使ってる点を見るに、根本的な勘違いがあるんじゃないかなぁと。
(ちょっと余計な話すると、独自の用語を使う人は、まず大抵その分野について
初歩的な理解ができてないです。きちんと意味を調べて、正しい用語を使いましょう。)
DirectX(のドキュメント)はベクトルを行ベクトルで書いて、ベクトルの変換は行列を右に掛ける形で表すから
X軸回転の行列は
>>79 の上の行列の形になるけど、DirectXのドキュメントを列ベクトルで書いて
ベクトルの変換は行列をベクトルの左に掛ける形で書き直すと、DirectXのX軸回転の行列も
>>79 の下の行列の形になりますよ。
>>82 も言ってるけど、両者は同じものなんですよ。
うーん、もうちょっと補足した方がいいだろうか。
>>82 や
>>83 で「同じ」と言ってるのは、何が「同じ」なのかというと、行列演算の「仕様」。
で、「仕様」と、その「数学的記述」は区別しないといけない。
OpenGL(の主なドキュメント)では仕様を、列ベクトルと左から掛ける行列で記述してるし、
DirectX(の主なドキュメント)では仕様を、行ベクトルと右から掛ける行列で記述してる。
同じ仕様を違う方法で記述してるだけだから、記述自体は相互に変換可能。
OpenGLもDirectXも仕様が同じなんだから、行列演算部分に関しては、同じプログラムがそのまま使える。
ってコトなんですよ。
>>83 行ベクトルに対するアフィン変換行列を行中心行列
列ベクトルに対するアフィン変換行列を列中心行列
というんだと思っていました。
一般的にはどう呼ばれているんでしょう
58のrow major、 column major?
左から掛ければ一緒というのはわかります
ただ右から掛けたい(*1)というのが独自で行列計算する動機なので左から掛ければ一緒はNGなんです
*1
左から掛ける場合Matrixクラスに対してoperator*=を定義できないため
>>86 の補足です
operator*=を定義できない、ではなく「効率的に定義できない」です
・row majorの場合
Matrix m; // ワールド座標系への変換行列
Matrix x1, x2; // 回転行列等
m *= x1;
m *= x2;
・column majorの場合
Matrix m; // ワールド座標系への変換行列
Matrix x1, x2; // 回転行列等
// M*=x1 は 意味的にM=M*x1なので使えない
m = x1 * m; // operator=が余計に発生
m = x2 * m; // operator=が余計に発生
もしくはむりやり Matrix t = x1; t *= m; Matrix t2 = x2; t2 *= t; m = t2;
>>87 >>79 の上のつもりで作った配列は右から掛けてok
できた配列は左版の転置になってると思うだろうけど、
それはそのまま直接OpenGLでもDirectXでも使えるメモリ配置になっている
実際にやってみたらわかると思うよ
>>87-88 の言わんとしてることはわかるけど、最近のコンパイラの最適化的にどうなんだろね
グラフィック系のオーバーヘッドはそこには全く現れないと思うけど。でも気持ちはわかる
>>89 ああ、確かに反対の反対で同じになりますね。
安心して寝れます。
> ・column majorの場合 > Matrix m; // ワールド座標系への変換行列 > Matrix x1, x2; // 回転行列等 > // M*=x1 は 意味的にM=M*x1なので使えない これが嘘だな。operator*=を定義すれば使える
DirectXもOpenGLも結局は同じ 同じ3Dを扱う物だからな ただ、DirectXはC++の配列の並びがそのまま使えるように左手座標系になってる OpenGLの場合はあらゆるプラットフォーム、言語で使うために右手座標系になっている ただ単にそれだけの事だ
右手座標だとそういう壁が超えられて左手だと超えられないの?
>>91 あなたのコードをメンテする人がかわいそうなのでプログラミングしないでください
ないよ
単にSGI-GLが右手座標系だったので、DirectXは左手にしてみましたみたいことじゃないの
>>98 ちゃう
OGL=数理重視
D3D=感覚・実用重視にしたら左手座標系になった
右手はマウス握ってるから、左手系にしといたほうが実用的だよなw
>>99 ちがう
なんでもいいからOpenGL と変えたかっただけ。
共通規格が成立するのを邪魔するのが、マイクロソフトの仕事だから。
DirectXが左手系を採用した理由を、設計者に本音で聞いてみたいよねw しかし左手系が実用性重視だのCの配列と相性がいいだの言ってる人は、 一体何を根拠にしてるんだろ? ワケ分からん。
OpenGL右手座標系のはずなのに左手でCoordinate作ってしまう x:中指,y:人差し指,z:親指
でも XNA で用意されている関数は右手系なんだよな 何がしたいのか分からん
MS のこれまでの所業を見て
>>102 以外の理由があるかというと
3DCGに関わって15年になるけどどっちでもいい
7. OpenGL does not force left- or right-handedness on any of its coordinates
あほか DirectXはとにかく速度重視したからC++の配列に合わせて左手座標にしたのだ 転置する必要をなくすためにな
右手座標だって転置する必要ないじゃん
してないように見えて実はハードウェア内部でしてる
>>111 してないよ
>>68 見ればわかるけど、D3DXMATRIXとOpenGLのマトリックスは全く同じ配列なんだよ
そりゃ一回Translationしただけなら転置の必要はないわな。
>>112 DirectXの場合はScaleしてからRotateしてTranslateするけど
OpenGLで、その順番でやってみなよ君
基本的なことを聞くけど ・座標系の左右と、行列の積の結合の左右 ・座標系の左右と、行ベクトルか列ベクトルか ・座標系の左右と、乗算すべき行列が概念的なスタックに積まれる順番 これらは本質的に無関係だよな
そもそもDirect3Dが左手だってのはどこから来てるの? 算術関数も両方用意されてるじゃん
>>115 自分で行列逆に掛け算してSetTransformしてんじゃないの
MultiplyTransformで掛けこんでいったらDirectXもTrans Rotate Scaleの順だったが
昔は左手座標しか無かったんだよ DirectX5時代の話だけど
なんかglLoadMatrixに渡す行列のレイアウトがD3DXと同じなのに glRotate/Translate/Scaleの変換の適用順がD3DXの乗算と逆なあたりが混乱の元凶な気がするんだが
>今までの行列演算でおかしいと思った方がいたらすばらしいです。 >実はDirectXでは通常の数学とは行列の演算順序を逆にしてるんですよね。 >数学では座標 * 行列の演算順序であるのに、DirectXでは行列 * 座標の >演算順序で表しています。 >迷惑な話ですが、このようなことで配列を効率よく使うことができ、 >メモリ効率が上がるらしいです。 >ただ、これだと行列の演算順序が変わると結果が変わってしまいます。 >そこで、DirectXでは行列を転置させて結果を変えないようにしています。 >ややっこしい。
>>123 > matWorld = matScale * matRot * matTrans;
v' = v * S * R * T
なんだから
デバイスのポインタ->SetTransform(D3DTS_WORLD,&matWorld);
をMultiplyTransformで書き換えれば、
デバイスのポインタ->SetTransform(D3DTS_WORLD,&matTrans);
デバイスのポインタ->SetTransform(D3DTS_WORLD,&matRot);
デバイスのポインタ->SetTransform(D3DTS_WORLD,&matScale);
になる。OpenGLと一緒。
>>125 下の3行はMultiplyTransformの間違い。
あと掛ける前にD3DXMatrixIdentityで作ったので初期化(glLoadIdentity同等)する必要もある
列優先だか行優先だか右手回転系だか左手回転系だか どれをなんて呼ぶのかよく覚えてねえけどさ z軸の符号が異なるだけの右手左手系は全然関係ねえでしょ? D3DXのLHとRHの結果の相違は転置してるだけ? 違うでしょ?
おまえ、SetTransformは行列スタックじゃねぇか D3DXMatrixMultiplyでやってみろ
D3DXMatrixTranslation D3DXMatrixRotation D3DXMatrixScaling でやってみたの?
>>125 お前どうしようもないな
v' = S * R * T * v
S,R,T,vの順にかける
>>117 @座標系の左右と、行列の積の結合の左右
座標系の左右と行列の積の結合の左右は関係ない
A座標系の左右と、行ベクトルか列ベクトルか
少なくとも数学では右手座標と列ベクトルを用いることが定まっている
そしてOpenGLはそれを採用
DirectXでは左手座標と行ベクトルを採用していた(当初)
理由として
2Dの場合画面左上が原点になる
C++配列と相性が良い
B座標系の左右と、乗算すべき行列が概念的なスタックに積まれる順番
座標系の左右と、乗算すべき行列が概念的なスタックに積まれる順番は関係ない
>>131 DirectXでは(紙の上ではOpenGLとは逆に) v' = v * M;
つか今回の話の発端はここでしょ
ちみがいいたいのは平行移動行列と回転行列、拡大縮小行列は同じって事だろ そう、同じだよ でもDirectXとOpenGLが同じかと問われたら、それは全然違うと答えるよ
C++配列と相性が良いってどういうことよ まさかメモリ効率云々を曲解してるんじゃないよな
Direct3DとOpenGLの座標系における明確な違いなんて o 非同次射影空間のz値のクリッピング範囲が[-1,+1]と[0,+1] o 補助関数(D3DX、glu)を比較するとむしろOpenGLが右手座標系しか選択肢が無いと言うべき くらいで後はどうでもいい。 というか後者もどうでもいいか。
あとテクスチャのピクセルが0.5ずれてるんだっけ
列優先設定でのDirect3D持ち出したらお前が言い出した
>>125 のOpenGLとDirect3Dが一緒って主張がトリビアルでアホ丸出しだったってことになるんだが
阿呆は今のことろ行列の合成順に右手左手言いだしたヤツだけだょ
>>135 転置行列を作成しなくてもよい=無駄なメモリ使わないしスピードも速い
物凄く効率的じゃないですか?
>>142 右手座標系(OpenGL)でプログラムする場合に、
どこで、何の理由で転置行列を作る必要があるのでしょうか
>>139 D3D10からはずれていないと思った。
なんでズレてんの?
つーか今のDirect3Dでは、D3D9で生にシェーダ定数渡す時も D3D10以降の定数バッファに渡す時もD3DXの行列は転置する必要があるんだけどねw D3DXの行列レイアウトの何が効率的なの昔からよくわからんのだが 焼き直しのXNA Mathでも同じだしSIMD有利なのけ?
なんだったかな とにかく速度優先にしたらDirectXの実装になったんだよ ゲームSDKとしてOpenGLより速く表示する必要があったから 決してOpenGLの逆にしたいとか下らない理由では無かったと思う
>>145 10で変わったのか、知らなかった。そういう仕様を変えちゃうってもすごいな。
>>148 説得力が無い
行列同士の積も、行列とベクトルの積も、
右手座標系と左手座標系で計算量は変わらんと思うが
列同士の積の場合にCPUの積和演算器を活用するなら、
右手でも左手でもどちらかの行列を転置しないといけないし
>>150 すまん、紛らわしいミスをした
> 列同士の積の場合にCPUの積和演算器を活用するなら、
行列同士の積の場合にCPUの積和演算器を活用するなら、
>>150 説得力が無いと言いたいだけか
気になるならよく事情わからない名無しよりMSに問い合わせればいい
http://marupeke296.com/DXG_No15_AttentionCoordinate.html @ どうして左手系なのか?
>そもそも、左手系と右手系の2つある中でDirectXが左手系を選んだのは
>なぜなのでしょうか?私たちは小さい時から右方向がX軸、上方向がY軸の
>2Dのグラフを見てきました。
>そしてごく普通にアニメや漫画のキャラクタは上方向であるY軸に頭を向けて立ちます。
>さてこの状態で3Dになった時、キャラクタの目線は画面の奥に向かうのが自然でしょう。
>そうすれば、キャラクタの目線方向とプレーヤーの目線方向も合います。
>「前へ進め!」とボタンを押したとき、画面の奥に向かっていくのが自然なのです。
>Z軸が画面の奥へ進む座標系は『左手系』です。
>この自然な成り行きでDirectXなどの3Dゲームは左手系座標を採用しています。
http://www.arakin.dyndns.org/gl_coord.php >しかし、私がよく使用しているペイントソフトのPictBearやGIMP、そして、あの有名な
>Photoshopも左上が原点です。
>私自身が慣れているのは左上原点であり、これまでアップしたきたサンプルも
>左上原点なのですが、やはり、OpenGLのプログラムをする時は、左下を原点にした方が
>分かりやすいため、左下で統一することにしました。ということで、多くのサンプルを
>一部変更しました。
直感的で自然でわかりやすいからというのが理由だろうな
本当の所はわからんが
自然だの直感的だのは人によって違うからねぇ。 ところで、左手系の方が効率が良いとかまことしやかな噂を聞く割には、 具体的にどの部分でどう効率が良くなるのかっていう説明は目にしないよね。 不思議だよねw
NDAを結ばないと見れない資料だったんじゃないの。 だとしたら不思議じゃないけど。
ギャグかそれ
setPlaymodeからsetPlayModeに勝手に変えんなよ糞osgが
OSGすげー汚くない? 適当にドキュメント読んだだけだけどあれ使う気にならんわ
OSsanGeyか
osgはシーングラフ完全特化というのと微妙にゆるい命名規約がいいな glutよりは好きかも
glutとosgを比べるのはちょっと無理があるだろ
私もosgのおかげで偏頭痛が軽減しました
左手座標が速いってのは上手くやれば視体積0.0〜1.0の範囲に収まるって事かな? その場合、マイナスの演算が無くなるから速くなるかもね
何言ってんのこの人
ネタに突っ込んでやるなよ
流石にこれは本当に 何いってんの?だと思った 煽る訳じゃないが、普通に思った
>>163 大変興味深い
もう少し具体的な数値を出して、
マイナスの演算が無くなって速くなる事を例示してみてはどうだろう
ネタとか言ってる愚民どもを黙らせることができるかも知れん
自演なのかな。 それとも病人が二人いるのかな。
三人だ。ようこそ。
アセンブラだと乗算は9clock、除算は46clockだっけ。 加算と減算はどうなんだ?
addとsubは同じ ただsignedとunsignedの乗算はまず、どちらかにそろえる必要があるから signedが増えると若干プロセスが増えるのは確か
浮動小数点の話じゃないの?
>>138 の言ってる事だろ
Direct3Dのビューボリュームが0〜1の範囲になってるのはそういう事だったのか
分かってるだろうが敢えて言う 行列式じゃなくて行列の式な 意味全然違うから
>>175 contentヘッダがplain/text返すhtmlファイルってどうよ?
これで左手座標系の方が速くなる理由がわかったな。 それ以外にもDirectXはZバッファリングを適当にごまかして処理を端折ってるからな。
そうですか
左手座標系関係無いじゃんw
てか、そんな速度差も100:1ほどあるなら話は別だが、 そうでないなら、自分の書く処理に集中するべき 私の書いたプログラムの、本当に注力するべき部分、 速度に関しても本当にボトルネックになっている部分、 それが本当に問題になっているなら、そこを洗って正すべき
>>181 言ってることは至極もっともだが、論点がずれてる
175の式見てDirectXの方が速いとか言ってる人達は、 1フレームに何万回と射影行列を作るんですかね。
行列1つについて話してるのになんで出てきちゃったの?
行列一つの話をしてどうすんのさ。 元々は、DirectXは速度優先のために左手系を採用したとかいう話だったわけでしょ。 それともDirectXは行列一つを速く計算するために左手系を採用したの?
175は行列の話なのに他の話と混ざっちゃったの?
つまり175は、DirectXが左手系を採用した理由とは関係無いし、 左手系の方が速いっていう都市伝説とも関係の無い、 射影行列を作るならDirectXの方がちょっとだけ速いよっていうだけの話、って事? だったらここで出す事に何の意味が・・・まぁいいか。
誰かベンチマーク
あの、左手系とか言ってる人はどの概念にその呼称を割り当ててるの? z軸が反転してること? メモリ配置の違いによる行列の合成順のこと?
メモリ配置とか言ってる人は数学ベースで考えられない人?
>>190 数学ベースなら右手も左手も全く同じ計算量なんだから、
あとはメモリ配置とかCPU命令、GPUの仕組みやドライバなどで考えるしかないような・・・
>>190 お前もう黙れよ低脳。 数学的に考えたら速度差の話に答えが出せるっての?
>>192 メモリ配置って言ってるのが恥ずかしくなった?
190みたいな、具体的な話は何もできないくせにさも何かを知ってる風にしたがる厨二はどこにでもいるわけで・・・
相手にしたところで、空っぽなところからは何も引き出せないんだから、熱くならないことをお勧め致しますよ。
>>192
射影行列って言っても、1秒60フレームなら60回分は速くなるわけな。 メモリ効率が良いってのはなんなんだ? GPUに転送する時に何かあるのか?
メモリ上で連続に配置されてるほうがキャッシュに乗りやすいから早い
ほうほう。左手座標は連続してて右手座標は連続してないのか。
>>199 それは確かにそうだが、
行列1つを行優先で配置しようが列優先で配置しようが、
普通のライブラリならどちらも連続的に配置する(ことを要求してくる)
採用している座標系の右手左手に関係なく
そして、行列同士の演算や行列とベクトルの演算において、
ある行や列は計算に不要ということはなく、全ての要素が計算対象となる
だから、行優先でも列優先でも、ましてjpgみたいに斜めに配置しようと、
連続的に配置されているのなら、1回の演算におけるキャッシュ効率は全く同じ
ちなみに、行列1つにつき32ビット浮動小数点16個分で、たった64バイト
ライン長64バイトのキャッシュメモリの場合、
行列の要素をメモリ上にどのように並べようが連続してさえいれば、
1行1列目にアクセスした時点で全要素キャッシュにロードされる
しかも64バイトの配列の並びは行優先と列優先の転置では同じでしょ DirectXのx行目y列目とOpenGLのy行目x列目は共にm[ x * 4 + y ]
メモリ配置厨涙目w
なんか痛々しいのが多いな
それ誰に対して言ってるの?
散々関係ないって言ってるのに いまだに右手だの左手だのほざいてるアホにでしょう
ポリゴンの一面単位でなく、頂点単位でglRotate〜などの変換を適用させる方法がわかりません 頂点データを毎回変更させてから描画するしかないのでしょうか?
>>207 それは例えば 「鋭く尖ったウニみたい五芒星を、まるっこい五角形に」 みたいな話?
頂点更新して再適用( glMapBuffer〜頂点更新〜glUnmapBuffer )するか、
または頂点シェーダで
>>208 そのような描画をしたいんですが、どうやら毎回更新するしかなさそうですね
ありがとうございました
>>209 ちなみに一つだけ老婆心で書いておくと、上の話を踏まえた場合、
>頂点単位でglRotate〜などの変換を
頂点の移動は glScale/glRotate/glTranslate でなく、自分で数学的に計算すること
何故って自分で持ってるデータを書き換えて、再送信だから
みんなツールキットは何を使ってるん?
普通wgl
Linuxでも使えたっけ wgl
まともな環境なら大抵はね
SDL androidに移植できるらしいが情報が全然なくて途方に暮れてる
SDLはライセンスに注意
GPL混ざってる?
SDLとGLFWとでは抽象レベルが全然違うような気がする
SDL使うぐらいならSFMLを使ったほうがいい
GLEWで音楽再生とかどうやるの?
恥ずかしながらSFMLって初めて聞いた 面白そうだけど日本語情報が少ないから大変そうだ……
>>221 GLFW 自体には音楽再生用の仕組みは用意されていないから、
別のライブラリやAPIを使う
play 関数を呼べば stop 関数を呼ぶまで再生し続ける関数があるなら、
それを適当なタイミングで呼べばいい
再生用バッファにwavデータを少しずつ放り込むタイプなら、
毎フレームにおいてバッファの様子を調べて適当にデータを放り込め
>>218 横からだけど、glutしか使ってなかった
glfwまじで使いやすかったわ・・・ガチでありがとう
225 :
224 :2011/12/06(火) 22:40:46.98
テンプレに入れて欲しいくらいだ
フレームワークだけは自作じゃないと落ち着かない
>>224 glutと比べてどこらへんが使いやすい感じなの?
>>227 ・ちゃんとメインループから帰ってくる
・tgaのテクスチャなら作るのラクチン
・glutくらいシンプル
229 :
デフォルトの名無しさん :2011/12/07(水) 16:18:16.17
GLUTによる「手抜き」OpenGL入門を見てアニメーションを作っているのですがこのやり方で一定の動きをした後同じオブジェクトに違う動きをさせるアニメーションを作るにはどうすればいいでしょうか?
どこのopenglのバージョンの境かしらないが 0サイズのテクスチャーをFBOにアタッチしてOKだったりエラーだったりするのな 焦らせやがって全くw
>>229 それは GLUT や OpenGL とは何の関係もない
「一定の条件を満たしたかどうか」を判定する方法と、
判定した結果に応じて「状態を遷移させる」方法があればできる
if (一定の動きをしたか?) then 違う動き else 同じ動き
とか
void anim1 () { 同じ動き }
void anim2 () { 違う動き }
--------
a = anim1 // 初期化
if (一定の動きをしたか?) then a = anim2
とか、方法はいろいろある
いつも省略してたからthenっていう書き方が斬新に見えた 本来は if then elseなんだな
ES 2.0でglEnable/glDisableのGL_MULTISAMPLEがなくなってますが、 途中でマルチサンプルのON/OFFを切り替えるのって もうできなくなってしまったんでしょうか?
スレチだけど状態遷移書いてるとyieldとか手軽につかえたらなーと思うなぁ
long jumpでええやん
libpclマジオススメ
>>231 ありがとうございます。また質問させてください。
これまでの流れで自分の理解度が不安になったんで質問します。 質問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 で、正しいですか?
質問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)と異なりますよね?
>つまり、紙の上では C=IRT コーディングは C=ITR >で、正しいですか? 正しいわけないだろ
今からまた行ベクトルだ列だ転置だ左手だってはじめるのかw
はあフレームバッファの始点を左上にしたい
また阿呆が暴れてるのか。消えろよ 240
紙の上ってのが良くわからんが C=IRT コーディングは C=TRI じゃねぇの? 右から計算するなら
一部のandroid機種だとGL_INFO_LOG_LENGTHの値って常に0が返ってくるのね… おのれー!
紙の上=学校で習った数学での習慣を使った手計算の時の順序では、
ってことじゃないの?
ここは勉強出来ない、数学出来ない、ライブラリのリファレンス読んでわかったつもりの
ニートとクズの吹き溜まりだから、真面目な質問しても答え返ってこないよ
>>242-247 みたいなレスしか返せない。 さらにバカだと
>>246 みたいな頭のおかしいレスになるし。
ちなみに俺は、数学弱いのでよくわからないw
>>240 紙のRやTもOpenGLでは転置になるから同じR T ではない点に注意
(R * T)の転置 = Tの転置 * Rの転置
という関係があるので逆になるように見える。
縦書きと横書きの違いでしかない
つかずっと同じ話してるので、自分で実際にプログラム作って確認してみたらいいよ
>>251 OpenGLでは転置になるとかウソ書くからまた混乱する初心者が増えるんだよ・・・。
OpenGLの主な(?)ドキュメントは列ベクトル表記を採用しているというだけの話だろ。
>>247 は合ってると思うけどw
学校で習った数学での習慣を使った手計算の時の順序が
OpenGLでは逆になるという事だ
紙の上とは
>>249 氏のとうりです。
>紙の上=学校で習った数学での習慣を使った手計算の時の順序では、
>>247 確かにです。
>>254 皆さん、有難うございます。
数学こそ列ベクトルが基本じゃないか 写像 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(・)は転置 というだけの話だろ というか、変換行列であることを無視して単なる行列演算の話をしても無意味
数学、OpenGL=列ベクトル C/C++の配列=行ベクトル だから逆順に掛けるんだよ
ここは自分の中の知識を相手に伝えることの出来ない人間と相手の言っていることを理解しようともしない人間の巣窟ですね
さすがに
>>257 は、わざわざ頓珍漢な事を書いて場を荒らそうとしてるとしか思えないレベル。
glutで作った二つのウィンドウに, glDrawArraysを用いて全く同じ物を描画しようとすると, エラーでプログラムが落ちてしまいます. ウィンドウが一つの時は問題なく描画できています. 頂点の数は2^24個程なのですが,何か制限があるのでしょうか? 頂点の数を減らしても駄目でした.
>>261 昔のことなんで間違ってるかもしれないが
テクスチャとか頂点配列ってウィンドウごとに固有じゃなかったっけ
2つのスレッドが同じ所を参照しようとして… とか いや適当だが
クリティカルセクション
wglShareLists
glutでウィンドウ2つ作れることに驚いた
267 :
261 :2011/12/14(水) 10:56:15.94
返信ありがとうございました.
検討したところ,
>>262 の方の言う通りでした.
VBOを二つ用意しても,予め二つ確保した場合では描画されず,
もう一つのウィンドウを作成したあとにもう一つのVBOを確保してやる必要がありました.
皆様,御助言ありがとうございました.
>>267 それを共有するようにするのが
>>265 のwglShareListsだったり
glut使ってるとすんなりは無理かもしれないけど
三次元中にGL_QUADSにglcolorで色をつけて描画したいのですが 線のみ色が変わります。塗りつぶすにはどうすればいいでしょうか?
glPolygonMode 辺りを
>>270 それを使って塗りつぶせました。
ありがとうございます。
273 :
デフォルトの名無しさん :2011/12/14(水) 20:50:01.98
短縮URLやめようぜ
なんで?
>>271 MFC使わなきゃいいだけじゃね
stl と boost と自分の過去資産(win32ハンドリング含む)があればまったく不要
と言う俺は最近 Python+OpenGLが楽しい。直書きそのまま実行でGLSLのテスト出来るってのが、
スクラッチ&ビルドで実験コード書いてる時、超絶楽ちんぽん
>>274 文字数にシビアな制限があるわけでもないし、
短縮だとどこへのリンクかURLから予測できないからクリックしずらい
t.coだからtwitterのつぶやきをコピペしたんだろ。
278 :
デフォルトの名無しさん :2011/12/16(金) 18:14:51.33
OpenGLって、ジオメトリインスタンシングを自動でやるのですか。 ディスプレイリストだったら、APIの仕様としてまとめて送るというのは知ってますが ジオメトリまでやってるとは聞いた事がありません。
glDrawElementsInstanced
インスタンシングを勉強すると、1体しか出なくても それで出してしまう 関数ポインタを習った後、何でもかんでも関数ポインタ使って実装したのと同じ
インスタンシングが必要ない程度には早いって大昔に聞いたけど専用の拡張もできてたんだな
やっぱ効果あるよ 30フレームすら維持できないくらいに頂点を増した状態でインスタンシングすると 60フレームにビターッと張り付く
自分はカメラは3次元空間に配置するオブジェクトだからモデルビューに置くものだと思ってるけど みんなはプロジェクションビューとモデルビューどっちに置く?
お前は一体何を逝ってるんだw
>>283 曖昧にしか理解していないか、
またはもの凄く話しを省略して話している?
自分が言った内容の詳細を説明してみろ
ジオメトリだけ考えるならカメラ操作を投影行列の方でやってもいいんだろうけど、 それだとライティングやクリッピングその他、色々うまく動かなくなるよね。
283=286だな お前の理解はまったくダメダメなので あと3回OpenGLの教科書を読み直せ
>>286 まさかとは思うが、モデルビューとプロジェクションビューって言う、
プログラム的にまったく作りの異なる別の何かが存在してるとか思ってる?
あと、まさかカメラって言う、プログラム的に独立した、
何か曖昧なオブジェクトが存在してると思ってる?
289 :
286 :2011/12/18(日) 18:28:08.72
いや283じゃありませんが。 お二人とも、想像力豊かなコトでw
つかプロジェクションビューってなに
291 :
デフォルトの名無しさん :2011/12/18(日) 20:02:32.63
「ここは茶臼山でしょうか?」 ↓ 関西人「ちゃうス」
今どきのOpenGLで 自前で行列管理してる話とかじゃないのかしら
こうするか 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);
いや違うか
いやそうでしょ 多分
296 :
デフォルトの名無しさん :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つで全部できるようなもんないのか
いや違うカテゴリーのものを一緒にされてもw
>>296 一人や一箇所が全部作ってる訳じゃないから。 分家してるとか、そういう事じゃないんだよ。LinuxやUnixのOSとかもそうだけど。
コンピュータの世界にあるライブラリや製品の多くがそうなように、それぞれバラバラに、
誰かがいつか思いついて開発して、そして増えて広がっただけ。 またはプロダクトの設計上、疎結の関係にして切り離したりしてるだけ
俺らが、他人の生み出した物を使わせてもらう分際で、それすらめんどくさいと思うのなら、
むしろ自分で一つにまとめたライブラリでも作って自分で使うか、または世界に発表して、標準化しておくれ。
誰にでもそうやって、高名を得るチャンスは平等にあるんだから
分家というならESの方よね
今は glm なんかもあるしなあ。
これってnvidiaドライバのバグ? glGetActiveUniformARBでシェーダ側の変数名を得ると シェーダ側の変数が"uniform mat4 JointTransform[62];"の時 amd "JointTransform" nvidia "JointTransform[0]" と返ってくる
304 :
デフォルトの名無しさん :2011/12/19(月) 20:35:01.94
>>296 >1つで全部できるようなもんないのか
いいとこに気がついたね
誰もそういうのを作ってないんだよ お前が作ればいいじゃん
>>303 バグかどうか知らんけどうちでもそうなる。
もう随分前からずっとそうなので、そういうもんだと思ってやってる。
>>304 だな。
そしてglなんとかがまた一つ増えるw
307 :
デフォルトの名無しさん :2011/12/21(水) 05:31:10.57
魔方陣GLGL
308 :
デフォルトの名無しさん :2011/12/21(水) 12:54:40.15
でも何で「glなんとか」なのか___ 接頭詞としてglつけろ”という決まりでもあるのか。 glグレネードランチャーとかいうの作ったら、略称がglglになるじゃねえか。
ARB48
メンバーが抜けたり消えたりする
えっ、それ減る一方
SDLだってSFMLだってあるんですよ! つかSFMLすげえな。SDLだったらSDL_imageやSDL_mixerが必要なところをこれひとつで全部賄えるなんて
GLSLのfragment shaderでmain関数の中のfor文の打ち切り条件式に uniform変数を使うと挙動がおかしくなるんですけど uniform int n; for(int i = 0 ; i < n ; i++){... こんなの これなんなんでしょうね main関数以外でも同じようなことやってるんですがそっちは別段なんともないんですよね
floatでシェーダーに渡して中でintにキャストしたら安定した なんだこれ・・・
Uniform変数にintって使えたっけ? 標準では無理だった気がする。まだベンダー拡張じゃなかったか
あ、一応glew使ってます あとGLSLは#version 120
1.2じゃ駄目だった気が
glGetUniformLocation glUniform
シェーダで使うライトの数はコンパイル時に決定するから外部変数にはできないのかー なんか回避方法ないかねこれ
floatで渡せよ。何いってんだ
普通(?)のGLSLのライトの数はfloatで渡せばいいんだけど、 WebGLのGLSLはループ回数(の上限)がコンパイル時に決まらないといけないから for (int i=0; i<8; ++i) { if (i >= num_lights) continue; ... } みたいな書き方になったりする。
>>321 WebGL って OpenGL を JavaScript から使うバインダか何かじゃなかったか。
Python から OpenGL を使う PyOpenGL みたいな、要は
ほにゃららから OpenGL を使う 何とか、みたいなそういう立場の物。
なので、先に WebGL の話だけど、って前提置いてから話さないと、
君が一人で思ってる事なんて、誰にも伝わらないよ
使う上限を予め決めといてライティング結果をライト毎に加算すればいい 使わないライトは0になる値を入れておけば問題ない
素人考えだけど、テクスチャマップのファイルに データとしてライトの情報を入れて、シェーダー側で参照ってできんの?
ライトマップか投影テクスチャのどっちの意味かわからんけどできるよ
326 :
321 :2011/12/25(日) 12:29:58.56
>>322 何を勘違いしてるのか知らないけど。
俺は319じゃないし、単にこういうこともあるって書いただけだよ。
>>324 できる。
>>324 浮動小数点フォーマットのテクスチャファイルに、長い行列の要素放り込んで
シェーダ側でそれを参照、とかは珍しくない話。だが、
>データとしてライトの情報を入れて
これがどこまでを想定してるのが曖昧なので、YesともNoとも言いにくい
自分が使いたい情報で、かつUniform変数で渡してられないほどの分量があった時、
かつ浮動小数点フォーマットのテクスチャが使える環境なら、そういう手段を取る事もあるでしょう、って話
>>326 じゃあそれを最初に言えよ。
>>319-321 の流れみたら、普通に本人だと思うだろうが。
なんでお前も前提置いて話せないの?
お前が一人で思ってる事なんて、誰にも伝わらな… あれ?デジャブ?
>>328 恥ずかしかったのは分かるがそう開き直られてもな。
お前みたいなアホの事まで考慮して書き込む気は無い。
>>321 どうでもいいけどそこはbreakじゃだめなん?用途しだいか?でもcontinueである場合ってないよな?
>>330 なんだったけかな…よく覚えてないけど、breakだとうまく動かなかったような。
>>329 いやアホはどう見てもお前。狭い了見の自己中。
それに気づいていないで開き直ってるお前が、まさにアホ
アホと言うより、10代くらいのガキだと思う
>>321 ちょっとそんな抜け道がと思ってやってみたがなんでか駄目だった
break continueどっちも試したが反応なしというか
>>332 横から口挟むけど
>>319 は環境については触れていないのに
>>321 で突然WebGLに話が具体化
この流れはどう見ても本人が情報後出ししたケースの流れ
国語の勉強の話しになるけど本来は「WebGLのこと言ってるなら」とか書くべき
ちょっと脳内スキップ発揮しすぎかと
オフでも多分周りの人間はあなたの話しについて行けてないと思う
予想だが、GLSLが使うライトの数を評価するのは uniform変数は0 for文のイテレーター変数は増えない 0番目のライトのみデフォルトで取得 この条件下で行われるのかもしれない
>>336 あーいや、2番目おかしいな
もうわかんねえなこれ
>>334 じゃあ
for (int i=0; i<8; ++i) {
if (i < num_lights) {
...
}
}
みたいな感じではどう?
それでダメならプログラム間違ってるんじゃないかとw
「反応なし」の意味がちょっと分からないけど。
>>341 >>321 が
>>319 の回避方法じゃなくて、追加情報と解釈してしまったのだと思う
つまり、
>>321 の方法しかないのか? もっといい方法無いの? と質問しているように取ったと
たぶん、これがロジックだと思う
国語の勉強の問題なのかどうかは分からないし、このスレとは何の関係もない
余計な煽りをしないで、双方さっさと誤解を解いて話を続けた方が良い
お前ら面白いなぁ
>>340 それで効きました
ただ・・・なんか動作が全部チェックしているときの重さと変わらない感じ
for(int i = 0 ; i < gl_MaxLights ; ++i){...
プログラムはコメントアウトしたりして比較しているので間違っては無いと思いたい
反応なしは、1個目0番のライトだけアクティブで他のライトが反応しない状態
なんかもうライトの変数なんて高が知れてるから全部uniform化させてしまおうと思えてきた
>>346 だから「ライトが反応しない」じゃ意味分からないってばw
built-in変数に値が設定できてないとか?
常々思ってるけどID出ない板って色々不便ね。
IDあってもID変えただけの同一人物だろwとか言い出す馬鹿もいるけど
floatに頼子だ割ったプログラムソースを目指す人のためのブランド「float志向」
フロシコ
誤字が何もかも台無しにしている
シェーダーの最適化は、GLSLが吐くオペコード数を減らす事とほぼ同義 つまり、固定数ループのfor文で、ループ中で条件かけても 条件が変数でコンパイラが事前に分からないなら 吐き出されるオペコードは、個定数ループを処理する長さと同じ 例え条件で、ジャンプして処理を多少飛ばした所で シェーダーのオペコード数は同じなんだから大して軽くならない マジで最適化かけるなら #if や #ifdef 等でコードをライト数分用意して 動的に切り替わる仕組みを入れないと駄目なんじゃないかな?
356 :
355 :2011/12/26(月) 03:29:13.26
昔々のシェーダーモデルのバージョンが低い頃は if文は重たいなんて言われてたでしょ、そんなイメージ 因みに、うちの会社のライブラリは、シェーダー内に #if や #ifdef なんかが可読性を殺す程入ってて バカにしてたけど、シェーダー最適化の説明を聞いて納得した 例を挙げると、シェーダー初期化前にライト数を決めると そのライト数を処理するシェーダーコードになる仕組み、見たいな (実行中に変えると、シェーダーの再初期化が入るので非推奨って感じ)
357 :
355 :2011/12/26(月) 03:39:33.79
要はシェーダー構文だけで、 ライト数に応じて可変の最軽量負荷のコードを吐くのは無理かと思われる 一番簡単なのは、一番バカっぽいけど ライト数文のシェーダーファイル(コード?)を用意して ライト数に応じて、各シェーダーを適応すれば良い シェーダーやシステムをスッキリさせるか、最適化シェーダーを目指すかは 仕組みを理解して、自分でバランスを決めて実装するしかないと思うよ 確か、GLSLコンパイラでシェーダーアセンブラを吐く機能があったから まずはそれから試してみなよ
うおぉ ためになる話ありがとうございます シェーダアセンブラは初めて聞きました、敷居高そうですが心に留めておきます
敷居が高いというか、HLやGL+しゅっしゅっぽっぽぅができるまでは みんなそれでやっていた。
そこはCgというべきだったか HLSLはCgの無断モロパクリだからな
なんかi286以前の頃に戻った気分だ クロック数とか気にしちゃう系
みんなPTXとかILとか読んでないの?
>>350 この板が扱う話題の性質上、IDが出ると
必死チェッカーで照らしあわせれば
どこの企業(大学)に属してて何をやってるのかとか、おぼろげながら分かってしまうからな
はぁ?
触らないで、その人は病気なの
誰か扱いやすいライト管理クラスください
どういう事ができると「扱いやすい」と思えるの?
(○○) ライト、ついてますか
こないだ無灯火でチャリこいでたらおまわりに注意された
試す前に人に訊くバカ
glMaterialしろよ... あと頂点ライティングだからピクセル単位でグラデーションは出ないのを忘れるな
阿呆だもん!
かわいい
3D空間上にサイズ不定の画像を表示させたいんですが、どうすれば効率よく出来ますか? 今は各ピクセルの色取り出してglVertex3dで描画みたいな効率の悪いことやってる
テクスチャー使えよって話?
VisualBasic で GetPixel や SetPixel やってるようなモンか
>>377 テクスチャって2のn乗じゃないと駄目なんだよね?
800*600とか色々なサイズに対応したいからそこで困ってる
いや、それかなり古いバージョンのOpenGLだよ どっからか走らないが最近のはどんなサイズにも対応してるはず
たとえ2のn乗じゃないと駄目でも、 800*600なら1024*1024のテクスチャ使えばいいじゃん
ありがとう、初めてテクスチャ使ってみるわ
今時はiPhoneですら都合の良いサイズのテクスチャ使えるよ。 きっと2のn乗の方が効率は良いんだろうけど、他のやり方するよりはずっとましだと思う。
ポリ側を800*600の部分で切ったらええやん
制限聞いただけで思考停止するのがよくないな
俺は元画像を縦横拡大して2^nサイズにあわせてテクスチャ化しといて元の縦横比でポリ描画してるけど メモリの無駄感は否めない
gluBuild2DMipmapsってみんな使わないの?
gluLookAtの引数のeyeとupをcenterを向いたままcenter中心でupに対して水平、垂直それぞれの方向に θ度回転させた結果のeyeとupのベクトルを得たいんだけどどんな行列かければいい?
>>388 脳が拒否する文面なのでまず正確な文章がかければいい
gluLookAtの引数であるeye, up, centerについて eye, upを変化させて対象物(centerの座標)を中心に回転させたいです。 イメージとしてはcenterとeye間をヒモで繋いでぐるぐる回す感じです。 回転させる向きは以下の通り 1.upベクトル方向 2.upベクトルと(center-eye)ベクトルの外積方向 1.、2.についてθ度回転させたeye, upを得るためにはeye, upにどんな行列、 を掛ければいいでしょうか。
簡単に言うと、 カメラの方向ベクトルを軸にして、θ度回転させたい = とある任意の軸を中心にθ度回転させたい、って話だろ? って、くるとクォータニオンの得意分野
反応が早くて助かります。ありがとうございます。
>>392 クォータニオン・・・がんばります
>>391 このサイトいいですね参考にさせていただきます
OpenGLの左手座標系を、右手座標系に変換したいときって、
glScalef(1.0f, 1.0f, -1.0f) もしくは、
glScalef(-1.0f, 1.0f, 1.0f) で出来ますよね?間違っていたら指摘お願いします。
で、今Javaで、OpenGL使っているので、JOGLを使っています。
JOGLのバージョンは、Jogamp v2.0 rc5なのですけど、z軸を-1.0倍すると何も映らなくなって、x軸を-1.0倍した結果と違ってしまいます。
これってバグでしょうか?私の勘違いでしょうか?コレだけの情報ではわからないでしょうか?
ttp://ideone.com/A1dtB 97、98行目です。
DEPTH_TESTをenableにしてZをひっくり返してるからじゃないのかな
もしくはカメラも反転してるとか
Xを-1して左手系を右手系なんて聞いたことないな Zを-1するのだって、行列等の諸々の結果に対して有効であって 途中の計算とかあるなら、Zを-1した所でおかしくなるだけ 詳細を伝えない&自分が理解してないでZに-1スケールしてるだけなら、 聞いた所でちゃんとした挙動にならない&理解出来ないんじゃない? 行列と3D処理を理解して、ちゃんと行列処理を右手系にかえるしかないと思うが?
Zを-1倍したら奥にあるものがカメラの後ろにくるんだぞ? カメラの方向変えないとな。
399 :
デフォルトの名無しさん :2012/01/05(木) 19:23:45.21
それはTransrateが入った場合 リンク先を見る限り、Rotationしかしてない >OpenGLの左手座標系を、右手座標系に変換したいときって、 この質問の仕方で、全然理解してないのが分かる 左手系、右手系とは行列処理の事だろ 例えば左手系前提で作られたモデルがあり、右手系の行列処理でレンダリングしたら ポリゴンが裏向きになってカリングされてしまうとかの場合 よって最後にスケールZ-1をする事で左手系のモデルを右手系で描画する とかの場合に、Z-1とかにするんだよ つかもともとOpenGLの行列処理は右手系 何が左手系なんだ? 頂点って言うんだったら、処理は右手系のまま頂点の2番目と3番目を入れ替えてみれば CWがCCW、もしくはCCWがCWになって上手く行くかもね
ハァ?
そこはハァじゃなく、知りたいことをはっきり訊いた方がいいぞ
ソースがくさいのだけはわかった
>>399 俺モデルデータをファイルから読込みむ時に頂点順序反転する処理入れてた・・・・・
scaleで行けたのか・・・・・・・・・・・
glFrontFace(GL_CCW), glFrontFace(GL_CW) でいいと思うけど。
モデルデータを右手系で出力すればおけ
まあ1年に3回ぐらいはどちらかに統一しろよとは思うよな
元々、右手系しかなかったのにDirectXが左手系で超速いもんだから一気に広まった。 現在では速度差はあまりないが。 最近ではOpenGLの方が活気付いているけど、DirectX9.0cまでは付け入る隙など無かった。
左手系で超速い だってさww
いつものバカだろ。放っておけ
もう スーパーレフト ってコテ名乗れよ 酉やるからほら スーパーレフト#孰扞wPSX
3D界のレフティという名を名乗っていいぞ。俺が許可する
>>408 そこは、左手系だから超速いと言いたいんじゃないと思うぞ
当時のOpenGLよりもゲーム向き(=速い)なライブラリだったからみんなが使って、
それがたまたま左手系だったから「左手系」が一気に広まった事を言いたいのだと思う
あくまで、一気に広まった要因は速かったからで、左手系だからと言いたいわけではないだろ
すぐ後で、現在では速度差はあまりないがとも言ってるし
と、俺は読み取ったが、どうだうか
むしろ「左手系だから速い」って読み取るほうが難しいわ
左手系の方が速い、とか言ってたやつが最近出没していたからなあ。
「左手系だから超速い」と読み取るのが自然かと。
>>412 それならば、
DirectXが左手系で超速い、ではなく、左手系のDirectXが超速い
にしないと、意味が正しく伝わらない。
複数の意味に取れる文章を書いてはダメって、大学で教わらなかったのか?
>>414 曖昧な文章だとは思うよ
でも、相手がどう読み取って欲しいのか、は何故か分かってしまう場合が多い
それを分かってて逆に取って馬鹿にするのが 2ch の遊び方の一種なのも知ってる
>>414 いや、お前の読解力がおかしいだけだろ
「『DirectXは左手系で』超速い」は普通の日本語なら「『DirectXは左手系だから』超速い」という意味には読まないぞ
書き手がそういうふうに書くアホかもしれない、と考えるとこっちの読解力だけではもう面倒みきれなくなるから最初に感じたままでええのよ
右手左手DirectXが超速い ここ一ヶ月のスレの流れ読めばスーパーレフトさんが来たと思うのも自然だろう
俺は右足系が好きかな。
百足系の方が
ここ国語弱い人間いるよな 外人か普段人と接してない人間と睨んでる
OpenGL の上位ライブラリで、 マルチウィンドウ機能をデフォルトで装備するものってある? 少なくとも GLFW はウィンドウひとつしかサポートしない GLUT はやってみた人がいるようだが、公式サポートではないらしく注意が多い
GLUT やら OSG やら Coin3D やら幾らでもあるけど、 > GLUT はやってみた人がいるようだが、公式サポートではないらしく注意が多い とか言ってるお前にゃ無理だな
>>423 OS の API や環境に依存しそうな部分はできるだけ触りたくない
しっかりとラッピングしておいてほしいんだ
Haskellでプログラムしてるから、
Haskell用ラッパーの作成にも時間を取られる
GUI構築よりも本来注力したい仕事にさっさと取りかかりたいんだよ
> とか言ってるお前にゃ無理だな
無理だったら別の方法を考えるから、とにかく OSG や Coin3D を調べてみるよ
ありがと
glutSetWindow つかってるけど簡単実装には便利だよ
>>425 GLUTは一度入ったメインループから抜け出せない仕様が扱いにくいんだが、
今は背に腹は替えられない状況なんで検討してみる
ありがと
時々聴くけどglutでMainLoopから抜けたい時ってどんな時なのかな
終了ボタンでいきなり終了されたら困る時
まさにそれ。 APIHookするしかないのか
windowsならatexit()でいけそう
javaれ
メモリーリーク検出のために正しい手順で終わりたい時 ってかglutリークもOpenGLもメモリリークしてるがな...
ペイントソフトとか作ってファイルを保存してないのに終了ボタン押されたら困るだろ? そういう時にファイル保存の処理をするんだよ
終了ボタンを自分で作ってるなら、マウスが終了ボタンを押した時の処理をMouseFuncに書けばいいんじゃないの windowのXボタンのことならatexitで処理すればいいし
>>434 終了しますか?(はい/いいえ)
って聞かれたことない?
それは置いといて実用目的でGLUT使うのは間違ってる
Haskell限定だが GLUTがメインループを持ってるせいで、 一部の同じくメインループを持つFRPライブラリと相性が悪い またGLUTがイベントドリブンなのも、 いくつかのFRPライブラリとの相性を悪くしてる
マルチウィンドウを管理して欲しいけどメインループは持たないでくれってのは難しいんじゃないのか いっそ表示とそれ以外にスレッド分けたほうがスッキリしそう
atexitだとまたメインループに戻る処理が出来ないだろ馬鹿
>>438 馬鹿で悪かったな。そんな押されちゃ困るXボタンなら消しときゃいいだろ
人のことをすぐ罵る男の人って
ポチっとな
>>442 >OpenSceneGraphとかUDKとかのゲームエンジンの方がもっと機能が多いよ
レイヤが違うんだから当たり前だろ。せめて理解してから喋れ
すみません GLSLを使ってメッシュを表示しているのですが、 2台のPCで結果を確認すると、一方では正常に表示されるのに、もう一方では何も表示されません。 ダメなPC(デスク) Win7 32bit RADEON HD5750 正常なPC(ノート) Win7 64biy intel HD3000 デバッグするとどちらもGLSLのコンパイルは正常に完了しており、レンダリング中に何のエラーもありません。 ただ、スプライト(板ポリ)を表示する簡単なシェーダだけはRADEONでも正常に動きます。 ポリゴンを表示するシェーダだけがRADEONで動かないのは何が原因でしょう?
RADEONで動かないシェーダーに原因があるでしょう
バグがないと仮定したらテクスチャーモードを設定してないとか 確かATI系だけは設定しないと表示されなかったはず
RADEONってほんとプログラマー泣かせだよな
そんな事はない。ATIの方が仕様に正しく実装されている 作ったとおりに動くのがATI。正しく作らなかったら正しく動かないのがいい NVIDIAはわりといい加減に作っても動くけど、それは正しい動作ではない
/) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ / nvidia
せっかくこの話題になったから聞いておきたいんだけど ATIで動いたシェーダはNVIDIAでも動くってのは正解? つまり開発環境としてはRADEONの方が無難?
どちらでも動くソフトを作るならRADEONで動作チェックするしかないな っていうか融通がきかないんだよRADEONは
>>444 OpenGLのエラーが出てないか調べたら良いかも。GL_ARB_debug_outputとか。
又は、gDebuggerとか今はタダだから使ってなかったら試してみたらコード変更しなくてもエラーが見つけられるかも。
>>450 ドライバの出来次第では?
古いNVのドライバだと対応してないテクスチャフォーマットがあったりもしたよ。
お前の環境は何だとか一々きかせるな
>>453 予め必要な文字を描いておいたテクスチャの一部をビルボードに貼って表示すれば良い
これが一番簡単だ
文字の形をした立体オブジェクトを表示させたいのなら、
FreeFontでも使ってフォントのアウトライン(ベジェ曲線)を得て、
それをtrianglizeして表示すれば良い
>>455 ごめんなさい。Windowsでglut使ってます。WindowsなんでWin32API使ってもいい
>>456 そのテクスチャの方法でやりたいんだけど、その元の文字を画像にしたものの作り方
で簡単に出来る方法が知りたいです。自分で平仮名から漢字まで全部用意するのは
現実的ではないし
>>457 普通は自分で用意するんだよ
どの文字を必要としているかは人ぞれぞれなんだから
それが面倒だと言うのなら、
例えばTUF-8やShift-JISの何番から何番までの文字を列挙したビットマップを作る
という考え方もある
これならプログラムを書いてある程度自動化できるだろ
スクリプトが書けるテキストエディタで文字を列挙してスクリーンキャプチャを撮るとか
ビットマップからデバイスコンテキストを取って、それに対してTextOutして、
そのビットマップをファイルに保存するとか
> 例えばTUF-8やShift-JISの何番から何番までの文字を列挙したビットマップを作る > スクリプトが書けるテキストエディタで文字を列挙してスクリーンキャプチャを撮るとか え?w 普通OSが用意してる文字をビットマップに書き込むAPIを利用するだろ
>>459 > え?w 普通OSが用意してる文字をビットマップに書き込むAPIを利用するだろ
どこに笑える要素があるのか、詳しく聞きかせろ
私は「どの文字」をビットマップに描くのかを指定する方法のひとつとして、
連続した文字コードの文字をビットマップに並べるという「考え方」を提案した
文字コードが連続している文字を使えば for ループが使えるからな
それ以外に「どの文字」をビットマップに描くのかを指定する方法があるのなら、
>>457 に提案してやってくれ
あと、スクリーンキャプチャの方法を提案したのは、
あくまでも主目的は文字を3D空間に表示する事であって、
文字が描かれたテクスチャ(ビットマップ)を作る方法は「簡単なら何でも良い」
と解釈したからだ
そして、質問者にとってどのような方法が簡単なのか私は知らない
だから、もうひとつ TextOut 関数を使う考え方も提案した
私は文字を「直接」ビットマップに描く OS の API は知らない
知っているのなら関数名を
>>457 に教えてあげるべきだろ
その方がより楽なのは明らかなのだから
怒りの長文炸裂
Mac なら CTFrameDraw とかあるけどな。Win は知らん
DrawText()
glutBitmapCharacter
>>453 できない方法ってのは wglUseFontBitmapsW使ってるみたいだし、
3D空間に文字出してクルクルまわしたいとかそういうことじゃないのだよね?
glutならwglGetCurrentDCでhdcもってきてとかそういう話だったりして
>>453 何ができないのか、まずはそれからだ。
エスパーだけどglLoadIdentityとかglOrthoとかしてないから画面外に文字が出てて
表示されてないだけと見た。
deprecatedなOpenGL関数使うとどういうまずいことがあるんですか?
直ちに影響はないんですね ありがとうございました
471 :
453 :2012/01/12(木) 02:23:43.74
ありがとう、教えてもらった方法を参考にして調べながら、DIBSectionとDrawTextを使って 描画したピクセルデータをテクスチャにする方法でやってみると上手くできました。
ATI RADEON HD5600 Seriesを使用しています。
>>453 のサイトで自分も勉強し始めたばかりなのですが、一番簡単な空のウインドウを表示するでなぜかウィンドウ内がスクリーンキャプチャしたようになってしまいます。
2〜7までは正常に実行できるのですが、8の円を描画するや目的のスタティックメッシュ編は1の同様ウィンドウがおかしな表示になってしまいます。
上述のようにRADEONのボードが関係あるのでしょうか?
OSはXPsp3、reeglut、Visual Studio 2010 Express Editionで実行しています。
これからOpenGLとかDirectXを学ぼうとする者がRADEON使うのはやめれ 時間を無駄にするだけだ
>>472 空のウィンドウが開くプログラムは画面のクリアすらしてないので、ウィンドウ内がスクリーンキャプチャになってても正常かと
8のプログラムはglutInitDisplayModeでダブルバッファにしているが、
glutCreateWindowより下でやってる。入れ替えれば動くかもね
うちのPC(NVIDIA)ではそうだった
>>474 −475
アドバイスありがとうございます。
glutInitDisplayModeとglutCreateWindowを入れ替えたら無事に円を表示する事ができました!
9.文字列描画も同じ方法で正常に実行できたので以下のプログラムもそれに気をつけてビルドしてみます。
RADEONである事は関係なかったようですね…。
>>476 そこで続けるのか。OpenGL関係ないことのが多いような気がするが。
自分は画像処理しかしていませんがみなさんはOpenGLで何をされていますか?
球面調和関数でおっぱいをレンダリングとか
481 :
デフォルトの名無しさん :2012/01/14(土) 10:14:44.92
VMware / Ubuntu で「GLUTによる「手抜き」OpenGL入門」の勉強を始めました。 man glBegin でmanを見るには具体的にはどうすればよいのでしょうか?
>>481 ググったら和歌山大学とかいうFラン大が出てきたがそこの学生か?
>>482 そのサイト、おっさんで会社員の俺もよくみるが
manの内容程度ならぐぐれば出るよ www.google.co.jp/search?q=site%3Aopengl.org+glBegin
それ以前にVMWare上でUbuntu動かしてるところに突っ込めよ
スレの流れを無視しちゃうかもしれないけど OpenGLで作る Android SDKゲームプログラミング って本は最悪だった Amazonで評価が良かったから、買ってみたら プログラミングのスタイルは悪いわ 後半にいくにしたがって、段々記述が荒くなってくるわで、散々な目にあった 極めつきは、VBOのソースで、 AndroidはJAVAなのに、メモリ割り当てとか無茶苦茶なことをやろうとした挙げ句に 「Sizeof」とか書いてあるの。もうアホかと、バカかと NDKではなくSDKなのに、Sizeofはねーだろうよ 碌にコンパイルすらしていないのがバレバレ 初心者が買ったら、わけがわからなくて確実に詰むね こんな本で3000円も取るなんてふざけてる
ブームだ急げ、今なら売れる、と言う 「勢い本」 の中には、そういう危険な物もきっとある
>>488 さあ早くAmazonでボロクソにレビューする作業に戻るんだ
本読まないとJNI使えないようなレベルじゃどっちにしろ何も作れないから大丈夫
492 :
481 :2012/01/14(土) 20:56:43.17
481です。初心者の年寄りです
>>484 教えていただきありがとうございます。
Unix系の開発環境を使いたくて、VMware + Ubuntu にしました。
man で シンタックスが分かる方法ありましたら教えてください。よろしくお願いします。
それと、皆さんどんな開発環境を使っているのでしょうか?
俺の Mac では man glBegin は普通に出てきた
なにそれ
>>481 "ubuntu manpage OpenGL"でググってみれば
496 :
481 :2012/01/15(日) 00:52:30.35
すみませんglmではMatrixをVectorの右からかけますが、GLSLでは左からかけています。 プログラム内で複数のMatrixを掛けて計算したMatrixはプログラム内のVectorを変換するのには使えますが、 シェーダーでは計算の順序が違うのでおかしなことになってしまっていると思います。 1つのMatrixをプログラム内とシェーダー内両方で使うにはどうすればよいのでしょう。
しつこいなぁ
transposeですね!ありがとうございます^^
>>498 問題をわかってないのは君だけだと思うよ
glmの行列がどんなんか知らないけど、row-majorならそのまま使えるんでないの?
glmがどんなのか知らんが 直交座標系で、例えばある回転行列の右からベクトルを掛けた時に そのベクトルが時計回りに回転するように見える場合、 もし(ベクトルを転置して)左からその回転行列に掛けたならば、 逆向きに回転するように見える 同じ向きに回転するように見せるには、 その回転行列も同時に転置させなければならない row-major か column-major かの話とはまた別だ メモリレイアウトはそのまま使えるかも知れない(私は知らないが)
ベクトルを転置する話なんて誰もしてないのに…
3Dやるなら最低でも線形代数やっといた方がいいと思う
最低が線形代数ならそれ以上は何?
量子力学
>>504 >>497 > glmではMatrixをVectorの右からかけますが、GLSLでは左からかけています
行列の右からベクトルを掛けるなら、
そのベクトルは意味上は列ベクトルだ
それを同じ行列の右から掛ける為には、
意味上は行ベクトルに転置しないといけない
ここでベクトルの転置の話が出てくる
しかし、それは今回の本質的な問題ではないため、
私も(ベクトルを転置して)と括弧で括った
今回の話がベクトルではなく行列の転置の話であることは承知している
理解していただけだろうか
509 :
502 :2012/01/17(火) 00:13:44.56
GLSLは列ベクトルの左に行列をかける&行列の配列への格納はcolumn-major、 glmは(497によると)行ベクトルの右に行列をかける、 なのだからあとは glmの行列がrow-majorならそのまま配列が使える glmの行列がcolumn-majorなら転置の必要がある んじゃないの? 話が別ってなんで?
glm使ったこと無かったのだけど、
ttp://glm.g-truc.net/code.html mat4はcolumn-major
translate,rotateなどの機能も用意されているので
行ベクトルに右から掛けるのではなく、列ベクトルに左から掛けるほうが良いっぽい
vec3 a,b;
mat4 M;
a = b * M; だとbを行ベクトルとして計算し、
a = M * b; だとbを列ベクトルとして計算するみたい
>>509 以下の2つの事は本質的に全く別の事だ
・数学的な意味でのベクトル-行列の積の順や行列の転置
・数学的な行列をたまたまメモリにシーケンシャルに配置して表現しており、
それがたまたま一方はrow-majorでもう一方はcolumn-majorであり、
同時にたまたま一方が行列に右からベクトルを掛ける表記をなぞらえており、
もう一方が行列に左からベクトルを掛ける表記をなぞらえている為に、
一方の計算をもう一方へ移植するのに行列の転置「処理」を必要とせず、
そのままのメモリレイアウトで移植可能である(かも知れない)事
簡単に言えば、数学的な計算と、
メモリレイアウトと内部処理の関係でプログラマが仕事を端折れる事、
これらは全く別だという事
だからしっかりと分けて、まずは数学的な意味での計算の仕組みを理解し、
その後でたまたま今回は仕事を端折れる(かも知れない)事を理解すべき
逆順で理解しようとすることは結局は遠回りになる
>>497 は質問文の書き方や内容、また
>>500 のレスから察するに、
数学的な意味での計算の仕組みを「プログラムに落とし込める」ほどには
理解できていなかったと見える(まだ今でも理解はおぼろげだと思う)
であれば、その時点でのrow-majorなどの話は混乱の元ではないだろうか
「row-majorならそのまま使える」と、「数学とメモリレイアウトは別の話だ」 ってのはそれこそ別の話じゃん。 あんたは個々の言ってる事は正しいんだけど、話の筋がズレてるんだよ。
>>510 つまり最初からGLSLに合わせた使い方すればokと。
514 :
497 :2012/01/17(火) 11:59:38.76
つまりglmは右からも左からも行列を掛けられるということですね 昨日は左から掛けたらコンパイル通らなかったんですが、いま試すとできました 何か勘違いしていたんですね
>>512 > それこそ別の話じゃん
初めから別の話だと
>>503 ではっきり言っている
メモリレイアウトはそのまま使えるかも知れないとも言った
行列の転置の話とも混ぜてはいない
レス内の上下でしっかりと行を分け、文脈を分けている
そして
>>509 で「話が別なのは何故か」という趣旨の質問を受けた
だから
>>511 で私が話は別と言った「理由」を説明した
これらが別の話だと認識しなければ理解できないからと
私が最初に話し、それに対して質問を受け、それに応えた
応答に問題があるのなら、何が問題なのかはっきりと指摘して欲しい
516 :
515 :2012/01/17(火) 12:46:37.61
>>512 ちなみに、row-major というのはメモリレイアウトの範疇の話だ
これに異論があるのか?
glmってexpression template使ってないの
もちろんそうよ
Expression Templateっつうもんがあるのか でもあんまり必要性を感じないな 巨大な配列使わなければいいだけ
そういう問題ではない…。
海外ゲームの日本語化をしていてフォントファイルらしきものがあったんですが 拡張子が「glf」だったんです。 これはglfontって事ですかね?編集って出来ます?
>>522 ありがとうございます。
字数制限がキビシー
LINEを描くとき色が中間で分かれるようにするにはどうすればいいですか? Smoothだとグラデーションになるし、Flatだと中間で分かれないんですよね
texcoord つかって、シェーダで色分けろ。
2回LINEすればおけ
回答ありがとうございます。 やってみます。
シェーダなしでも2色のテクスチャをGL_NEARESTで使えば
GLSLのコンパイル時間の長さにイラッとくる
そんな頻繁にコンパイルするシステムってあるの?
ShaderTreeみたいなツールとか
glsl内で回転行列(Z軸)を定義するとなんか30度くらい余計に回転してる感じなんだけど
間違いなくコーディングミス
大方、度で角度を指定してるんだろ ラジアンにしてるか?
それだ まあ、言われなくても自分で気づいてただろうが
史上これほどまでに傲慢な返答はあるまい
宣言もないのに同一人物だと思い込むのやめたほうがいいよ
2chのレスは自分のも含めて全て人工知能だと思ってる
マルバツでもやってろ
OpenGLを使ったエフェクトのサンプルソースが見れるサイト教えてください
えっち
Celeron G530 の Intel HD Graphicsで glsl使われてる方いますか?サンプルとかちゃんと動きますか?
GLSL 1.2 だから結構動かないのあるんじゃないかな
545 :
543 :2012/01/29(日) 16:34:19.12
>>544 なるほど、glslのバージョンは見てませんでした。ありがとうございます。
GeForce付きPCを考えます。
誰か、BCCでfreeglut使う方法教えてくれ
makeファイル見ながらソースコンパイルすればいい
VC++が無料かつ使用制限なしで使えるのに作成したバイナリを公開する事も出来ないBCCを選択する意味がわからない
VC++Expressって無料なの?商用でも?
無料だよ
VC++インストールしたくない
なんで?
わがまま言うな インストールしなさい
依存関係の稼動テストするのに開発環境と共にいつの間にかインストールされたCOMやらNETやらOLEやらごちゃごちゃ入れられて ライブラリ使用の有無だけじゃ判断つけられずOSをもう1個買うかなんかしないとロクにテストも出来なくなるからねー
そうやって人生無駄にしていった人間を何人も知っている
>>554 その割りには VC++ で作られた普通に動く無料アプリって多いよな
bccはまじでオススメできない おとなしくVCいれとけ せめてMinGWかcygwin
bccはインストール権限なくても展開するだけで動くからじゃね? USBメモリでこっそり持ち込んで… に最適
>>554 おまえはそんな大層なプログラムを書くんか
そんなん気にするよりコーディング環境を良くして
1行で多くプログラムを書けよ
そっちのがお前さんの為になると思うよ
でも気持ちはわかる。
563 :
546 :2012/01/31(火) 00:03:26.53
>>558 の通りUSBメモリに入れてどこでも開発できるから。
複数のPCで設定とか揃えるの面倒。
USBHDDに全部入れりゃVC++で解決
usbとかってはなしならなMinGWでいいじゃん
開発環境といったらLSI C-86試食版一択だろう
なつかしい まじでお世話になったなLSI C-86試食版
568 :
デフォルトの名無しさん :2012/02/01(水) 00:17:16.21
OpenGL使ってiPhoneアプリ作ってるけどなかなか難しいね^^
黙れ^^
いーえすつー!^^
iPhone()笑
僕はCP/MでBDS-Cです。
iPhone(笑) iPhone()笑 iPhone() 笑 iPhone() 笑 iPhone()
お前らまだぴこぴこやってんのか...
575 :
デフォルトの名無しさん :2012/02/03(金) 19:54:40.70
android()
悔しかったん?
あほでしょあなた。。w あほでしょあなた。。。。w あほでしょあなた。。。。。。w あほでしょあなた。。。。。。。。
はぁぁぁぁ? はぁぁぁぁ? ! はぁぁぁぁ ? ! はぁぁぁぁ ?! はぁぁぁぁ ! ? はぁぁぁぁ!
いいからOpenGLの話しろ
ウィンドウサイズを変更した時に ウィンドウ全体のピクセルを拡大することってできる? たとえば ■□ □□ ↓ ■■□□ ■■□□ □□□□ □□□□ こんな感じ
別コンテキストにレンダしてそれをGL_NEARESTなテクスチャとして貼るとか? それかシェーダ
ビューポート
ビューポート
ビューポートで出来んだっけ??
できんの?!
ViewPort変換ってフラグメントシェーダが走った後に処理されるのか勉強になるよ
ビューポートの操作ではピクセルが拡大されたように見せることは無理だ
ソース乞食ktkr
また出来ないことを出来ると言い張る知障が現れたか 勘違いで発言した後引くに引けなくなって言動が破綻してくいつものパターン
596 :
590 :2012/02/08(水) 07:43:57.39
>>591 では、もう少し詳しく説明してやる
ビューポートは、正規化デバイス座標系(NDC)での座標を
ウィンドウ座標系での座標へどう変換するかを指定するものだ
この変換をビューポート変換という
ビューポート変換は線形変換だ
従って、ウィンドウ座標系のあるピクセルとその隣のピクセルに
それぞれ変換されるNDCの座標は、それぞれ異なるはずである
しかし、仮に
>>582 のやりたいことをビューポート変換で行う事を考えれば、
それはあるピクセルとその隣のピクセルにNDCの同じ座標を割り当てる事になる
だが、先ほども言ったようにビューポート変換は線形変換なので矛盾する
従って、
>>582 のやりたいことをビューポート変換で実現するのは不可能である
逆にこの事から、どうすべきかは必然的に見えてくる
要するにウィンドウ座標系のある隣同士のピクセルに
それぞれ変換されるNDCの2つの座標が同じ値が示しすようにするしかない
597 :
590 :2012/02/08(水) 07:51:17.08
>>596 > 逆にこの事から、どうすべきかは必然的に見えてくる
ここの件は間違いだった
シェーダーを用いればこの件の結論は覆る
しかし、ビューポート変換では実現できないことは確かだ
馬鹿なん?
元々の「ウィンドウ全体のピクセルを拡大」てのが意味不明瞭だしなぁ。 普通に考えればビューポート変えてもピクセルを拡大なんてできないわけだけど、 テクスチャを一枚表示してるだけのプログラムなら、ビューポート変えれば 「ピクセルを拡大」したように見えないこともないかもしれないし。 ていうかビューポート、ビューポート言ってる人達(達?)は、一体何を考えてるんだろうか。 一言レスとか悪態とかしか書けないあたり、具体的な策を持ってない人だろうか。
何のためのプロジェクション行列だよ…
そりゃ解決法はいくらでもあるだろう・・
>600-602
ああ、なるほど、うん、大体分かった…
>>582 とりあえずですね、残念ながらあなたの説明では、あなたのやりたい事が分からないですよ。
もしウィンドウサイズ変えても描画領域が変わらなくて困ってる、あるいは絵を大きくしたいだけならglViewportだし、
582の図を愚直に解釈して本当にピクセルを拡大したいなら、別のやり方を考えないといけないし。
(582の図は2x2->4x4ですけど、例えば2x4->9x3の場合ならどうなって欲しいの?とか)
なんだギザギザにしたいってだけか。 描画に関する事を全てテクスチャにオフスクリーンレンダリングして GL_NEARESTのミップマップにして後はウインドウサイズにビューポート合わせて ウインドウサイズにテクスチャをストレッチして描画すればいいだけだろJK
“だけ”にしちゃ長いなw
いやいやモザイクにしたいという方が間違えだろ
607 :
590 :2012/02/08(水) 19:37:45.67
>>582 のやりたい事なんて明確だろ
「ピクセルを拡大する」と言っている
別コンテキストなんて誤解を生みそうな用語使っちゃってる回答にアンカ振られても
glReadPixels と glPixelZoom と glDrawPixels で解決
611 :
名無し :2012/02/09(木) 16:26:19.40
プログラミング超初心者です。 openGLで「openGl 手抜き入門」を用いて勉強していてラジコンティーポットという課題をやっています。 まったくわからないので動かし方を教えてもらえたら嬉しいです お願いします。
「openGl 手抜き入門」ってなんだ
ggrks
>>611 「まったくわからない」じゃどこまでで来て、どこからができないのか答える方がまったくわからないので答えようがない。
もしわからないのが操作の部分ならOpenGLとは切り離して考えるべきじゃないだろうか。
615 :
名無し :2012/02/09(木) 17:00:19.78
616 :
名無し :2012/02/09(木) 17:02:33.92
動かすために何を書いたらいいのかがわかりません
抽象的すぎて何がわからないのかわからないのでアドバイスできません. 具体的に分からない箇所を言ってください
618 :
名無し :2012/02/09(木) 17:06:24.04
どうやったらラジコンティーポットが8の字に動くんですか?
openGlより前にプログラミングの基礎を勉強しようか
620 :
名無し :2012/02/09(木) 17:10:20.95
基礎勉強してたらこのラジコンティーポットを動かす課題の提出日が過ぎちゃいます
知るか。
622 :
名無し :2012/02/09(木) 17:17:02.76
知ってください 誰かお願いします。 ラジコンティーポットを操作できるようにしたいんです。
623 :
名無し :2012/02/09(木) 17:29:10.15
宿題は宿題スレへ
プログラムのビルド&実行ができてるのかすら怪しいレベルだな…
ちなみに期限はいつだ?
627 :
名無し :2012/02/09(木) 17:37:41.40
明日です
一連の流れにワロタw
っていうか床井先生のサイトじゃねーか つうか、何にでもstatic付けるのな そんなにインスタンス必要か
631 :
名無し :2012/02/09(木) 18:05:47.23
おねがいします
>>611 正解は
>>624 以下個人的な見解
質問の仕方から見るに、あなたはこの課題に向き合うレベルに全く達してないので
仮にこれをクリアしたとしても、すぐにまた詰みます。
課題と単位は諦めて基礎からやり直すのが宜しいでしょう。
急がば回れ C/C++の基礎から学んでOpenGLに入門したらよろしい
634 :
名無し :2012/02/09(木) 19:03:58.29
課題さえ終わればこの先プログラミングをやる機会は少なくなるので…
スレチ。消えろ
>>634 問題はそこではなく、これを教えたところであなたの成長を期待する事が全くできないって事です。
不良物件に時間を投資したいと思う人はいないでしょう?
プログラミングやらない人に教えるのはばからしいわな
そのために、金がある。
宿題スレ行ったのかな?と思ってあっち覗いたらそこそこ荒れててわらた
むしろ、あっちの方で先に聞いててワロタ
5分でマルチポストとか…
>>638 金払うなら仕事してもいいかも。
実装で5000円、相手するのが面倒そうなので二万円、
合計は切り上げて三万円の請求てとこだナ。
つうかsin,cos関数が分かれば組めるだろうに 高校生レベルじゃないか
>>642 多分だけど、分からないのはそこじゃなくて、もっとプログラムの根本的な部分だと思う。
ティーポットを奥に向かって一定速度で動かせ。っていうのすら出来ないんじゃないかなぁ。
>>611 まだいるか分からないけど、徹夜してでも頑張る気があるなら、SkypeかGoogleChatの
アカウントでも晒してくれれば、教えてあげてもいいよ。
ただし、段階を踏んで教えてあげることはできるけど、答えを教えるつもりは一切無いです。
あっちのスレで学校の掲示板にスレ晒されてたので来ないでしょう
646 :
644 :2012/02/09(木) 23:58:21.40
そんじゃ、寝ますわん。
いやん、ねないでえん
c#でOpenTK使ってテクスチャを張ろうとしたんだが、 LinuxでC++でやってた通りにやった積もりなのになかなかテクスチャが張れなくてえらい苦労した。 ふと、400x400の画像を512x128の画像に替えたらあっさり。 なんてこったいw
ほとんどの3Dで、テクスチャサイズは2のn乗にあわせないと不具合起こすと言うよね。
古い環境だとな。
テクスチャは2のn乗で作るのが常識だろ
今はそんなことない
そうやって一生自分の環境でしか動かないもの作ってるんだ
ターゲットにする環境はそれぞれで違うわけだし、 新しい機能だって必要に応じて使えばいいだろ。 今時はiPhoneとかでも好きなサイズのテクスチャ使えるよ。 パフォーマンス的に有利かどうかは知らんけど、 そこは目的に合わせてだよね。
てかエラーチェックちゃんとしようネ
言い訳がましい
まぁ、レンダリングの中に一つくらいは、お守りのつもりでglGetError()入れといた方が、結果的には助かるよね。
つARB_debug_output
gl_texture_rectangleはATI系で異常に遅かったり等あったから、 至近の2のn乗サイズのテクスチャ作って転送してUVで切り出すようにしてるわ
メタセコイアで作ったモデルをC++から読んで描画する所までは出来たんだが ここから、モデルをアニメーションさせたりするにはどうすりゃいいんだ…。 (; ゚д゚)ぼ、ボーン?ってレベルなんだが、 なんか参考になりそうな書籍などありましたらご教示お願いいたします。
マルペケ
>>660 行列またはクォータニオンなんかの頂点位置移動(回転)情報を時系列に並べた
モーションデータをまず用意して… それを読んで毎フレームごとに
再帰的にボーン情報に適用させ、各ボーンに所属する頂点位置を更新する感じ
だが、CPUでそれらを毎フレームごとに計算 (~ glMapBuffer で VertexBuffer 取り出して計算更新した後、glUnmapBuffer)
とかしてると、速度的に話にならないので、必要な情報渡してシェーダでスキンアニメーション処理書く感じ
具体的には浮動小数点フォーマットのテクスチャをデータバッファに使って渡したり、そこまで行列値の物量多く無いなら
普通に uniform で渡したりしつつ、 attribute で各頂点ごとに所属する(ボーン)行列インデクスとか渡して、
シェーダ側で計算して描画。 みたいな。
…そんな具体的な方法よりも、もっと手前の基本的な処理や話なら、マルペケその他の初心者向け記事をどうぞ
free glutとopen glutはどちらがオススメですか?
>>661-
>>662 ありがとう。だいたいどういったものなのかイメージする事が出来た。
手順は…
1.モデルデータにボーンを何らかのツール上でモデルに仕込む
(ボーンは移動計算の元となる頂点・線分で、モデルの各頂点に対して関連付けられる)
2.ツール上でモーションデータを作成し、プログラム側で読む
(モーションデータはボーンがどう移動(回転)したかという情報を時系列順に並べたもので、扱いやすいように行列/クォータニオンの形で持つ)
3.ボーンに関連付けられたモデルの頂点に対して、ボーンが移動した分だけ頂点を移動
(ボーンは親子関係が存在するから、親が動いたら子に関連付けられた頂点も操作→再帰でやる)
4.頂点バッファに突っ込んでレンダリング
(ただしバッファの転送を毎フレーム行うのは速度的に遅いので、GPU側に処理をお願いする方法がある)
シェーダは…すまん、まだ触った事なくてちょっと解らない。
せっかく説明してくれたのに申し訳ない。
基本的な知識もだいぶ足り無そうだから、お勧めされたサイトのマルペケで
DirectX周りの説明で基礎知識を掻い摘みつつ、実装してみるよ!
とても解りやすいアドバイス、ありがとうございました。
665 :
662 :2012/02/14(火) 13:05:11.27
>>664 多分わかってるとは思うけど、念のためフォローしておくと、
>1.モデルデータにボーンを何らかのツール上でモデルに仕込む
>(ボーンは移動計算の元となる頂点・線分で、モデルの各頂点に対して関連付けられる)
実際には「ボーン」って言うのは、OpenGLの世界の話じゃなくて 「私がこうしたいから用意した、自前の情報」 なので
『ボーンデータを仕込む』 と言うより、『そのつもりの情報を、用意する』 って感じ
で、俗にボーンと呼ばれる物の正体は、移動計算の元にする物ではあるけど、それは頂点や線分じゃなくて、
主には位置と回転行列(細かい事言うと、それは1要素当たりfloatが16個並ぶ行列であったり、4個並ぶクォータニオンだったり)するだけ。
自分の計算方法次第だけど、あと、そのボーン座標空間上での原点から、次の節までの距離なんかも持たす事もあるかもしれないが
で、メッシュの各頂点への関連付けってのは、自分で 「これはこれ、あれはそれ」 のように関連付け "た" 形で用意する。
考え方のもっと細かい所は、キリが無いから上で出てるサイトでもなんでも見たほうがいいが、
大枠として簡単に言うなら、「ボーンの移動量に合わせて頂点を移動させる」 と言うより、「ボーンローカル座標空間を、回転させる」 感じ
それが再帰的に連なると。 以上スレチ気味御免
glDeleteTexturesの第二引数ってアドレスで渡すような形になってるけど、 値が同じなら、glGenTexturesで渡したアドレスと同じでなくてもいいんだね int tex1 = 0; glGenTextures(1, &tex1); (中略) int tex2 = tex1; glDeleteTextures(1, &tex2); これで普通に解放されてて驚いた 今までクラス間でポインタのバケツリレーやってたわ・・・
独り言はよそでお願いします。
解らないなら素直にそう言えよ
目くじら立てるほどのことか?
にわかの茶々は今に始まったことじゃない。
なんか知らんが氏ね
独り言はよそでお願いします。
freeglutしか使ったことない
>>666 glGenTextures が、アドレス受け取って書き戻しをしてるから、
対応する関数の glDeleteTextures でも、同じシグネチャにしてみた… って所じゃね。多分だけど
ポインタ渡しして値比較してるだけか
openglutも長いこと止まってないか?
678 :
660 :2012/02/14(火) 16:05:52.47
>>665 (; ゚д゚)お、おk。
ボーン周りというのは飽くまで、ツール上でそういう扱いや見え方してるけど
実体は、アニメーションしたいから付けた付加情報とかタグとかみたいなもので
ボーンと各頂点の関連付けについても同様で、そういうデータを自分で用意するんですよという事か。
それで、ツール上で書き込んだ論理的なボーンとかその関連付けを
自分のプログラムで読み込んだとき、
計算しやすいような持ち方にして持ちましょうということか。
OpenGLというより、スキンメッシュの概論みたいな相談になってしまって申し訳ありません。
アドバイス、ありがとうございました。
複数のテクスチャをまとめて一度に削除できるように配列のサイズと先頭アドレスを渡す形になってるだけじゃないの
Cの配列の仕様と書き出し用ポインタがぐちゃぐちゃでややこしくて発生した悪い例
え、ややこしいのか?
Cの配列はこれ以上ないくらいシンプル。
だからポインタと配列の比較でって言ってるじゃないか 配列単体のことは言ってないよ
Cの配列はそんな高級言語的な目でみるもんじゃないでしょ。
685 :
590 :2012/02/15(水) 07:13:25.93
ポインタも配列も構造体も全てメモリ操作の構文糖衣
なんだ雑魚か 全て要件が違うだろ
配列=複数の同じ型の変数がメモリに順番に並んでいる物 ポインタ=変数のアドレスを格納している変数 構造体=いろいろな型の変数、ポインタ、あるいは構造体を複数、含める事のできる機構 最近では関数も含める事ができるしコンストラクタ等もあって、ほとんどクラスみたくなってる
688 :
590 :2012/02/15(水) 22:35:41.38
1バイトのデータを格納できる領域がたくさんシーケンシャルに並んだメモリというものがある そこに、1バイト〜64バイトのひとつの枠をあてがうのが間接演算子(*)によるアクセス 1バイト〜64バイトの1種類の小枠が複数並んだ枠をあてがうのが配列によるアクセス 1バイト〜64バイトの複数種類の小枠を任意に並べた枠をあてがうのが構造体によるアクセス
590は本物の阿呆だった 算術・論理演算は!&の構文糖衣理論並みの発言
freeglutは64ビットのアプリにもつかえますか?
64bit用のがどこかにあったと思う
どこですか?
質問。 GLSLシェーダコードに置いた、attribute 変数に対して、CPU側、glVertexAttribPointer で頂点ごとに変化する内容を渡そうと 任意配列を対応付け、glDrawArrays …ではなく、glDrawElements で描画させようとしています。 ここで疑問。 果たして、「VertexShaderにやってくる配列要素の順序は、何順になるのか」 です。 単純に頂点配列を一直線に並べて glDrawArrays する分には、結果的に頂点の順序でやってくるだろうと思うのですが、 glDrawElements …つまり、頂点インデクスの配列で渡した場合、シェーダに来る順序は、 1.それでも実際の頂点配列の順 2.インデクス配列の順 どちらになるでしょうか…。
? 頂点シェーダに来る頂点の順序とか考える意味が何処にある?
696 :
694 :2012/02/16(木) 23:39:58.29
文章だけだと伝わりづらいかもしれないので、例と補足。 A B □ A,B,C,D の4頂点がある四角形を描画しようとして、 C D 単純に頂点配列で A,D,C,A,B,C と6つ並べた配列に対して、 例えば attribute を、値[0],値[1],値[2],値[3],値[4],値[5] のような配列で渡せば、 B の頂点が VertexShader に来る時、そこでは 値[4] の値が参照出来る、のはわかるのですが、 これを、 . 0, 1, 2, 3 頂点データ: A,B,C,D / 頂点インデクス: 0,3,2,0,1,3 と並べて、 attribute に、値[0],値[1],値[2],値[3],( 値[4],値[5] ) のような配列で渡した時、 VertexShader で参照出来る attribute の順番は、「頂点順」 か、または 「インデクス順」 なのか、と言う話です。
むしろ全部の頂点を同時にやってクレ
698 :
694 :2012/02/16(木) 23:41:39.09
>>695 え? 頂点ごとに異なる内容を渡すのに attribute を使うので、
むしろ 「どの順序で来るのか」 がはっきりしないと、意味が無いかと
699 :
694 :2012/02/16(木) 23:44:54.66
あれもしかして俺、attribute の用途、間違えてる…??
glVertexAttribPointer は頂点と一対一対応してるんだよ。
順序ってのがわかりづらいな
>>696 の場合、
インデックス:0,3,2,0,1,3
頂点:A,D,C,A,B,D
属性:値[0],値[3],値[2],値[0],値[1],値[2]
こうなる。
ちなみに頂点座標も属性の一つだぞ
702 :
694 :2012/02/16(木) 23:57:12.66
>>700 ありがとうございます! つまり、
頂点データ: A,B,C,D ([0]〜[3]) / 頂点インデクス: 0,3,2,0,1,3 ([0]〜[5])
とある場合、それは glDrawArrays だろうが glDrawElements だろうが、
やってくる順序は、[0]〜[3] になると言う事ですね!
つまりこの例で言えば、attribute に対応付ける配列要素は、値[0],値[1],値[2],値[3] のみで、
そして VertexShader にやってくる順序は、 値[0], 値[3], 値[2], 値[0], 値[1], 値[3] になると。
確かに言われて見れば、CustomVertex の仕様を考えてみても、それが自然に思えてきました。
ありがとうございました。
703 :
694 :2012/02/17(金) 00:00:29.53
ああリロードしてなかった。
>>701 ありがとうございます! 納得出来ました。
>ちなみに頂点座標も属性の一つだぞ
確かに、おっしゃる通りだと思います。要は 「頂点も、色も、その他も」 配列にして全て
シェーダにブチ込んでしまって、それらについて描画する、と言う状態を想像すると、
とても晴れやかです。 ありがとうございました
>>694 君はOpenGLの仕様書の
2.6 Primitives and Vertices
から
2.8 Vertex Arrays
まで読み直したほうがいいと思う。
GPUには複数のVertex Shaderがあって
複数の頂点が同時にVSで処理される。
OpenGLは基本的に1頂点に頂点属性が一つに纏められる。
Objファイルだと一つの三角形に位置、法線、UVに対して別々のインデックスを指定できるけど
(glBeginのような古い機能を使わない限り)OpenGLだとそれができないのだ。
珍しくOpenGLスレらしい話が展開されている
俺にはわからん
>>706 君はOpenGLの仕様書の
全 ペ ー ジ
を読んだほうがいいと思う
いい仕様書をくれ 説明書みたいなブラックボックスはいらん
>>693 それって64ビットアプリじゃなくて32ビットアプリで
64ビットOSでも実行できるってだけじゃないんですか?
>>709 何言ってんだ?
と思ってダウンロードしてみたけど、32ビットも64ビットも両方入ってたよ
なんか小出しにされると疲れるな。 みつからないなら自分でソースからビルドしたら?
mingwの人はどうしてるんですか? みんな自分でビルドしているならそうします。
みんなそうしてなくても、こうしてる間に自分でビルドすればいいじゃん 後で見つかったら、それから差し替えるかどうか検討すればいい
mingwなんて使ってる人いたことに驚いた
いや使う事もある
vcとgccの中間のどっちつかずの子ってイメージあるなあ
>>717 おい。 MinGW に含まれるコンパイラって、名前通り GCC じゃないのか
gccだよな
んだね.クロス環境で作ってるからどうしてもwindowsだとMinGW使わざるを得ない
使わざるを得ないというほどのものじゃない気がするが 実際MinGWなんて久しく触ってない
Cygwin 上でコンパイル
覇王翔吼拳を使わざるを得ない
それなりの需要も理解できないのか
Vスタ使うならDX使うだろ普通。
なんか子供が新しいものを手に入れて、ドヤ顔で見せてる様を思い浮かべた
いつもの単文の人だろうけど 煽るなら煽るなりにもっとクオリティを追求して欲しい
mingwの64のfreeglutコンパイルしました。 普通は最適化が-O2だけど-O3にしてコンパイルしました。。 語尾に32の付いたライブラリーをリンクしたのが気になるけれど よく分からないんで放置しておきました。
静的リンクのライブラリーのとき-lopengl32というオプション等をつけたら コンパイル通るんですけど。 libopengl32.aなんて名前のファイルをパソコンの中を検索してもひとつも 見つかりませんでした。opengl32で検索してもそれらしきファイルは見つかりませんでした。 -lopengl32は一体どういう意味なのか教えてください。
探し方が悪い
いやほんとに無いです。 opengl32.dllならありますが これは関係ないでしょう。
あるじゃん
dllにもlib .aファイルと同じ効果があるというとは知りませんでした。 ありがとうございました。
>>733 dynamicライブラリとstaticライブラリの違いくらい勉強してからレスしましょう
>>733 は分かった上での皮肉だと思うんだが
動的リンクならdllからlib作れるけど静的リンクなら無理だね
本当にリンクできているんなら探し方が悪いんだろう
mingwならC:\MinGW\libにlibopengl32.aが普通に入ってるぞ
glutSolidCube(☆1)→glTranslate/glRotate/glScale→glutSolidCube(☆2) (☆1)と(☆2)の各頂点をGL_LINESでむずびたいのですが glTranslate/glRotate/glScaleする前後のglutSolidCubeの各頂点の座標を得るにはどうすればよいでしょうか 前後のどちらか片方はわかるんですが両方得るためには自前で行列演算しないとだめですか?
>>738 > 前後のどちらか片方はわかる
なぜ?
>>739 は本当に3Dプログラミングしたことあるんでしょうか・・・
例えば☆2でglutSolidCube(1.0f);とすれば
(-0.5, -0.5, -0.5)〜(0.5, 0.5, 0.5)を対角とした立方体として描画されますよね?
ここで☆1から☆2の各頂点への線分を引きたい場合は☆1の頂点座標をどうにかして得てGL_LINESすればよいです。
逆に☆1描画時にGL_LINESする場合も☆1の座標は固定でわかりますので☆2の各頂点座標をどうにかして得れば
頂点間の線分を描画することはできます。
「このどうにかして」という部分はOpenGL抜きで考えれば自前でアフィン変換をすれば得ることは可能ですが
OpenGLレイヤで簡単に取得することが可能であればそれを知りたいんです。
>>740 そういう意味でしたか
> 前後のどちらか片方はわかるんですが両方得るためには
「得る」というのが、OpenGL の何らかの関数を使って得ることができている
という意味だと解釈してました
だから、どうやって得ることができているのか、
なぜそれが両方ではできないのか不思議だったんですが、
「glutSolidCube の仕様上、値が分かる」という意味だったんですね
もの凄く不快な思いをさせてしまったような気がします
ごめんなさい
もう消えます
>>740 OpenGLの仕様書 ver2.1のChapter6を読み直せばOK
gluProject と gluUnProject と glGetDoublev を使ってごにょごにょすればできないこともない
>>741 すみません煽りかと思って過剰反応してしまいました…
消えないでください…
>>742 Chapter6というとStateのところだと思うんですけどやはりGetFloatv等でモデルビュー行列を
取得して自分で何とかするしかないということであってますか?
>>743 プロジェクション行列までは考えなくても済むような気はします
>>745 OpenGLの古典機能だけしか使わないのなら
モデルビュー行列を取得してラインの終点(☆2の頂点)を
自分で計算するのが一番楽だと思う。
glmのようなベクトル・行列ライブラリを使えばそんなに苦労はしないと思うし。
Vertex Shader使ってもいいのなら、他の方法もいろいろ考えられるけど。
ちゃんと自分の納豆できる手法を教えて欲しいのなら
どういう状況でプログラムを作っているのか具体的に書くべきだと思う。
(俗に言う5W2H)
・どうやってプログラムを作るか?
少ない手間で実装したいor実行速度優先
・どのversionのOpenGLが使えるのか?
古いグラボでも動かしたいかなど
・なんの為に開発しているのか
学校の宿題
女子校生にOpenGLを教えるための教材開発
国プロ
メガデモを作って海外のデモパーティで発表する
女子高生にOpenGL教えてもらいたいです
基本的にOpenGLの行列演算系命令は使わない方がいいと思う 簡単なサンプルプログラムを作れる程度の機能しかないので 真面目に書き始めたらglLoadMatrix以外は忘れて 別途ベクトル・行列演算ライブラリを使うべき ○○はできるんですか?どうやるんですか?とか悩んでる時間がもったいない
>>748 ふと思ったがOpenGLの行列演算系命令って速度的にはどうなん?
当然ドライバ依存だから単にどうかと言われてもわからないけど 常識的に考えればSSEくらいは使ってくれてるんじゃないかな CPUで計算するわけだし特別速かったりはしないだろう
glmで良くない? 標準のは有り得ないでしょ
単純な移動拡大回転だけならGLの命令使った方が良かったりしないかな。 glLoadMatrixって逆行列の計算で遅くならんかね。 計測してないけど。
なにが言いたいの?
754 :
660 :2012/02/28(火) 13:02:36.45
>>734 ありがとうございます。
openglではなく、libopenglで検索したら見つかりました。
先頭文字からの検索だったみたいです。
734にありがとうと言う精神が凄い。
757 :
546 :2012/02/28(火) 22:23:48.08
とりあえずBCPadでcl.exeを使うことで解決しました。 みなさんありがとうございました。
>>752 glLoadMatrixを使うと逆行列が計算されて重いってことになるんだったら
行列演算系の命令だって変わらないかそれ以上に重くなるはずじゃないか?
実際のところどっちにしろ本当に必要になるまで逆行列は計算されない
シェーダでgl_NormalMatrixとか使ってれば描画時に一度計算されるだけだろうし
その場合はglLoadMatrixを使ったかglRotateしか使ってないかは関係なく逆行列を計算するだろうね
>>758 でもScale,Rotate,Translateは逆行列が簡単に生成できるでしょ?計算するまでもないっていうか。
いやGLの内部で実際どんな処理がされてるかは知らんけどさ。
まぁLoadMatrixにしても、4行目が0,0,0,1なら逆行列の計算も軽いだろうけど。
モデルビュー行列を直接設定できるのはglLoadMatrixだけだよな?
glLoadIdentity → glMultMatrix っていう方法もないこともない
762 :
デフォルトの名無しさん :2012/02/29(水) 22:36:54.53
直接
スレチかもしれないけど助けて下さい 古いゲームやろうとしたら起動出来なくて スレみたら古いOpenGLのサポートが打ち切られてるからじゃないか みたいな話しが出てたんですが 古いOpenGLがサポートされていないグラボでもゲーム起動出来るようになるような そんな魔法のおまじないはありますか? それとも古いグラボ買ったりするしかないんでしょうか
ソフトやスレの実名出せばいいのに、わざわざ回答が得られないように質問をする 馬鹿ですね
スレチだと分かってるのなら、スレチでないスレを探せばいいと思うが
調べた中ではここ以上に適していそうな所がなかったので・・・ 手間を省くために知りたい部分だけ具体的にして出して 解決案を求めたつもりだったのですが逆効果だったようですね あまりスレ上の常識やお約束的なものを知らないもので スレ汚しすいませんでした
> あまりスレ上の常識やお約束的なものを知らないもので そういう事じゃなくて 少なくともゲームで遊ぶ事を語る板でスレを探すべきだろ ここはプログラム板なんだがな
OpenTKのGLControlでvsync onにすると30fpsくらいしか出ないんだけど フォームの中だとこういうもんなのか? GameWindowってのもあるみたいだけど 60fps出したいならこっち使えってことかね
769 :
デフォルトの名無しさん :2012/03/04(日) 05:11:11.10
それにしても酷い民度だな さすがOpenGL
>>766 見て、このコピペ思い出したわw
女『車のエンジンがかからないの…』
男『あらら?バッテリーかな?ライトは点く?』
女『昨日まではちゃんと動いてたのに。なんでいきなり動かなくなっちゃうんだろう。』
男『トラブルって怖いよね。で、バッテリーかどうか知りたいんだけどライトは点く?』
女『今日は○○まで行かなきゃならないから車使えないと困るのに』
男『それは困ったね。どう?ライトは点く?』
女『前に乗ってた車はこんな事無かったのに。こんなのに買い替えなきゃよかった。』
男『…ライトは点く?点かない?』
女『○時に約束だからまだ時間あるけどこのままじゃ困る。』
男『そうだね。で、ライトはどうかな?点くかな?』
女『え?ごめんよく聞こえなかった』
男『あ、えーと、、ライトは点くかな?』
女『何で?』
男『あ、えーと、エンジン掛からないんだよね?バッテリーがあがってるかも知れないから』
女『何の?』
男『え?』
女『ん?』
男『車のバッテリーがあがってるかどうか知りたいから、ライト点けてみてくれないかな?』
女『別にいいけど。でもバッテリーあがってたらライト点かないよね?』
男『いや、だから。それを知りたいからライト点けてみて欲しいんだけど。』
女『もしかしてちょっと怒ってる?』
男『大丈夫だから。怒ってないから。大丈夫、大丈夫だから』
女『何が大丈夫なの?』
男『バッテリーの話だったよね?』
女『車でしょ?』
男『ああそう車の話だった』
女『ちゃんと聞いてる?』
男『要するに車のエンジンが掛からないんでしょ?』
女『なんでそんな偉そうなの?』
>>771 いやぁ、何度見てもイラっとするコピペだw
論理的な思考ができる女とじゃないと結婚はできん
何で?
少しずつ長くなってるようなw
>>770 PC再起動したら60fps出るようになったわ
>>773 自分の要求を遠回しに言って察してもらおうとする
典型的な女思考の女はめんどくさくて嫌いだから
>>773 論理的思考ができないやつは、男、女に関係なく話にならんだろうw
もしかしてちょっと怒ってる?
なんでそんな偉そうなの?
喧嘩が成立するのは仲のいい証拠
何の?
え?
さて、ここはどこの板で、何のスレだ?
ごはんなら昨日食べたでしょう?
787 :
デフォルトの名無しさん :2012/03/04(日) 19:13:09.93
OpenGLって、C++以外で、C#やJava、Objective-Cでも動かすのは珍しくないんでしょうか? C#はXNAがありますし、JavaやObjective-CもAndroidやMacがありますよね?
何言ってんだお前
>>787 言語とミドルウェアとハードウェアぐらいの区別は
出来るようになった方がいいんじゃないかと思った。
レイヤーが違いすぎる
791 :
デフォルトの名無しさん :2012/03/05(月) 19:36:10.62
どう見ても
>>771 と同じ状況とは思えないんだが
質問したらなんか煽られて答えて貰えそうにないし
大人な対応してさようならって感じ
まぁ、正しい判断だったと思うわ
とっくに終わってる話題を掘り返すなよ
opengl使ったゲームのソースくだしあーん
わーいありがとー
いいってことよ
64bitのマシンで動かすと、 「DLL 'opengl32.dll' の 'glGenBuffers' というエントリ ポイントが見つかりません。」 というエラーが出るんですが、どうすればいいのでしょうか。 32bitだと正常に動きます。 GLSharpを使ってC#で開発しています。
GLSharpは知らないけど、64bit版のOSでも32bitのDLLを使うなら、 プラットフォームをAny CPUとかじゃなくてx86にする。 たぶん。
64ビットのexeで32ビット版のDLLを読み込もうとしてたりしない? 64ビット版のDLLを使うか、exeのビルドターゲットを32ビット (x86) にしないといけない
>>799 ,800
レスありがとうございます。
ビルドターゲットをx64にしていました。
x86にしようと思います。
glGenBuffersがopengl32.dllにね... GLSharpがx86なんじゃないの
VisualStudio2010からはこの手のトラブルを避けるために デフォルトがx86になってるんだがな
Openゲロ
805 :
デフォルトの名無しさん :2012/03/16(金) 23:27:26.12
黙れ
了解です。
次から発言に気をつけてくれればいいよ
あ?
れ?
こ?
811 :
デフォルトの名無しさん :2012/03/17(土) 17:45:38.74
黙れ
承知しました。
813 :
デフォルトの名無しさん :2012/03/17(土) 17:59:58.58
だ?
普通に動いてると思ったプログラムが別PCに持ってくと メモリリークしまくってて笑え・・・ない・・・ デバイス関連の注意点のまとめとか無いもんかね
>>814 お、ちょっとどういうケースなのか詳しく
どうせ開発ンヴィディアPC、動作不良レイディォンPCってとこだろ
メモリを沢山つんでて多少リークしても普通に動いてるPCから、 ちょっとでもリークすると笑えない別PCに持ってっただけとか
818 :
814 :2012/03/18(日) 11:15:46.23
>>815 メインのRadeonや知り合いのGeforceでは問題無かったけど
Corei5積んだサブPCのIntelHDだとリークしちゃうみたいで
エラーチェックには引っかかってないようだったけど
とりあえずシェーダ使わないようにしたらリーク解消されたってとこ
具体的なところはよく分からない
>>818 よく分かってないのは怖いな
なんか分かったら教えてくれ
Radeon HD搭載のノートでは問題なく動いてるのを 5年前のIntel GMA950なノートに持っていくとテクスチャの色がおかしくなった gl
メモリーリークしてたってのはどういう状態だったの? メインメモリーがリークしてたんだよね?
不動小数点で曖昧なところにじゃなくて画面の座標の右から何番目のピクセルに点を打てとか やりたいんだけどOpenGLじゃそんなことできませんよね?
glBitmap とかあるぞ。骨董品だけど
ちゃんと計算すれば普通にできる
>>823 不動小数点なんて言う非標準の型でなく、きちんと浮動小数点数の型を使えばいいと思うの。
次に必要になる数値は 0.375 だ。
全スクリーンを覆うポリゴンをレンダリングして フラグメントシェーダで今のフラグメントのスクリーン位置を取得して 目的の位置ではなかったらdiscard;って書けばOK&OK
>>828 glTranslatef (0.375, 0.375, 0.);
これだな。
何故0.375なのかくやしく。
くっそうくっそう! きりのいい数値だと微妙にズレる! 0.5 でもやっぱ駄目だ! 畜生! その半分 0.25 引いてみるか? 微妙に駄目じゃん! そのまた半分 0.125 足してみる! ずれないぜ! やったよカーチャン! って感じなのかね? ところで Direct3D だと 0.5 なの? これ
OpenGL ESとEGLを使ってマルチスレッドレンダリングを行いたいのですが、 wglでいうwglShareListsのようなテスクチャの継承は、 どうやって行えば良いのでしょうか。
なんだDXも同じか。
>>836 eglCreateContextの第3引数に共有したいContextをぶっ込むとか
>>838 出来ました! こんな単純な方法だったんですね…。
教えて頂き、ありがとうございました。
GTX 680 おっせーな 互換性の GeForce とスピードの Radeon か
GTX 680 おっせーなと言われたら、 Geforce 8800GT で鼻歌歌ってポリポリしている俺は
>>842 ついこの前まで俺もそんな感じだったわ
ボードがまるコゲになって交換したけど(´;ω;`)
>>842 だっせーwww
俺でさえ9600GTだぜw
いや、8800GT > 9600GTだから。つーか、8800GTのセカンドソースが9800GTだから。
Wildcat3使いがうらやましそうにそちらを見ている!
>> 8800GT > 9600GT え・・・そうなん・・・・orz
intel915で十分だ
難しいなOpenGL 学習に時間かかりそう
OpenGL以前の算数基礎学習が足りないと予想
OpenGL ES 2.0で座標aから座標bまでcフレームで移動するとかってできますか? 今は(b-a)/c*現在のフレーム数で移動していますがわざわざ変数を使わないでやりたいです
そういうのはOpenGLの管轄じゃないです
vertex shader を使えばできなくはないけど、それが普通かどうかは知らない。
OpenGLでbitmapを書き換える処理はありますか? drawbitmapに該当するものす。 命令名のヒント下さい。
? どういう事がしたいのかな?
drawbitmapが遅かったのでOpenGLで画面の描画だけでなく そのbitmapの変更も高速にできないものかと思ったので。
フレームバッファオブジェクト的なもの?
ええと多分そうです。 裏画面の書き換え(ビットマップイメージのコピー)です。
androidスレで聞けよ
861 :
デフォルトの名無しさん :2012/03/25(日) 22:05:26.42
シェーダにテクスチャを2つ放り込んで、フラグメントシェーダで計算して出力
>>861 ( ゚д゚)イメージのURL先が403Forbiddenになってて見れないぞ?
□+a=a
>>861 は昔だったらまずステンシルって答えが出てたろうね
>>861 画像Aと画像Bをブレンドさせたいのか
画像AのRGBと画像Aのalphaで画像Bを表示させたいのか
なんにせよシェーダー使えば簡単
何かあればすぐシェーダーシェーダーか。 昔のプログラマーなら AND と XOR 使うだろ。 抜き色って言うんだよ。
透過マスク処理もできんのか? スプライトも知らんのだろうな
870 :
861 :2012/03/26(月) 23:04:45.86
皆さんありがとうございます ググりましたが 簡単にはできないんですね Blendfancみたいな感じで出来るかと思ってました
昔のプログラマが AND と XOR 使ってたから、 今のプログラマもシェーダー使わず AND と XOR でやれという意味? って言うか、昔のプログラマが AND と XOR 使ってたことと、 今シェーダーを勧めることに何か関係があるの? 昔のプログラマーなら・・・ってのは、どうでもよくないか?
872 :
861 :2012/03/26(月) 23:06:08.57
>>868 だからそのシェーダの中で、AND/XOR すればいいだろっての
シェーダって、なんだと思ってるんだよw
>>871 今ならシェーダー使った方が速い
ま、そんな時代もあったんだよ
初歩の質問なんですが OpenGLは定まったテクスチャを描くのはいいようですが 自由なbitmapを描く時は毎回 for で数値化してテクスチャ作ってから描画するので かえって時間がかかるということになるんでしょうか?
for で数値化ってなんじゃい?
CPUで計算せずにシェーダに計算までさせて描かせるという手もある
なぜBITMAPに拘るのかわからんな。 テクスチャそのものに直接オフスクリーンレンダリングすればよし。
>>876 表示のビットマップからテクスチャ生成するソースでこういうのを見たので
public Texture makeTexture(Bitmap bitmap) {
…
//画像データの生成
ByteBuffer bb=ByteBuffer.allocateDirect(size*size*4);
bb.order(ByteOrder.BIG_ENDIAN);
IntBuffer ib=bb.asIntBuffer();
for (int y=result.getHeight()-1;y>-1;y--) {
for (int x=0;x<result.getWidth();x++) {
int pix=result.getPixel(x,result.getHeight()-y-1);
int alpha=((pix
>>24 )&0xFF);
int red =((pix
>>16 )&0xFF);
int green=((pix
>>8 )&0xFF);
int blue =((pix)&0xFF);
ib.put((red<<24)+(green<<16)+(blue<<8)+alpha);
}
}
…
>>878 テクスチャそのものに直接描画できるわけですか。
>>875 エスパーすると、
「画像ファイルなどをロードして、それをテクスチャを使うのはいいようですが(?)、
メモリ空間にビットマップ領域を確保して、そこに計算で描き込んだ内容をテクスチャとして利用すると
かえって時間がかかるという事になるんでしょうか?」
って聞いてる予感がするが、それ、OpenGL 固有の話じゃない。
>>878 多分、BITMAPと言う画像フォーマットの話じゃなくて、
メモリ上の画像領域(=ビットマップ)の事だと思う。 ※用語がわからなくても、Win32API などで、DIB や DDB 扱った事あればわかると思う
>>879 まずそもそも、コンピュータ上で、画像ってどうそういうデータ、どう扱われる物かは、
わかってるよな?
メモリ上のデータならポインタ使って変更すればよろし。
>>880 おおよそそうです。
surfaceviewと自由な内容のbitmap使ってやってたことをOpenGLに置き換えたいのですが
>>879 のソース見てかえって遅くなると思ったもので。
>OpenGLは定まったテクスチャを描くのはいいようですが >自由なbitmapを描く時は毎回 for で数値化してテクスチャ作ってから描画するので >for で数値化してテクスチャ作って この作ったテクスチャが >定まったテクスチャ だと思うが? なんでテクスチャを毎回作り直す必要があるんだ?
>>884 bitmapの内容が毎フレーム変わるからです。
2Dで使ってます。
2DもOpenGLで描ける 解決
>>886 bitmapもということでしょうか?
そてれともテクスチャの内容を(別の描画方法で)自由にできるということですか?
bitmapなんか使わずに、最初から最後まですべてをOpenGLで描くんだ 何か問題ある?
リアルタイムでテクスチャにレンダリングして その結果を使って最終的な絵を出すのは割と一般的な手法だと思うんだが
ググって2.0以上でないとできないともでてきましたが テクスチャにレンダリング方法を調べてみます。 どうもありがとうございます。
>>890 ちなみに、根本的な話だけど、例え OpenGL 経由で描画しようがなんだろうが、
自由に生成する内容をテクスチャに書くとしても、結局同じような処理するだけだから、
そこを勘違いしないように
例えば DIBの 先頭ピクセルからループで処理するのと、
テクスチャの 先頭ピクセルからループで処理するのと、
同じような事をしたいなら、結局経由が違うだけで同じ処理するよ。考えてみればわかる事だが
そして、何かのライブラリで簡単に1行で書けるとしても、裏では同じ事してるので、
それはそういう物。 そこだけ曖昧に、勘違いしないように
あと、
>>879 のコード見て気づいたけど、C/C++ じゃなくて Javaで行おうとしてるとして、
JavaやC#でそのレイヤの処理は、元々向いてないので遅くなっても当たり前
>>872 なら単に1枚のテクスチャをアルファ反転で描画したいってことか
黒いところは描画して白い部分は透明
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
シェーダー使えた方が色々応用が利いて良い せっかく良い題材なんだから、練習がてらシェーダーを学ぶ事を勧める
シェーダーってちょっと古いPCだと動かなくなるみたいなイメージあるんですけどどうなんですか?
ちょっと古い程度なら動く 望む処理速度が出るかどうかは、シェーダーの組み方と、 どのくらいを望んでいるかに依るから何とも言えない それと、イメージでものを語るな 実際に自分で動かしてみるか、実際に動かした事例を見なさい
シェーダー使うまでもない今回の例のようなケースが多くて 未だにシェーダーを使ったことがない私が通りますよ。
2Dなら固定機能で十分な場合が殆どかもなぁ。 シェーダーでないと書けない処理ってでてこんな…。 固定機能一掃しちゃったDirect3Dならともかく、OpenGLは残したわけだし。 まぁ暗号みたいなステート操作まみれのコード書くのは嫌だから、俺はシェーダー使うけど…。
むしろ2Dこそシェーダが楽
なんで最近3Dやりたがるプログラミング初心者多いんだ・・・ 段階的に知識養うってことを知らなすぎる・・・・
いいんじゃないの。なんか3Dカッコイイ!てのも原動力になるよ。
今月の日経ソフトに入門的なのが載ってるな
簡単に絵が出て動いて楽しいからプログラム入門にちょうどいいよ
マジレスするとSurfaceViewのが簡単だし入門にちょうどいい
processingでも良い
原動力になるならいいが、コピペで済まして、すべて他人任せなヤツも多い
部品の再利用を否定するとかソフトウェア工学完全否定ですか
部品の再利用じゃなくて、怠惰の方 その区別を出来ないか、言い訳に利用する人が多いってこと
遊びでやっててそんなに努力とかする気ないよみたいな人もいるだろうし、 気に食わなかったらスルーしたり、からかったりすればいいんじゃない
車輪の再発明やジェネリックプログラミングの話と 不思議仕様を含んだブラックボックススパゲッティの話を 一緒にするのはやめようぜ
OpenGLは遊びじゃねえんだよ!!!!!1111
OPEN GL, IT'S SERIOUS BUSINESS!
なんだよこの流れww
ここまで俺の自演
もうそうおちゅっちゅ
質問。環境はWindowsXPSP3 と Windows7HomeSP1 OpenGL でオフスクリーンレンダリングを行う要件があるんですが、動作コストの面で、 win32のDCを頼りにする wgl系の手法(wglCreateContext&wglMakeCurrent)と、 OpenGL オフィシャル(拡張)である、framebuffer/renderbuffer を用いる方法と、どちらが手続き内でコストが低いでしょうか もしも、ライブラリ手続きの面でそれほどコスト差が無く、顕著に現れるのはそれ以外の自前コードだ、と言う場合 出来ればオフィシャルで行きたいと思っています。よろしくお願いします。
>>922 それはだから framebuffer の例です
普通にFBOでいいんじゃね。 どっちかが使い物にならないくらい遅いとかは聞いたこと無いが 気になるなら両方作って比較してみたらいいかと。
そのレンダリングした結果をどうしたいかによるんじゃね? 動作コスト云々の前に、まず目的によって使い分けが生じると思うんだけど。
GeForce GTX 590 より 580 の方が良い結果が出て Radeon HD 6990 より 6950 の方が良い結果が出る世の中。
GPUによって、得意、不得意な処理があるんじゃねーの?
デュアルGPUはクロック下げてるからマルチGPU非対応の旧ソフトだとそりゃ悪いよ
OpenGL ES2.0はglPushAttrib, glPushClientAttribないみたいなんだけど手で一個一個やれって?
>>929 無印OpenGLでも3.0以降コアから外された。(ARB_compatibilityで残ってはいるけど)
glPushAttribの方は高価だから元々避けるべきとされてる。
なんで、どのみちステートマネージャは作らなきゃいけない。
なんかえらい難しいですね。 これ考えた人バカですか?
オフスクリーンレンダリングでテクスチャの一部から先の一部へコピーする方法ありますか? それを解説してあるいいHPないでしょうか?
先の一部って何だ?コピー先の事か? glTexCoord2でコピー元の座標を指定して後は普通にコピー先テクスチャに オフスクリーンレンダリングすればいいだけだろ
>>930 ありがとです
そうなんですか はふぅ・・
>>933 できるんですね。わかりました調べてみます。
>>931 えらく難しいと思ってる自分は賢いのかいw
>>836 でマルチスレッドでのレンダリングを質問した物なのですが、
生成したスレッドの最初に eglCreateContext の第3引数に
共有したいContextを入れてeglMakeCurrentしたのです。
これがGoogleのangleprojectではちゃんとレンダリングされたのですが、
QualcommのAdreno SDKやARMのOpenGL ES Emulatorでは上手くいきませんでした。
そもそもangleprojectで確認してたのが悪かったのですが、
レンダリング出来るようにするにはどうしたらいいでしょうか。
>>937 一般的にはその方法で問題ないはず。
実装毎に上手くいかない場合にどうすればいいかはメーカに聞くしかないんじゃないかな。
あとエミュレータは細かいところまで実装されてない場合があるのであまり信用せずに実機で確認してくれ。
おお、Open GLスレを発見。 「実例で学ぶゲーム3D数学」 OPEN GLで卒論制作するつもりで、数学的なところを 勉強したいんですけど、上の本わかりやすいですか? 結構数学苦手なので、困ってるんですけど… 何か他にもよさげな本があれば紹介お願いします。
そこそこわかりやすかったと記憶している。
授業でやってた頃はなんに使うのかわからなかったけど 高校〜大学の数学物理力学等の教科書は結構役に立った
ここで質問スべきかどうか迷ったけど幾つかアドバイスくだしあ Windows Vista 32bit、ATI Radeon HD 4850でGLSL のビット演算はできた 同じPCでWindows 7 64bitをデュアルブートしてドライバを確認するとHD 4800になっていて ビット演算がサポートされていない模様 (シェーダのコンパイルは通るが入力に関係なく0が返ってきている) ラデオンのHDバージョンがオペレーティングシステムによって変わって見えるものなの? GLSLで確実にビット演算をさせる方法はある? ちなみに後者は#extension GL_EXT_gpu_shader4 : enableも試してみたが駄目
ドライバ更新してないんじゃないの?
一応更新したつもりだったがあやふやだったからそうなのかも PC触れるようになったら確認してみます
数学関係は、手取り足取り掛け算から教えてくれるぐらいの物を、わかりやすいと思う人もいれば、 そんな馬鹿冗長な物ウザいだけだと、公式と証明羅列して、そこに補足入るくらいがシンプルでわかりやすい、って人もいるので 「何がわかりやすいか」 なんて、自分で読んでみないで他人に感想聞いた所で、正解なんてわからない いや普通の話。
947 :
942 :2012/04/08(日) 14:52:29.80
942だけど、ビット演算は普通に動いていて、全く別の所で躓いていました、失礼失礼・・・
そうだと思ってました
>>938 お答えくださり、ありがとうございます。
なるほど、間違ってはいないはずですか。
まずはエミュでGL環境を整えてから実機で試そうとしてたので、
実際に実機で確認出来るようになったらまた色々と探ってみます。
GLSLで二つの3Dモデルに対して別々のシェーダーを適用したいのですが、 別々のシェーダーと言っても一部共通する部分があります イメージとしてはこんな感じです(フラグメントシェーダー) モデルX : 計算a + 計算b モデルY : 計算a’ + 計算b 計算bはどちらのシェーダーにも共通する計算なのですが、 この様な場合でも二つのシェーダーのソースのどちらにも 同じ計算bを書く必要があるのでしょうか
YES
ということは、VRAM上に全く同じ命令データが 複数置かれることも普通にあり得るということですか 非常に無駄な感じがしますが、仕方ないのですね これは仕方ないとして、せめてシェーダーのソースコード上では、 このようなコピペを回避する手段は何か無いのでしょうか 機能毎にモジュールに分けておいたソースをロードしてコンパイルし、 リンカがそれをひとつのシェーダーにリンクするとか
コーディングルールをがちがちに決めておいて文字列操作で何とかすれば良いんじゃね
NO
>>954 私の
>>952 へのレスですよね
VRAM上に全く同じ命令データが複数置かれることはないという意味でしょうか
それとも、コピペを回避する手段は無いといういみでしょうか
あるいは両方でしょうか
OpenGL3以前のGLSLではCPUでの関数呼び出しみたいな事ができないので 関数は全部展開されていた。 OpenGL4だと関数呼び出しができるらしいけど詳しくは知らん
Direct3Dは9の頃、静的リンカあったけど、最適化阻害する割にメリットがコード分割できるってだけだったから、全く使われず10であっさり消えたな。 11で動的リンカっぽい機能ついたけど使われてんだろか…。 マァ同じ命令データが複数置かれるといっても、画像に比べたら無いに等しいし、パフォーマンスへの影響の方がでかい。 とりあえずOpenGLでコード分割するには、#includeを自前で実装して、コンパイル前に展開するしかない。 異種バージョン間とか考えるとかなりめんどくさそうだが、 単純に文字列展開するだけで済ますならそんな難しいもんでもないよ。
コピペを回避するには、基本的には自分でGLSLのコードを弄って
共通に使われる関数を複数のGLSLのコードに自動的に配置するような処理が必要になる。
そこでオススメなのがboost::waveだ!
waveはC言語で使われるプリプロッサを実装したものだが
waveに付属の以下のサンプルはGLSLのコードを処理できるようになっている。
wave\samples\custom_directives
このサンプルコードを使えばヘッダファイルに共通処理を書いて
#include "common.glsl"
みたいな事がGLSLでできるようになる。
ちょっと話は変わるが、最近Revisionという大きなデモパーティが開催された。
http://revision-party.net/ ここで作品をダウンロード可能
http://pouet.net/party.php?which=1550&when=2012 ここのスレのみんなはメガデモに興味ないかい?
今でもAMIGAのデモやってるんだな。
>>958 横からだけど、boost::wave とかノーマークだった。
これいい。素敵。ありがとう
みなさん、ありがとうございます
自分のマシンで使える OpenGL が 3.1 までなので、
GLSL の機能だけでコピペを回避するのは諦めざるを得ませんね
>>958 すいません、質問には関係ないと思って開発言語は伏せていました
Haskell でプログラムしてます
プログラムソース内で(所謂シェーダーツリーみたいに)
グラフでシェーダーを組み立てられる仕組みを作って、
それでコピペを回避する方向でがんばってみます
そんぐらいコピペしろよ
cppとかLLでも簡単にできない?
>>962 コピペ自体は簡単にできますが、コピペ元を変更した場合、
全てのコピペ先を同様に変更しなければならず、
その時に変更漏れしてしまう可能性があります
そういう事を防ぐのが、いろんなプログラム言語で実現されている
モジュール化機能の役割の一つだと学んできたので、
GLSL には少しショックでした
HLSLみたく実行時にコンパイルできないのかGLSLは?
むしろつい最近まで実行時にコンパイルするしかなかったっていう 後追いのくせに細かいところは結構gdgdだよなぁ
灼熱のファイヤーダンス
Haskellとかつまんねー言語捨てろし
ほしぞらまですべててにいれた♪
シェーダにプログラムから定数を渡したい時って、uniform変数へ渡すのと、 attribute変数の定数として渡すのと、どう使いわけたらいいんでしょうか。 投影行列みたいなのはuniform変数が使われているサンプルをよく見かける のですが、頂点ごとの計算に使うような定数は、attribute変数の定数として 渡した方がいいんでしょうか。 今一使い分けがわかりません。よろおねm(_ _)m
>>261 の質問者とは別人ですが、似たような質問をします
レンダリングコンテキストAがカレントの時に VBO を作り、
頂点データをVRAMに転送します
別のレンダリングコンテキストBがカレントの時に別の VBO を作り、
先ほどと全く同じ頂点データをVRAMに転送します
これで2つの全く同じ頂点データを元にして、
同じ3Dモデルを別々のウィンドウに別々の角度で表示したりできるのですが、
この場合、VRAMには2つの全く同じデータがダブって入ってる事になりますよね
これではあまりに無駄なのですが、
頂点データをVRMA内で共有する方法は無いでしょうか
wglShareLists などはディスプレイリストは共有するけど、
VBO は共有できないような気がするのですが、共有できるのでしょうか
[環境]
OpenGL 3.1
>>972 「wglShareLists VBO」でググるとできそうな感じだけど、ダメだった?
>>973 いえ、開発言語がHaskellなのでwglShareListsそのものを試す環境にはないのですが、
Haskellで GTK + OpenGL の組み合わせを提供するライブラリに、
他のレンダリングコンテキストとリソースを共有するレンダリングコンテキストを作る関数があって、
それで試したところ上手くできなかったので、もっと根本的に別のやり方があるのかと思いました
同じようにレンダリングコンテキスト同士のリソースを共有するwglShareListsでできるのでしたら、
Haskellの方でもできると思うので、関数の使い方に問題があるのかもしれません
理屈では可能なのですね、もう少し考えてみます
ありがとうございました
attributeは頂点ごとのデータ、つまり頂点「属性」。uniformは頂点ごとに変わらない「一様」なデータ。
>>975 レスありがとうございます。attributeが頂点ごとのデータというのは理解しています。
自分が聞きたかったのは、glVertexAttribPointerではなくて、glVertexAttribで指定する変数の方です。
これは全頂点で同じ値になりますよね。これと、glUniform〜 で指定する変数との使いわけについてです。
説明が紛らわしくてすみません。
>>976 それはglVertexとglVertexPointerと同じような関係じゃない?
つまり実用的にはglVertexAttribはあまり使わないんじゃ。
まぁ人によると思うが。
>>977 あそうなんですか。
例えば頂点の色を全部同じにしたい時は、glUniform〜じゃなくて、glVertexAttribで指定する
ものなのかなと思ったりしたんたですが。
そういう場合でも、glUniform〜で渡してやる方が一般的なんですかね。
ググり方が悪いのかわからなかったので… glutInitDisplayMode(GLUT_RGBA|GLUT_SINGLE); のGLUT_SINGLEとは何ですか
シングルバッファ つまりダブルバッファを使わないということ
981 :
979 :
2012/04/13(金) 11:48:19.26 なるほど! ダブルバッファを読んだらよくわかりました ありがとう