OpenGLスレ Part11

このエントリーをはてなブックマークに追加
935デフォルトの名無しさん
GLfloatとGLdoubleのどちらを使えば最適な速度が得られるのでしょうか?
OpenGLのデフォルトはGLfloatの場合が多いのでGLfloatかと思うのですが…
gl.hをみると以下のようになっています

typedef double GLdouble;
typedef double GLclampd;

素のdoubleとfloatだとdoubleの方が速いんですよね?
936デフォルトの名無しさん:2008/08/30(土) 12:18:52
>>935
>素のdoubleとfloatだとdoubleの方が速いんですよね?

ANSI以前のCだとfloatはdoubleに変換するから遅いんだっけ?今はそんなことないはず。
float使ってコンパイルフラグでSSEの使用をONにしときなさい。
937935:2008/08/30(土) 12:56:33
>>936
SSEがなにか勉強してきます
ありがとうございました
938920:2008/08/30(土) 13:24:22
ありがとうございます。できました。
ただ、同じものを2回描画しなきゃならないのがちょっと…
なにかいい方法はないものか
939デフォルトの名無しさん:2008/08/30(土) 14:59:13
>>938
>>二つのテクスチャマップした板の重なり部分をテクスチャの色でブレンディングしたいのですが、
>>重なり部分はうまくブレンディングできているようですが、
>>重なりでない部分が背景色とブレンディングされてしまうのですが、どうしたらよいですか。

普通の alpha 合成なら
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
だが、
alpha 値を、裏にある色を透過させる割合、としたいならば、
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
にすべき。たぶん君がやりたいのはこっち。

裏にどういう物体が存在するかで、光学特性を変えようとするなら、
そりゃあめんどくさいことになるよ。
940デフォルトの名無しさん:2008/08/30(土) 15:51:18
>>934
そんな感じ
ただCOLLADAはけっこうめんどくさい
BVHがシンプルだがスキン付きのモデルの方をどうするか悩む
941デフォルトの名無しさん:2008/09/01(月) 12:14:36
>>936
floatは演算プロセッサが処理する時にdoubleに変換されてるので、
最初からdoubleを使った方が効率いい。
942デフォルトの名無しさん:2008/09/01(月) 13:37:38
アフォか?スループットはfloatのほうが良いケースが多いだろ
943デフォルトの名無しさん:2008/09/01(月) 14:05:35
>>941
太古の昔にどこかで聞いた言葉の受け売りか?
944デフォルトの名無しさん:2008/09/01(月) 16:47:19
Linux/Cygwin/Mac OS Xで./configureしただけでOpenGLのプログラムがmakeできるように
configure.inを書きたいのですが、方法が全く分からなくて困っています。
すでにそこらへんのプラットフォームでコンパイルできるように調整されたソフトウェアのconfigure.inを
参考にしようと思っているのですが、そんなソフトウェアご存知ないでしょうか?
945デフォルトの名無しさん:2008/09/01(月) 21:11:38
求めてるものとは少しずれてるかもだけど、確かabuse-sdlってゲームがconfigureのなかでOpenGLのチェックしてた。
でも、configureはコピペで動かすのも結構大変なんだよね・・・。
gnuに拘ってるんじゃないならcmakeを検討してみるのもいいかもよ。
configureよりビルドが速いし、VisualStudioのプロジェクトも作ってくれるし。
946デフォルトの名無しさん:2008/09/01(月) 22:37:36
>944
お望みの環境で全部動くかどうか知らないが、
ttp://autoconf-archive.cryp.to/ax_check_gl.html
辺りを参考にしてみれば?
必要なら近辺の GLU とかも参考に。
947デフォルトの名無しさん:2008/09/02(火) 10:33:37
>>942
64ビットマシンではdouble圧勝。
948デフォルトの名無しさん:2008/09/02(火) 11:42:03
64bitマシンでdoubleが圧勝するというソースか再現可能な環境を示して。
949デフォルトの名無しさん:2008/09/02(火) 17:20:05
GLSLでフラグメントシェーダから深度値とレンダリングバッファを取得したいのですが、
どのようにして値をセットすればいいのでしょうか?
FBOを使うとシェーダからでも深度値の取得が出来るらしいのですが、
単純にglUniform1iABRで0を入れてみてもその数字はテクスチャユニットの番号になってしまうみたいですが…
950デフォルトの名無しさん:2008/09/02(火) 21:52:31
直接は読めないから深度値のテクスチャ作ってそれをサンプリングするんだ
FBOの深度バッファにDEPTHCOMPONENTのテクスチャをアタッチすれば深度値をテクスチャに入れられる
あとは普通にテクスチャとしてそいつをサンプリングすればok
951デフォルトの名無しさん:2008/09/02(火) 23:42:56
>>950
教えてくださったとおり、テクスチャをFBOに関連付けたものをglBindTextureし、
その後glUniform1iABRを実行してみたのですが、なぜか入ってるのは
深度値ではなくポリゴンに貼り付けるテクスチャでした orz
これは全く別問題でしょうか?
952デフォルトの名無しさん:2008/09/03(水) 10:31:04
どこから間違ってるのかよくわからんからまずFBOは諦めてみるか
テクスチャを作ってglBindTextureしたあと、
glCopyTexImage2DでinternalFormatにGL_DEPTH_COMPONENTとかを指定すると
画面の深度値をテクスチャに簡単にコピーできるから、そいつをサンプリングだ
953デフォルトの名無しさん:2008/09/03(水) 13:15:51
>>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);

