== 必読書 == -- 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シリーズ
== 必読書2 == -- モダンな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 (青本)
以上テンプレでした。 チュートリアルサイト、増えたことに気づかず まとめ損ないました。 すみません。
おつおつ
>>1 おつです
3次元の立方体を線画で描こうと思って入力したら
「error c2099:初期化子が定数ではない」
と下の点情報が引っかかってしまいました(点G以外すべて)
何を直せばいいのかわからないので指摘お願いします
GLdouble vertex[][3]=
{
(0.0,0.0,0.0),//A
(1.0,0.0,0.0),//B
(1.0,1.0,0.0),//C
(0.0,1.0,0.0),//D
(0.0,0.0,1.0),//E
(1.0,0.0,1.0),//F
(1.0,1.0,1.0),//G
(0.0,1.0,1.0)//H
};
>>1 おつ
質問です
CAD や モデラーなどを OpenGL を使って作る場合も、
頂点データは VBO を使って VRAM 側に持たせて、
頂点の位置や法線などのパラメータを変更する度に
バッファのマッピング系やコピー系の関数を使って書き換えるのが普通ですか
それとも、元の頂点のパラメータが変化しないゲームなどと違って、
モデラーなどではメインメモリ側に持たせる方がいいのでしょうか
>>10 あっさり解決
低レベルな質問で申し訳ないです、ありがとうございました
OpenGLコンテキストを作らずにシェーダーで使われているUniform変数とAttribute変数の名前を表示したいのですが、 どうすれば可能でしょうか? 自前でGLSLを全部パースするしか無い? (すごく大変。。。。)
>>8 の初期化子って定数だよね?
数が足りないから警告ならあってもいいけど
C/C++的にはエラー出るのはおかしくない?
>>13 VisualCのC言語ファイル(.c)だと変数の初期化にカンマ演算子を使うとこのエラーになるっぽい
>>13 (0.0,0.0,0.0)なんて定数ありません
>>14 VSもgccもいけるやん!
って思ってたらVC++か。。。
たんに{と(を間違ってるだけじゃ?
>>14 へへ。確かに初期化でカンマ演算子を使うことはないから、
その仕様はいいかも。
20 :
12 :2012/04/18(水) 00:03:24.97
やはりそれしかないですか.... C#から使いたいのでAngleのGLSLパーサーをC#から使えるようにして。。。。 まあ自前でGLSLパーサーを作るよりは簡単でしょう どうしたものか、むむむむ
頂点インデックスを使いたいのですが たとえば立方体を描画する場合、頂点情報は8つですみますが それにテクスチャを貼り付けたい場合は、UV情報は最大だと48個必要になると思います この場合どのように描画すればいいのでしょうか? UVの個数に合わせなければなりませんか?
UVにあわせるしかない。 法線も必要な場合は48個まるまる必要になる。 立方体は不連続な子だから仕方ない。
23 :
22 :2012/04/19(木) 14:15:25.00
48個じゃねえ、24個だorz UVも変な張り方しないなら24個で収まる。 が、UVの個数にあわせるしか方法は無い。 とりあえず俺は算数からやり直してきます…。
25 :
デフォルトの名無しさん :2012/04/21(土) 00:43:30.89
3Dモデルの平均曲率の計算の実装の方法を教えてください!
それはOpenGLのAPI使わないと出来ないことか?
27 :
デフォルトの名無しさん :2012/04/21(土) 03:04:43.61
28 :
デフォルトの名無しさん :2012/04/22(日) 23:46:13.45
>>27 25です.
wikiやベクトル解析の教科書などで曲率を調べて数式的定義は見たんですが,
実際の3Dモデルに対する実装の方法が良く分かりません・・・
よろしければ教えてください。
>>28 だからそれはOpenGLなのか?
曲率考える前に
質問する板考えろ。
頭くさってんじゃねぇのか?
もしかするとGLSLでという?いや、まさかね
質問です VC2008(C++)で、最初から入ってるopengl32.lib/glu32.libを使って、テクスチャをポリゴンに貼って表示する所まで出来るようになりました。 そこで、テクスチャとレンダーターゲットを16bit or 32bitの浮動小数点にしたいんですが、最初から付いてる奴はヘッダもlibも古いみたいで、 そういうテクスチャが作れないように思えます。 何か新しいライブラリを入れる必要があると思うのですが、何を使えばいいのでしょうか? テクスチャフォーマットをfloatにして精度を上げたいだけで、それ以上の凝った機能は無くても大丈夫です。 商用に使いますので、できるだけライセンスの緩い奴だと助かります。 よろしくお願いします。
>>32 ありがとうございます、これです!glext.h / glxext.h ってヘッダしか無いんですね。
ライセンスについて書かれてないっぽいですが、勝手に使って良いんでしょうか?
glewも色々便利っぽいですね〜!こっちはglew使ってますっていう表記をしないといけないヤツですね。
表記する必要あんのか?
glewはBSDライセンスだし(他の物も混ざってるようだが)少なくとも添付のドキュメントか何かには表記が必要だろ しかし素のgl.hもSGI Free Software License B, Version 1.0とやらに従って表記が必要なようなんだけど、これ書いてあるの全く見たことないな
glew使ってます!って表記してんの見たことない
ちょっと前ダイレクトXにダイレクト2Dって奴の2D機能あったじゃないですか? オープンGLに2D機能って無いんですか? 3DにしてCPU使いすぎる程のものではないので・・・
ない
今はなんでもかんでも3Dとして描画するのが流行り
>>37 > オープンGLに2D機能って無いんですか?
あるよ。というか、特に3Dと区別していない。
有難うございます。 ではz軸を固定して線を描いたりすればいいんですね。 そうやってみます。
openGL32ライブラリーじゃなくてopenGL64ってあるんですか? 64ビット対応CPUなんで使ってみたいんですけど windows7です。どうやったら出来るか教えてください。
ライティングやモーションの有無等によって処理を切り替えたいのですが GLSLは動的な条件分岐に弱く、速度が極端に落ちると聞いたのですが 処理毎にプログラムを分けると条件分岐の数の二乗分だけプログラムが必要になり色々効率的ではなさそうですが 動的な条件分岐に弱いなら、一回のdraw中に条件判定に要する値が変わらない静的な分岐なら速度はそれほど落ちないのでしょうか?
>>43 OpenGL4で関数ポインタみたいのが導入されて、
それつかえば関数の呼び出し先を必要に応じて変えられるらしい。
使った事は無いのでよくわかんないけど。
最近のGPUだと条件分岐も昔よりだいぶ改善されてんじゃないかな 静的な分岐というか、なるべく多くのプロセッサが同じ動作をするように分岐を書くと効率はいいはず
>>43 頭でっかちにならないで実際にシェーダーを書いてみなよ、
動的な条件分岐でさ。案外問題ないと思うよ。
それで速度が遅いなら#ifdefとかで分ければ無駄にならないし、勉強にもなるよ。
projectionMatrixで正規化した座標に変換するのって w座標が1のにできないの? 逆行列で戻すとき困るんだけど
質問は日本語で
SSAOってもう過ぎた技術なの?
>>48 projectionMatrixで変換した座標がwに馬鹿でかい数値入ってくる。
wに1が来るようなprojectionMatrixの作り方教えろ
51 :
47 :2012/05/04(金) 22:58:50.66
スクリーン座標からワールド座標は一意に決まらないことからわからないのか? まずそこはどうなのよ
>>51 >クリックした画面のワールド座標を求めたいのだが
glReadPixelsでデプス取ってきてUnProjectすればいいだけじゃないのか?
>>51 その[160 80 0.66666 1.0] を逆行列で変換すると[-0.6666 0.6666 0.0 0.33333]になるから
またwの0.3333で割ってやれば[-2 2 0 1]に戻る
クリックした画面のワールド座標は、スクリーン座標[160 80 0 1]の(x,y)だけではダメで
glReadPixelsのGL_DEPTH_COMPONENTでzも拾ってこないと
OpenGLならgluUnProjectを使うのが楽
RBOをコピー等のオーバヘッドなしでテクスチャオブジェクトとして振舞わせることは可能ですか?
不可能です 最初からテクスチャに描けよ
GLSLについて質問があります。 fragmentシェーダ内でアクティブであるテクスチャの横幅、縦幅を取得する方法はありますか? 現在はuniform float pixel_size_x;等の変数を作成しセットして利用しています。 これが自動的に求められる(シェーダ内で関数を用いる等で)と、 例えばポストプロセスでガウスをかける時に非常に簡単になるのですが このような関数はありますでしょうか。 もし存在しており、ご存知の方がいればご教示のほうお願いします。
textureSize()
>>56 ありがとうございます。デプステクスチャが使えないandroidなもんで...
GLUTでの視点の操作について質問させていただいてもよろしいでしょうか。
平面を移動する物体があります。
物体の向き(進む方向)の真後ろから物体を見たいのですが、
視点の位置がうまく導き出せません。
物体の操作方法は
http://www.wakayama-u.ac.jp/~tokoi/opengl/ex-a.html のページを参考に
r-=(マウスのX座標)/10.0;
(物体のX座標)+=(マウスのY座標)*sin(r*π/180.0)/100.0;
(物体のZ座標)-=-(マウスのY座標)*cos(r*π/180.0)/100.0;
で導出しています。
まだまだわからないことばかりで大変恐縮ですが
何卒ご教示のほうお願いします。
何が分からないのか意味不明 何をやりたのかも意味不明
申し訳ありません。 物体が平面の上を自由に動くプログラムを作りたいのですが、 その際に視点を物体の真後ろに固定したいのです。 物体を自由に動かすことは自分でできたのですが、 視点が物体の真後ろに固定する方法がうまく見つからず、アドバイスをいただきたい という内容です。
物体の位置からのオフセットを決めて視点の位置に物体の位置+オフセット値を入れれば 取り敢えずケツにくっついて動くよね。 物体が回転したら視点の位置ベクトルに物体の回転量を掛ければいい。
物体の場所が判っていて物体の向きも判っているなら、視点も視線も判るべさ。
>>62 物体の前方を意味する方向ベクトルを v とし、
物体の中心位置の位置ベクトルを p とする。
カメラの位置ベクトルを p - l * v とする(l は物体とカメラの間の距離)。
カメラの視線の方向ベクトルを v とする(あるいはカメラの注視点の位置ベクトルを p とする)。
カメラの天頂方向の方向ベクトルは適当に設定する(普通は物体の天頂方向と同じにする)。
カメラの3つのベクトルをこのように設定すれば、
基本的にはとりあえずこれで望みのことは出来るはず。
ただ、これだと物体がほんの少しでも向きを変えれば、その瞬間に
カメラは注視している物体の周りを「大きく」回ることになるので、
たいていは非常に見難いことになる。
カメラの移動を遅らせたり、慣性を付けたりして工夫する必要がある。
66 :
62 :2012/05/10(木) 14:08:58.64
>>63 様
>>64 様
>>65 様
おかげさまで無事に動くことができました。
わかりやすいアドバイスをありがとうございました。
67 :
57 :2012/05/11(金) 18:51:37.97
>>58 57です。レスありがとうございます。
また、返信が遅れてしまい申し訳ありませんでした。
そのままの名前だったのですね・・・。
バージョン1.3から使えることを先ほど確認しました。
おかげでGL側のコードが非常にスマートに書けそうです。ものすごい嬉しいです。
本当にありがとうございました。
※ OpenTKです GL.BindBuffer (BufferTarget.ElementArrayBuffer, glResources[ibuf]); GL.BindVertexArray (id); GL.BindBuffer (BufferTarget.ArrayBuffer, glResources[positions]); GL.DrawElements (省略) みたいに (1) ElementArrayBufferをバインドして (2) バーテックスアトリビュートをバインド (3) DrawElements するとメモリアクセス違反で落ちます。 (1)と(2)を入れ替えると正常に動作します。 DrawElementsの直前でElementArrayBufferをバインドしなければならない という制約はありますか? もしくは何かすごい勘違いをしてますか?
わかりました glBindVertexArray()の前にglBindBuffer(GL_ELEMENT_ARRAY_BUFFER)を呼ぶと落ちます 本にはVAOのバインドはカレントのバッファーポイントを変更しないと書かれていますが、 ATIだと思いっきり変更してくれるようです。 やれやれ
解決乙 いろいろあるよね(´・ω・`)
固定シェーダーとまったく同じ機能のGLSLコードどこかに落ちてませんか?
固定シェーダーではマルチテクスチャだったり、合成方法だったり関数で指定するだけだが、 シェーダーは使う機能ごとに異なる記述しないといけないから、何をもってして固定と同じと呼ぶかがそもそも不明。
質問は日本語で
OpenGL ES の本とか参考になるかも。
Mac+GeforceでGLSL描写がすこぶる遅いって話を聞いたんだけど これはOSとGPUの相性だったりしますの?
77 :
72 :2012/05/13(日) 10:19:45.94
いやシェーダーにFogColorとかあって それをセットすれば固定シェーダーと同じ画像が得られるというだけですよ? 探せばありそうですが意外と無いです
お前は何を言っているんだ・・・・
微妙にスレ違いかもしれないけどGL関係なので・・・。 C++でglew.hを複数回includeしてしまうとエラーを吐く仕様なのは理解しています。 現在、 クラスのメンバ関数のデフォルト引数にGLenum型の定数を、 クラスのメンバ変数の型にGLenum型を利用したいと思っています。 例) classA.h ←glew.hをinclude classB.h ←glew.hをinclude これらのヘッダを相互にincludeすると先程のエラーを吐くとおもいます。 現在はこの問題に対してglew.hの中から使用する型や定数の部分を抜き出して ヘッダ上部で前方宣言することで解決しています。 よりスマートな解決法をご存知の方がいましたら教えて頂けないでしょうか。
インクルードガードが付いてるのに複数回 include でエラー吐くとは思えんが。
#ifdef ヘッダーで検索してみろ
classA.hとかclassB.hにインクルードガードが付いてないとかが原因だったりして…。
>>82 >>83 >>84 レスありがとうございます。
申し訳ありません、自己解決しました。
エラー内容は下のようなモノだったのですが
C1189: #error : gl.h included before glew.h
どうやら、自作のGLヘッダの前にOpenCLのc++ラッパ用ヘッダcl.hppを
includeしたのが問題だったようです。(内部を確認しにいったところgl.hが・・・。)
スレを汚してしまい申し訳ありません。
知らんがな
87 :
デフォルトの名無しさん :2012/05/16(水) 00:31:25.47
すいません。 openglのポリンゴンのオブジェクトを作った後、バインドしなきゃ 有効なならないとか解説されてますが。 バインドっていったいなにをやっているんですか?なぜ必要なのでしょうか?
質問は日本語でおねがいします 一体どこでそんな解説を見てきたんですか OpenGLにポリゴンのオブジェクトなんて物は存在しません
ポ、ポリゴンじゃねえよ!
ぬ〜ぶすだ、ぬ〜ぶす!
glBindBufferじゃね?
>>88 お前は本当に頭が悪いな。どこにポリゴンなんて書いてある?
ちゃんと「ポリンゴン」と書いてあるだろう。
恥かく前にゴミは消えろ
>>92 ポリンゴンって、スタートレックみたいだなーと思ったぉ。
それクリンゴンや
某MMOのMobの名前か?
三角形の秘密を教えてくれないいけずな奴だろ
は?なに?
それはポリンキリー
やっべww俺今度からポリンゴンて言うわww
GLSLのフラグメントシェーダで、これから点を描こうとしてるバックバッファのドットの色って取得できるんでしょうか? カレントの色を拾ってきて、それに何か加工するような処理を入れたいんですが・・・。
どの環境なのかわかんないけど たぶんできない レンダリングターゲット作って描画して それを使ってなにかする系が普通らしいです 簡単な計算だったらBlendFuncとかいじればいいよ
ありがとうございます う〜んダメなんですね 描画結果をテクスチャに貼って、マルチテクスチャで混ぜるようなカンジですか・・・ 面倒です!!!
OpenGL4.2で追加されたARB_shader_image_load_storeは任意のテクスチャ配列に対してフラグメントシェーダで自由に読み書きできるらしいからそれ使えば出来るんじゃない。 多分DirectX11のUnorderedAccessView相当の機能だと思うから、やりたいことによっては使えないだろうけど。
>>103 それ面倒とか言ったら何も出来ないと思う
linuxでRenderMonkeyみたいなのないでしょうか?
犯人特定できてないうちは俺らの負け
でお前らエウレカ環境遮蔽は見ているのか
固定シェーダーをパクったGLSLを書こうとしています。 struct LightInfo { int Type; vec4 Position; vec3 Color; }; uniform LightInfo Light[8]; と書いてglGetActiveUnfiform()でユニフォーム変数の名前とサイズ、型を取得すると name = "Light[0].Type" size = 1 type = INT みたいな値が8個返ってきます(配列ではなく...)。 ユーザー定義の配列の型は何が帰ってくるのが正しいのか? 配列で返ってくるにはどうすればいいのか? を教えていただけないでしょうか
GetActiveUniformの返してくる型にはユーザ定義型や配列なんてのはないから「配列で返ってくる」ことはないよ 今の状態が正しい もし配列的に設定したいならUniform Blockを使ってバッファオブジェクトを設定するといいよ
VertexShader、FragmentShaderともにエラーもなくコンパイルもできており、 きちんとAttacheShaderもしてるのに、LinkProgramをすると失敗します。 おまけにglGetShaderivでログの長さを調べるとゼロになってます。 いままでLinkが失敗したことなんてなかったのでさっぱりなのですが、 こういった場合何が悪いのでしょうか。
VertexShaderのoutとFragmentShadreのinが一致してないんだろ エラーはGetProgramInfoLogに書いてあるはず
>>112 レスありがとうございます。
それぞれinとoutは以下のようになっており、一致しているのですが・・・。
// vertex shader
in vec3 in_pisition;
in vec3 in_color;
out vec3 o_Color;
途中で送信してしまいました。 続きです。 // fragment shader側の変数 in vec3 o_Color; out vec4 FragColor; GetProgramInfoLogでみようにも、glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &loglen) で帰ってくる長さがゼロなんです。 適当にバッファサイズ増やしてみて無理やりGetProgramInfoLogしてみても何もはいって きません。
115 :
111 :2012/05/28(月) 19:07:12.45
すみません、自己解決しました。 ステータスチェック用の変数を0で初期化してしまっており、 GL_FALSE扱いになっていました。 GLint status; glGetShaderiv(this->handle, GL_LINK_STATUS, &status); とやると、成功してるとなにもはいってこないんですね・・・。
リンクはglGetShader()ではなくglGetProgram()だけどな なんかいろいろ単純ミスをしてる感じ
>>116 ぁ・・・・そうですね、そりゃログ取れないですよね・・・
すごく単純なミスでした、すみませんorz
PBOについて勉強中なのですが、ただ単純に画像ファイルデータを そのままポリゴンへ貼り付ける場合にはPBOを介した方が早くなるのでしょうか? VBOと同じように「GPU側へ予め転送しておく事で高速に描画できる」ものなのかと認識していたのですが、 サンプルソースを探してみても、MapBuffer/UnmapBufferを利用して何らかの処理を施してからテクスチャとして 利用するものばかりなもので・・・画像データをそのまま貼り付けるソースが見当らず戸惑っております
何をやりたいのかサッパリ分からんが PBOとか使わずに普通にテクスチャーを貼ればいいんじゃね
120 :
118 :2012/05/30(水) 15:13:19.55
「頂点配列→描画」よりも「頂点配列→VBO→描画」
121 :
118 :2012/05/30(水) 15:14:26.54
すみません、途中送信してしまいました 「頂点配列→描画」よりも「頂点配列→VBO→描画」の方が処理が早くなるのと同じように 「画像ファイル→テクスチャ」よりも「画像ファイル→PBO→テクスチャ」の方が早いのかと お聞きしたかったのです
毎フレームテクスチャが変わる(動画テクスチャやアニメーションテクスチャ)の? 単に画像ファイルを貼りたいだけなら意味ないんじゃね。普通使わない。
「画像ファイル→TO→テクスチャ」が一番速いに決まってるだろ・・・ 何で標準で用意されている最も簡単で最も速い方法を使わずに アクロバティックな方法を採用したがるのか・・・
>>121 テクスチャを書き換えするならPBO使え
他人のアドバイスにケチをつけるつもりはないが無意味
そもそもそこはボトルネックなのか?
ttp://asura.iaigiri.com/OpenGL/gl43.html のサンプルプログラムを実行したところ、次のようなエラーが出てしまいました
GLUT: Fatal Error in c:\〜〜〜〜.exe: pixel format with necessary capabilities not found.
おそらくglnterleavedArraysあたりでエラーを吐いてるんじゃないかと思うのですが
glnterleavedArraysは諦めたほうが良いのでしょうか?
pixel format with necessary capabilities not found. ってしっかり書いてあるじゃねぇか、glnterleavedArrays関係ないよ。 初期化部分で指定してるRGBAとかDepthのサイズが対応してないんじゃないかな
>>128 ありがとうございました
動くようになるまで初期化部分を試行錯誤してみます
すいません超初心者なんですけど CとopenGLでボーンアニメーションを動かすことってできますか?ぐぐっても、C++ばっか出てきちゃって
できる
よろしければ、やり方か参考になるサイトなんかを教えてもらえませんか?
お前が見つけたC++のソースが参考になるだろ。
シェーダー使うか使わないかでもだいぶ違うし 一口にこれというのはないな
c++でもcでも出来ることはだいたい一緒だよ 継承とかを多用されてたらやや面倒臭い程度 ところでスレチになったらすまないんだが、OpenGLを使ってゲーム製作中なんだけれどもdxと違ってサウンド機能が無いのが辛い GLのように広いプラットフォームで利用できて、ある程度高速に実行できるサウンドライブラリはないだろうか
SDL Audio
OpenALは
OpenALなんてものがあったのか クロスプラットフォームなのに加えてGLライクに書けるみたいだし、早速試してみるわ ありがとう
glext.hにglBindTextureARBがねぇ!
glew使えよ
glewにもgoogleにも軽く聞いてもなかったよ
glBindTextureEXTじゃね? しかし今更OpenGL1.0の環境もないだろうからglBindTextureでいいと思うがな
そもそもないってなんだよ。 コンパイルエラーなのか、定義がないのか、IntelliSenseで出ない(笑)のか
定義
glBindTextureEXTの間違いじゃね?
>>142 も言ってるけどglBindTextureでおk
英語のforumでもそんな感じの解答だったしやっぱりそうなのかな。とりあえずありがとう
そもそもglBindTextureARBという名前はどこから出てきたんだよ 何が元でglBindTextureARBの存在を信じていたのかが知りたい
便乗質問。 glBindTextureって遅いので、起動時に一回だけ 実行して、あとはそのまま描画してglBindTextureを 二度と実行しないという方法で高速化して動いてるんだけど、 この方法で問題ないですか? というか、glBindTextureでバインドしたテクスチャが 消える条件が良く分からない。
テクスチャー変更しないなら最初に1回だけ指定すればOK ってか別に遅くないだろ
>>148 遅いのはglTexImageXd系でglBindTextureは遅くないと思うのが
152 :
148 :2012/06/05(火) 13:48:37.06
>>149 ありがとうございます。っていうか、えっ?!と
思ったら
>>151 !!!
サンプル改造して動かすだけじゃなく、ちゃんと
中身理解しないとダメですね……
そのglTexImage2D()も充分速かったりするけどね。
そもそも割り当てたテクスチャ変更しないならglBindTextureも glTexImage2Dも作成時に1回しか呼ばないから何も問題ない。 ※描画時にBindTextureしないのはGLSLの話 単に貼るテクスチャ変えるなら複数枚作っておいて切り替えればいい話。
一枚のテクスチャの中に @ABC DEFG HIJK LMNO と言う感じで、複数枚のコマ送りの画像を埋め込んでおいて UV座標で@だけをマッピング→Aだけをマッピング→Bだけをマッピング・・・ として簡単なアニメーションをさせていたんだけどこれじゃダメかな?
どういう用途か分からないけどそれはそれでいいよ。 2Dゲームのキャラのアニメーションとかはそうやるし。 使ってないならディスプレイリストも使うといいかもね
>>155 テクスチャアトラスでググると吉。俺も2Dゲーム
作ってるんで、その方法で行ってる。
158 :
デフォルトの名無しさん :2012/06/07(木) 16:22:23.29
質問です。 GLSLでバリアンスシャドウマップをやろうとしています。 シャドウマップ作成、 色情報内にライトまでの距離と距離の2乗を格納 ↓ ガウスフィルタでシャドウマップをぼかす ↓ ぼかしたシャドウマップで距離を比較して影をつける これでやろうとしているのですが、 ガウスでぼかしたタイミングで 周りの描画されていない部分の色(ここでは白)と混ざって ぼかした部分の格納した距離が描画していない部分の距離と混ざってしまい、 距離が正しく比較できなくなり、ぼかした部分が表示されないのですが、 ぼかすのが間違っているのでしょうか??? 描画していない部分は白(1.0, 1.0, 1.0)なので ライトまでの最短距離が0.0,最長距離が1.0に変換しているとすると 混ざって大体最長距離になってしまうっぽいのですが…。
ぼかすのは近隣の深度値も見て影を描きたいという意味なので、背景描いてないなら正しい挙動でしょう 嫌ならちゃんと背景を描いてやるか、ぼかすのをやめるしかない
160 :
デフォルトの名無しさん :2012/06/08(金) 11:18:37.34
>>159 やっぱりそうなのですね…。
背景も描いてみて頑張ってみます。
ありがとうございます。
シェーダーって1回だけ実行すればいいように作りますか、 それとも何回かに分けて実行しますか
語りえぬものについては、沈黙しなければならない。
glClear(赤,緑,青,透明度) この透明度の値を変えると,背景にどのような変化がありますか。 自分の持っているプログラムで試しても変化がわかりませんでした。
>>163 その透明度を計算に利用する時に影響が出る。
当然その透明度を使わなければ見た目何の変化もない。
165 :
163 :2012/06/09(土) 16:33:13.60
>>164 なるほど納得です。ありがとうございます。
166 :
163 :2012/06/09(土) 16:35:59.31
連投すみません。 ソースコードの間違い探しってここに晒せば見てもらえますか。 長めかもしれないんですけど。
思わず探したくなるようなコードなら、探すかも知れん クソなコードなら無視する
168 :
163 :2012/06/09(土) 16:50:58.41
げげ。一応晒してみようか…な…。 とあるサイトで、 「X-Y平面、Y-Z平面にポリゴンを描画し、クリックした所の 三次元位置を取得せよ。」 という問題と、それの答えが公開されていたサンプルをもらいました。 いざ実行してみると、正しく座標が取れないことがあったので、 まだ直すところがあるのかどうかを見てもらいたいです。 次にソースをさらします。
ディスプレイ座標とデプスから逆算する奴なら、誤差があるのは当然だけど、 まさかその話じゃないよな。
170 :
163 :2012/06/09(土) 17:08:07.62
>>169 そうでした。クソでした。
全力でごめんなさい。
171 :
163 :2012/06/09(土) 17:25:18.70
投下したってことはまだ何か聞きたいことがあるの?
義理と人情ってやつだろう。
ギリトニン錠
2次元のディスプレイ(しかも高々数千×数千の解像度)と言う少ない情報から、 3次元と言う高次の情報を無理矢理得ようとしているんだから誤差は付き物 逆算は誤差が出ることを前提にプログラムしなきゃならないよ
176 :
163 :2012/06/09(土) 18:01:32.12
>>171 は、間違えてボタンを押して投下しまっていたみたい。
お気遣いありがとうございます。
ご迷惑おかけしました。
>>175 > 2次元のディスプレイ
縦横にデプス加えて3次元だぞ。誤差が大きくなるのは、単に透視投影の際のデプス値の入り方のせい。
3Dのアクションゲームを作っています ダメージを受けた時に「画面を揺らす」と言う効果を実装したいのです 現在は全描画物に対して僅かにglTranslateさせると言う方法で行なっていますが、 これよりもスマートで良い方法があればご教示下さい
View行列にTranslateすればいいのでは
>>178 全描画物ではなく、カメラの方を僅かに揺らす方が良い
>>161 誰かこれ教えて下さい。
多分MeshクラスにShaderProgramクラスを持つことになって
1つ持つべきかN個持つべきか迷ってます
1回で描けるなら1回で描くし 描けないなら複数回で描く それだけのことよ
>>182 複数回で描いた方が良いシェーダーって例えばどんなの?
描けないならっつってんだろ
>>184 不快な思いをさせたようで申し訳なかった
どういう時に描けないのか、何か例を知っているのなら、という意味で聞いたんだ
シャドーマップとかディファードレンダリングとか、トゥーンシェーダーの輪郭とか複数回描く奴ならいろいろあるし、 そうじゃない特殊なケースもある。いろいろでしょ
187 :
181 :2012/06/10(日) 12:37:18.38
今の予定だと (1) (ボーン)TransformShader => 頂点の変形 (2) MaterialShader => マテリアル係数の書き出しとテクスチャー (3) LightShader => ライティング の3種類を考えています。 これをレンダリングするためには単純に一回だけレンダリングするだけでは駄目で 多分シェーダーとフレームバッファー)を取り替えながら3回回す必要があります。 で、3回x(ShaderProgram+UniformArray+VertexArray)とレンダーターゲットの変更とかやると すごく長くなりそうで死にそうなんですがどうすればいいですか
188 :
181 :2012/06/10(日) 12:39:33.59
あとシャドーは別パスで。 シャドーマップ作る時はマテリアルはいらないので その時だけシェーダーを単純なのに取り替える? それはどういうAPIがあればいい? シェーダーを複数セットできるようにしておいて レンダリングの時にpass=1とか送って 使用するシェーダーを決めればいい?
glGetErrorってもしかしてレンダリングデバイスコンテキスト毎にエラーをストックしていて、それを返している? デバイス設定直後いエラーがある場合は、前にそのデバイスを使っていた時のエラーを返している可能性があるのか・・?
ってちょっと調べればわかるよな、ビンゴだった
191 :
171 :2012/06/10(日) 21:16:55.03
たびたびすみません。
http://codepad.org/uTZTuch0 なんですが、タイマー関数の存在って何か意味がありますか。
c(28)C4113:
"void (__cdecl *)()" はパラメータ リストが "void (__cdecl *)(void)"と異なる
という警告が出るんですが、これの解決法はありますか。
>>191 display 関数内でアニメーションしてるわけでもないから、
これだけならタイマー関数を使う意味は無いように思える。
警告の方は、display 関数のシグネチャを
void display() から void display(void) に変えてみるとか。
glGetErrorをglBeginとglEndの間で使っちゃいけないってすごい落とし穴
194 :
171 :2012/06/10(日) 21:49:36.46
>>192 了解しました。警告は直したところ出なくなりました。
ありがとうございます。
>>187 その程度で死にそうになってたらこの先確実に死ぬぞ
設計はDirectXのエフェクトやCgFXなんかの既存のエフェクトシステムや
OpenSceneGraphとか各種ゲームエンジンなんかの描画システムをまず参考にするといいんじゃないかな
そこでlispという選択肢もありですよ
またそんな格好(カッコ)ばかりつけて
198 :
デフォルトの名無しさん :2012/06/13(水) 17:46:16.00
GL_FOG を適用したテクスチャを GL_BLEND で背景テクスチャとαブレンドしたいのですがどうすればいいでしょうか? フォグの色は float fogColor[] = { 0, 0, 0, 1 }; glFogfv( GL_FOG_COLOR, fogColor ); で、ブレンドに glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); とすると、ブレンド後にフォグの黒い部分が背景に現れてしまいます。 glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR); だと、色が加算されてしまいます。 フォグ適用結果のアルファ値だけを利用する手段はないのでしょうか? よろしくお願い致します。
フォグ色のアルファ値は使われないので無理です 諦めてシェーダ書いてください
200 :
デフォルトの名無しさん :2012/06/14(木) 00:00:33.79
回答ありがとうございます マニュアルに書いてありました。どーもすみません。 あしたシェーダ書いてみます。初体験です。(今までのコードと共存出来るのかな?)
>>200 共存、て話で言うと、シェーダコードは別のプログラム(GLSL)を書いて、それを自分の処理の途中で使うように指示するだけで、
自分の処理そのものを大きく変えるようなアプローチでは無いから大丈夫
もちろん、引き渡す内容に関して、それを管理する引き渡す部分の処理は追加になるけど
そしてシェーダコード自体は新たに書くことになるけど、それは当たり前と言うことで
202 :
デフォルトの名無しさん :2012/06/14(木) 18:32:53.46
>>201 シェーダ書きました。
まだまだ改良の余地はありますが、単体テストではいい感じになりました。
教えて頂いて感謝です。
次に共存・共生についてですが
実はこのレンダリングを行う関数はDLL内部にあります。
DLLの初期化時にシェーダプログラムを作成し、親玉のレンダリング処理の一貫として
DLL内のレンダリング関数が呼び出される造りです。
単体テストで「親玉」に相当するものはシェーダなど全く使っていないため
いい感じで動作しました。
ところが「本物の親玉」では既にシェーダを使っていることが分かりました。
glUseProgram() でシェーダを切り替える必要があるのですが
DLL内のレンダリング関数が終了する直前に親玉のシェーダに戻したい場合
どうすればいいか悩んでいます。
(DLLのレンダリング関数を呼び出すときにIDも一緒に渡しておく... ちょ、I/F変更??)
そこで質問です。
その時点で使用されているシェーダのIDを取得する関数はありますか?
例) GLuint program = glNowUsingThisProgram(void);
よろしくお願いします
>197 いや、今使っている道具の限界を知る上で有用だ
>>202 glUseProgramをググって出てくるドキュメントみるとglGet()にGL_CURRENT_PROGRAMで拾えるっぽいこと書いてあるよ
206 :
デフォルトの名無しさん :2012/06/15(金) 10:04:53.78
>>205 またまたすみません。
シェーダが元に戻るのを確認できました。
ドキュメントをちゃんと嫁!ですね。
ところで
シェーダを完全に切り替えるのではなく直前のシェーダの結果に追加したシェーダを合成する場合
皆さんはどのような方法をお使いでしょうか?
質問ばかりで申し訳ありませんが、よろしくお願い致します。
207 :
デフォルトの名無しさん :2012/06/15(金) 23:51:35.08
>>206 シェーダ、2日目で限界を感じました・・
フラグメントシェーダ内でカメラからの距離が分からんのですか?!
z/wでは座標系によっては使えんのですね・・
致命的やん
バーテックスシェーダーから渡せば?
>>207 致命的って・・・
フラグメントシェーダに限らず一般的にシェーダというのは、
デフォルトでは得られない情報は外部から得るんだよ。
パイプラインの前段から情報を渡したり(
>>208 )、テクスチャから得たり。
210 :
デフォルトの名無しさん :2012/06/16(土) 00:13:21.52
バーテックスシェーダって頂点座標だけでなくピクセルごとの(OpenGLでの)座標も取れるのですか? 何だか分からなくなってきました…(泣)
>>210 バーテックスシェーダで頂点毎のデータを出力すると、
それが補間されてピクセル毎のデータとなり、
フラグメントシェーダに入力される。
212 :
デフォルトの名無しさん :2012/06/16(土) 00:38:51.31
>>211 教えて下さい
例えば最終的に画面上で10x10の100ピクセルが表示されるとして
バーテックス、フラグメントのそれぞれのシェーダは何回ずつ呼び出されますか?
VERTは四隅の4回、FRAGは100回でしょうか?
それともVERT、FRAGとも100回ずつでしょうか?
「補完」のイメージがよくわかっておりません…
バーテックスシェーダーは頂点数、フラグメントシェーダはピクセル数 補完はあるフラグメントに飛び込むポリゴンの部分の頂点に対する補完
214 :
デフォルトの名無しさん :2012/06/16(土) 00:49:53.51
>>213 なんとなく解りました。
とすると、バーテックスシェーダーから渡すとしても「補間」される前の頂点の座標しか渡せないように思うのですが、まちがってますか?
>>214 それが補完されるのだから十分であると思うけど・・・とりあえず間違ってはないと思う
216 :
デフォルトの名無しさん :2012/06/16(土) 01:44:52.22
>>215 夜遅くまですみません…
バーテックスシェーダで算出した頂点座標(画面座標系かつユーザ変数)までもがフラグメントシェーダに渡った時点で対象ピクセルの画面座標(頂点とは限らない)に補間されるのでしょうか?
そんな器用なことできないですよね…
フラグメントシェーダ内で画面座標ではなくワールド座標系の変数、gl_FragWorldCoord みたいなのは無いんでしょうか?
テクスチャの淵の座標と視点座標ぐらいなら何とかなりますが、画面上に描画する淵以外のピクセル(補間された部分)だとそう簡単には行きません。。
(OpenGLさんが内部的にやってることと同じ処理を書く必要がある)
で、限界を感じ、致命的などと愚痴りました。(泣)
>>216 器用も何も単なる線形補間
頂点毎に色を変えたポリゴンを描いたことはないの?シェーダの話以前に
ワールド座標系はバーテックスシェーダでgl_Vertexだったっけな、あるよ確か
あとそっから下に書いてあることはなんかよくわからんw
だからlisp使えとあれほ(ry
非効率指向のlisperはAVでもみてろよ
いやうちlisperちゃうし
俺はcpluserだし
222 :
デフォルトの名無しさん :2012/06/18(月) 22:04:22.56
>>217 いろいろ教えて下さり、おかげさまで気持ちよく動作するようになりました。有難うございました。
VS内でカメラと頂点の距離を取得し、FSに渡して解決しました…
これで十分要件満たします。
>>222 パイプラインの処理的にもそれであってる
GLSLにおけるvarying変数でバーテックスシェーダからフラグメントシェーダに渡せる変数の数って制限があったりします?
実装依存で制限。つまり環境によって制限数が違う
やっぱり制限自体はあるんですね float 20個くらいでリンクの時に必ずフリーズ起こすんですよね こんなものですかね?環境依存なんでしょうけど
varying変数の上限ってMAX_VERTEX_OUTPUT_COMPONENTSでいいの? 手元の仕様(4.0)では最小値64になってるけど
MAX_VARYING_FLOATS?
GL_MAX_VERTEX_ATTRIBS:16 GL_MAX_VERTEX_VARYING_COMPONENTS_ARB:16 GL_MAX_VARYING_FLOATS:68 で使ってるのが varying vec4 x1 varying float x11 varying vec2 x8 :31 floats 20 components? ここから一個でもfloatを削るとリンク通る(Render Monky) というかrender monkyはこのチェックしないでフリーズしてしまうんだな
230 :
デフォルトの名無しさん :2012/06/21(木) 21:00:29.70
別スレッドでjpgを読み込みそれをglTexture2Dに渡しています。 glTexture2Dを実行している間メインの描画スレッドがカクツキ、停まっているようなんですが glTexture2D の部分を memcpy に置き換えてバッファに空書きならスムーズに動きます。 こんなんでしたっけ? NVIDIA GeForce をつかっています。
渡してるformat+datatypeがinternal_formatと違ってたら変換起きるから遅いよ formatとinternal_formatは合ってるか?
ちょっと暇な人付き合ってください //vertex shader #define N 20 varying v[N]; void main(void) {
↑ミス //vertex shader #define N 20 varying float v[20]; void main(void) { for(int i = 0 ; i < N ; i++) { v[i] = float(i); } gl_Position = ftransform(); } //fragment shader #define N 20 varying float v[N]; void main(void) { float c = 0; for(int i = 0 ; i < N ; i++) { c += v[i]/N; } gl_FragColor = vec4( c, 0.0, 0.9, 1.0 ); } // このシェーダでrender monkeyか何かでNを増やしていって何処でハングするか・・・自分は以下で20で、floatをvec4に変えても同じという謎 Card name: ATI Radeon HD 4850 Manufacturer: ATI Technologies Inc. Chip type: ATI Radeon Graphics Processor (0x9442)
> varying float v[20];
>>233 (VertexShaderをvarying float v[N];に変えて)39で落ちた。
vec4に変えると32でエラー
GeForce GTX 580 (Driver 301.32)
>>234 ああそういうことか、どうも
>>235 レスありがとう。
環境によってまちまちなようですな
でもやっぱり綺麗に4倍ではないのか、かといって同じでもないのか
リンクできないならリンクエラーになって欲しいがそうもならないし
237 :
デフォルトの名無しさん :2012/06/24(日) 18:09:22.93
GLSLの変数のgl_Vertexにはオブジェクト座標空間の頂点座標が入ってるらしいんだけど、オブジェクトの頂点っていっぱいあるだろうから(立方体なら8個?)、これは配列なの??それとも頂点シェーダーはオブジェクトの頂点毎に実行されてるってことなの??
頂点毎に実行されてる だから頂点シェーダー
まずちゃんとした本を読めと言いたい
>定説に異論を唱え、議論を挑む姿勢 は評価してよいのではないか
242 :
デフォルトの名無しさん :2012/06/25(月) 23:23:36.28
>>231 そうですか、遅いですか
でも別スレッドなんですよ?
glTexImage2Dに突入してから抜けるまで他のスレッドに移らないようにドライバ内で排他制御してるのかな?cpu->gpu転送時にそうしないといけないんでしょうかね?(でも転送前の変換してるときにはロックする必要もないと思うんだけど)
>>242 別スレッドというのが新情報な気がするがまあいい
描画スレッド(glDrawElementsなんかで描画してる)と別なスレッドでglTexImage2Dを呼んでいるという理解でいいかな
その時各スレッドでOpenGLのコンテキストはどうなってる?
OpenGLでは大抵の実装で同じコンテキストに複数のスレッドから同時にアクセスしてはいけないことになってる
なのでglTexImage2Dをやるスレッドでは通常の描画コンテキストとは別に共有コンテキストを作って使うべきだ
230で別スレッドって書いてあるし、当然共有コンテキストにしてるだろう。じゃないとできないし。
ここってWebglの質問でも良いのかね? 常に最新のverで話されていて躊躇する
いいんじゃね。わかる人いなければスルーされるだけなんだし
どうせ過疎スレですし
botの私もいますよ
>>242 実はシングルコアのCPUで別スレッドなんです〜
とかだったら笑う。
>>242 変換処理は、GPU内部で行っていたと思う。
そこは確かめた?
>>242 >突入してから抜けるまで他のスレッドに移らないようにドライバ内で排他制御してるのかな?
>cpu->gpu転送時にそうしないといけないんでしょうかね?
一つの穴に何人もが突っ込んだら、穴裂けちゃうでしょ
>(でも転送前の変換してるときにはロックする必要もないと思うんだけど)
逆に自分がOpenGLの中側にいると想像して、中で管理するリストを持ってるとした時、
そのリストに追加変更処理発生するような場合、ロックしたくならないか?
シェーダーの良質なサンプルが沢山あるサイトを教えてくだしい
本ならあるんだが、まとまったサンプルがあるサイトは見当たらないね
どんな本?
俺もGLSLで画像処理する系の本は持ってるな てか、「良質なサンプル」 ってのは、つまり難しい事を予め片っ端から製造済みのコードそのもの、って事か よくわかんないからコピペで済ましたいって意味で
さすがにそれは深読みしすぎじゃねw
>>254 ShaderX とか GPU Pro なんて、良質でモダンなシェーダーてんこ盛りだよ
258 :
デフォルトの名無しさん :2012/06/26(火) 21:48:52.20
>>251 glTexImage2D に渡す前に自分で変換してから渡したほうが速かった(・o・)ノ
ドライバ、しょぼ
って、おいらのプログラムの方がショボイですが。。 (ρ_;)
260 :
デフォルトの名無しさん :2012/06/28(木) 22:52:41.98
シェーダってデプスバッファの処理(隠面消去)を勝手にやってくれるんでつか?
うん。 こっちが返した depth 値を見て、奥にある分は上書きされる。
設定でしないようにも出来る
>>261 デプスバッファは自動なのにライトは書き書きしないといけないんですよね?
違いはどこに有るのでしょうか?
ドキュメントのどこをみればいいでつか?
>>263 ライト?ライトって光源のライトの事?
デプスバッファは、スクリーンの平面だけでは足りない深度についての距離情報を持つ物で、
光源は単に、そのフラグメントの色を決定する為の要素でしかないから、計算すればって話
二つは全然立場が違う物だよ。 違う意味のライトが思いつかないので、こんな話だけど
デプスバッファはカラーバッファに書き込みしないとか、フラグメントシェーダをカットとか、 グラフィクスパイプラインの動作に深く関わってるから固定機能なんでつよ。
DirectXのような固定ライト機能が欲しいってことかね?
何故そこでDirectXが。glLightfv とかせめてそっちに
268 :
デフォルトの名無しさん :2012/06/29(金) 05:46:44.04
263(260)です。質問の仕方が大雑把ですまねぇ。 ライトはglEnable(GL_LIGHTING)&glLightXX()のつもりですた。 glEnable/glDisableでCapa制御するが、シェーダでは GL_DEPTH_TEST だけ特別扱いするぜ!! ということでいいでつか?
ビルドインの GL_LIGHTING がシェーダで使えるとか、 それ明らかにシェーダの自由性を損なうから使えないのは当然だろ。 一方デプステストはPシェーダともVシェーダとも直交してるから使えるのはおかしくない。 特別扱いとかお前何言ってるの。
PではなくFシェーダと言うべきか。
もしかして… デプステストは初期状態で有効になってますが、ライティングは初期状態で無効になってます。 OpenGLのレンダリングステートの初期状態について知るには何処を参照すればいいでしょうか? という質問なのか…?
wglUseFontBitmapsを使ってフォントを描画しています 左下が1ピクセルでも画面外に行くと描画されなくなっていまいます うまくクリッピングされるようにはできないのでしょうか?
デプステスト初期状態で有効になってたっけ?
>>272 無理。たぶん。
おとなしく wglUseFontOutlines を使用するか、
いったんFBOに描画したやつをTextureで描画する。
1.glRasterPosで見える位置に設定 2.glBitmapでずらす 3.描画 でいけるとおもうよ
そんな裏技があったとは。
どうみても間違えた方向の努力
だからプロラミンなどすんなと言ったのによぉ
blenderで作成したモデルをOpenGLで使いたいのですが、何か良い方法はありますか。
http://codezine.jp/article/detail/843 を参考にしながらやると、codezineのページが古いためかエラーが起きてしまいます。
一応collada domを使用したいと考えてはいますが、
もし、それよりも良いやり方があればご指南、アドバイス等いただけないでしょうか。
宜しくお願いします。
「エラーが起きてしまいます」としか書けない奴はプログラミングに向いていないから諦めろ。
わかりました。不愉快な思いをさせてしまって申し訳ありませんでした。
>>283 >>282 の真意をくみ取れないなら、あるいは真意を伺うことすらできないなら、
プログラミングどころかコンピュータに関わることすら向いていないから諦めろ
>>284 いえ、エラーについて書く前に、
もう一度エラーについて考え直していたところでした。
>>284 の真意を汲み取れてない様な・・・
スマン、ループったな
DOM使ってcolladaのパーサ書いたことあるけど 方便キツすぎて汎用性ないから別の形式にした方がいいよ
だな。colladaに拘る理由がないなら他の方が楽できると思う。
方便がキツいというのもよく分らん言い方だが COLLADA ってデータの意図をパーサーで汲み取らないといけないものなの?
俺自前だわ Blender側Exporter書いて、自前のC++コードで読んで表示 都合優先で
とりあえずボーンその他の仕掛け要らなくて、まずは表示だけ出来ればいいなら、 wavefrontOBJ形式がシンプルで実装しやすいと思うぜ 中の構造もテキストエディタで開いて、一目瞭然。パースも単純。
>>289 方言のタイポじゃね?
3Dツールの汎用フォーマットってのはバベルの塔なのかもな…。
Colladaがいいならcollada domなんか使わなくても
C#かboostのptree使えば・・・
結局
>>290 みたいにモデラー側にExporter書いちゃうのが一番楽
>>290 ,
>>293 俺Blenderのエクスポーターすごく書きたいんだけど
資料はどこを見ればいい?
どこから手を付けていいかサッパリ分からん
ヒント:オープンソース
>>294 とりあえず「Blender プラグイン 作成」とか「Blender スクリプト 作成」とかでググれよ。
あとその話になるともうスレチだからBlenderスレいくといい
>>294 俺
>>290 だけど、APIリファレンス見ただけだよ
コードはPythonで。 てか、普段 OpenGLの、特にVBOとかのレベル扱ってて意味わかってれば、別に普通。
3D描画の手前に2Dを描画したいのですが、どうしても3Dの方が手前に来てしまいます。 上手く描く方法はないでしょうか??
>>298 glDisable( GL_DEPTH_TEST );
>>298 glDisable( GL_DEPTH_TEST ); してから描画とか
glClear(GL_DEPTH_BUFFER_BIT); してから描画とか、
バックバッファに、そのOSのAPIで上から描画しちゃうとか、色々
>>300 w
302 :
298 :2012/07/08(日) 13:28:02.70
DEPTH_TESTで出来ました。皆さんありがとうございます。
というか,前から思ってたんだけど,なんで'TEST'なんだろう? まだ実験段階ですよってこと?
そりゃそうだろ なんだと思ってたんだ?
hitTest
>>303 判定とか判断って意味じゃないの。TEST
学校のテストと意味的には変わらん。
308 :
298 :2012/07/09(月) 17:42:05.73
すみません、再度質問なのですが、GL_LINEで描画する際、非表示で描画する方法ってあるでしょうか? 「retuneで処理を通さないとかは無しで」 色を無色透明にする、ラインの太さを0にするなど、そういう方法は試しましたが、駄目でした。
>>308 retune(リチューン?)ってなに?
310 :
298 :2012/07/09(月) 18:15:14.56
すみません。returnの間違いです。
非表示で描画ってなんや? バックバッファに描画するって事か?
カラーにマスクかければいい glColorMaskだっけ? 忘れた
Zバッファにだけ描画とか、そんな意味なんじゃないか
blendでsrcを0にしてdstを1にするとかか
「非表示で描画」とか言っちゃう時点で・・・
Zバッファにだけ書き込みたいなら そう書けば良いのに
誰かが作った描画関数のライン部分だけ消したいとかじゃねの
質問が下手な人は「自分の考えたやりたい処理」じゃなくて出したい結果を書いた方が良い結果になると思う。 答える方もエスパーしなくていいし。
毎フレームごとにメインメモリ上に生成された画像(動画をデコードした結果とか)を テクスチャとして使うために GPU 側に転送する場合、 0. glTexImage2D で転送 1. glTexSubImage2D で転送 1. PBO で glMapBuffer して書き込み → glTex(Sub)?Image2D 2. FBO …はこの用途での使い方が分からない。 一般的にはどれが一番早いんでしょうか。
1 か 1が速い。 0はデータサイズの変更とかもできるのであんまり速く無いと思う。 この用途でFBOを使う事はたぶん無いだろう。 昔Geforce6000系でglTexSubImage2D とPBO+glMapBufferで速度比較したが 大差なかったような記憶がある。 デコード結果を一旦メモリに置いてからglMapBufferが返すアドレスにデータを書き込むよりも 直接デコード結果をglMapBufferが返すアドレスに書き込む方が早いかもしれない。 後ピクセルフォーマットによっては内部でデータ変換が必要になって遅くなるみたいな事を聞いた事がある。 GL通はデコード前のデータをGPUへ転送してGPUでデコードしたりするんだろうか。 まぁ、たくさんGPUを買ってきて、いろんな方法を試して調べてみたらいいと思うよ。
あは。1が二つあるのね
OpenGLってゲームプログラマを目指さない高校生が個人でゲームを作るのに使うべきなんですかね? 自分は、Unityとかで作るべきだと思うんですけど、どうなんですかね? 友達が全く言う事を聞かなくて困っています。よろしくお願いします。
OpenGLは3D描写ライブラリ ゲームには音だしたりAIだったり他に色々必要になる ゲームにもよるだろうけどゲーム作りたいとだけ言われたらUnityを薦めるわな
>>323 普通に考えればそうですよね。ありがとうございます。
OpenGLを使ってUnityと同じ事が出来るようになる頃には大学卒業してると思うお
それはそれで悪くないと思うけどね ただopenGLであとは何もかも自作となると途中で挫折する可能性のほうが高くなりそうで ヤル気があるのであればopenGLで作るのを止める理由はないね 若いって羨ましいのぅ
>>320 ありがとう。
しかしこの用途で PBO が早くないとなると、存在価値がよく分からなくなってくるな。
GLES2 では PBO ないし、 FBO が出た時点で用済みなのかな。
15 年前に 2D ゲームを作ったら、一番のボトルネックは RAM => VRAM の転送で、よく DirectDraw やら GDI の BitBlt と pixel format の組み合わせで、どれが一番速度が 出るかベンチマークしている人がたくさんいた。 2012 年の今でも、未だにここがボトルネックという…。 少し前の Intel GMA でテクスチャ転送すると、 pixel format によっては 640x480 60fps の転送が 間に合わん。何かの冗談だと言ってくれ。
少し前のIntel GMAでOpenGLを使おうというのが冗談だろ? 最近は4.0まで対応したらしいがどうなんだろうな
さんざっぱらオンボーロVGAと言われ続けてきたからHD4000を信じられない・・・
Intel はクセあるからなあ
こっそり裏で解像度や画質落としてパフォーマンス稼ごうとするしな。
>>329 インテルGMAはUMAだから理論上は転送コストゼロにできるはずなのに、余程ドライバの実装がアホなのか。
マザーボードをみると、チップセットとRAM, グラボ間はそこそこ離れているじゃん。 VRAMとRAMの転送速度を速くしようとすると、GPUをCPUかチップセットに内臓せなあかんのやろうね。 でも現状は内臓GPUってしょぼいのばっかだよね。 さらに高解像度なディスプレイが普及してきているから 転送しなきゃいけない量も増えている。 こうなったらRAMとのデータのやり取りは最小限にして フラグメントシェーダとか駆使してばりばり映像を作るしかないべ。 ここにいるおまいらなら、おっぱい方程式をレイトレーシングとか簡単でしょ。
>>335 > さらに高解像度なディスプレイが普及してきているから
> 転送しなきゃいけない量も増えている。
ディスプレイが高解像度になったという理由で増えてきてる
RAM->VRAM 転送しなきゃならないデータというのは何?
それはフラグメントシェーダとか駆使することが主な解決方法なの?
俺は、ディスプレイの高解像度化が原因で転送量が増えてきてるのなら、
シェーダのユニット(コア)を増やすよりも、
予めデータを VRAM に置いておける量を増やす、
つまり VRAM の容量を増やした方が解決に繋がると思うのだが。
>>336 > さらに高解像度なディスプレイが普及してきているから
> 転送しなきゃいけない量も増えている。
つまり、高解像度なディスプレイがあると表示するコンテンツも
それに合わせて高解像度にしたくなる。
だからCGやるときはテクスチャサイズが大きくなり
動画再生するときもよりサイズが大きいものが必要になるという事。
初期化時にテクスチャやメッシュをVRAMに転送しておいて
レンダリング時にあまりGPUへデータ転送しなくていいならVRAM容量アップでもいいかもしれない。
けどストリーミングされた動画をテクスチャに貼り付けたいときは
あらかじめVRAMに置いておく事はできない。
そこでデコード前のデータを転送してGPUでデコードするとか
高解像度画像に見えるようにデータ処理すればいいんでないかと。
>>337 Visual Studio Add-inを使えばいいんじゃ。
Express Editionだと使えないらしいけど。
http://qt.nokia.com/downloads/visual-studio-add-in
>>338 なるほど、テクスチャ ストリーミングね。
すまん、「映像を作る」と言われた時、正直デコーディングは想定してなかった。
OpenGLの、線を描画するプログラムが正しく表示されません。
具体的な症状は、線が描画されずに真っ白いまま、というものなのですが、どなたかアドバイス頂けませんでしょうか。
OSはWindows7 64bit
ディスプレイアダプターはInterl(R) HD Graphics 4000で、
サンプルプログラムは
http://www21.atwiki.jp/opengl/pages/21.htmlです プログラム自体は起動するので、インストール関係は間違ってないと思われます
試しにInterl(R) HD Graphics 4000をアンインストールして、標準VGAドライバにすると描画されたので
おそらくディスプレイドライバ関係だと思うのですが…
Intelでもジオメトリシェーダ動くようになるのか
345 :
デフォルトの名無しさん :2012/07/23(月) 23:06:29.41
GLESで3D描画しています。 オブジェクトの移動回転について、 Matrix.scaleM(); Matrix.rotateM(); Matrix.translateM(); の順でやるのがセオリーだと思いますが、これでは上手く行かず Matrix.translateM(); Matrix.rotateM(); Matrix.scaleM(); だと思ったように描画されます。これはどうしてでしょうか?
>>345 こう考えてはどうでしょうか。
OpenGL(GLES)の頂点座標ベクトル V は「縦ベクトル」で表されていると考える。
(あくまでそう解釈するだけ。配列の書き方とか内部実装などは考えるな)
その場合、座標変換行列を M とすると、座標変換は M * V と表現される。
scaleM を Ms、rotateM を Mr、translateM を Mt とすると、
Matrix.scaleM();
Matrix.rotateM();
Matrix.translateM();
は Ms * Mr * Mt * V と表現される。
Matrix.translateM();
Matrix.rotateM();
Matrix.scaleM();
は Mt * Mr * Ms * V と表現される。
貴方が意図している変換がどういうものかは知りませんが、
このように考えると、変換を組み合わせるべき順番が分ると思います。
サンクス どうも腑に落ちないんだが 内部で頂点の情報は最後に合成されるから、それまでは0に何をかけても0という解釈なのだろうか・・・?
>>347 内部は考えるなと言ったんだが・・・
内部の事で説明した方が分りやすいのなら、そうしようか。
実行時に Matrix.scaleM(); というコードの部分を処理した時、
ただちに各頂点に scaleM という座標変換が施される訳ではない。
モデルビュー変換行列というバッファが一つある。
この変換行列を使うように設定した後 glLoadIdentity 関数を呼ぶと、
この変換行列が単位行列に「設定」される。
一方、scaleM や rotateM、scaleM という関数が内部で
glScalef や glRotatef や glTranslatef という関数を呼ぶモノだとしたら、
これらの関数はそれぞれ先の変換行列に自身の行列を「乗算」する。
glLoadIdentity 関数は変換行列を「設定」する。
glScalef 関数などは変換行列に「乗算」する。
(乗算する方向は
>>346 から類推してくれ)
どちらの類の関数も変換行列のバッファに対して何かをする関数であって、
頂点座標ベクトルに対して何かをする関数ではない。
draw 系の関数が呼ばれて初めて変換行列と頂点座標ベクトルが乗算される。
行列計算は自前でやる方が圧倒的に楽だぞ
GLESを使うなら2以降にすれば、シェーダも自分で書くことになるから、 内部も見られて速攻で理解できる。
計算してglMultMatrixだな オブジェクト指向ならなおさら
オブジェクト指向ならglMultMatrixなんて使わずに、 自分で行列クラスを作って、 *とか/を一通りオーバーロードして、 行列やベクトルを直感的に演算できるようにするよ。 ついでに組み込みでSSEやNEON対応のコードを入れておく。 そのあたりが作り終わってからがようやくスタートラインだろう。
gl系の行列演算操作ってそういえばそんなに速度でないの?
そもそもボーンのフレームを出したりと事前の計算が必要なときに、全く役に立たない。 ただのテスト用であって、実用するようなものじゃない。
オペレータオーバーロードは便利だけどクソ遅い
生成されたコードを見てから言えよ。 オーバーロードと通常の関数に相違点なんて無い。 きちんと作れば、小規模ならインライン展開されて関数の呼び出しすら省略されたコードになるのに、 どこに重くなる要因があるのか、馬鹿の考えはさっぱり分からない。 組み込みと__m128を組み合わせると戻り値の128bitのデータをXMMレジスタから直接引き渡すようになったりするんだぞ。 不勉強で知ったかするのはやめておけ。
俺はgl系で済ましちゃうけどな>行列計算 速度が必要ってどんな時だ?
そういうことを書いてある書籍やサイトが少なくないからな
ESやったら手でやるしかなかった
速度か可読性か。 うちのようにアセンブラを読めない連中ばかりだと、SIMDが一切使えない。
アセンブラが読めなくても組み込み関数なら使えるはずだが、単に不勉強なだけだろう。
ベクトル系の拡張命令なんて、もはや新しい技術とは言えないレベルで枯れてきているのに、 10年以上前の知識にしがみついて、いったいどれだけ怠け者なんだよ。
陳腐化した技術しか誇れない化石だろ。 口も悪くなるさ。
自演乙
えっ
時代はどんどん流れているのにCPUの拡張命令どころか、シェーダを使ったことすらなく、 過去の遺物のような演算補助関数や固定機能しか使えない人間は、 少しは不勉強を恥じるべきだろうね。 使わないという選択はあっても、不勉強で使えないから選択すら出来ないというのはみっともない。
不勉強さん、職場でオナニーコード認められないの?
>>356 いまどき遅くは感じないけど無駄って発生しないのかね?
最適化について一切触れられてないんだけど?
保証されるものじゃないからね
出力されたアセンブラのソースを見ていない時点で、いい加減な内容。 コンパイラの最適化をなめすぎ。
今は右辺値参照使えるしな。
volatileを必要としないような設計ならな。
あまり甘えるのもどうかと思うが
オーバーロードで以下のようになるように作ると、 vector v1(1.0f,2.0f,3.0f,4.0f); vector v2(10.0f,20.0f,30.0f,40.0f); v1 = v1*v2; printf("%f,%f,%f,%f",v1.x,v1.y,v1.z,v1.w); SSEの組み込み乗算が計算済みにされて、printfの呼び出ししか残ってない。 movaps xmm0, XMMWORD PTR __xmm@2 movaps XMMWORD PTR _v1$[esp+16], xmm0 ; Line 44 fld DWORD PTR _v1$[esp+28] sub esp, 32 ; 00000020H fstp QWORD PTR [esp+24] fld DWORD PTR _v1$[esp+56] fstp QWORD PTR [esp+16] fld DWORD PTR _v1$[esp+52] fstp QWORD PTR [esp+8] fld DWORD PTR _v1$[esp+48] fstp QWORD PTR [esp] push OFFSET ??_C@_0M@JJJBFJKB@?$CFf?0?$CFf?0?$CFf?0?$CFf?$AA@ call DWORD PTR __imp__printf
ボクのパソコンではこうなったんだもん><
SSE引っ張り出して論点ずらしてるのにワロタ
最適化でオーバーロード云々関係なく、きちんと書けばインライン展開されるんだよ。 だから新しいオブジェクトを作って破棄なんて無駄なコードは生成されない。 staticを付けて、最初から計算済みにならないようにしても、 _wmain PROC ; COMDAT ; Line 39 push ebp mov ebp, esp and esp, -8 ; fffffff8H ; Line 40 mov eax, DWORD PTR ?$S1@?1??wmain@@9@4IA test al, 1 jne SHORT $LN17@wmain movaps xmm1, XMMWORD PTR __xmm@0 or eax, 1 mov DWORD PTR ?$S1@?1??wmain@@9@4IA, eax jmp SHORT $LN5@wmain $LN17@wmain:
movaps xmm1, XMMWORD PTR ?v1@?1??wmain@@9@4Uvector@@A $LN5@wmain: ; Line 41 test al, 2 jne SHORT $LN18@wmain movaps xmm0, XMMWORD PTR __xmm@1 or eax, 2 mov DWORD PTR ?$S1@?1??wmain@@9@4IA, eax movaps XMMWORD PTR ?v2@?1??wmain@@9@4Uvector@@A, xmm0 jmp SHORT $LN7@wmain $LN18@wmain: movaps xmm0, XMMWORD PTR ?v2@?1??wmain@@9@4Uvector@@A $LN7@wmain: ; Line 44 sub esp, 32 ; 00000020H mulps xmm0, xmm1 以下printfの呼び出し部分 これを見れば分かるが、ベクトルの乗算まで余計なcallも作られなければ、必要のないリソースも作られない。 これが最適化。
儂は68000しか読めん…
まともな開発じゃgoto同様、禁則項目だね。 basic_stringが、何故、char*に対するoperatorを使わずに、c_strなどという関数を定義しているか考えてみよう。
> char*に対するoperator ??
儂はgotoは少しは使うよ。
教科書を写すだけで、意味も分からないうちは軽々しく定義しちゃダメみたいだな。
ちょっと前の gcc なんかだとオーバーロードは微妙だった気がするなあ 今は知らん
この手の恐ろしさは、マルチスレッドで書いてみないと分からんだろう
複数コアでベクトル演算ユニットを共有しててSSE命令でストールするとかか? ねえわ
>>386 演算系で必要なオペレーターは*とか=だけで、
単体のoperatorに設定するようなものは無い。
必要なのは演算対象を明確にした物だけ。
まともにプログラムを組んで検証をせずに、
聞きかじった知識だけで語るからそうやってボロボロに間違うんだよ。
オーバーロードの最適化だって、自分でほんの少しキーをたたけば検証できる話だっただろう。
そんな簡単なことすらしないからいつまでたっても、間違った知識を抱えたままなんだよ。
いい加減スレチだから他所でやれよカスども
>>393 ぼくのパソコンではこうなったってのは検証とは言わない。
最適化のされ方なんて環境ひとつでいくらでも変わる。
ここはOpenGLのスレ、環境で変わるようなコードの話は他でやってよ
>>395 もちろんコンパイラ次第だ。
反論があるのなら、違う検証結果を出せばいいだけの話。
化石みたいなコンパイラでも探してこない限り結果は見えてるけどやってみれば?
Javaじゃ完全に害悪扱いだな 大規模開発で爆弾になるから
いつまでやってんだよ
オナニーが止まるまで
C++信者は本当に品がないな
煽りもガキっぽいし、一人よがりなコードしか書いたのことない学生クンだと思う。
ARM厨w
404 :
デフォルトの名無しさん :2012/07/26(木) 05:48:15.33
結局、コンパイラ次第とか どこぞで規格化でもされているのかと思いきや 馬鹿がニッチな俺様コードを普遍的であるかのように語ってたってだけの話か
結局、オーバーロードでオーバーヘッドが発生するコンパイラは見つからなかっただろう。 まあ検証するような誠実さなんて持ち合わせていない無い怠け者だろうから、探してもいないんだろうけど。 これに懲りたら、聞きかじった知識じゃなく、自分で検証する癖を身につけろ。
検証結果を出さなかったら、今もオーバーヘッド云々を言い続けてたんだろうなあ。 そう言い続けなくなっただけでも、少しはマシになったと言うことか。
マシも何もスレチ続けてる時点でどっちも糞
すぐ学生認定するのは頭の悪い証拠
>>409 演算子オーバーロードで遅くなるとしている記事だけが見つかっているわけじゃないね。
つーか、私にはRubyが遅いだとか、後置インクリメント演算子が遅いとか、
そう言った的外れな記事しか見つからないんだけど。
都合の悪い記事は全部的外れかよw
いや、腐るほど見つかると言うのなら検索キーワードだけじゃなくて 実際に見つかった記事を提示すればいいじゃん。 それをしないから突っ込まれるって事も判らないの?
>>412 きっと>409は「演算子」「オーバーロード」「遅くなる」って検索して引っ掛かったものは
全て該当記事だと思いたかったんだろうよ。
>>414 >>415 えーと、その二例のどこが「演算子オーバーロードは遅くなる」例?
つーか、いいからエアコンを28℃に設定して昼寝しろ。
自分が書いたことをもう忘れたのか? それとも無かったことにしたいだけか お前は今、分かってないことを自白したんだよ
インクリメントの順序の問題は別にオーバーロードで遅くなるのとは関係ない。 どちらにせよ、結局は不必要な処理はコンパイラが撤去しちゃんだけどね。 インラインで展開されるものは、戻り値が必要なければ生成されないんだよ。 無駄な処理を生成するコンパイラがどこにあるのか、 未だに答えていないんだけど、そうやって逃げ回るんだよね。 知ったかをした人間の末路は毎度同じなので、珍しくもないけど。
インライン展開って保障されないでしょ。
inline付ければ全部展開されるとでも思ってんじゃね
逆に、inlineつけないとインライン展開されないと思っていそうな抜策もいそうだけど。
Javaが如何に優れているかって話だな。
ふーん、そうなんだー。
お前らここOpenGLのスレなんだけど?
VCしかいじって無さそうやな
ニートタイムに張りついてんのか。
gccの結果 printfを呼ぶまでに、オーバーロード部分の演算が全て展開されるのは変わらず。 main: .LFB537: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 cmpb $0, _ZGVZ4mainE2v1(%rip) je .L5 .L2: cmpb $0, _ZGVZ4mainE2v2(%rip) je .L6 .L3: movaps _ZZ4mainE2v1(%rip), %xmm0 movl $.LC2, %edi movl $4, %eax mulps _ZZ4mainE2v2(%rip), %xmm0 movaps %xmm0, _ZZ4mainE2v1(%rip) movss _ZZ4mainE2v1(%rip), %xmm0 movss _ZZ4mainE2v1+12(%rip), %xmm3 movss _ZZ4mainE2v1+8(%rip), %xmm2 movss _ZZ4mainE2v1+4(%rip), %xmm1 cvtps2pd %xmm0, %xmm0 cvtps2pd %xmm3, %xmm3 cvtps2pd %xmm2, %xmm2 cvtps2pd %xmm1, %xmm1 call printf
これだけスレ違いだから止めてくれって言ってるのに。 コンパイラ屋ってほんと性格悪いよな
オーバーロードの中身を書いてないし、どうせ都合のいいコードしか使ってない。
マジでいつまでこの話やんの? やめろって何度言われてるかわかってんの? 脳がイカれてんのか?
機械語なら理解できます><
インライン展開されまくってコードサイズが大きくなってキャッシュミスが増えて遅くなる可能性は無視でしょうか?
まだ続けるんだ
>>432 オーバーヘッドがあるかどうか生成されたコードを見て検証する
遅くなるかどうかベンチマークをとって検証する。
そんな当たり前のことすらやろうとせずに、
聞きかじっただけの可能性云々で思考停止している時点で、それはただの怠け者。
まだまだ続けるよー!
>>434 可能性を無視するんですか?
どうして検証しようとしないのですか?
あなたには期待していたのに失望しました
結局、オーバーロードでパフォーマンスが落ちるコンパイラは見つからないの? 古いのを探せば「可能性」はあるかもしれないんだから、もう少し必死になれ。
一体誰と誰が戦っているんだ・・
スレ違いだっていってんだろ スレ違いだっていってんだろ スレ違いだっていってんだろ スレ違いだっていってんだろ スレ違いだっていってんだろ スレ違いだっていってんだろ スレ違いだっていってんだろ スレ違いだっていってんだろ いつまで話続けんだよ他所でやれ
>>434 ぼくのパソコンでこうなった論は分かったから、質問に答えなよ
ム板もID表示ほしいな。 キチガイ沸いた時困る。
>>441 オーバーロードでパフォーマンスが落ちるコンパイラを出して解決したら、検証結果を張るよ。
まあ、次もCPUによって違うとか言い出すんだろうけど。
>ぼくのパソコンでこうなった論は分かったから、質問に答えなよ これは素直じゃ無いだけで、 あなた様の言っていることが正しいのは分かりました。 最適化が出来ないコンパイラは見つかりません。 愚かな私めにキャッシュミスについてお教えいただけないでしょうか? と言っているんだから、教えてやれよ。
オーバーロードしたコードを貼れよ
ほれ struct vector{ union{__m128 vect;struct{float x,y,z,w;};}; vector(){} vector(float x,float y,float z,float w) {vect = _mm_set_ps(w,z,y,x);} inline vector& operator=(const vector& v) {vect = v.vect;return *this;} inline vector operator*(const vector& v) const {vector result;result.vect = _mm_mul_ps(vect,v.vect); return result;}};
普通、開発はデバッグモードでやるものでしょうに。
>>446 検証自体がいい加減なことが分かった
ループで百万回ほど回してみ
実測で倍くらいになるから
>>446 そういう抽象的な答えが返ってくると思ってたよ。
何と比較してとか絶対に答えないんだろうなあ。
ニート達の夜は明けそうにもないな。
>>448 実測で倍速いコードを張ってみてといっても、
絶対に話をそらして逃げ回るんだろうし。
どうすればいいのさ。
>>449 ありゃ、関数の書き方が解らないのか
参照渡しだよ
for文の使い方は分かるよな?
構造体のタグ名にvectorとか付けてる時点で終わっとるな。
ていうかそんなんより3Dグラフィックスの計算でよく使う 4x4行列の掛け算とか逆行列の計算とか4x4行列によるベクトルの変換とかの速度のほうが重要ですよね
>>453 事前に予測したとおり、絶対にコードを出さないよね。
そのままごまかして逃げ回るお決まりの行動パターンだろう。
>>455 もちろん行列の乗算が一番重要だよ。
ベクトル乗算の他にスカラが入るから、ベクトルの乗算のみのようにシンプルには書けないけど。
>>456 同じ構造体を参照渡しで計算して値を返す関数を書くだけのことが、そんなに難しいのかね?
君が丸写ししている本のタイトルを挙げてもらった方が早そうだな
とりあえずこれから先も議論する奴は名前付けてくれ
ちなみに100万回ループさせると、以下のコードになるだよね。 これ以上、どうしろというんだろう? mov eax, 1000000 ; 000f4240H npad 1 $LL3@wmain: dec eax ; Line 35 movaps xmm2, xmm1 mulps xmm0, xmm2 jne SHORT $LL3@wmain
>>458 関数を書くのはいいけど
>>460 のコード以上の結果を残すのが不可能なんだよ。
直接アセンブラを書いても、あれ以上どうにもならない。
毎回の演算結果を棄ててループするとかお前ふざけてるの?
この話題ここで続けるならコテつけろや、うっとおしいから。 それとも頭悪いやつは日本語も理解できないの?
>>462 演算結果ならxmm0に入ってるけど、いったい何を言っているんだ?
>>460 アセンブラの出力しか見ていないようだが、ちゃんと計測したか?
/arch:SSE2で1000msecほど差が出るぞ
自治スレなくなったからカスを押しつける先がない・・・なければないで面倒なもんだな
>>465 実行に1秒かからないプログラムにどうやって1秒差を付けるんだよ?
嘘をつくにしても、もう少しわかりにくい値にすればいいのに。
はいはい、ぼくのパソコンでは1秒かからないんですね 書いたら書いたで嘘扱いw やっぱり適当なこと書いて自己顕示したいだけのカスでした
どっちも中途半端な検証結果しか書かないし不毛 もう止めろスレ違いだ
>>468 信じてあげるから実験したCPUを書いてみて。
ちなみに100MHzのCPUでも1秒かからないので、
SSEに対応していて遙かにロークロックな製品を探してくるといいよ。
あったら素直に驚くから。
オーバーロードの話がしたいのか、最適化の話がしたいのかよく判らないけれど どっちも該当するスレがあるので、そちらでやっていただけませんかね。 畑違いのスレじゃないと、お互い誤魔化しきれない感じですか? 平日の昼間から張りついているようなので素性はお察しですけど。
>>470 もしかして、プログラムの実測がCPUだけで決まると思ってる?w
>>472 少年漫画的急展開だね。
ネタでやっているのは分かったから、そろそろ終わりにしよう。
結論は書いていけよ 結局オペレータオーバーロードは遅いの?
>>474 それを人に訊く前に自分で調べろと言うことでは?
>>475 わかった、それが結論ならそうする
スレチではあったが興味ある話ではあったからな
もっとも、あんまりちゃんと追いかける気はなかったが
ここに至って結論が分からないなら、自分で調べても無駄な気がする。
>>476 は、そうする、とは言うが、実際に自分で調べる気は全くないと思う。
あんまりちゃんと追いかける気がなかったのなら、
そもそも何をどう調べればいいのか自分で検討することもできない。
折れたと思いきや、お子様のご高説はまだまだ続くようだ。
必要だと思えば自分で調べるだろ
C++スレとかに移動してやれ
ここまで俺の自作自演
もう全員出入り禁止
こうしてOpenGLは衰退するのであった
スレ違いの話題に乗っ取られてた時点で何を今更
シェーダアセンブラか懐かしい
俺のPC(EeePC)では未だに現役だよ!
PlaySound() のヘルプ読んでから質問しろ。 SND_ASYNC
>>490 あぁorz
解決しました。ありがとうございました。
なんでwglとかQtとかじゃなくglutで本格的にコード組もうとする人多いの? 細かいマルチメディア制御のできない体験用のおもちゃだろアレ。
サンプルコードに GLUT 使い続けてて、慣れてるからだろう。
細かいマルチメディア制御ができないってどういう事なん?
タイトルバー掴まれてもアニメーション止まらないようにしたいんだがどうすればいいんだ?
glutPostRedisplay();を使う
>>494 wglとか使えば、WinAPIのウィンドウにOpenGLの描画領域埋め込んでるだけなんで
全てのイベントが拾えるし、HWNDやHDC、イベント連携を必要とするマルチメディア系APIが全て使える。
ボタンや標準コントロール全て使えるのも便利だな ゲームでも無けりゃ自分でコントロールなんてわざわざ作ってられんからな。
GLUTでもできるし。
EnumWindows使ってハンドル取得とかキャプチャー系のAPI使ってハンドル探すとか そういう方法しか無いだろ。ハンドル手に入った所でウィンドウのコントロールとして OpenGLの領域を組み込めるわけでもない。
入門者向けだとGLUT使った資料が多いだろうし、GLUT入門レベルには充分だがそれ以上のことをするにはこれを使え!とか書いてある日本語の情報が無いからじゃないか OpenGLならまずQt、みたいな流れを流行らせることが出来ればいいかもしれない
駄目だね OPENGLプログラミングは簡単で楽しく出来るって事をGLUTで体験しなければならない それ以上の事がしたくなったら初めてwglとかに手を出せばいい
たいしたGUIはいらないし、macでも同じコード動かしたいし
>>502 本格的にやるならglut卒業しろって話だろ
入門時の話はしてない
glutで十分ならずっとglutでも何も問題ない glutと同じものを作る意味もないし
問題あるのに無理やりglutで何とか出来ませんかねって聞いてるから 卒業しろっていわれるんだろ
そんな個人的なグチをここで言われても
このスレの流れから出た話だろ
>>495 windowsでだけど描画を別スレッドにしてる。glutじゃできないかも
別に画期的なことしてないので万年glutで十分
ステマはqtスレに帰れ。
これほど酷いステマの使われ方を見たのは初めてだ
そうだよな、これはアンチQt派によるネガキャン
たかがマ勢がいきがっておるのぅ...
だが四天王の中では最弱
WindowsならC# + OpenTKで簡単に標準のGUIアプリケーションと組み合わせられるな。 Macだと元々CocoaアプリにはNSOpenGLViewがあるし。
でもマルチプラットフォームを考えるとglutかQtですかね
GLUTは単一スレッドでマルチウィンドウ使えるし、研究系とか自社内ツールとかなら十分 Qtに合ってる内容だとかチーム全体がQt好きとかなら選択すればいいけど、なんでもかんでも気軽に導入ってわけにもいかんでしょ
GUI必要ないからね
QtでOpenGL使うほうが使い捨てでも楽だろ ポトペタしたら描画コード書くだけだぞ
GUIしたいだけならC#でOpenGLすりゃいいのに
C#で組むメリットが判らんQtに比べ何がいいんだ? MSの奴隷専用だろ
なぜMSが関係あるんだ?
Qtうぜー。描画以外のとこなんて何でも好きにすりゃいいだろ。
>>526 MS以外の環境で開発されてないだろ
Linuxでもmonoで動くけどWindowsの輸入品ばかりで
Linux上で新規開発されたソースなんて配布されてない
だからメタアルゴリズムに精を出してマを駆逐しろと言っておろうに・・・
Windowsの輸入品?
QtにWindowsの輸入はありえないからね
C#でOpenGL使えるのか? System.WIndowsなしで
なぜなしなんだ?
OpenGL の外の話題は余所でやれよ
なぜこたえられないのか?
>>530 Visual Studioありきだからな
他のOSでC#をうまく使える環境がない
C#使う奴にDirectXよりOpenGLがいいってやつが居るのか?
それがQt最高C#はカスという理屈ですか?
なんでGUIツールキットとプログラミング言語を比べるバカが現れるのか
C#でglut最高だNE!
楽するためにGlut使う。 ただそれだけだ。
glutはファイル選択ダイアログが使えればなあ
glutはどうしてぐるっとっていうの?
>>543 windowsならGetOpenFileNameで
ぐらぐらしているから
普通のglutのバグでどうにもならなくなってからfreeglutを使ってる。 当たり前だが、ちゃんと動くのは素晴らしい。
glutのバグってどういうバグ?
今GLUTって言ったらfreeglutが普通に使われてるんじゃないの
普通って?
SDLでいいんじゃないの?????
普通のってのはNate Robins氏が公開しているglutの事。 64bit環境用にビルドしたDLLを使ったらglutTimerFuncが動作しなかった。
本家は最終更新日が10年以上前だからなー
>>552 やってみたけど64bit 32bit関係なしにsrcからビルドすると正しく動かないみたい
binの配布の方は動くんだけど、ソースが違うのかな(コンパイラのせいかも)
win32_util.cのgettimeofdayあたりが原因っぽい
これ使ってるプログラムも保守してるので将来64bit化で嵌らずすんで助かったかも。thx info
>>554 流石に配布されている32bitのほうはビルドせずに使ってたから、それもsrcからビルドすると動かないの気付かんかった。
OpenGL勉強中の素人が嵌った点でもお役に立てたようでなにより。
C#でもOpenGL使うだろ。このスレ的に言って
だから敵対ベンダーの話はよそでやれ
C#とOpenGL、悪くない選択だと思うが?
どやってC#でやるん? 一旦CLI使って関数をエクスポートしてC#から利用?
ググりゃ一杯でてくんだろ
っテンプレ
OpenGLって別スレッドのオフスクリーンで描画して BitBlt転送で表示とか出来んのかのぅ
>>562 OpenGL用スレッドを作って
フレームバッファオブジェクトにレンダリングして、その内容をGPUのメモリからメインメモリへ転送する事はできる。
後はそのメモリの内容を表示するとかすればいいんだけど何故そんな事したいの?
フレームバッファオブジェクトねぇ ありがと
死ねよお前w
何が不満なんだ・・・
欲求不満なのね
おまいらはOpenGL4.3とかOpenGLES3.0については何か語らないの?
OpenGL 4.3とES 3.0出たな。 ES 3.0はやっとかって感じ。 詳細は読んでいないけど、しかしcompute shaderとはな。同じKhronosなのにOpenCLとかぶるんじゃないか。
なんで、いつもDirectXの後追いなんだろ。 たまにはOpenGLの方から新技術を出して、DirectXに真似させればいいのに。
ComputeShaderは確かにOpenCLと被るけど、ポストプロセス処理するのにわざわざOpenCLを別に使わないといけないのはめんどくせー!というのに応えるものっぽい 確かに使いやすそうだと思う 4.3はもはやそれほど機能追加無いかと思ってたけど意外に新機能多いね
NvidiaはOpenGLに力入れてるからなぁ GLUTの作者がNvidiaにいるらしいぞ
954 名前:デフォルトの名無しさん [sage]: 2012/08/07(火) 11:20:40.11 OpenGLスレにわざわざ出張してステマする奴らに言われたくないだろうな。
じゃあQuadro安くしてくれよ!!
シェーダーを書けばもっと大量に増やせる
>>576 大抵8なんじゃないかな
それに16じゃ30以下だから足りないんじゃね?
4回合成が2回になって高速化みたいな話かななら
素直にFragmentShader使うばいいかと
8個って1.1辺りの制限か?
実はオフラインのライトマップで十分とかいうオチはないよな
様々なご回答をいただきありがとうございます.
理解が及ばない点があり,申し訳ないのですがいくつか質問させて下さい.
>>577 ,578
シェーダーというのはGLSLや.Cgでしょうか.
これまで,OpenGLのみしか扱っていなかったので,シェーダー言語についての知識がないのですが,
これらの,拡張言語と組み合わせることで,複数光源が可能になるという理解でよいでしょうか.
また,この場合は,複数回のレンダリングではなく,一度に30個の光源を定義可能ということでしょうか.
>>579 現在のバージョンでは,光源数に制約はないのでしょうか.
バージョンごとの差異がよくわからず,以前利用したことのあった2.x系を利用しています.
>>580 申し訳ないです.ライトマップについての理解が乏しいのですが
テクスチャマッピングのお話でよいでしょうか.
今回想定しているモデルでは,30個の光源に設定した個別の明るさや色を
ある程度忠実に再現したいと考えておりまして
この点につきまして,テクスチャマッピングでは困難であると考えていますが
理解が誤っているでしょうか.
パラメタ制御したいならどのみちシェーダーだね
日本語でおk
>>581 30個のライトを同時にレンダリングできる。いまやOpenGLを扱うならシェーダーは必須
研究職でプログラミングは素人でお金が沢山あるなら、ぜひ高性能なプログラマの雇用を
自前でアルファブレンドを行いたいのですが 点を打つ前の色を取得することは可能ですか?
>>586 フレームバッファを直接参照することはできないので
ブレンド前画像をテクスチャにしとく
g_FragColor = α*Color + (1-α)*g_FragColor
参照できるのか出来ないのか
前スレの32あたりでも話題になってそんときはできないっていう話になってる ブレンドしたい画像を独立にテクスチャにレンダリングして最後に合成描画が簡単なような
詳しい事は知らんが、OpenGL4.3でパイプライン上ではフラグメントシェーダの後にコンピュートシェーダが追加されて
アルファブレンディングがプログラマブルになったらしい。
詳しくは
>>583 を読んでくれ
おまいらPOV-rayは使わないの
リアルタイムレンダリングできるのなら使うが?
え?今時のハードならレイトレース程度なら余裕じゃね?
>>592 コンピュートシェーダはフラグメントシェーダの後じゃなくて、レンダリングパイプラインに組み込まれずに単体で動くもの
通常の描画をせずにシェーダだけ動かしたいという時に使うものなので、ブレンディングがプログラマブルになったりはしてないよ
コンピュートシェーダでブレンドするにしても結局2枚以上のテクスチャに一旦描画してそれらをシェーダでブレンドするという形になるので、
フラグメントシェーダでやるのとかわらない。というかフラグメントシェーダでやった方が楽だろうな
コンピュートシェーダーってVertex Transform Feedbackの代わりに使える?
>>595 レイトレじゃリアルにならんだろ。
パストレとかその系統じゃないと。で、それらだとまだまだ計算速度足りない。
>>598 >>595 の言うレイトレースって、たぶん
パストレとかその系統も含めた大義的な意味だと思うぞ。
要するに、ピクセル毎に何らかの光線を追跡して絵を作る工程全般のことかと。
「ピクセル毎に何らかの光線を追跡して絵を作る工程全般」の リアルタイムレンダリング が余裕 って言ってるとしたら相当おかしいだろ
>>600 求める画素数と FPS による。
さすがにフルHDで60FPSを求めると、リアルタイムレンダリングが余裕とは思えんが。
レイトレースがリアルタイムでできる訳ないだろ
"real-time raytracing" でググるといくつか出てくる
すげぇな 水面とかもリアルタイムレイトレースでできるのか おそれいった
しかし、Haskell でもここまで real-time raytracing できるとはすごいな。 repa という Haskell のライブラリが C で書かれた外部ライブラリの単なるラッパーではなく、 純粋に 100% Haskell で書かれた配列表現ライブラリであるだけに、余計に驚いた。
CGなんて騙してなんぼなんだから バカ正直なレイトレースなんて絶対流行らないだろ 物理的に間違ってても綺麗だったらおkな世界なんだし
その綺麗な絵を作る目的でレイトレーシングを使う場合もある。 例えば水面下のコースティクスや、透明度が複雑に変化する媒体を通る光などは、 素直にレイトレーシングを試みた方が簡単に綺麗な絵ができる。 (この場合、フォトンマップの功績が大きいが) これらをアニメーションさせるなら、なおさらレイトレーシングの方が騙しやすい。 Zバッファを用いた大量のポリゴンなどで表現しようとすると、 確かに処理速度は段違いに速いが、なかなか騙すが難しい。
GLUIってC++だからDLLにできない(しにくい)のにLGPLってふざけてるよな
某同人STGはネタでレイトレーシングモード搭載しているな MMX/SSEメインでOpenGL関係ないけど
>>604 水面だからこそリアルタイムにできる。鏡面反射・透過だからな。
拡散面だとあらゆる方向にレイを飛ばしまくらないと計算できないし。
GIなら毎フレーム再計算しなくても効果あると思うがな 特に拡散面であれば オフラインで十分と言えばそれまでだが Parthenonがライブラリとして使えればいいのに
ディスプレイリストってどういうとき使うの?
必要になったとき。
もうねーよ
いつまでCompatibilityProfileが使えるか賭けよう
OpenGLなどリアルタイムグラフィックスで現実のカメラというか距離感を模倣する方法ってありますか? 例えばOpenGLなどの標準の透視投影変換では、視点に対して正面を向いている長方形のそれぞれの平行な線の組は画面内のどこまで行っても平行ですよね。 しかし現実では視界の端のほうが距離が遠くなるので平行な線の幅が狭まって見えるはずです。 ぱっと想像した方法としては、画面をいくつかのグリッドに区切って、それぞれ対応する方向を「正面」に見てレンダリングした画像をつなぎ合わせる、があります。 何かスマートな方法はありますか? よろしくお願いします。
頂点シェーダで距離に応じて座標を調整すれば?
>>618 別にグリッドに区切らなくても一度レンダリングしてからそれを湾曲した面にテクスチャとして張ればよさそう
頂点シェーダーだと左端から右端への直線は正面に頂点が無いとまっすぐになっちゃう
確かに頂点シェーダーもありますが、事前分割が必要という問題点はありますね。 湾曲面に張りつけですか。確かにそれでいけそうな気もしますね。
ジオメトリシェーダで分割しまくれ.
前に仕事で実装したときは 普通にピクセルシェーダで座標オフセットしてたな。 曰くポスエフェ。
魚眼レンズか
>>618 > しかし現実では視界の端のほうが距離が遠くなるので平行な線の幅が狭まって見えるはずです。
それを言ったら、現実のカメラにはレンズによる歪みがある。
端の方が距離が遠くなることで起こる歪みよりも、
レンズによる歪みの方がもっと顕著だと思うが。
>>618 透視変換の時に、z 値で割るのではなく頂点の距離で割る。
>>626 だからそれじゃダメだからポストエフェクトでやればって話になってるのだが
628 :
デフォルトの名無しさん :2012/08/24(金) 12:24:23.74
フラミンゴ2羽犠牲「申し訳ない」 旭川市長陳謝 2012/8/23 19:43
http://www.nikkei.com/article/DGXNASDG2303P_T20C12A8CC1000/ 北海道旭川市の西川将人市長は23日の記者会見で、市が運営する旭山動物園から逃げた
ヨーロッパフラミンゴの捕獲作業で、フラミンゴをおびき寄せるために用意したおとり1羽が死に、
1羽が行方不明になったことを陳謝した。
市長は「フラミンゴは1羽25万〜30万円。市民に損害を与えて申し訳ない。
犠牲になったフラミンゴにも申し訳ないと思っている」と述べた。
2羽のフラミンゴはキタキツネに襲われたとみられ、動物園には電話で苦情が約50件寄せられた。
市長は「捕獲して戻すことが重要な役割だ」として捕獲作業を継続する方針を示した。
同時に「寒くなれば南に飛んでしまう可能性があるので、なるべく早く連れ戻したい」と述べた。
紋別市・コムケ湖で今月17〜18日に行われた動物園による捕獲作業では、逃げたフラミンゴの捕獲に失敗し、
おとりで用意した4羽のうち2羽を失った。園は既に、おとりを使った捕獲の中止を決めている。〔共同〕
629 :
デフォルトの名無しさん :2012/08/24(金) 16:59:02.54
本を参考にしながらopenGLを勉強しようと思っていますが glewのインストールがうまくいきません。 本のサンプルのビルド自体はできるのですが 「コンピュータにglew32.dllがないためプログラムを開始できません。」 とシステムエラーをはいてしまいます。 本を参考にしながら Program Files(x86)\Micro...10.0\VC\include にglew.h Program Files(x86)\Micro...10.0\VC\lib にglew32.lib,glew32s.lib windows\system32 にglew32.dll を入れてます。 同じやり方でglutもインストールしたのですがこちらは問題ないみたいです。 「追加の依存ファイル」にglew32.lib、 環境変数のpathには %SystemRoot%\system32; を確認しています。 他に確認する項目があれば教えてもらえると助かります。 環境は windows7 64bit VC++ 10.0 参考にしている本は「openGL+GLSLによる3D-CGアニメーション」です よろしくお願いします
glew.dllを放り込む場所が違うんでない? system32じゃなくて、SystemWow6432(失念)とかそんな名前のフォルダに入れないとダメとか?
SysWOW64か
>>629 pathに%SystemRoot%\system32があるならそこにglew32.dllを入れる
たいていはc:\Windows\System32だけど
633 :
629 :2012/08/24(金) 17:50:20.70
>>630 おー、ありがとうございます。エラーを吐かなくなりました。
windows¥SysWOW64
にglew32.dllを入れるのが正解みたいです。
助かりました。
634 :
629 :2012/08/24(金) 17:52:12.52
>>631-632 ありがとうございます。
system32だとなぜか認識してくれないみたいでした。glutは認識してるんですが。
>>634 理由は64bitWindowsでは32bitアプリが参照するディレクトリはSysWow64で、
64bitアプリはSystem32になるからです。
64bitで開発しないならDLLは基本的に32bit用を使って、インストールするディレクトリ
はSysWow64に。
System32 と SysWow64 って、名前が紛らわしいよな
スタティックリンクすりゃdllいらず。
dllは実行ファイルと同じ場所に置く方が安心じゃないか
>>638 同じDLLを使う実行ファイルが複数あったら、
それぞれのフォルダにその同じDLLをコピーするのか?
>>638 配布するならそれが正しいだろうね。
開発時ならvcxprojと同じ階層とかビルド時にexeができる所とかに置くのもありかな。
641 :
デフォルトの名無しさん :2012/08/24(金) 19:25:49.03
普通は/usr/local/bin的なディレクトリを作ってそこにまとめて置いといてパス通すよな
>>637 スタティックリンクだと自分のコードに問題なくても、リンクしたlibに問題あると全部ビルドし直しになるからなぁ。
サイドバイサイドとかいう糞仕様には誰も触れないのね
644 :
629 :2012/08/24(金) 20:02:33.73
>>635 ああ、そういう仕組みなんですか。
ありがとうございます
GTX 580 から GTX 680 に変えたら、glGetTexImage が激しく遅くなってた。 GTX 280 から GTX 480 のときは、glReadPixels が3倍ほど遅くされたが、 今度はこれかよ。
上げられてもいないコードの誤りを指摘しろと。
private GLSurfaceView glSurfaceView = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); glSurfaceView = new GLSurfaceView(this); glSurfaceView.setEGLConfigChooser(true); glSurfaceView.setRenderer(new GLRenderSample1()); setContentView(glSurfaceView); } class GLRenderSample1 implements Renderer { float aspect = 0.0f; float zPosition = 110f; int size = 100; //格子サイズ public void onSurfaceCreated(GL10 gl, EGLConfig config) { } public void onSurfaceChanged(GL10 gl, int width, int height) { aspect = (float) width / (float) height; gl.glViewport(0, 0, width, height); } public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glColor4f(1.0f, 0, 0, 1.0f); ここでfloat配列 vertices に頂点座標を入れる
{ FloatBuffer fb = ByteBuffer.allocateDirect(vertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); fb.put(vertices); fb.position(0); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fb); } //! カメラ転送 { //! 呼び出さなかった場合の動作を考える gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); //! 転送順番に注意する GLU.gluPerspective(gl, 90.0f, aspect, 0.001f, 100.0f); // GLU.gluLookAt(gl, zPosition / 2, -zPosition, zPosition, 0, 0, 0.0f, 0.0f, 1.0f, 0.0f); GLU.gluLookAt(gl, 0, 20, zp, 0, 0, 0.0f, 0.0f, 1.0f, 0.0f); //! 標的に近づける zp -= 1f; } //! 描画 gl.glDrawArrays(GL10.GL_LINES, 0, (8*size)+4); } }
650 :
二つ目 :2012/08/28(火) 01:46:42.60
class GLRenderSample2 implements Renderer { float aspect = 0.0f; float zp = 600f; int posBufferObject = 0; int size = 1000; public void onSurfaceCreated(GL10 gl, EGLConfig arg1) { } public void onSurfaceChanged(GL10 gl, int w, int h) { aspect = (float) w / (float) h; gl.glViewport(0, 0, w, h); ここでfloat配列 vertices に頂点座標を入れる ByteBuffer bb = ByteBuffer.allocateDirect(vertices.length * 4); bb.order(ByteOrder.nativeOrder()); FloatBuffer posBuffer = bb.asFloatBuffer(); posBuffer.put(vertices); posBuffer.position(0);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //! 頂点オブジェクト作成 { GL11 gl11 = (GL11) gl; int[] buffers = new int[1]; gl11.glGenBuffers(1, buffers, 0); posBufferObject = buffers[0]; gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, posBufferObject); gl11.glBufferData(GL11.GL_ARRAY_BUFFER, posBuffer.capacity() * 4, posBuffer, GL11.GL_STATIC_DRAW); gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0); gl11.glTranslatef(0, 0, 0.1f); gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0); } } public void onDrawFrame(GL10 gl) { gl.glColor4f(1.0f, 0, 0, 0.2f); //! カメラ転送 { //! 呼び出さなかった場合の動作を考える gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); //! 転送順番に注意する GLU.gluPerspective(gl, 90.0f, aspect, 0.01f, 1000.0f); GLU.gluLookAt(gl, 0, 23.0f, zp, 0, 0, 0.0f, 0.0f, 1.0f, 0.0f); zp -= 5f; } gl.glDrawArrays(GL10.GL_LINES, 0, (8*size)+4); } }
652 :
646 :2012/08/28(火) 01:57:12.40
二つ目はonSurfaceChanged で VertexBufferObject へ転送しています。 一つ目のコードの変数zPosition と zp は同じものです。ここにコピペするとき間違えました。
そのカオスなインデントはなんなの
>>653 すいません。Eclipse上ではインデントされてます。
double bufferingしてるかどうか。 GLU.gluPerspective(gl, 90.0f, aspect, 0.001f, 100.0f); でnearの距離が近すぎるような気がする。 nearの値が小さ過ぎるとまずい。 glBufferData, glDrawArrays, 配列の初期化で データが正しく設定されているか確認する。 Depthテストを有効してないのなら, ラインの描画だけなら Depth bufferをクリアしなくてもいいけど・・・。
>>655 点滅する事も無くちゃんと動くようになりました。
onSurfaceChangedの中で配列の生成、初期化をしてるのが駄目だったみたい。データは問題なかった。
アルファブレンドを有効にしたら、綺麗になりました。
遠くの方の線が重なって塗り潰したようになる症状も大分緩和されたけど、
もっと綺麗になる様にしたいのでdouble buffering を調べてみます。
ドライバの設定で anti alias を有効にすると綺麗になるよ。 black hole 風にするなら、blend func を (ONE, ONE) に。 projection matrix に gluLookAt してるのがなんとなく気持ちわるい。
よくOpenGLは右手系って説明を見ますが 少なくともGLSLレベルから見たら右手左手関係ないって理解であってますでしょうか。
行列計算全部自前でやるならGLSLどころか互換プロファイルでも左手系を採用するのは可能じゃね それに正規化デバイス座標って左手系じゃなかったっけ
これまで適当にしか使ったことがなくて 今回新たにES2.0ベースでコードを書いてたのですが デフォルトだとデプステストがGL_LESSらしく左手系に見えて混乱してます。 カメラのユーティリティもないので実装のためにOpenGLの参考資料とか見だすとますます・・・
projection matrixかlook at matrixの実装が本家と違うんじゃない?
そう思ってカメラを外して単純に頂点をそのままgl_Positionに渡してたら むしろ左手系としてみたほうが素直に見えてきたんで・・・
さらにテストしたかったのがキューブマッピングで テクスチャのバイト並びからテクスチャ座標系まで考えると わけが分からなくなってしまってしまいました。
projection matrix含めての右手座標系なんじゃない? ただあくまでそれはユーザーによる頂点の与え方が右手系になるためであって、projection * modelview * vertices後の空間は奥のほうがz値が大きいんじゃなかったっけ。
明確に設定していないデフォルト値は信用しない方が無難。
結局ただの数値だってことで理解してきたんですが ・正規化デバイス座標は実際に描画に影響するからこの座標系でx,y,zが-1〜1でなければならない ・普通のウインドウ座標ではこのときのx,yは(-1,-1)が左下(1,1)が右上(これはOpenGLの管轄外?) ・glDepthFuncの初期値はGL_LESS(OpenGL仕様では確認しました) この事実を考えると、ウインドウで見たときに手前がかかれて欲しいと考えると 正のX軸方向は右 正のY軸方向は上 正のZ軸方向は奥 となって左手系に見えてしまいます。
>>666 その認識の元で、色々なオブジェクトを色々座標変換してレンダリングしてみるのが良い。
指定したパラメータで意図したようにレンダリングされていれば、それで全く問題ない。
もしおかしな結果になったら、何故なのかを考えれば良いし、
その結果と疑問をここで質問すれば良い。
>>666 どういう実装になっているかはわからんけど、標準と似たような実装と仮定して
left -1、right 1、top 1、bottom -1、near面1、far面100のprojection matrix、
視点(0, 0, 3)、注視点(0, 0, 0)、上向きベクトル(0, 1, 0)のLookAt変換で
zが0の左下(-1, -1) - 右上(1, 1)の青色の矩形と、zが-1で赤色の矩形、どっちが前に見える?
もちろんDepthFuncはデフォルトで。
青色が手前なら間違ってないと思うけど。
>>668 ES2.0が前提の話なのに、
>LookAt変換
アホか?
固定機能しか使ったことが無いのなら黙っていれば良いのに。
>>669 だから「標準と似たような実装」っていってるだろうが。アホはお前だ。
なんでこの手のスレはいつも 質問者そっちのけで 回答者同士が争うんだろうなw
OpenGLの仕様に 7. OpenGL does not force left- or right-handedness on any of its coordinates systems. ってあるのは知ってたんですけど手抜いて日本語サイト中心に検索してると あまりこの手の話に説得力あるサイトがないんですよね。 とくにキューブマップでさらにXYZからテクスチャひっぱるとカオスになってしまって。
>>668 勉強のためにやってみましたが青色が手前でした。
実際には3Dでやってたときは
>>1 にあるサイトのcameraMatrixを使ってましたが
perspectiveMatrixを使ってみました。
これも結局シェーダーで自前でいじるのであれですが
一般的な動作の参考になりました。ありがとうございます。
glShaderSourceでソースを指定するときって SJISかUnicodeとかの指定ありますか? 仕様書には何も書いてない気がするのですが・・・
日本語を使う必要なんて無いんだから気にするな
GLSL 3.2くらいからUTF-8になった…はず
Unicodeて
glutで手っ取り早くパラメータGUIみたいなの作る方法ありますかね・・・? rendermonkyのパラメータいじるあれっぽいやつ
無いよ。
GLUTのサンプルに面白いのがあった気がするけど忘れた
あぁん・・ひどぅい・・・ 仕方ないね CLIとかで頑張るか
じゃあ作ってみようか、という流れにはならないか
質問
http://codepad.org/4ViSsdia 上記はglutを使って線を通常のopenGLで、立方体をglDrawElementを使って描写したものだけど
どうやらアクセス違反で例外が呼ばれている模様
つまり通常のglVertexなどとglDrawElementって併用できなかったりします?
glVertexPointer(3,GL_FLOAT,6,0); glNormalPointer(GL_FLOAT,6,3);
ああ・・・そういうことでしたか お恥ずかしい こんなオチですいません
いや、ストライドはバイト単位であってる気がしますね ポインタがおかしいのかな
688 :
684 :2012/09/07(金) 09:30:47.94
>>684 そのままで動いたけど WINDOWS7 + NVIDIA
>>689 ホントですか?ウィンドウをリサイズさせてもちゃんと描写されてます?
ということはグラボ依存性か・・・?うああ
>>690 >ホントですか?ウィンドウをリサイズさせてもちゃんと描写されてます?
リサイズするとき落ちるなんて初耳だが。
つか試してやったのにホントですか?とか言うならもう知らねーよ
>>691 単に驚いたときの常套句だろ
それくらい汲んでやれよ
>>691 すいません、正確に申しますと僕の方でも最初の一回は描写されるんですよ
なので本当にループが回っているかどうかの確認方法の一つとしてウィンドウのりサイズを
お願いしたかったのです。
情報出すのが遅れて申し訳なかったですが、出来ればリサイズしてみてループが回っているかどうか
確認していただけるとありがたいです。
ループが回っている場合ウィンドウのサイズに合わせて中央の箱のサイズも変わりますが
そうでない場合、ウィンドウの縁の部分が断続的に並んでしまう絵になってしまいます
>>693 アクセス違反で例外が起きるんじゃなかったの?
うちの環境ではウィンドウのサイズに合わせて中央の箱のサイズも変わります
箱つっても真っ黒な四角だけどね
そろそろ動かないPC環境とか書きませんか?
>>694 はい、確認ありがとうございます
環境忘れていました
windows7 64bit home premium
AMD Radeon HD7700
AMD特有・・・?
>>695 私のノートPCのRadeonでは動いたよ
resizeしたときdisplay()呼ばれてる?
cubeの部分を全部削除して一本の線だけにすると正しく動く?
なにが原因かもう少し探ってみれば
もうちょっと探ってみますがわかっていることは 最初の1ループだけは何事も無く描写される 次のループからはダメ キューブ、もしくは線のみにした場合予想通りの動きをしてくれる もしかするとプロジェクト設定が何か悪さをしているのかもしれませんが しかしvs2008空のコンソールデフォルトでこうなってしまっています ちょっとエラーメッセージなども探ってみます(真っ先に探るべきでしたが)
glNormalPointer で指定しているのは何? 対応するVBOがないぞ。
>>697 glGetErrorとgluErrorStringでエラーチェックくらいしようよ
glGetErrorはヌル、glew再インストールしてみましたが変わらず、でした あとはドライバ更新くらいでしょうか
シングルバッファのプログラムなんだし、
display()の適当なところにglFinish()でもいれてデバッガで追ってみれば?
(あと描画の度にVBO更新してるけど、最初に1回やればいいんじゃね。まぁそれが原因とも思えないけど)
>>693 の
>ウィンドウの縁の部分が断続的に並んでしまう絵になってしまいます
ってのは描画が更新されないときに昔よく見た現象なような気がするんで。
少なくともdisplay()に入っていればglClearくらいはされないとおかしいような。
glVertexPointerの4つ目の引数で sizeof_GLfloat*6,0 を指定してるのはなんでなん? それで24個の頂点の描画をしたら1個足りなくならん?
デバッガで追ってみてひとつわかりました 2回目のglBufferDataで例外が発生してループを抜けているようです ということはバッファを上書きするときに何か悪さをしているのかと思い glBufferDataは一回だけ呼び出し、glBufferSubDataで更新をかけて見ましたが変わらず、です さらに初回のみバッファに書き込み、以降バッファを更新しないようにしてみましたが 今度は立方体を書く直前のglColor4fで、それも外してみるとglDrawElementで例外が発生しています (いずれも2回目のループで) もう訳がわかりません・・・
704 :
702 :2012/09/08(土) 07:13:13.02
見間違えてた。 引数は3つしかなかったね。 そこはstrideか…。
4つありますが4つ目は0でバッファ先頭のはずですよね
例外?が発生したらループ(=glutMainLoopのこと?)を抜ける、のにプログラムは終了しないの?
32bit版では、display関数の最初にブレークポイントを貼って実行を続けると 例外が発生→display関数の最初のブレークポイント に戻ってきます 64bit版も作っていて、それではプログラムが終了します
情報を小出しにしすぎ。 何故やったことを全部書かないのか。
>>707 64bit版だと終了するって、
リサイズすると終了?
何も描画せずに終了?
1ループ目は回りますが 2ループ目で ***.exeは動作を停止しましたとなりますね つまり見た目には何も描写しないで終了しています
glEnableClientState(GL_INDEX_ARRAY); が原因だったりしない? glIndexPointer 呼んでないし
試しに glEnableClientState,glDisableClienatStateをコメントアウト →32bit;変化なし、64bit:終了しなくなったが、例外は発生している、描写はリサイズを止めると更新 glIndexPointerを読んでみる →32bit;変化なし, 64bit:上に同じ いずれも箱は表示されて、線は表示されません
同じく、glEnableClientState(GL_INDEX_ARRAY); はいらないと思う
glEnable(GL_LIGHTING) なのに glColor4f(1.0,0.0,0.0,1.0);
ではちょっと横道にそれて基本的な質問をさせて頂きますと 上記コードで glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,m_indexBufferID); を呼び出せばglEnableClientStateせずともglDrawElementsでインデックスとして参照してもらえるということでしょうか するとglEnableClientStateが必要なのは、たとえばglBindBuffer(GL_ARRAY_BUFFER,m_indexBufferID)などした場合 glIndexPointerと一緒に、ということでしょうか?
なるほど 元の問題ですが、とりあえず僕の環境以外で起こっていないということで、 僕の環境を見なおしてみます もちろん上のコードが動いたとか動かなかったなどのレス、 あるいは上記コードそのものに対してのレスは歓迎しますがopenGLそのものの問題ではないような気がしてきましたので お付き合いくださいありがとうございました。 なんかすっきりしない結果ですいません
再現する全ソース貼るのが礼儀
すいません
最終的なコードは以下になります
http://codepad.org/4nyn5wkx 最初のコードとの違いは
init関数内でバッファ操作を完結
glEnableClientState(GL_INDEX_ARRAY)および同glDisable~を削除
最終的な症状は
>>712 です(すべてのopenGLエラーチェックではNo Error)
なお、glewの動的リンクに切り替えられますが、結果は変わりませんでした
読めないくせに人にコード要求する奴っているよね
念のため、GLfloat geom[] をグローバル変数にした方がいい気がする。
geom(とindicies)をグローバルに(ついでにconstに)してみましたが変わりませんでした
誰か他に動かない人いないのかねぇ。別のPCでやってみれば?
人生あきらめも大切だよ
グラボ壊れてんじゃないの?
>>725 割と大事な視点ですね
過去に痛い目見た奴は、ついでに電源ユニットも買い替える傾向にありますね
割とアレっすよね
>>719 動かなかったというか
printfとかあやしいし未使用変数とかあるし動かす気あんのか
あと正直コード読む気にならないので何が表示されるかぐらい書いてくれ
法線よりも色が欲しいような気はする
>>721 glBufferSubDataは呼び出し時にコピーを行うようなので
geomのスコープは問題にはならないはず.インデントきもいけど
アレとは
>>727 何が表示されるかは書いてあるぞ。
それと、確かにコードはきれいとは言わないが試行錯誤の結果にケチつけるのは粋じゃないねぇ。
その程度コードも読めないで文句ばっか言ってんなよ。
>>719 2回目のdisplayで不正なメモリアクセスが発生して停止しました。
Win7 64bit
Radeon HD5700(8.982.0.0)
色々とソースを変更して、とりあえず動作するようにしてみました。
・インデックスの型をGL_UNSIGNED_SHORTに変更
・glBufferSubDataをglBufferData(,,GL_STAIC_DRAW)
原因はよくわかりません。
UNSIGNED_BYTEのインデックス描画に問題がありそうですが。
GL_ELEMENT_ARRAY_BUFFERを使用せず
glDrawElementsに直接index配列を渡すとUNSIGNED_BYTEでも正常に動作するようです。
>>730 うおおおおおおありがとうございます!
UNSIGNED_SHORTで動く、直接indexを渡すと動くということは
GPUが扱うメモリ側のバイト詰めの問題だったのでしょうか
こちらでも吟味してみて新しく何かがわかったら報告致します
改めてありがとうございました!
>>666 正のX軸方向は右手中指
正のY軸方向は右手人差し指
正のZ軸方向は右手親指
となって右手系
左手中指が正X 左手人指が正Y 左手親指が正Z で右手系の方が個人的にパッと手で作りやすい
左手で右手系とか紛らわしい
まだ手で覚えてるの?小学生の算数じゃねえんだから
ペンやマウス持ってると左手のが使いやすいけどな。
右手系とか覚えてなくてもゲーム作ってたよ。
>>736 高校生でもフラミンゴの左手の法則で使うぜ
フラミンゴが優雅に立っている様を表現する
そのフラミンゴの左手をうまく描写するんだな! 左手ってどうなってんだろ
座標系も理解せずにOpenGLを語る
フラミンゴ2羽犠牲「申し訳ない」 旭川市長陳謝 2012/8/23 19:4
http://www.nikkei.com/article/DGXNASDG2303P_T20C12A8CC1000/ 北海道旭川市の西川将人市長は23日の記者会見で、市が運営する旭山動物園から逃げた
ヨーロッパフラミンゴの捕獲作業で、フラミンゴをおびき寄せるために用意したおとり1羽が死に、
1羽が行方不明になったことを陳謝した。
市長は「フラミンゴは1羽25万〜30万円。市民に損害を与えて申し訳ない。
犠牲になったフラミンゴにも申し訳ないと思っている」と述べた。
2羽のフラミンゴはキタキツネに襲われたとみられ、動物園には電話で苦情が約50件寄せられた。
市長は「捕獲して戻すことが重要な役割だ」として捕獲作業を継続する方針を示した。
同時に「寒くなれば南に飛んでしまう可能性があるので、なるべく早く連れ戻したい」と述べた。
紋別市・コムケ湖で今月17〜18日に行われた動物園による捕獲作業では、逃げたフラミンゴの捕獲に失敗し、
おとりで用意した4羽のうち2羽を失った。園は既に、おとりを使った捕獲の中止を決めている。〔共同〕
744 :
デフォルトの名無しさん :2012/09/10(月) 13:31:16.39
サブメッシュで質問があります。 サイコロの6面をマテリアル(シェーダー)を変えながら6回描画した場合、 シェーダーを6回取り替えることになりますが、OpenGLのVertexArrayオブジェクトも6回変えなければならず 単にメッシュを6回レンダリングするのとパフォーマンスに差がない気がします。 ツールなどで見かける「サブメッシュ」にはどういう利点があるのでしょうか?
>>744 ツールによって用語が違うだろうからそれだけでは分からないが、
多分、パフォーマンスを改善するためにそういう仕組みがあるのではなく、
サブメッシュを複数持つ論理的な単位のために存在するのだろう。
モデリングするときには一体のものとして作業したいが、部分によって
マテリアルが違う、というようなときに便利だろう。
小学生の時のほうが頭だけで考えれた おっさんになったら手をひねり出す 小学生の時にOpenGLを教えたほうがいい
748 :
デフォルトの名無しさん :2012/09/11(火) 00:53:12.73
オープンGLとダイレクトXのクロスライブらりーででベレップしたい
Cgなら両方で使える、はずだよ。
シェーダは適当なプリプロセッサをかまして変換したらいい。 GLSL と HLSL はそんなに変わらないから。
でベレップ ってなに?
develop のことだろ この程度の推論もできんのか
ライブらりー ってなに?
OpenGL++のことだよ
wxGLCanvasの質問はここでいい?
GL部分の話ならいんじゃね、どうせそんな賑わってないんだし 環境固有の問題が絡むと反応できんがw
Android端末って恐ろしい程CPUもGPUも遅い よくこれでまともに動く3Dソフトが作れるもんだな外人は…
遅いっていっても2.3端末以降とかで縛れば、一昔前のPC並に叩けてびっくりするけどなあ JAVAから叩くのは早々に諦めたが もちろん俺もマーケットに並んでる3Dゲームには惚けるしかないけどw 数学バカが集結してGPU別に最適化やってそうなイメージ
http://user.xmission.com/~nate/glut.html ここの glut32.lib を link しています。
winmm.lib に依存するコードは書いていないのに、
LINK : fatal error LNK1104: ファイル 'winmm.lib' を開くことができません。
というエラーが出るのですが、なぜでしょう?
環境は VC++ 2008 Express Edition です。
762 :
761 :2012/09/22(土) 17:09:15.63
事故解決しました。
>>759 既にGPU性能は春モデルはPS1以上、夏モデルはPS2を凌駕している。
Javaで組むのは論外として、きちんとndkやneonでの最適化はやっているのか?
764 :
デフォルトの名無しさん :2012/09/22(土) 17:29:22.21
ES2.0対応機種くらいなら、NDKを使ってればそれなりに速いと思うけど。 NEON使わなくとも。
まあ今はPCで適当に書いても劇速だからなぁ。 PS1レベルから処理コスト考えてるような人じゃないと遅いと感じるのかもね。
PS1はAndroidスマホで動いている しかもソニー公式
で?
ソニーの公式エミュってPS1の仕様通りに内部固定少数点でポリゴン割れるのかな いやちょっと気になっただけだが
AndroidのGLSLは、少し大きなサイズのシェーダを実行すると、 不安定になってOSごと巻き込んで落ちるのは勘弁してほしい。 これだとほとんどお決まりの処理しか書けないんだよね。
>>763 PCのGPUと比較すると100倍くらい差があるからね・・
リアルタイムレイトースがGLSLでさくさく動く時代だし
>>770 具体的にどのGPUと比較して100倍なのか、前提条件を明確にしろ。
どうせ脳内ソースの妄想だろう。
Tegra3 12 GFLOPS HD7870 2.56 TFLOPS HD7970 3.79 TFLOPS ハイエンド同士だと100倍どころか300倍違う
ハイエンドじゃなくて一般的な性能の奴で比べろよ ほとんどの人が持ってないんじゃ意味ないだろう
SandyBridge内蔵GPUでおよそ100GFLOPS
なにこのきもいの。 なにが気にくわなくて難癖つけてんのか分からんw
なるほど、GPU性能とは小数の計算速度のことなのか。
Corei7-3.4G RADEON HD7700とMSM8660 1.5GHzで組んでるけど、 解像度と統一して、依存部分や拡張命令をそれぞれに対応させている以外は、 ほぼ同じソースでFPSは20倍程度の差。 CPUの圧倒的な差を思えば健闘していると思うけどね。
その話、ソースに依存してくるんじゃないですかね・・・?
他人の情報など当てにせず、自分で確かめればすむことだ。 結局、性能差なんて自分の組んだプログラム次第なんだから。
PCのFPSなんて、今では演算周りの処理能力以前にディスプレイが最大の制約要因だろうに・・・
性能測定にディスプレイの表示能力なんて何の関係もないのに、 この馬鹿は何を言っているんだろう?
馬鹿なんだろう。
783 :
デフォルトの名無しさん :2012/09/24(月) 00:28:41.96
馬鹿には無理
GPUに大量データ渡すならテクスチャ転送になるというのはもう普通なんじゃないかな テクスチャと命名したときと状況が違いすぎる
>>785 なるほど。
本来とは違う使い方ではあるけれども
大きなデータはテクスチャを使うのが
今となっては普通なんですね。
もやもやが解消されました。
ありがとうございました。
787 :
デフォルトの名無しさん :2012/09/26(水) 00:28:36.45
GLES2.0の初心者ですがすれ違いでしたらすいません。 現在勉強中でやっとシェーダ上でのスキニングとシャドウマップができたところです。 シャドウマップをやっていて気付いたのですが、シェーダ上でボーン処理をすると シャドウマップ作成などのプリプロセス?でも頂点シェーダを通ってしまいます。 今後ポストエフェクト用にパス数を増やしていきたいのですが DirectXのマルチレンダーターゲットの様な頂点シェーダは1回で済むみたいな やり方ってありますでしょうか。 2パスでの描画でしたが予想以上に遅かった (約5000頂点のモデル1個と地面を描くだけで60fpsをきってしまいました)ので原因が気になってしまいました。 今はVBO使ってなかったのでそっちでどのくらいマシになるかやってます。
788 :
デフォルトの名無しさん :2012/09/26(水) 00:58:46.15
すいません787ですが 環境はAndroid2.3でNDK+GLES2.0で組んでます
(Windows で)右上の閉じるボタンでウィンドウを閉じたとき なんらかのコールバック関数を呼ばせることは出来ますか? 閉じるボタン以外(ESCキーを拾うなど)の方法で次のコードで終了させると glutDestroyWindow(glutGetWindow()); myfreeresourcefunction(); // 自前のリソース開放部分 exit(0); リソースの開放が可能ですが 右上の閉じるボタンを押したときは glutMainLoop() の方が いきなり終了するようでリソースの解放が出来ないのです
glutCreateWindowWithExit GLUT_BUILDING_LIB
789 です とりあえずうまく行っていたように見えたのですが atexit() を実行したあとに例外を投げると落ちます 同じコードで atexit() が無い時は例外は捕捉出来ました また atexit() を実行する前に例外を投げたときも正常です atexit() で exit() の動きが変わることで 例外が投げられると(catch も出来ずに)落ちるようなのですが 何が原因なんでしょう?
既に OpenGL と関係無さそうな話題ではありますが glutMainLoop() の問題っぽいのですみません
796 :
デフォルトの名無しさん :2012/09/26(水) 20:39:04.64
リソースが二回以上開放されている に一議員票
馬鹿には無理
>>796 それかも知れません
ちょっと調べて来ます
>>797 判らないなら黙っててください
うざいだけです
>>798 その一言が余計なんだよ
黙って無視すること
∧_∧ / ̄ ̄ ̄ ̄ ̄ ( ´∀`)< オマエモナー ( ) \_____ │ │ │ (__)_)
789 です 原因は良く判らないのですが catch(){ の中に exit(1); } を書いたら UAE 出さずに終了するようになりました 本当にありがとうございました
馬鹿には無理
原因分からないのに満足するとか....
満足してるかどうかは
>>802 からは分からんな
とりあえず妥協してるのかもしれん
ただ、このままでは危険なコードである事は間違いないな
何か知らんけど、最後に +1 したらバグらなくなった、
という類いのコードを放置するのが一番怖い
789 です atexit() を使うようにしてから catch(){ の中に exit(1); } を書くまでのコードについて まだ条件は絞り込めていないのですが 例外と無関係に落ちているケースがあることが判明しました 場所は main の最後の return で落ちているようです main の return で終了するときは atexit() のコールバックは呼ばれないのでしょうか? どんどん深みにはまっています
ソースコード全部書くか エラーが出る最小化して書こうよ(´・ω・`)
glutのglutMainLoopつかっててmainのreturnに行く時ってどういう時よ atexitが呼ばれてるかどうかはatexit先にprintfでも入れておけばわかるんじゃないの
freeglut使え。 glutMainLoopから抜け出る機能がある。 そしてまたglutMainLoopに入る事もできる。 atexit()ではそれができない。
>>808 >glutのglutMainLoopつかっててmainのreturnに行く時ってどういう時よ
Idle のコールバックの中で例外をわざと出してみています
main で例外を catch して exit() しなければ return に行くと思っています
>atexitが呼ばれてるかどうかはatexit先にprintfでも入れておけばわかるんじゃないの
これは試しました
呼ばれています
あ ちょっと違いますね 例外を出したときだけ呼ばれている感じですが 今自分が混乱しているので 頭の中が整理出来たらまた来ます
要は終了するときにリソースを開放したいだけなんでしょ リソースクラスのデストラクタに解放コード入れておけばいいんじゃないの?
元々そうしてたのですが atexit() してない状態で ウィンドウの右上閉じるボタンをクリックで終了すると デストラクタが呼ばれなかったという・・・
>>807 そうします
しばらくおまちください
>>809 それも検討してみます
とりあえず今作ってしまったものについて原因を知りたいだけです
>>808 ●自分で例外を出したときは
main で catch されて glutMainLoop() を抜けて main に戻り
return または exit() するときにリソースのデストラクタが呼ばれています
ただし return の場合は直後に UAE が出ます
exit() の場合は黙って終了します
●右上閉じるボタンで終了したときは
main に戻らず glutMainLoop() 内で exit() されている
→ atexit() で自分で開放することはできる
main 内で生成したリソースのデストラクタは呼ばれていない
です
main 内では
Hoge *hoge = new Hoge();
ではなく
Hoge hoge;
で生成しています
>>814 exit()するとローカル変数のデストラクタは呼ばれない。
グローバル変数もしくはstaticな変数なら呼ばれる
mainのreturnで終了して解放、その後、atexitでまた解放みたいなことになってるとみた。 SAFE_RELEASEくらいしろよ。
delete したポインタとかは NULL にして 二回開放は防止してるつもりなんですけど・・・
mainのreturnで解放されるリソースの一部を、 atexit()の方で使ってるんじゃないかな。
789 です
>>818 たぶんそれですね
とりあえず atexit() の中の方で
危険そうな部分を回避したら
catch 側の exit() 取り除いても
終了時の UAE は出なくなりました
具体的に適切なコードに直す方法は
これから考えます
本当にありがとうございました
>>819 は glutMainLoop() から生還する必殺技を手に入れた!
要するにmainのreturnの直前でatexit()の設定をキャンセル出来れば良いんだな。
>>822 atexitはキャンセル出来ないんだよね
exitってまともなソフトなら普通使わないよな・・
みなさん色々ありがとうございます
>>802 の時点でとりあえず動いていた
(動いているように見えた)ので
危うく妥協してしまうところだったのですが
>>804-805 さんたちのおかげで考えを改め
望み通りまともなコードにまで改善することが
出来ました
本当にありがとうございました
ありがとうございます!!
有名なサイコロの表示の時みたいに エッジが強い箇所では1頂点=1法線とはいかずに各面用の複数の法線データが必要になるけど こういうデータを効率よく頂点バッファで転送する方法ってないのかな? 全く情報が見つからない やはりそういう箇所でバッファを使うには法線の数だけ頂点を増やすしかない?
たまたま座標が同じだけなのに同じ頂点と考えるからおかしくなる 法線やテクスチャ座標が違うということは別の面に属する別の頂点と考えるのが自然だろう
四次元で考えると便利に扱える
>>830 >>329 はそれは十分理解していると思うぞ。
その場合に、単に属性の数だけ頂点データを転送するのではなく、
もっと効率よく頂点バッファで転送する方法はないものか、と訊いてるのでは?
属性的には別の頂点でも、ジオメトリ的、トポロジ的には一つの頂点なんだから、と。
ジオメトリ的、トポロジ的にも複数の頂点です。 本当にありがとうございました。
>>823 コマンドラインのツールはexitしてるの多いけどまともじゃないん
>>835 全世界の全てのまともなソフトの中で、
exit使ってるコマンドラインのツールというのは、
「普通」から外れるのではないだろうか
例外的と言ってもいいような気がする
--helpだしたらexitするだろ。
なんか気になってexitに致命的な問題でもあるのかとぐぐってみたが、 はて
宗教的な問題だろ。
マナーの問題だな。 exit は、自分の仕事が終わったら何も言わずにさっと帰って行くヤツ。 main 関数の return で終わるのは、OS に対して「お疲れ様でした」と言って帰るヤツ。
quick_exit()を使え、という主旨なら同意できる。というか、そうすべきだと思う けどそういう主旨じゃないよね
GLUTはなにライブラリの分際で勝手にexitしてくれるわけ?
>>840 いくらなんでもさすがに、そんな餌で釣られるわけが……
ここ腐ってもプログラム板なんで
直行直帰
GOTO
GL関係ないね
Errors should never pass silently.
なんで1.6以降になってから短期間での改変繰り返してんだろ そういうのはDirectXにまかせとけばいいのに 向こうはXPのために何年経っても9がデファクトのままで OpenGLは少し前の情報がどんどん役に立たなくなっていくとか…
嫌なら使わなければ良いだけなのに 何言ってんのこのひと
Microsoft系以外の環境において 3Dグラフィックスライブラリは実質OpenGLしかなく、 これを使わざるを得ない状況にある。 気に入らない点があるからといって使わないわけにはいかない。
バージョンアップしたからって昔の方法が全く使えなくなるわけじゃなかろう 互換プロファイルもできちゃったし
829だけど一般的な3Dのファイルはフォーマットがそう効率的でない(描画の都合だけで見ると) エッジのない箇所でも同一頂点に違う法線をどんどん定義したり、同一法線を重複して定義したり これを頂点共有しない形にベタに展開するとかなり頂点数が増える PCでは気のせい程度でもAndroidは最適化を詰めないとすぐ重くなる 動作確認に使ってる中華padだと6〜10kポリゴン程度が60fps維持の限界だし
メモリが足りないなら共有したほうがいいだろうけど速度の話だったら共有しないほうが速いんじゃないの?
素人考えだけど、共有した方がキャッシュヒット率が上がって速度も上がるのでは?
>>855 頂点だけを共有して、法線やUVとかは共有できないわけだから、参照がもっと複雑になるんじゃないかな
なるほど、そっちがオーバーヘッドになることもあるな
結局、頂点共有とかしない方が高速だし面倒な処理もいらないっていうオチ ローポリ化の方で対処した方がいい
glpng.lib にバグがあるの知らずに変な動作で悩んでた 明らかに glpng がメモリ壊してたので 正しいデータでもう一度上書きしたら治った 今日1日つぶれた
なんだそのglpng.libって
野良かどうかはともかく、古過ぎて怖いな。
すなおにlibpng使えばいいじゃん。
野良だよ。
野良ですか orz 最初試したときは使うのが楽だったのと ちゃんと動いてたのでそのまま使ってました 最初から使えなかったらさっさと捨ててたのですが 中途半端に動いてる(ように見える)と危険ですね 素直に libpng 使うように軌道修正します orz
言語によってはフロー制御に例外使うのをアンチパターンとしているからかな
867 :
デフォルトの名無しさん :2012/10/06(土) 17:04:02.14
四角形2個描画して 1個固定 1個だけ回転させたいのですが どうすればいい?
それを聞くってどんだけだよ。 少しは試行錯誤しろ。
ただのマルチだよ
>>867 方法はいくつか考えられるのでこれが正解という回答は無い
(A) 四角形A描画→四角形Aの座標そのものに回転行列をかけて更新しまう→四角形A描画
(B) 四角形A描画→GPUに送るmodel行列を回転させる→四角形A描画
GPUの頂点シェーダでは固定機能使用なら描画命令呼び出し時にセットされているパラメータから
プロジェクション行列×モデルビュー行列×頂点座標の計算をしているだけ
>>873 「表紙は英語版のものです」と書いてあるだろ
そうか海外版じゃなくて英語版か ということは中身日本語訳してあるってことか やっと日本語のまともなcore profileの本が出るのか
OpenGL SuperBible: Comprehensive Tutorial and Referenceの最初のトライアングルを書く準備 段階の頁に記述があるGLTools.aが見つかりません。 筆者のサイトのソースにも入っていなかったので困っています。 よろしければ助言ください。
GLToolsのソースコードからstatic library作れば良いだろ
調べてもどうもよくわからんので教えてほしいのだが. UV指定したテクスチャの一部を1枚のポリゴンの中でループするのはどうやったらいいの?
0->1 の代わりに 0->2 とか 0->10 とかで与える
レスありがと だがそれは1枚もののテクスチャじゃないとダメでは? 1枚のテクスチャの中に複数のパターンが入ってて,その1つをループさせたいのです
>>882 誰もが「それを早く言え」と言いたくなるんじゃないかな
フラグメントシェーダーで、
テクスチャ座標に対して mod を計算するとかじゃダメ?
UV値を一定時間毎に変えるだけでいいんじゃね?
自分も以前同じことやろうとして、詰んだような。
シェーダ使えば良いだけの話。
要は一枚のテクスチャでパラパラアニメしたいって事だろう?
一つのテクスチャの中の一部分を1枚のポリゴンにびっしり敷き詰めたいのかと思ってた
連番画像の表示はテクスチャの切り替えかtexSubImage2Dが一般的なんじゃない?
読み込みを極限まで減らしたいって事だろう
892 :
882 :2012/10/09(火) 21:39:02.53
あ,ごめん 889の認識が正解 ループっていうから悪かった GL_REPEATしたいってことです
コストを減らしたいのか それなら前の人が言ってるようにシェーダを使いフレーム数渡してサンプリングの位置変えるだけ
894 :
882 :2012/10/09(火) 22:24:54.18
>883 できました そういう事だったのね ありがとねー 皆
頭が悪いだけかと思ったら目も悪かったでござるの巻
896 :
デフォルトの名無しさん :2012/10/14(日) 13:37:42.60
o
テクスチャといえばAndroidで開発してるとGCが凄い邪魔で困る リソースはjava側の専用APIでしか読めないからテクスチャもjavaで読むしかない 1MBの画像をたった1枚読込→GPU転送してから破棄するだけで15msもGCで止められてしまう 苦肉の策で初回起動時に外部にコピーして保存してまって直接操作してる人もいるけど管理の面で嫌だし
フラッシュからデータの読み出し、デコード、GPUへ転送を考えればそんなもんだろう。
libjpegでも使えばいい
ヒント:マルチスレッド
シングルスレッドでもload中とload完了の状態に応じてマッピングすれば実用上問題ない firefoxが証明している(キリッ)
中華padで13kポリゴン(4.6MB)のデータをストレージから読み込んで表示するのに0.3秒 Javaのメモリ確保とGCが暴れている時間が0.15秒 C++側へのデータ転送と展開、GPUへの転送その他で計0.09秒 ファイルの読込自体は0.06秒程だった 内蔵ストレージは思いのほか早かった、やはりjavaの弊害が半端ない
つーかVMのメモリプールが少ないだけだよね。 搭載メモリ量の制限からしょうがないかと。
このスレではandroidでのGLES話はNDK前提にした方が良くね? 結局パフォーマンスつかGCの話題しか出ないし、OpenGLの話か?とちょっと思ったもので。解決策もNDK以外ないよね。間の技術でrenderScriptはあるけど、スレ違いなのは自明だし。 いやもちろんあえてandroid+javaで、という需要があるようなら黙ります。過疎気味だしスレ分ける必要性ないじゃんとかもあるだろし
androidスレがあるんだから、>905に賛成。 とは言え、OpenGLのネタがないのも事実だけれど。 だからと言って、QGLWidgetのネタ出したら元の木阿弥だしw
テクスチャのロードは画面切り替え中にやればいいわけで、Now Loadingでも出しておけばよい
Render To Textureでテクスチャーに書いた画像を確認したいのですが、 テクスチャーをCPU側にコピーする方法を教えてください glMapBufferはテクスチャーオブジェクトには使えませんでした。 テクスチャー画像を確認する簡単な方法がない気がするのですが・・・
馬鹿には無理
912 :
908 :2012/10/22(月) 11:56:54.38
>馬鹿には無理という事は、できた俺は馬鹿じゃないと言うことだな! 出来なかったら馬鹿だけど、出来たからと言って馬鹿じゃないとは限らない。 という解釈が正しい論理。
いいえ、馬鹿には不可能、つまり馬鹿である要素が少しでも存在すれば 達成できないことを意味します。 よって達成できた時点で馬鹿ではあり得ません。 しかし人間は常に変化するものです。 達成できた後に馬鹿になる可能性もあり 今のあなたが馬鹿ではないことを保証するものではありません。
馬鹿には無理であれば 無理ではなかった時点で 馬鹿ではないことになると思う もし無理ではなかったのに馬鹿だったら そもそも馬鹿には無理と矛盾する
おまいらこんな簡単な論理も判らないのにム板に来てるのか。
917 :
デフォルトの名無しさん :2012/10/22(月) 13:24:57.08
いや わかってないのは >913 だけだろ
>>913 は直観主義論理の立場をとってるのかもよ
ある命題が真のときその対偶が真になる、というのは古典論理でしか通用しないルールだしね
馬鹿にでもできたのだから間違っているのは
>>909 だろ
直観主義を知らない
>>919 が馬鹿というのは分かった
デファード系に限った話じゃないけど今の主流はポストプロセス式のAAじゃない?速いし。
OpenGLが使いやすいC++のGUIのライブラリってなかなかないな freeglut+gluiはファイルダイアログがないし FLTKは自分でOpenGLのcontext作らないとマルチサンプルできないとかでクロスプラットフォームじゃないし QtはVS2012のx64で使おうとしたらQt Creatorがnmakeやらclやらを見つけられずコンパイルできないし
Qt Creatorがnmakeやらclやらを見つける仕組みって、どんなの?
環境変数にはVCのパスとかそのへんは入ってないしレジストリでも見てるんじゃないか x86にすると見つけてくれるのが謎だ 64bit対応はまだ中途半端ってことなのかもしれないな ソース見れば分かりそうだが分かったところで直せん qmake -tp vcでVC用のプロジェクトファイル作って Qt Creatorはui弄る時だけ使おうとか考えたが コンパイルが失敗するんでなえなえだわ VS開発者コンソールからnmakeすればコンパイル通るんだが 実行ファイルがあればデバッグ実行普通にできてたし 我慢すれば問題ないレベルだったかもしれんな イラッときて全削除しなければ良かった
Qt Creator 2.6βでオプション→ビルドして実行→Compilersで自動検出されたのがずらずらっと出る ここでそれぞれのコンパイラ使うための環境変数を設定するためにbatファイルの起動コマンドが載ってるんだが vcvarsall.batの引数がx64とかamd64とかが自動検出されてるけど、引数はx86_amd64じゃないとダメだ x86でコンパイラが動くのにx64で動かないのはこういう理由だったわけだ というわけで手動で追加したらコンパイル通るようになった 追加の手順は Qt Creatorでx64の設定をCloneしてからNameを分かりやすく変更して %USERPROFILE%AppData/Roaming/Nokia/qtcreator/toolchain.xmlの中をその名前で検索して <value type="QString" key="ProjectExplorer.MsvcToolChain.VarsBatArg">x64</value> ↑を↓に変更でおk <value type="QString" key="ProjectExplorer.MsvcToolChain.VarsBatArg">x86_amd64</value> 激しくスレ違いだしニッチすぎて参考にする人がいるかどうかは知らん
つまり俺のおかげという事か
WxGLCanvas最強ですねわかります
QtでOpenGL
ttp://www1.axfc.net/uploader/so/2665805.zip 三角形をくるくる回すだけのプログラムです
GLThread::run()が描画ループになってるのでUIがいらないならここだけ弄ればおk
まあQt使っててUIいらねえなんてことは絶対ないので
一応UIから回転を止めたり再開したりする機能も付けてみた
bool変数に値セットするだけだから排他制御要らないけど
ちゃんとやるならスレッドセーフなQueueを使ってイベント処理したり
排他制御したりする必要があるだろう
QtはUIスレッドとOpenGLのスレッドを分離できるのが良いな
タイトルバー掴んでも描画が止まらないのが良い
wgl使う場合と同等の自由度もあるのかな
Qt CreatorがVC#とかVBくらいの出来なら最強なんだけどなあ
VSと比べるのは酷だろうw VSのクオリティはもはやMS最後の綱
Qtはライセンスの関係でフリー版使ったらプログラムを公開しなければならないからなぁ
デマ乙 LGPLについてぐぐっておいで
流石に訴えられても仕方ないレベル なんでよく分からないままに書き散らすんだろ 殺害予告する馬鹿とは社会影響度が違うとはいえ、同レベルで理解できぬ
>>934 LGPLのライブラリを使って作られたアプリとかは、
そのアプリ側のソースは公開する必要はないよ。
ただ、アプリ側のリバースエンジニアリングを禁止してはダメだけど。
934 じゃないけど、LGPL 版なんてのができてたんだね。 いつ頃だったか、C++Builder からの乗り換え先を探してた時には無かったな。
939 :
デフォルトの名無しさん :2012/11/08(木) 15:35:55.48
GLSLのデバッグ方法について教えてください GLSLの中でブレイクポイントをはってラインでバッグとか Uniform変数の値を確認とかってできるのでしょうか? 環境はWindows7でVisualStudio2010です。 AMDかNVIDIAのGPUでお願いします 可能ならC#/.NetアプリからGLSLの値だけでも確認できると嬉しいです バグが取れません・・・
gdebuggerおすすめ
941 :
939 :2012/11/08(木) 16:42:46.90
おすすめというか、できるかできないかを教えていただけないでしょうか やりたいことはシェーダーが走った時のUniform変数とAttribute変数です ライン実行はなくてもいいです
馬鹿には無理
そういうのはライン実行じゃなくてステップ実行ね
GLSLとかOpenCLとかデバッグ難しいよなあ
gdebuggerちょっとだけ使ってみたけど バッファオブジェクトの中身とかが見れてなにこれすごいって思ったわ つまりin変数の中身は見れますな uniform変数も見れるんじゃね ステップ実行ができるかどうかは分からなかった あと整数のin変数はglVertexAttrib「I」Pointerじゃないとダメですよね 整数を入力するサンプルとか見たことないので超ハマりましたわ
CPU以外で動くコードはデバッガがそれ専用じゃないと無理だからね。
947 :
デフォルトの名無しさん :2012/11/10(土) 21:37:33.52
は?
は?って低脳なのばれるから書き込まないほうがいいよ
あ゛?
負け惜しみがぶざま
>>946 いろいろ考えさせられるが
それをレスると、都合の良い後付けレスさせられるから止めとこ
954 :
デフォルトの名無しさん :2012/11/21(水) 09:57:52.42
レスを見てると日本にまともなOpenGL使いがいないのがよくわかる XCode(=gDebugger)もNsightもGLSLのシェーダーデバッグはできない つまりブレークポイントを張って変数の値を確認とかはできない CPU側のAPIレベルで止めてOpenGLコマンドのトレース(呼び出し履歴)の確認や テクスチャーやバッファーオブジェクトの確認などはできる ただシェーダー全盛の時代にAPIレベルでデバッグできた所であまり有益ではない・・・ というわけで今でも地道にテクスチャーにオフラインレンダリングして値を確認するしかない OpenCLがカーネルデバッグできるんだからOpenGL(GLSL)もできそうなものだが・・・
955 :
デフォルトの名無しさん :2012/11/21(水) 10:30:59.42
どうやって?
海外にいるまともなOpenGL使いならできるんじゃね 954も日本人だろうからOpenGLは使えないのだろう
サンプルだけ動かして 満足して終わりの人が多い
つかそこまでOpenGL突っ込んで使う必要のある人居ないでしょ。DirectXなら大勢居るんだろうけどw
スマホのGPUではDirect3Dは動かんよ OpenGLじゃないと動かない あとゲームコンソールはMS以外はOpenGLかOpenGL風のAPIになってるね 日本で箱がほぼ終了してることとPCゲー市場がそもそも死滅してることを考えられる奴なら Direct3Dなんてオワコンにしがみついたままでいるとは思えないんだけど
direct3dがオワコンだとは思わないが マルチプラットフォーム前提で開発しないといけなかったりするのでopenGL
>>959 間違っては無いが、正しくは無いな。
あんま、薄識広げんなよ
xboxってそんな売れてないのか
3Dを必要としない層にはDirectXは人気ですよね
カバーするレイヤが違うのに毎度DirectX比較対象に出してくるのは私怨としか思えない
皆Direct3DのことをDirectXと読んでるだけだろ 話をややこしくするな
966 :
デフォルトの名無しさん :2012/11/24(土) 11:42:07.94
初歩的な質問なのですがglBlendFunc()を使って貼り付ける画像の 透過部分の透過を有効にしたい場合 テクスチャとテクスチャオブジェクトの関連付け(GLUtils.texImage2D()まで) をしてからglBlendFuncを呼ぶか関連付をする前に呼ぶかどちらにしないと有効にならないとかありますか?
有効にするのは glEnable(GL_BLEND) です
968 :
デフォルトの名無しさん :2012/11/24(土) 12:32:52.26
>>967 すみません言い方を間違えました。
glEnable(GL10.GL_BLEND)
glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA)
glDisable(GL10.GL_BLEND)
この3つを使って編集して画像に透過を加えた部分がちゃんと透過されるようにしたいです。
これのglBlendFunc()の入れる位置を教えて欲しいです。
glEnable/glDisable の位置とか関係ないだろ。
970 :
デフォルトの名無しさん :2012/11/24(土) 15:15:44.60
>>969 教えて欲しいのはglBlendFunc()の位置です
glEnable(GL10.GL_BLEND) より前でも大丈夫
そんなことよりtextureを貼り付ける順序の方が大事。
973 :
デフォルトの名無しさん :2012/11/24(土) 23:36:22.17
>>972 OpenGLでは直接文字表示ができないらしいので文字を画像として
貼りたいのですがそのプログラム貼り付けます。
テクスチャとオブジェクトの関連付のみでほかは省略します。
長いので2回に分けて書きます。
gl10.glClear(GL10.GL_COLOR_BUFFER_BIT); //GL10のインスタンスのgl10は初期化済み
gl10.glEnable(GL10.GL_TEXTURE_2D);
gl10.glEnable(GL10.GL_BLEND);
gl10.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
int[] textureIds=new int[1];
gl10.glGenTextures(1,textureIds,0);
int textureId=textureIds[0];
Bitmap bitmap=Bitmap.createBitmap(512,512,Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(bitmap);
canvas.drawARGB(0, 0, 0, 0); //文字の画像の背景を透明にする
Paint paint=new Paint();
paint.setColor(Color.BLACK);
paint.setTextSize(30);
canvas.drawText(text,canvas.getWidth()/2,170,paint);
974 :
デフォルトの名無しさん :2012/11/24(土) 23:37:25.72
gl10.glBindTexture(GL10.GL_TEXTURE_2D,textureId); GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bitmap,0); gl10.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST); gl10.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_NEAREST); bitmap.recycle(); gl.glBindTexture(GL10.GL_TEXTURE_2D, 0); gl10.glBindTexture(GL10.GL_TEXTURE_2D,textureId); gl10.glColor4f(0,0,0,alpha); //alphaは時間が経つたびに減っていく //これよりあとは描画作業 最後のglColor4fは文字の画像全体を最初は透明にし時間が経つたびにalphaを減らしていき文字が浮かび上がるような感じにするためです。 このプログラムだとこの画像を描画した部分だけ白く表示されます。 どのへんがあやしいですか? 自分的にはglcolor4f()かdrawARGB()あたりだと思うのですが。
突っ込み所は沢山あるが、そもそもブレンドを止めれば文字画像は画面に出るの?
glErrorを使ってどの関数がエラーになってるか調べたかい?
馬鹿には無理
978 :
デフォルトの名無しさん :2012/11/25(日) 16:12:47.84
自己紹介乙
>>978-979 この板ではこのスレしか見ないのか?
どんだけ悔しかったのか知らないが、アチコチに適当に投稿される煽りにイチイチ反応するなよ。
981 :
デフォルトの名無しさん :2012/11/26(月) 21:35:38.60
オフラインレンダリングで整数型の数字をそのまま出力したいのですがどうもうまくいきません。 テクスチャーをinternalFormat=RGBA16ui, format=RgbaIntegerで作って、 シェーダーからivec4=0,1,2,3で出力してglGetTexでformat=RgbaInteger, type=UnsigndShortで取得すると 0,1,2,3が0,65535,65535,65535で取得されます (整数型でない)小数型のフレームバッファーと同様に0〜1が0〜65535に内部変換されているっぽいです シェーダーで出力した整数値をそのままCPU側で取得するにはどうすればいいのでしょうか
>>980 この板ではこのスレしか見ないのか?
「馬鹿には無理」には「自己紹介乙」で返すのが挨拶だろ
挨拶の出来ない人間にろくな人間はいないってな
ログを漁ってみたが、この板はほとんどがロクでなしのようだから、人格者の君はもっとマトモな場へ行ったらどうだろうか。
>>983 何スクリプトに反応してんのwww と煽られたのがそんなに悔しいのか。
ぼくには無理
987 :
981 :2012/11/27(火) 11:23:19.23
>>982 そうじゃなくてw
ピクセルシェーダーの出力でivec4を指定した時の値の範囲は
整数型のテクスチャーをバインドした時は0〜1ではなく0〜INT_MAXを期待したのに
そうなってないのは仕様書と照らし合わせてどうなのかと
仕様書のどこを呼んでも該当する項目が見つかりません。
これは仕様的にできないのか単に見落としているだけなのか???
> internalFormat=RGBA16ui お前が1コンポーネント辺り16ビット指定してるんじゃん。
EXT_texture_integer
今参考書(OpenGLでつくるAndroidSDKプログラミング)を元に勉強中なんですが 「OpenGLは視点の位置は原点(0,0,0)に固定されていて、注視点もZ軸マイナス方向に固定されています。」 「そのため視点と注視点を決定するのではなく、描画するオブジェクト全体をマトリクス変換によって移動させたり、 回転させたりして視野を設定します。」 と書いてあったのですが、初心者ながらこれはおかしいんじゃないか?…と感じました。 これって本当でしょうか?
本当です
描画するオブジェクトも原点中心に描画されるので オブジェクトを描画したあとで原点を移動するんです
>>990 カメラの位置や方向を決定するAPIは用意してないけど、
数学的にはオブジェクト全体に変換行列適応するのと同じだから問題ない。
カメラの位置や方向をシミュレートする機能が必要なら自分で作れ
というスタンスです。
>オブジェクトを描画したあとで原点を移動するんです これは意味不明だ
なるほど。 ただglRotatef()、glTranslatef()をつかったりするよりは ググった時に見つけたgluLookAt()を使ったほうが便利そうなんですが どっちがいいとかありますか?
どっちもやってることは同じになるので、便利だと思ったらgluLookAt使ったらいい
意味も分からずにラッパーを挟んで、 自分の意図した位置に描画できない人間をそこら中で見かけるのが何とも。
>>987 整数の場合は0〜1にマッピングされる
だから、0〜255な8bitのテクスチャもシェーダの中では0〜1の値になる
999 :
デフォルトの名無しさん :2012/11/27(火) 22:46:04.00
次スレはありません
∧∧ ミ ドスッ ( ) _n_ / つ 終了| 〜′ /´  ̄|| ̄ ∪∪ ||_ε3 ゙゙゙゙ 長い間ご声援ありがとうございました。 OpenGLスレはこれにて終了です。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。