GLfloatとGLdoubleのどちらを使えば最適な速度が得られるのでしょうか?
OpenGLのデフォルトはGLfloatの場合が多いのでGLfloatかと思うのですが…
gl.hをみると以下のようになっています
typedef double GLdouble;
typedef double GLclampd;
素のdoubleとfloatだとdoubleの方が速いんですよね?
>>935 >素のdoubleとfloatだとdoubleの方が速いんですよね?
ANSI以前のCだとfloatはdoubleに変換するから遅いんだっけ?今はそんなことないはず。
float使ってコンパイルフラグでSSEの使用をONにしときなさい。
937 :
935:2008/08/30(土) 12:56:33
>>936 SSEがなにか勉強してきます
ありがとうございました
938 :
920:2008/08/30(土) 13:24:22
ありがとうございます。できました。
ただ、同じものを2回描画しなきゃならないのがちょっと…
なにかいい方法はないものか
>>938 >>二つのテクスチャマップした板の重なり部分をテクスチャの色でブレンディングしたいのですが、
>>重なり部分はうまくブレンディングできているようですが、
>>重なりでない部分が背景色とブレンディングされてしまうのですが、どうしたらよいですか。
普通の alpha 合成なら
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
だが、
alpha 値を、裏にある色を透過させる割合、としたいならば、
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
にすべき。たぶん君がやりたいのはこっち。
裏にどういう物体が存在するかで、光学特性を変えようとするなら、
そりゃあめんどくさいことになるよ。
>>934 そんな感じ
ただCOLLADAはけっこうめんどくさい
BVHがシンプルだがスキン付きのモデルの方をどうするか悩む
941 :
デフォルトの名無しさん:2008/09/01(月) 12:14:36
>>936 floatは演算プロセッサが処理する時にdoubleに変換されてるので、
最初からdoubleを使った方が効率いい。
アフォか?スループットはfloatのほうが良いケースが多いだろ
>>941 太古の昔にどこかで聞いた言葉の受け売りか?
Linux/Cygwin/Mac OS Xで./configureしただけでOpenGLのプログラムがmakeできるように
configure.inを書きたいのですが、方法が全く分からなくて困っています。
すでにそこらへんのプラットフォームでコンパイルできるように調整されたソフトウェアのconfigure.inを
参考にしようと思っているのですが、そんなソフトウェアご存知ないでしょうか?
求めてるものとは少しずれてるかもだけど、確かabuse-sdlってゲームがconfigureのなかでOpenGLのチェックしてた。
でも、configureはコピペで動かすのも結構大変なんだよね・・・。
gnuに拘ってるんじゃないならcmakeを検討してみるのもいいかもよ。
configureよりビルドが速いし、VisualStudioのプロジェクトも作ってくれるし。
>>942 64ビットマシンではdouble圧勝。
64bitマシンでdoubleが圧勝するというソースか再現可能な環境を示して。
GLSLでフラグメントシェーダから深度値とレンダリングバッファを取得したいのですが、
どのようにして値をセットすればいいのでしょうか?
FBOを使うとシェーダからでも深度値の取得が出来るらしいのですが、
単純にglUniform1iABRで0を入れてみてもその数字はテクスチャユニットの番号になってしまうみたいですが…
直接は読めないから深度値のテクスチャ作ってそれをサンプリングするんだ
FBOの深度バッファにDEPTHCOMPONENTのテクスチャをアタッチすれば深度値をテクスチャに入れられる
あとは普通にテクスチャとしてそいつをサンプリングすればok
>>950 教えてくださったとおり、テクスチャをFBOに関連付けたものをglBindTextureし、
その後glUniform1iABRを実行してみたのですが、なぜか入ってるのは
深度値ではなくポリゴンに貼り付けるテクスチャでした orz
これは全く別問題でしょうか?
どこから間違ってるのかよくわからんからまずFBOは諦めてみるか
テクスチャを作ってglBindTextureしたあと、
glCopyTexImage2DでinternalFormatにGL_DEPTH_COMPONENTとかを指定すると
画面の深度値をテクスチャに簡単にコピーできるから、そいつをサンプリングだ
>>952 うまく行きました!
glActiveTextureした後にglBindTexture、glCopyTexSubImage2Dでシェーダに深度値を
渡せました。
しかし、深度値をとった後に
depht.r
とするのと、
depth.x
とでは値が違うみたいなのですが、これは単純にvec4の値の取り出している位置が
違うだけなのでしょうか?
それと、テクスチャとデプスバッファからコピーしたテクスチャのサイズは同じはずなのに、
gl_Color = vec4(texture2D(tex, gl_TexCoord[0].st).xyz, texture2D(depthTex, gl_TexCoord[0].st).r);
とすると、同じサイズのポリゴンを重ねたときに、上のポリゴン全体の
アルファが変わるのではなく、中心部分しか半透明になりません。
これは何故でしょうか?
vec4のrとxは同じはずなんだけどな
あとの中心だけってのもよくわからない
とりあえず自分のプログラムのバグを疑って確認するんだ
それでもおかしいようなら最新のドライバを試してくれ
もし古いドライバ使ったりするとGLSLなんかはひどくバグってたりする
955 :
890:2008/09/03(水) 22:27:02
>>954 試してみたところ、rはzと同じ値になっていたようですが、もう一度
確認してみるとrとxが同じ値だったので、見間違いしてたんだと思います orz
テクスチャの方もこちらの単純ミスが原因でした orz
最後に1つだけ…
テクスチャ座標を求めるために、テクスチャのサイズをuniform vec2な変数に
入れようと、glUniform2fvで代入したのですが、なぜか0しか入らず、テクスチャ座標を
求めることが出来ません。
ちゃんと変数へのハンドルは取得されており、代入前や代入後にglGetInfoLogARBを
しても特にエラーはなく…
テクスチャの方はちゃんと代入
されているのですが。
聞いてばかりで本当にすみません orz
>>956 どうやってshader側に渡されたuniform値を確認しているのかが
よく見えないが、
Textureサイズ(widthとheightのこと?)をuniformで渡している点から
推測してサンプリング座標を操作しているだろうから、texture2Dに
渡している s,t まわりのfragment shaderを確認してみては?としか。
GL仕様でいうところの(s,t)→(u,v)変換がtexture2D内部で実行されるのは
認識しているよね、念のため。
>>957 まず、値がちゃんとセットされるかどうかを確認するために、
uniform vec2 texSize;
void main(void)
{
gl_FragColor = vec4(texSize.x / 640.0, texSize.y / 480.0, 1, 1);
}
というのを書き、glUniform2ivで(640, 480)を渡したのですが、texSizeにこの値が入っていれば
白い単板になるはずなのになぜか真っ青に… orz
gl_FragColor = vec4(texSize, 1, 1);
として(1, 1)を渡しても真っ青でした。
>GL仕様でいうところの(s,t)→(u,v)変換
glTexCoord2などの引数からST=UVかと思っていましたが…
ST座標が(1.5, -0.5)などとなっていたときに、(0.5, 0.5)と1〜0の間に戻す計算のことでしょうか?
すいません、自己解決しました。
値のセットがうまくいかなかったのはglUniform2ivではなく、glUniform2fvでしたが、
texSizeをtexWidth、texHeightに分けてglUniform1fvで1つずつ渡すことにより解決できました。
これでなんとかなりそうです。
今までくだらない質問に答えていただき、本当にありがとうございました (';ω;`)
基礎の基礎ですまんが、ズームってどうやって実装したらいいんだろう?
いまはglOrthoで空間を定義して、glScalefで拡大縮小してるんだけど、
これだと一定以上に拡大したときにオブジェクトの端が切れちゃう。
CADみたいな感じで無段階拡大縮小ってどうやったらいいかな?
頭を前後させれば良いじゃん。
(よし、俺面白いこといった!)
>>961 orthoのnear/farも一緒に動かしたらいいんじゃね?
>>961 glOrthoで指定するleft〜rightとbottom〜topの幅を小さくすればいいんだヨ。
見る範囲を半分にすれば、見える大きさは2倍になるでしょ?
>>964の方法でもいい(というかやってることは本質的に変わらない)けど、
プログラムは面倒臭くなると思うw
勉強中の初心者です。
GL_TEXTURE_2Dで作ったフルカラーのテクスチャを表示したいのですが、
16bitカラーみたいな色むらが表示されます。
どのようにすれば奇麗に表示されるんでしょうか?
OpenGLの初期化のときに16ビットカラーを選択してしまっているとか
>>968 レスありがとうございます。
サンプルコードをベースにしているので初期化の状況すら把握できていないのですが、
どのようにすれば初期化時に色数を指定できるんでしょうか?
970 :
デフォルトの名無しさん:2008/09/09(火) 13:52:29
OpenGLはmulti-threadできないのかな
OpenGLともうひとつ画面だしてmulti-threadで表示すると
(OpenGLの画面+OpenCVの画面)
OpenCVのほうが止まる…
どうすればいいものか…
OpenGLで2画面ってだせるんでしたっけ…
マルチスレッドには対応していない
2画面は出せると思う
973 :
デフォルトの名無しさん:2008/09/09(火) 20:56:03
glslで動的に配列を作りたいのですが、どうしたらいいですか?
できますか?
uniform int aaa;
として
vec3 bbb[aaa];
とするとエラーになります。
>>970 規格としてはマルチスレッドについてはなにも定めてないので実装依存
描画は一つのスレッドでまとめてやるのが無難
NVIDIAの何かのドキュメントではマルチスレッドで描画するにはスレッドごとに別コンテキストにしろって話だった
>>973 残念ながら無理だ
定数として埋め込んでその都度コンパイルしなおす、
充分大きな配列を作っておいて一部だけ使うようにする、
テクスチャにしてしまう、
なんかで対処してくれ
質問よろしいでしょうか。
glVertexPointer や glTexCoordPointer などの引数がnewやmallocで確保した通常のメモリーへのポインタなのですが、
OpenGLでは頂点配列などをVRAM上に配置することはできないのでしょうか?
大きな頂点配列を持つハイポリな人間モデルなどは、VRAMを食ってでもVRAM上に配置して速度を稼ぎたいのですが・・・。
>>977 ありがとうございます
さっそくiPhoneでも使えるか試してみるとします〜
979 :
973:2008/09/10(水) 18:37:21
了解しましたー。ありがとうございます。
アルファチャンネル付き2Dテクスチャを半透明にしたくて
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
としたんですが、エッジが黒く縁取りされたようになてしまいます。
これはテクスチャの作り方が悪いんでしょうか?
>>980 エッジというのがテクスチャのボーダーという意味なら、WRAPを
GL_CLAMP_TO_EDGEやGL_REPEATで指定。
エッジが半透明と完全透明の境界という意味なら、透過テクセルの
RGBが0だからそう見えている。テクスチャのサンプリング時にバイリニア
/トライリニアで、透過テクセルのRGBもフィルタリングされているから。
フィルタ不要ならポイントサンプル(GL_NEAREST)にするだけでいいし、
フィルタリングするならエッジに隣接した透過テクセルのRGBを
正しい値で作っておく必要があるかと。
RGBの値が常にAを超えることがなく、A=0(完全透過)の場合にRGB=(0,0,0)になるような
アルファの解釈の仕方は、いわゆる "pre-multiplied alpha" というやつだね。
映像業界のポスプロの合成なんかで昔からよく使われている流儀。
この場合、ソースRGBにアルファを再度かけてやる必要はないから、
半透明合成は glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) になる。
質問です。
1からOpenGLを始め、ライティングの利用にとりかかりました。
ただうまくいかず、とりあえず
glEnable(GL_LIGHTING);
glDisable(GL_LIGHT0);
glDisable(GL_LIGHT1);
以下、7まで無効化。
として「これなら真っ黒になるはずだよな」と思ったのですが、なぜかモデルの色が暗くですがはっきりと色づきます。
RGB(255,0,0)のモデルなのですが、RGB(32,0,0);くらいの色で見えるのです。
GL_EMISSIONのような自己発光は行わせていません。
なぜライトがすべて無効であっても、うっすらモデルが見えるのでしょうか?
また、もちろんglEnable(GL_LIGHTING);しなければ、モデルは真っ赤で描画されます。
float ambient = { 0,0,0,0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
でどう?
モデルのMaterialのambientが見えてる
986 :
980:2008/09/11(木) 21:44:29
>>981,982
ありがとうございました。
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)で出来ました。感謝!
直線の描画について
関数 glBegin()の内部処理について知ることは出来ませんでしょうか?
出来るとすれば、どのソースファイルを読めば良いのでしょう?
助けて下さい。
>>987 ソースを見たければMesaというオープンソースなOpenGLの実装がある。
でも、なぜ直線の描画の処理を知りたいのか書いた方がいいんじゃね。
単に直線の描画アルゴリズムが知りたいのか、何かライブラリの内部処理を
知らないといけない事情があるのか。
実装はドライバごとに違うから中で何やってるかはわからない
参考実装で良ければMesa3Dについて調べるといい
なんでそんなのを知りたいか書けばもっと適切なアドバイスが出来るかもしれないよ
>>988, 989さん
返信ありがとうございます。
知りたいのは、直線の描画アルゴリズムです。
言葉が足りずに申し訳ありません。
例えば、縦×横=10×10の画像を考えてみます。
そこで、2点(0, 0)と(2,9)を結ぶ直線を描画したいような場合についてです。
(0,0)と(9, 9)は綺麗に引けると思います。
しかし、例のような場合で、”ディザ”って言うのですかね?
傾きがぴったり1ではないので、
単純に直線の式から求めた座標ではなく、
描画すべき(x, y)の組み合わせが変わってくると思います。
例のように(0, 0)と(2, 9)を結びたければ、
(0, 0)、(0, 1)、(0, 2)、(1, 3)、(1, 4)、(1, 5)、(1, 6)、(2, 7)、(2, 8)、(,2,9)
といった感じの座標になるのでしょうか。
分かりにくい文章で申し訳ありません。
ご教授お願いします。
それならOpenGLの実装を調べるなんてまわりくどいことしないで
直線 描画 アルゴリズム
とかでググった方がいいぜ
>>991さん
本当ですね。
皆さん、ありがとうございます。
アホな質問をして、申し訳ありませんでした。
貴重なお時間をありがとうございます。
またよろしくお願いします。
昔はブレゼンハムとかソフトで実装してたな。何もかも懐かしい・・・。
>>984-985 今手元に環境がないのですが、
984さんので直りそうな雰囲気ですね
GL_LIGHT_MODEL_AMBIENT でぐぐったら、初期値が(0.2、0.2、0.2、1.0)とありました。
Materialのambientは0,0,0,1でしたので、こちらではなさそうです。
お二人ともありがちございました。
PS2はDDA
996 :
デフォルトの名無しさん:2008/09/12(金) 09:10:33
デジタル微分解析とかなつかしす
次スレまだたってない?
998 :
デフォルトの名無しさん:2008/09/12(金) 18:33:18
998 !!!!!
999
1000get
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。