とすると、同じサイズのポリゴンを重ねたときに、上のポリゴン全体の
アルファが変わるのではなく、中心部分しか半透明になりません。
これは何故でしょうか?
954デフォルトの名無しさん:2008/09/03(水) 21:56:10
vec4のrとxは同じはずなんだけどな
あとの中心だけってのもよくわからない
とりあえず自分のプログラムのバグを疑って確認するんだ
それでもおかしいようなら最新のドライバを試してくれ
もし古いドライバ使ったりするとGLSLなんかはひどくバグってたりする
955890:2008/09/03(水) 22:27:02
超亀レスですいませんが、
>>891
glReadPixelsでも充分な速度出ますか?テクスチャをロックしたときのように
直接アクセスは出来ないんでしょうか。
>>893
ttp://ruffnex.oc.to/kenji/text/api_hook/
のような方法でglFlushのときに画像取得処理をすればいいんでしょうか
956デフォルトの名無しさん:2008/09/04(木) 01:09:14
>>954
試してみたところ、rはzと同じ値になっていたようですが、もう一度
確認してみるとrとxが同じ値だったので、見間違いしてたんだと思います orz
テクスチャの方もこちらの単純ミスが原因でした orz

最後に1つだけ…
テクスチャ座標を求めるために、テクスチャのサイズをuniform vec2な変数に
入れようと、glUniform2fvで代入したのですが、なぜか0しか入らず、テクスチャ座標を
求めることが出来ません。
ちゃんと変数へのハンドルは取得されており、代入前や代入後にglGetInfoLogARBを
しても特にエラーはなく…
テクスチャの方はちゃんと代入
されているのですが。

聞いてばかりで本当にすみません orz
957デフォルトの名無しさん:2008/09/04(木) 04:41:47
>>956
どうやってshader側に渡されたuniform値を確認しているのかが
よく見えないが、

Textureサイズ(widthとheightのこと?)をuniformで渡している点から
推測してサンプリング座標を操作しているだろうから、texture2Dに
渡している s,t まわりのfragment shaderを確認してみては?としか。

GL仕様でいうところの(s,t)→(u,v)変換がtexture2D内部で実行されるのは
認識しているよね、念のため。
958デフォルトの名無しさん:2008/09/04(木) 10:04:03
>>945-946
ありがとうございます。参考にしてconfigureしてみます。
959デフォルトの名無しさん:2008/09/04(木) 10:44:14
>>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の間に戻す計算のことでしょうか?
960デフォルトの名無しさん:2008/09/04(木) 21:04:34
すいません、自己解決しました。
値のセットがうまくいかなかったのはglUniform2ivではなく、glUniform2fvでしたが、
texSizeをtexWidth、texHeightに分けてglUniform1fvで1つずつ渡すことにより解決できました。
これでなんとかなりそうです。

今までくだらない質問に答えていただき、本当にありがとうございました (';ω;`)
961デフォルトの名無しさん:2008/09/06(土) 23:14:21
基礎の基礎ですまんが、ズームってどうやって実装したらいいんだろう?
いまはglOrthoで空間を定義して、glScalefで拡大縮小してるんだけど、
これだと一定以上に拡大したときにオブジェクトの端が切れちゃう。
CADみたいな感じで無段階拡大縮小ってどうやったらいいかな?
962デフォルトの名無しさん:2008/09/06(土) 23:20:58
頭を前後させれば良いじゃん。
963デフォルトの名無しさん:2008/09/06(土) 23:27:03
(よし、俺面白いこといった!)
964デフォルトの名無しさん:2008/09/06(土) 23:31:07
>>961
orthoのnear/farも一緒に動かしたらいいんじゃね?
965デフォルトの名無しさん:2008/09/07(日) 08:35:17
>>961
glOrthoで指定するleft〜rightとbottom〜topの幅を小さくすればいいんだヨ。
見る範囲を半分にすれば、見える大きさは2倍になるでしょ?

>>964の方法でもいい(というかやってることは本質的に変わらない)けど、
プログラムは面倒臭くなると思うw
966デフォルトの名無しさん:2008/09/07(日) 14:38:16
>>962-965
できた!
お前ら愛してる!
967デフォルトの名無しさん:2008/09/09(火) 10:10:04
勉強中の初心者です。
GL_TEXTURE_2Dで作ったフルカラーのテクスチャを表示したいのですが、
16bitカラーみたいな色むらが表示されます。
どのようにすれば奇麗に表示されるんでしょうか?
968デフォルトの名無しさん:2008/09/09(火) 10:28:19
OpenGLの初期化のときに16ビットカラーを選択してしまっているとか
969デフォルトの名無しさん:2008/09/09(火) 10:52:00
>>968
レスありがとうございます。
サンプルコードをベースにしているので初期化の状況すら把握できていないのですが、
どのようにすれば初期化時に色数を指定できるんでしょうか?

970デフォルトの名無しさん:2008/09/09(火) 13:52:29
OpenGLはmulti-threadできないのかな

OpenGLともうひとつ画面だしてmulti-threadで表示すると
(OpenGLの画面+OpenCVの画面)
OpenCVのほうが止まる…

どうすればいいものか…
OpenGLで2画面ってだせるんでしたっけ…
971デフォルトの名無しさん:2008/09/09(火) 14:52:10
マルチスレッドには対応していない

2画面は出せると思う
972デフォルトの名無しさん:2008/09/09(火) 15:04:28
>>969
環境は?
OSとかglut使用とか
973デフォルトの名無しさん:2008/09/09(火) 20:56:03
glslで動的に配列を作りたいのですが、どうしたらいいですか?
できますか?

uniform int aaa;
として
vec3 bbb[aaa];
とするとエラーになります。
974デフォルトの名無しさん:2008/09/09(火) 22:38:13
>>970
規格としてはマルチスレッドについてはなにも定めてないので実装依存
描画は一つのスレッドでまとめてやるのが無難
NVIDIAの何かのドキュメントではマルチスレッドで描画するにはスレッドごとに別コンテキストにしろって話だった
975デフォルトの名無しさん:2008/09/09(火) 22:45:41
>>973
残念ながら無理だ
定数として埋め込んでその都度コンパイルしなおす、
充分大きな配列を作っておいて一部だけ使うようにする、
テクスチャにしてしまう、
なんかで対処してくれ
976デフォルトの名無しさん:2008/09/10(水) 17:16:37
質問よろしいでしょうか。

glVertexPointer や glTexCoordPointer などの引数がnewやmallocで確保した通常のメモリーへのポインタなのですが、
OpenGLでは頂点配列などをVRAM上に配置することはできないのでしょうか?

大きな頂点配列を持つハイポリな人間モデルなどは、VRAMを食ってでもVRAM上に配置して速度を稼ぎたいのですが・・・。
977デフォルトの名無しさん:2008/09/10(水) 17:23:46
>>976
VBOでぐぐる
978デフォルトの名無しさん:2008/09/10(水) 17:28:25
>>977
ありがとうございます
さっそくiPhoneでも使えるか試してみるとします〜
979973:2008/09/10(水) 18:37:21
了解しましたー。ありがとうございます。
980デフォルトの名無しさん:2008/09/11(木) 00:32:43
アルファチャンネル付き2Dテクスチャを半透明にしたくて
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
としたんですが、エッジが黒く縁取りされたようになてしまいます。
これはテクスチャの作り方が悪いんでしょうか?
981デフォルトの名無しさん:2008/09/11(木) 02:22:00
>>980
エッジというのがテクスチャのボーダーという意味なら、WRAPを
GL_CLAMP_TO_EDGEやGL_REPEATで指定。

エッジが半透明と完全透明の境界という意味なら、透過テクセルの
RGBが0だからそう見えている。テクスチャのサンプリング時にバイリニア
/トライリニアで、透過テクセルのRGBもフィルタリングされているから。

フィルタ不要ならポイントサンプル(GL_NEAREST)にするだけでいいし、
フィルタリングするならエッジに隣接した透過テクセルのRGBを
正しい値で作っておく必要があるかと。
982デフォルトの名無しさん:2008/09/11(木) 03:04:28
RGBの値が常にAを超えることがなく、A=0(完全透過)の場合にRGB=(0,0,0)になるような
アルファの解釈の仕方は、いわゆる "pre-multiplied alpha" というやつだね。
映像業界のポスプロの合成なんかで昔からよく使われている流儀。

この場合、ソースRGBにアルファを再度かけてやる必要はないから、
半透明合成は glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) になる。
983デフォルトの名無しさん:2008/09/11(木) 17:56:55
質問です。
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);しなければ、モデルは真っ赤で描画されます。
984デフォルトの名無しさん:2008/09/11(木) 18:11:20
float ambient = { 0,0,0,0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
でどう?
985デフォルトの名無しさん:2008/09/11(木) 18:13:40
モデルのMaterialのambientが見えてる
986980:2008/09/11(木) 21:44:29
>>981,982
ありがとうございました。
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)で出来ました。感謝!
987ahonoko:2008/09/11(木) 22:05:22
直線の描画について
関数 glBegin()の内部処理について知ることは出来ませんでしょうか?

出来るとすれば、どのソースファイルを読めば良いのでしょう?

助けて下さい。
988デフォルトの名無しさん:2008/09/11(木) 22:10:52
>>987
ソースを見たければMesaというオープンソースなOpenGLの実装がある。
でも、なぜ直線の描画の処理を知りたいのか書いた方がいいんじゃね。
単に直線の描画アルゴリズムが知りたいのか、何かライブラリの内部処理を
知らないといけない事情があるのか。
989デフォルトの名無しさん:2008/09/11(木) 22:17:34
実装はドライバごとに違うから中で何やってるかはわからない
参考実装で良ければMesa3Dについて調べるといい
なんでそんなのを知りたいか書けばもっと適切なアドバイスが出来るかもしれないよ
990ahonoko:2008/09/11(木) 22:44:33
>>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)
といった感じの座標になるのでしょうか。


分かりにくい文章で申し訳ありません。

ご教授お願いします。
991デフォルトの名無しさん:2008/09/11(木) 22:49:42
それならOpenGLの実装を調べるなんてまわりくどいことしないで
直線 描画 アルゴリズム
とかでググった方がいいぜ
992ahonoko:2008/09/11(木) 22:57:04
>>991さん
本当ですね。
皆さん、ありがとうございます。

アホな質問をして、申し訳ありませんでした。
貴重なお時間をありがとうございます。

またよろしくお願いします。
993デフォルトの名無しさん:2008/09/11(木) 22:58:20
昔はブレゼンハムとかソフトで実装してたな。何もかも懐かしい・・・。
994デフォルトの名無しさん:2008/09/11(木) 23:20:52

>>984-985
今手元に環境がないのですが、
984さんので直りそうな雰囲気ですね

GL_LIGHT_MODEL_AMBIENT でぐぐったら、初期値が(0.2、0.2、0.2、1.0)とありました。

Materialのambientは0,0,0,1でしたので、こちらではなさそうです。
お二人ともありがちございました。
995デフォルトの名無しさん:2008/09/11(木) 23:27:24
PS2はDDA
996デフォルトの名無しさん:2008/09/12(金) 09:10:33
デジタル微分解析とかなつかしす
997デフォルトの名無しさん:2008/09/12(金) 17:56:29
次スレまだたってない?
998デフォルトの名無しさん:2008/09/12(金) 18:33:18
998 !!!!!
999デフォルトの名無しさん:2008/09/12(金) 19:27:42
999
1000デフォルトの名無しさん:2008/09/12(金) 20:10:57
1000get
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。