>>140 LGPL はスタティックリンクしてもソースは公開しなくて良いんだぜ。
他人が再リンク可能なようにする必要があるだけだから、リンク前の
オブジェクトファイルを同梱しておけばオーケー。ソースは隠しておけ。
144 :
デフォルトの名無しさん :2007/06/16(土) 01:28:53
>>143 おおっ、トリッキーな情報さんきゅです。
確かにそんなこと書いてあった気がする。
これで恥ずかしい自コードを隠しておけそうですヽ(´▽`)/
145 :
デフォルトの名無しさん :2007/06/16(土) 18:19:21
> LGPL はスタティックリンクしてもソースは公開しなくて良いんだぜ。 嘘はいけないよ、嘘は・・・
>>145 釣りするつもりならもう少し工夫したらどうなんだ?
最近少し頑張りが足りないぞ。
147 :
デフォルトの名無しさん :2007/06/16(土) 18:56:46
おいおい、LGPLは動的リンクでないとLGPLになるよ。 だから、みんな、DLLにしてるのに・・・
>>147 gnu.org 逝って来い
思い込みだけで書き散らしてないで、原文をきちんと読め
というかLGPLなのにソース公開されてないの?
つうか、2007 年にもなって LGPL にソース公開義務があると 思っている人間がいたのが驚きだ…
for(i=0;i<WIDTH;i++){ for(j=0;j<HEIGHT;j++){ /* test source */ glGetDoublev(GL_MODELVIEW_MATRIX, model); glGetDoublev(GL_PROJECTION_MATRIX, proj); glGetIntegerv(GL_VIEWPORT, view); glReadPixels(i, j, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z1); gluUnProject(i, j, 0, model, proj, view, &x1, &y1, &z1); //スクリーン上の座標をワールド座標で取得 /* test source */ } printf(" at (%d, %d) --> ", i, j); printf(" at unproject (%lf, %lf, %lf)\n", x1, y1, z1); } スクリーン上の各ピクセルが、ワールド座標上でどうなっているのか知りたくて 上のようなソースを書いたのですが、変な値が入ってきます。 視点を<10 10 -20>において、<10 10 0>を見ているときに 左端のX〜右端のXを表示しても at (0, 256) --> at unproject (10.552285, 10.465990, -19.000000) at (255, 256) --> at unproject (9.672081, 10.465990, -19.000000) 画面の幅が縦横256なのに、こんな小さな差しか出てきません。 これだとスクリーンは左端〜右端までワールド座標中で約-0.5〜0.5の差でしかないということでしょうか gluPerspective(45.0, (double)w / (double)h, 1.0, 1000.0);はこのようにしております。 スクリーンの点から空間の点を知る方法を教えてください
スクリーン上の点を空間で表すと直線になるけどな。
すみません。仰ってることがわからないです 上のことは、私の勘違いだったかもしれません 画角を90度にして、画面も正方形で作ってみました そうすると距離が1離れているスクリーンは 左端が-1 右端が+1になりますねよね。 それで正しい値だと認識できました。
155 :
デフォルトの名無しさん :2007/06/17(日) 17:02:30
>>152 とりあえず
gluUnProject(i, j, 0, model, proj, view, &x1, &y1, &z1);
↓
gluUnProject(i, j, z1, model, proj, view, &x1, &y1, &z1);
じゃねぇかね?
ワールド座標中でのスクリーンが欲しいときは0にすると以前教えていただきまして z1だとこの場合スクリーンより奥の値になりますよね? ここまでやって、スクリーンに向かって光線を打てると思ったのですが詰まりました…はぁ…
157 :
デフォルトの名無しさん :2007/06/17(日) 19:42:18
>>156 >ワールド座標中でのスクリーンが欲しいときは0にすると以前教えていただきまして
はっきりいって間違ってるよ
>>152 >これだとスクリーンは左端〜右端までワールド座標中で約-0.5〜0.5の差でしかないということでしょうか
そーゆーコトです。(gluPerspectiveに与えたwとhの比にもよりますが)
>gluPerspective(45.0, (double)w / (double)h, 1.0, 1000.0);はこのようにしております。
とのことなので、これはglFrustumでいえば
const double t = tan(22.5 / 180 * M_PI);
glFrustum(
-1.0 * t * w / h,
1.0 * t * w / h,
-1.0 * t,
1.0 * t,
1.0
1000.0
);
に相当しますから、nearクリック面の横幅はw/h*2tan22.5度、となります。
>スクリーンの点から空間の点を知る方法を教えてください
求められているように思えますが・・・。
多分152さんは、前スレの915〜あたりの人ですよね。
もしいまだにnearクリップ面のことを「スクリーン」と呼んでるのなら、早く直した方がいいですよ。
独自の用語を使われると、意志の疎通以前に混乱を招きますので。
>>157 字面だけみると完全に間違ってる(笑)んですけど、
その辺の事情は前スレを見ないと分からないかと・・・。
160 :
140 :2007/06/17(日) 20:18:51
ライセンススレ化してすんません。原文読んできました。 スタリンクするものはLGPLの派生物となるが、例外として、 リバエン/改変などの告知をし、完全かつ機械読み取り可能なオブジェクトコードあるいはソースコー ド(どちらかでも可) と一緒にする。 この「オブジェクトコード」がglui.libを指すのであれば大丈夫ですな
>>159 さん
その節はありがとうございました。
一度他のことで時間を割かれてしまって、もう一度着手しているところです。
ご指摘もありがとうございます。手探りでやっている状態で、、、
上記の方法で、視点位置と、nearクリップ面とを結ぶ直線(レイ)を出そうとして
レイを単位ベクトルにしていざ使おうと思ったのですが
今度はそれと、立方体の面との交点の算出に苦戦しています。
ここはOPEN-GLじゃない、数学のレベルの問題なので、どうにかして頑張ります。
今日は帰れそうになさそうです(´;ω;`)
>>160 >この「オブジェクトコード」がglui.libを指すのであれば大丈夫ですな
違う、アプリケーションを構成する.oファイル全てなので、
公開しないコードの部分も.oは公開しないといけない。
つまり、コードは無くても良いけどLGPLの部分が置き換え可能な状態で無ければいけない。
>>162 が正解
LGPL 部分を自分で改変したバイナリで置き換えられる様に、.o を入手可能にする
必要がある。派生物の所持者が入手可能であれば良いから、世界に向けて公開する
必要は無いよ。
165 :
140 :2007/06/17(日) 22:45:24
>>162 ,164
両氏ともありがとうございました。
オブジェクトコード=.oだったんですね(;゚Д゚)
なるほど、派生物所持者が再びリンクできるようにってことですね。
>世界に向けて公開する 必要は無い
バイナリといえど、ちょっと抵抗があったので安心しました。
重ね重ね感謝ですヽ(´▽`)/
>>163 どうにか無事にレイと面の交差判定、できました!
あとはそれの効率化で頑張ります。
本当にありがとうございました!
c++でもextern"C"で頑張って、 dllやらsoを使うのが簡単な気がする。
光源の明るさを0にして描画しても真っ暗になりません。 具合的には、 GLfloat lightAmb[4] = {0.0f, 0.0f, 0.0f, 0.0f}; GLfloat lightDif[4] = {0.0f, 0.0f, 0.0f, 0.0f}; GLfloat lightSpe[4] = {0.0f, 0.0f, 0.0f, 0.0f}; glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDif); glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpe); GLfloat mateAmb[4] = {1.0f, 1.0f, 1.0f, 0.0f}; GLfloat mateDif[4] = {0.0f, 0.0f, 0.0f, 0.0f}; GLfloat mateSpe[4] = {0.0f, 0.0f, 0.0f, 0.0f}; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mateAmb); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mateDif); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mateSpe); にして描画すると、薄暗く (RGB=0.1, 0.1, 0.1 ぐらいの暗さ) 描画されてしまいます。 原因がわかる人おりますでしょうか? 環境は、GeForce 7900 GS です。
GL_LIGHT_MODEL_AMBIENT
>>169 ありがとうございます。原因わかりました。
デフォルトで環境光 0.2 が加わるなんて、知りませんでした。
171 :
yd :2007/06/25(月) 19:05:50
だれかいますか?
(@u@ .:;)ノシ
173 :
yd :2007/06/25(月) 19:20:10
こんち
174 :
yd :2007/06/25(月) 19:21:49
(x, y) = (0 + 0.557 * cos( 90 ), 0 + 0.557 * sin(90)); をFor文で回したいんですけどうまく逝きません;;
175 :
yd :2007/06/25(月) 19:31:25
円上にポイントを64個、均等に置きたいんですm(__)m
これはひどいマルチ
>>175 int i;
float a;
const float b = 3.1415926535897932384626433832795028*2/64;
glBegin(GL_POINTS);
for(i = a = 0; i < 64; i++, a += b)
glVertex2f(cosf(a), sinf(a));
glEnd();
足し算は駄目だろ…
>>180 でも差は、6.283185-6.283182=0.000003だけどな。
182 :
yd :2007/06/26(火) 04:01:08
ありがとうございます。早速試してみますm(__)m
どういたしまして
フィールドシーケンシャル 3DをOpenGLで実装したいのですが、 方法はさておき、左右の画像を1/2に間引きして交互に合成すれば いいのでしょうか。こんな感じに 右右右右右右右右右右右右右右 左左左左左左左左左左左左左左 右右右右右右右右右右右右右右 (繰り返し) 左左左左左左左左左左左左左左 資料があまりないので確証がとれません。どこかにありませんか。 英語サイト可です。
立体視の話?
そうです。 例えば、 640x480右画像 640x480左画像 ↓ 奇数行は右画像から 偶数行は左画像から ↓ 640x480の(裸眼では見るに堪えない)画像 でいいのでしょうか。それをOpenGLでやりたいんですが。もちろん動画です。
あなたがお使いのフィールドシーケンシャル方式のデバイスの 仕様に沿った形で画像データを渡せばよろしいかと思います。
188 :
yd :2007/06/27(水) 12:11:18
円周上にうたれた点に対して、1個飛ばしに円弧で結んでいきたいんですが 直線ニナら結べるんですけど、円弧だとどうアプローチしていいかわかりません やさしい人教えてください。
ニナがキモイ
円周上の点を円弧で結んだら1個飛ばしとか関係なく全部の点通るんじゃね? それはともかくOpenGLでやるなら細かい直線に分けて書く それも面倒ならgluPartialDisk ニナって誰?
191 :
Light :2007/06/27(水) 22:26:40
脳の視覚システムを研究している者です。
リンク先のような画像をOpenGLで作製したいのですが、うまくいきません。
http://en.wikipedia.org/wiki/Image:Monocular_rivalry.png いまのアルゴリズムは、赤線を描いた後、緑線を描いているんですが、
それだと上描きしてしまうことになるので、リンク先の画像のように、
重なった部分が混ざり合ってぼけた感じになりません。
また、赤と緑を別々に描くと、僕のiMacだと後の方に描いた線が
バチバチします。計算量が無駄に多くなってしまっているのかもしれません。
何か良い解決方法はないでしょうか?
閃いた方、ぜひぜひご教授ください。
混ぜるのは色のアルファを指定してBlendしてくれ ブレンドについてはGL_BLENDとかglBlendFuncで調べれば出てくるはず パチパチというのはよく分からないがZ比較してるんでないかい? glEnable(GL_DEPTH_TEST)をやってたらglDisableにしてみれ あとこのレベルの質問はくだすれOpenGLスレに書いた方が適切と思われる
同業界人かよ パチパチはvsyncに同期してないか、 ダブルバッファリング関係かどちらかかと思われる
194 :
Light :2007/06/28(木) 23:39:57
>>192 & 193の方へ
回答、ありがとうございます。
GL_BLENDは可にしていたんですが、glBlendFuncのパラメーターが良くなかった
ようです。glBlendFunc( GL_SRC_ALPHA, GL_ONE );でうまく色を融合できました。
バチバチは、glutIdleFunc( idle ); を入れると起こってしまいます。
ただし、idle関数の中身は、glutPostRedisplay();です。
glutSwapBuffers()を使っています。
もう少し自分でやってみて、また判らなければ「くだすれOpenGLスレ」に
投稿したいと思います。
195 :
デフォルトの名無しさん :2007/07/03(火) 02:15:15
手抜きOpenGlにあるサンプルが起動しません。 どうしたらいいのですか?
>>195 どういうふうに起動しないのよ?
環境わからんからなんとも言えんけど、GLUTは適切にインストールされてる?
197 :
デフォルトの名無しさん :2007/07/03(火) 08:25:16
【派遣ネガティブ根性チェック】 3つ以上、チェックがつけばアナタの性格はひん曲がっており、 ネガティブ負け組派遣人生を歩んでいます。 □派遣先正社員の作った糞開発ツールはたとえ腐っててもマンセーして使う □派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする □昼食は必ず派遣先の社員と行くべきだ □自分の仕事で問題が発生しても解決するのは自分の仕事ではない □派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい □自社で仕事なんてできるわけがない □派遣労働の問題点の話題が出ると感情剥き出しにして反論する □派遣労働の問題を指摘する人は嫌いだ □派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい □奢ってくれる派遣先正社員を尊敬する □自分の月額金額を知らないのは当然だ、単金を聞いてはいけない □派遣先正社員より自分の生涯収入が低いのは当然だ □チビは派遣先にかわいがってもらいやすから派遣には有利だ
プログラマー板でやれ
HaskellでOpenGL使ってる人いる?
いらない
俺もいらね
203 :
デフォルトの名無しさん :2007/07/03(火) 21:35:56
OpenGLなんて単独で使うもんだ 余計なもんなぞ糞
何がいらないのかまったくわからないのですが
そうですか
>200-202の流れにはワラタけど >203は全く意味がワカランなぁ・・・ OpenGL単独で一体何ができるってんだか。肝心の絵すら出ないよw
OpenGLが自我をもって動き出す 行く先も分からぬまま
行く先と言えばLongsPeakって出るの今月だっけ? ほんとに出るのかな…
>>209 …描画ロジックを分離するとOpenGL単独でいけるんだ。
…へェ。
俺もOpenGL単独で使いたい! 極意を教えてください!!
メンテナンス性を考慮してできるだけOpenGL単独になるように設計するだろ、普通
>>200 Haskellみたいな純粋に近い関数型言語ってよく知らないんだけどさ、
OpenGLみたいなStateMachineとの相性って悪くないの?
あれかな、モナドとかいうやつを使ってむにゃむにゃするのかな?
>>212 言語との組み合わせでどう?といわれているのに
単独とかわけの分からないこと言ってるから突っ込まれてるんだろ
>>204 HaskellでOpenGL使ってる人
ウィンドウとレンダリングコンテキストとフレームバッファがひとつに くっついているのって扱いにくくないですか? スレッドにカレントコンテキストを設定するのもグローバル変数のようで プログラムが複雑になるような気がします。
OpenGLのせいではありません。M$に文句言ってください。
D3Dはそのへんちゃんと作ってるのがムカつくなw
そうか? D3DでもDeviceは一個しか作れんし、結局グローバル変数にしちゃわない? デバイスを使用する関数にいちいち渡してたらそっちの方が複雑になるな あとは次バージョンのOpenGLにご期待ください
>D3DでもDeviceは一個しか作れんし 二個以上作れるしデバイスのAPIが複数スレッドからの 呼び出し可能にするオプションもあるんだなこれが。 ゲームはともかくツールとか作る時には未だにwgl*の適切な取り扱いがよーわからん。
そうなのか、昔やった時は1個しか作れなかったからそういう物だと思ってた 確かにツールとか複数ウィンドウに描画する場合はコンテキストの管理が面倒だな 設定は独自管理にしてコンテキスト切り替え時に必ず設定するようにするのがいいのかな しかしマルチコンテキストの場合は何が共有できるのか分かりづらいのが困る… これが嫌でpbuffer諦めてFBOにしたしな
内部で OpenGL を使うライブラリを作成するときに,ユーザーが 別に OpenGL を使っている可能性があるからライブラリの関数を 呼び出すごとにコンテキストの退避,切り替え,復元をしなけれ ばならないから非効率
それはそのライブラリの仕様が悪いだけのような…
ライブラリの作り方をずっと考えてきたがうまいやり方が思いつかなかった。 OpenGL をライブラリ内部に隠蔽してユーザと同じスレッドで動かすライブラリ の場合,ユーザが設定するコンテキストの影響を受けてもいけないし影響を 与えてもいけない。 結局ライブラリの関数に入ったときにこっそりコンテキストを切り替えて 関数から出るときに元のコンテキストに戻す方法しか思いつかなかった。
OpenGL 3.0 は D3D10 とほぼ同じ API にしてくれないかな。 そのほうが学習も楽だし,GPU ベンダーも楽になるのに。
それはない。何か(考えが)浅いな。
Fahrenheitというのがあってな…。
>226 今後はしばらくAPIの策定がD3D先行なのは間違いないから インターフェイスはともかく出来ることはほぼ同じになるだろうね 少なくともD3Dで出来ることはGLでも出来るようになる(速度は知らんが
なってくれないと困る
231 :
デフォルトの名無しさん :2007/07/19(木) 23:25:16
OpenGL初心者の者です.言語はjavaを使っています. 修士研究で使用していますが,周りに使っている人がいないので聞けない状況 です. 解析で出た速度ベクトルを,glutSolidConeで描画したいと思っています. 流体なので,複数のベクトルがあり,陰影がついていないと見づらいのです. for文で描画しようと思っています. 問題があり,glutSolidConeは,デフォルトでZ軸方向を向くようになっています. これを回転させて,求めたベクトルの方向に向かせたいのですが,分かりません. Z軸をこの方向に向かせたとして,他の2軸の向きがどうなろうと かまわないのですが,Z軸に向かせるだけなのにできません. 調べたところクォータニオンというものがあり,便利ということですが, あまり資料がありません.また,CGが研究の主題なのではなく, 描画自体はシンプルなものなので,ここまでやらなくてはいけないのか 悩んでいます. 良い方法があったらよろしくお願いしま
>>231 回転行列の3列目に向かせたい方向のベクトル入れたらええんちゃうのん?
残りの2列は直交するように適当に
233 :
デフォルトの名無しさん :2007/07/19(木) 23:42:29
それは,glRotatefを使用しない方法でしょうか? 詳しくないものですいません.
>231 四元数でもいいけど、glMultMatrix()使うのが分かりやすいかと。 Z軸が (x, y, z) の方向を向いて欲しいなら、 GLfloat m[16]={x0,x1,x2,0, y0,y1,y2,0, x,y,z,0, 0,0,0,1}; glMultMatrixf(m); (glutSolidCone...) て感じ。Cしか知らないので自分で適当にJavaに翻訳してね。 あ、事前に(x0,x1,x2)と(y0,y1,y2)と(x,y,z)は互いに直交するように かつ正規化されているように設定する必要がありますヨ。
235 :
デフォルトの名無しさん :2007/07/20(金) 00:04:27
ありがとうございます. 調べてやってみたいと思います. >234 あ、事前に(x0,x1,x2)と(y0,y1,y2)と(x,y,z)は互いに直交するように かつ正規化されているように設定する必要がありますヨ。 の部分がはっきりしないのですが, (x0,x1,x2)と(y0,y1,y2)はどういったベクトルなのでしょうか? ・向かせたい方向(x,y,z) ・直行するベクトル→(x0,x1,x2)と(y0,y1,y2)は (x0,y0,z0),(x1,y1,z1)と解釈 でよろしいでしょうか? かつ,(x,y,z),(x0,y0,z0),(x1,y1,z1)はそれぞれ正規化されたベクトル ただし,今回は(x0,y0,z0),(x1,y1,z1)は適当に与えればよい. でよろしいでしょうか?
236 :
デフォルトの名無しさん :2007/07/20(金) 00:13:51
>234 教えていただいたことで分からない点がもう一つありました. 仕様が違うのかもしれませんが… 「glMultMatrixf(float[],int)は(float)に適用できません」と出てしまいました. 引数で,int型のある数が必要らしいのですが,知っていれば教えていただけませんか?
>235 座標変換前のx軸とy軸が座標変換後に向く方向、って意味で(x0,x1,x2),(y0,y1,y2)って 名前にしましたけど、かえって分かりづらかったですか。w まぁ、名前なんて(x0,x1,x2)だろうが(x0,y0,z0)だろうがどうでもいいんで気にしない方向で。 要は、座標変換後もxyz軸が直交して欲しいなら三つのベクトルを直交させないといけないし、 また座標変換後のxyz軸の大きさが変わらないで欲しいなら三つのベクトルが正規化されてないと いけないわけです。GLと関係無い、数学の話ですね。 glMultMatrixf()の二番目の引数ってなんだろ。Cにはそんなの無いんですが。 てかAPIのリファレンスとかwebで調べれば良いだけの話では。
238 :
デフォルトの名無しさん :2007/07/20(金) 01:25:37
>237 分かりました,ありがとうございます. 3次元の座標変換というものに慣れていないので,質問しました. 調べてみればみるほど,数学の話になるので仰るとおり理解するには 数学的にしっかり理解しなければいけないようです. APIの方も見ようと思います. ありがとうございました.
>238 改めて考えてみたら、glMultMatrixを使うのは無駄多いかも。 要するにz軸(0,0,1)を任意の方向(x,y,z)に向けられればいいわけだから・・・ Vz=(0,0,1)→V=(x,y,z) 回転軸Vr(rx,ry,rz)は Vr = Vz x V (外積) 回転角度aは a = arccos(Vz・V) (・は内積、Vは単位ベクトルとする) このVrとaが、そのままglRotateの引数に使える、の、かな。 Vz = (0,0,1)を入れて具体的に計算すると、 Vr = (-y, x, 0) a = arccos(z) これを、速度ベクトル一個ずつに対応して保存しておけば、 描画するときにglRotate(a, Vr.x, Vr.y, Vr.z)でいけるはず。 ただしGLの角度表現はradじゃなく度なので注意。 あとV(x,y,z)がz軸に平行なときは計算が別になるけど、ま、それは分かるでしょ。
>236 2 番目の引数は配列のオフセット。 C → glMultMatrixf( m + 10 ); Java → gl.glMultMatrix( m, 10 );
>>239 直接基底作ってglMultMatrixのほうが明らかに計算量が少ないと思うが・・・
242 :
デフォルトの名無しさん :2007/07/21(土) 01:25:26
昨日質問した者です. >239 なるほど,そういう方法もあるんですね.glRotateの引数には,1.0fか0.0fを 入れる方法しか知りませんでした(汗) >240 オフセットですか.APIを見ても???という感じでしたが,オフセットで調べたいと 思います. みなさんありがとうございます.諦めかけていましたが,なんとかなりそうです.
>>241 >glMultMatrixのほうが明らかに計算量が少ない
そうでもない。
・パラメータの転送量が多い
・(OpenGL内部での)逆行列計算が大変
てことで、glMultMatrixは負荷が大きいよ。
対してglTranslate,glScale,glRotateは逆行列の計算が速い。
ま、自分ではベンチとって比べてみたことは無いけど。一般的には、
MultMatrixを使うよりはTranslate/Scale/Rotateを使うべきと言われてるね。
それに事前の計算量もメモリ消費量も、このケースでは
234の方法 > 239の方法 だと思うけど・・・。
244 :
薄汚い派遣の国、日本 :2007/07/22(日) 17:53:13
最近、職場で「出戻り寄生派遣」という言葉が囁かれています。 派遣契約を切られたにもかかわらず「次の派遣先でも切られてしまって生活できません」 などと 言って泣き落としで現場責任者に一切話がないまま再契約した派遣のことです。 今月初め、半年前に切った派遣が出社してきてマネージャーも含めみんなびっくりしました。 影でコソコソ偉い人に泣きついて再契約したそうです。同じ部署の人には黙って・・・ そんなことまでして自宅の近くの派遣先にこだわって人間として恥ずかしくないのですか。 派遣でスキルアップ、派遣で収入アップとか言うなら一箇所にしがみつかず 複数の会社を渡り歩いてください。 ひとつの会社で派遣向けの単調な仕事をしていたらスキルアップなんてありえないでしょう。 身分不相応な商品のローンを払うために派遣だと当然足りない収入は親にも寄生して、 いつ切られるんじゃないかとビクビクしながら人事権のある人間とだけ仲良くし、 契約終了を通知されれば泣き落とし。悲惨な人生ですね。 氏んだほうがいいんじゃないですか。
XPだとうまく動いてたプログラムが Vista だと glBindTexture での テクスチャの切り替えがうまくいかねぇ・・・・ ググっても同様の症状は出ないので自分のコードのどこかが 行儀悪いんだろうが何がいけないのやらさっぱり・・・ orz
とりあえずOpenGL-D3D Translatorで動かしてみたら?
【派遣ネガティブ根性チェック】 3つ以上、チェックがつけばアナタの性格はひん曲がっており、 ネガティブ負け組派遣人生を歩んでいます。 □派遣先正社員の作った糞開発ツールはたとえ腐っててもマンセーして使う □派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする □仕様とは正社員から口伝されるものだ □耳で聞いた仕様を正確に覚えていないのは自分の責任だ □昼食は必ず派遣先の社員と行くべきだ □自分の仕事で問題が発生しても解決するのは派遣の仕事ではない □自社で仕事なんてできるわけがない □派遣労働の問題点の話題が出ると感情剥き出しにして反論する □派遣労働の問題を指摘する人は嫌いだ □派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい □奢ってくれる派遣先正社員を尊敬する □自分の月額金額を知らないのは当然だ、単金を聞いてはいけない □派遣先正社員より自分の生涯収入が低いのは当然だ □チビは派遣先にかわいがってもらいやすいから派遣には有利だ
245ですが原因わかりました。-_-;.. glBindTexture でテクスチャを切り替える時に、XPだと、 glBindTexture( GL_TEXTURE_2D, テクスチャ1 ); /* テクスチャ1有効 */ glBindTexture( GL_TEXTURE_2D, テクスチャ2 ); /* テクスチャ2有効 */ とダイレクトにバインドして問題ないんだけど、 Vista の場合、 glBindTexture( GL_TEXTURE_2D, テクスチャ1 ); /* テクスチャ1有効 */ glBindTexture( GL_TEXTURE_2D, 0 ); glBindTexture( GL_TEXTURE_2D, テクスチャ2 ); /* テクスチャ2有効 */ glBindTexture( GL_TEXTURE_2D, 0 ); と、名無しテクスチャに戻してやらないと他のテクスチャにバインドし直せなかったです。 うーん・・・ 赤本(原書第5版)の glBindTexture のサンプルコードは上の書き方だったけど この辺何か文献でてましたっけ。 勉強が足らんなぁ・・・ >> 249 サンクス!! OpenGL描画中にGDIはいじってないので大丈夫そうです。 自分の元のコードが Aero の On/Off に関わらず発症すること、 上記の修正をして Aero の On/Off に関わらず修正されたことを確認しました。 以上、お騒がせしてすんませんでした・・・・ orz
>>250 BindTextureに0を指定することって普通無いと思うが、不思議な現象だな
まだVista用のグラフィックドライバがバグってるってだけかもしんないね
おいらンとこではBindTextureで0をバインドしなくてもVistaで普通に動いてるよ。 てか今まで特に不具合は出てないな。
>>250 定番だけどドライバを更新。もうやってそうだけど。
>>251 無名のテクスチャを指定するときに0を指定するんじゃなかったかな。
254 :
デフォルトの名無しさん :2007/07/27(金) 18:17:26
Vista標準のドライバを使っているといったら、なぐる
>>254 とはいえ、標準ドライバでも最低限まともに動くようになってないとね・・
なんせ「標準」ですからね・・
>>252 ですよねぇ。自分のOpenGL作法がおかしいんだろうなぁとは思うんですが、
テクスチャ以外は問題ないし、毎回 gllTexImage2D() する分にも問題ない。
glBindTexture だけが思うように動かない。謎です。
みなさんどもありがとです。m(_ _)m
256 :
名無しさん@そうだ選挙に行こう :2007/07/29(日) 13:16:20
うちのプロジェクトでは、Vista添付のドライバでOpenGL動かしたら、 WindowsXPのベンダー提供ドライバ時の約6%しか、速度がでなかった。 Vista対応ドライバを入れると、解決した。 よって、Vistaの添付ドライバは全く信用していない
遅いのはD3Dへのtranslatorだからってだけの話 信用云々とかあふぉくさ
258 :
デフォルトの名無しさん :2007/07/30(月) 01:13:23
全然詳しくないので質問させてください。 いつも仕事中にWebばかり見てる派遣クンが 「OpenGLがプログラムどおりに動かない原因を調べるのは僕の仕事ではありません。」 と言っています。 彼のOpenGLプログラムが動かないのを調べるのは誰の仕事なのでしょうか?
まともに論破する技量も無いお前の仕事
こういうバカを論破しようとチャレンジするなんて尊敬するよ 俺なら論破以前に派遣契約を切るからな
それスクリプト
>>259-260 論破しようにもそういう奴って話通じないだろ
「僕は言われた通りにやりました!何で僕が調べないといけないんですか!」
なんて言われたひにゃ俺ならマジギレしそう
>>262 話通じない奴が居るって時点でお前も話通じなそうだな
>>263 日本語をしゃべってれば話が通じるなんて考えは甘いよ。
>>263 お前ずいぶん恵まれた環境で仕事してるんだな
マ板池
267 :
デフォルトの名無しさん :2007/07/30(月) 05:45:57
契約内容見直せよ。
258はDirectXスレでも単語が変わっただけの同じのみたな
270 :
デフォルトの名無しさん :2007/08/04(土) 19:23:43
MacでOpenGLやりたいんだけどXcodeでプログラミングすれば平気?
CocoaでやんのかCarbonでやんのか知らんがまぁがんばれ
今日から始めたんだが解説サイトとかすごく少なくて不安… 日本語で基礎からガッチリ固めたかったらあの高い赤本しかないの? せめて5000円以下でないだろうか
>>258 人材配置を見直してもらうか、仕事振ってるマネージャーを変えてもらえ
やはり英語か… 覚悟きめてがんばるわ
古い赤本はほんとうに古いから参考になるかどうか… 図書館は無ければリクエストしてみるといいかも でも入るまでかなり時間かかるかな
日本語の赤本もようやっと原著第5版になってるしね。 英語で格闘する労力と13k円の出費のトレードオフを考えてオレは買った。>赤本
昔の赤本(初版)はもってるんだけど、最近のとどこが違うのでしょうか?
280 :
デフォルトの名無しさん :2007/08/06(月) 21:10:38
図書館てOpenGLみたいなマニアな(?)専門書って置いてるものなの?
比較的メジャーなマニア本だからな。
282 :
デフォルトの名無しさん :2007/08/06(月) 22:42:51
>>279 Amazon.co.jp: OpenGLプログラミングガイド 原著第5版: 本: OpenGL策定委員会,松田 晃一
http://www.amazon.co.jp/dp/4894717239 > ■OpenGL バージョン1.5 で追加された以下の新しいコア機能:頂点配列のバッ
> ファオブジェクトへの格納/遮蔽問い合わせ/シャドウマッピング用のテクス
> チャ比較関数の追加/トークンの更新
>
> ■OpenGL バージョン2.0 で追加された以下の新しいコア機能:シェーダ記述言
> 語の追加/プログラマブルシェーダからの複数のカラーバッファへの異なる色の
> 出力/テクスチャマップに関する2 のべき乗のサイズ制限の緩和/テクスチャ
> マップされた点スプライトのレンダリング/前面と背面ポリゴンでのステンシル
> 処理の分離
>
> ■バグ修正
だそうです。
OpenGL1.5とOpenGL2.0についての追加と、訳の見直しが行われている模様。
俺もほしい
第2版までは翻訳業者が訳してたから読みにくかったね
>>279 ・より赤くなった
・1,000円高くなった
不覚にも笑ってしまった しかしせめて8000円ぐらいに…
287 :
デフォルトの名無しさん :2007/08/07(火) 02:39:49
> 原著第5版 テクスチャへの描画とか、実際に使う際の普遍的なチップスとかって 載ってますのん? そういうのは、Game Programming Gems買えって事かな? (そろえたら、赤本よりたけええけどよぉおぉ)
Gems にそんなの載ってたっけ
>>287 テクスチャへのレンダリングにはGL_EXT_framebuffer_objectを使う。
この拡張機能はOpenGL 2.0の仕様に含まれていないから当然赤本には載ってない。
290 :
デフォルトの名無しさん :2007/08/07(火) 22:16:01
ああ、使用に含まれてない=載ってないか・・・ そうだよなあ
赤本は昔からextensionには触れないからね
293 :
デフォルトの名無しさん :2007/08/19(日) 23:15:27
よしはる別スレに今も登場中
wwwwwwwwwwww
ざまぁwww
すみません。 OpenGLでなくGLSLでVertex texture fetchをしたいのですが、 テクスチャを取ってくるときの関数はフラグメントシェーダと同じように、 texture2Dやtexture2DRectを使うのでしょうか?
299 :
デフォルトの名無しさん :2007/08/24(金) 21:08:31
GeForce8600GTにしてからたまに描画が異様に遅くなるんですが、似たような症状に遭って解決できた方いませんか? VBOにデータ置いても直らず、シェーダやテクスチャはおろか、ライティングすらしてないモデルでも再現。 WindowsXPで、ドライバは最新(162.18)とベータ版(163.44)両方で発症。 GeForce6000系や7000系では問題は起きませんでした。 プログラムを何度も起動しなおしたら上手くいくこともあるのですが…。
盲点でした、が、マシン起動直後でも起きるので、単純に熱だけが原因ではなさそうです。 あとDirectXのゲームとかでは同様の問題は起きず。 # もう検証疲れた…。ドライバが腐ってるせいってことにしたいorz
VBOに書き込む際のバッファオーバーランとか
glInterleavedArray()/glVertexPointer()系 + VBO使用/未使用の組み合わせ、 glBegin()〜glEnd()、の5パターンで同じモデルを描いてみましたが、全てで発症しました。 モデルは立方体を1000個程描いてるだけです。
とりあえずプログラムうp
>>305 ちょっと公開したくない部分があるんで、
問題が起きる最小限のプログラム用意してみます。
お、えらい。 大抵公開できない部分があるのでそこを何とかお願いしますとかが多いのに。
unzip.dllが古いんじゃね
WindowsXP標準の圧縮フォルダで展開できるZIP形式でお願いします。
そのぐらいじぶんでやれよ
そのままで自動ダウソすると失敗するぽいお リンク押してダウソしたら解凍できるんでないか
unzip コマンドで普通に展開できたよ
>>308 うちのgeforce8800gtxでもbad.jpgと同じぐらいのスピードになった。
GLexpertから何もメッセージがでてない(標準出力は起動時につくられるstdout.txtに出力されるんだよね?)
っぽいし、ソースコードをざっと読んだけど原因はよくわからなかった。
そういえば、geforce6000, 7000で毎framePBOにデータを送るようなプログラムを書いていたときに
数秒後に急に倍近くfpsが上がることがあった。
ドライバが消費電力を低くするために裏で負荷に合わせて使用するシェーダの数を調整したりしてるのか?
教えてエロ詳しい人
Vista yaneurao
321 :
デフォルトの名無しさん :2007/09/01(土) 13:24:30
>>308 ずっとこんな感じで推移。
http://gamdev.org/up/img/10058.jpg たまにぐっと負荷がかかるようだが、見た目はスムーズ
たぶん常駐が多いせいだと思う
環境は、
CPU: Pen4 2.6GHz
メモリ: 1.5GMB
GPU: Sapphire RADEON X700
今時だと、さすがにプア環境でアレだが
しかし、きれいやねー参考にさせていただこう
322 :
デフォルトの名無しさん :2007/09/01(土) 13:27:04
メンゴ書き忘れ OS: Windows XP SP2 32bit GPU DRIVER: ATI ver 8.342.0.0
OpenGL 3.0て具体的にはどんなんになるんだ。
あれだろ コンセプトだけ言って、具体的には何もできてないっての
326 :
デフォルトの名無しさん :2007/09/05(水) 16:55:37
>>325 それは、もまえ、OpenGL自体を馬鹿にしているのかw
むしろ、交差とか法線計算とかエッジ検出とか・・自動でやってくれるようにはならんかね。 楽したいんじゃ。ワシャ。 この前セレクション出来るようになったばっかなのに(^ω^;;)
>>308 nVidiaのドライバの設定にあるtheaded optimizationがautoになってると遅くなったり速くなったりするようだ。
onにすると常に速く、offにすると遅くなるようだ。
このオプションはマルチコアCPUで複数スレッドを使って高速化するかどうかのオプションらしい。
fpsが60以上になるとだんだんとCPU側がボトルネックになってきてるんかな。
>>327 そういうのはwild magicとかなんとかライブラリを使えばいいんじゃない?
329 :
308 :2007/09/06(木) 08:33:45
>>328 うお、ありがとうございます。
ただ、うちだとoffにすると常に速くなるようになりました。
(FPS60超える/超えない関係なく)
なんかこれ不気味なオプションですね…。
330 :
デフォルトの名無しさん :2007/09/23(日) 10:52:18
glGenTextures()してgluBuild2DMipmaps()した画像のテクスチャが、 ウィンドウがリサイズされたときにSDL_setVideoMode()すると画像が無くなってしまうのですが、仕様ですか? リサイズされたときビューポートをウィンドウと一致させたくて毎回SDL_setVideoMode()しているのですが、 glViewPort()を使ったほうがいいのでしょうか?
カラーマップの使い方がいまいちわかりません おしえてください
>>331 ウインドウのサイズが変わるたびにglViewportするべき
だと俺は考える
リサイズでビューポートとprojection matrix設定しなおしてるんだけど、 そうするとディスプレイリストが無効になることがあります。 リサイズのときにディスプレイリストを消して作り直すことにして回避したけど、 これはそういうものですか? それともどっかおかしい?
>>334 俺の経験上、ウインドウのリサイズでディスプレイリストを作り直すってことは無いな…
glRasterPosとか使ってるのかな??
>>331 ならglTexParameterのGL_TEXTURE_MIN_FILTERなり、GL_TEXTURE_MAG_FILTER
なり
と思ったりするけど、どうなんかなぁ〜
ウィンドウ全体を FBO あるいは pBuffer でテクスチャに取り込んで、自前でダブルバッファリングをしようと考えています。 しかし、もしウィンドウのサイズが最大テクスチャサイズを超えてしまうとどうしようもありません。そういう場合どうすればいいのでしょうか?
>>336 いくつかのテクスチャに分割するしか無いだろうな
glTexImage2Dでは2^n乗のサイズしか指定できませんが、 gluBuild2DMipmapsではどんなサイズでも指定できることに関して、わからない点があります。 ミップマップは使う必要がない場合、例えば100*200の画像をglTexImage2Dでテクスチャ化しようとしたとします。 ここから128*256というサイズのテクスチャを作るところまではいいのですが、 そうした場合、100*200に対してはみ出ている部分も含めて、128*256のテクスチャがopenGLに渡されますよね。 そうすると、glTexCoord2fに指定する値は、(0〜100/128) * (0〜200/256) としなければ、 こっちが広げてやった余白(?)も表示されてしまいます。 しかし、gluBuild2DMipmapsで100*200を指定してやった場合は glTexCoord2fに指定する値は、(0〜1) * (0〜1) でうまくいきます。 これはどういうことですか?glTexImage2Dを使ってテクスチャを作った後、 任意のサイズの元画像にたいして、glTexCoord2fに指定する値を(0〜1) * (0〜1) で操作できるようにする方法を教えてください。
2.0以降ならgluBuild2DMipmaps使わんでも 非2^nのサイズ扱えるし、ミップマップも生成してくれる。(パラメータの設定次第
>>331 ,334
Windows上のSDLだとsetVideoModeするとOpenGLのコンテキスト作り直される
設定やらディスプレイリストやらテクスチャは全部作り直す必要があるぞ
Windows以外ではどうなってるかわからん
>>339 てことは内部で既に縦横比が変更されてるんですね。ありがとうございます。
>>340 >(パラメータの設定次第
調べてみます。
>>341 ありがとうございます。やはりそうなんですね。ウィンドウリサイズにはglViewportだけ動かすようにしました。
343 :
デフォルトの名無しさん :2007/10/11(木) 13:21:30
>>341 ゲッ!
もしかして、OpenGLで、DirectDraw使って全画面表示やってた時に、
環境によって、うまく動かなかった(画面真っ黒)のは、もしや、これのせいだったのか?
Geforceでは、うまく動いてたからなぞだったんだが・・・
スキンメッシュについて学びたいんだけど、 いいサンプルとかない?
OpenGLを使って作った画像の情報が欲しいんですが キャプチャ以外で画像の情報(RGBなど)はとってこれるんでしょうか
glReadPixels
>>346 ありがとうございます。調べてみました。
いろんなサイトのサンプルを見てみたのですが
具体的にどのようにプログラムすればいいのかどうしてもわかりません・・
(出てきた画面をキャプチャしたいんですが、どうすればいいんでしょうか)
>>347 少なくとも
unsigned char pBuffer = new unsigned char[WIDTH*HEIGHT*4]; // sizeof(RGBA)==4?
glReadPixels(0,0
WIDTH,HEIGHT
GL_RGBA,
GL_UNSIGNED_BYTE,
(GLvoid *)pBUffer);
この位は実験してみようや。
オフスクリーンの DIB にOpenGLで描画してビットマップ参照しれ
GPUレイトレっぽいことをやりたくて、バウンディングボックスの各面からレイを放って 各面に3次元テクスチャを並行投影したくて下記のようにしてるのですがどうも表示がおかしいのです。 確認したいのですが、これはちゃんと各頂点に、テクスチャ座標の0と1が対応されてマッピングされていますよね? void vertex(float x, float y, float z) { glActiveTexture(GL_TEXTURE0); glMultiTexCoord3fARB(GL_TEXTURE0_ARB, x, y, z); glVertex3f(x,y,z); } void drawQuads(float x, float y, float z) glBegin(GL_QUADS); /* Back side */ glNormal3f(0.0, 0.0, -1.0);vertex(0.0, 0.0, 0.0);vertex(0.0, y, 0.0);vertex(x, y, 0.0);vertex(x, 0.0, 0.0); /* Front side */ glNormal3f(0.0, 0.0, 1.0);vertex(0.0, 0.0, z);vertex(x, 0.0, z);vertex(x, y, z);vertex(0.0, y, z); /* Top side */ glNormal3f(0.0, 1.0, 0.0);vertex(0.0, y, 0.0);vertex(0.0, y, z);vertex(x, y, z);vertex(x, y, 0.0); /* Bottom side */ glNormal3f(0.0, -1.0, 0.0);vertex(0.0, 0.0, 0.0);vertex(x, 0.0, 0.0);vertex(x, 0.0, z);vertex(0.0, 0.0, z); /* Left side */ glNormal3f(-1.0, 0.0, 0.0);vertex(0.0, 0.0, 0.0);vertex(0.0, 0.0, z);vertex(0.0, y, z);vertex(0.0, y, 0.0); /* Right side */ glNormal3f(1.0, 0.0, 0.0);vertex(x, 0.0, 0.0);vertex(x, y, 0.0);vertex(x, y, z);vertex(x, 0.0, z); glEnd(); } drawQuads(1.0,1.0,1.0)
3次元テクスチャを並行投影ってどういう状態? そのコードだと、サイコロの各表面に2次元テクスチャを貼り付けてるのと大差ない気がするが。 3次元テクスチャの各表面を貼り付けてるだけで、内部は描画されていないが、そのへんは理解してるか?
その辺は理解しています。
サイコロの各面から、内部に向かってレイを放ってテクスチャのピクセル色を決定して(フラグメントシェーダ)
それを貼り付ける、といったことをしようとしてこうなっています。
ttp://www.uploda.org/uporg1073971.jpg これは0〜64までの3次元テクスチャに
4〜60まで、テクスチャ在りにしたものを、45度程度傾けたものなのですが
テクスチャがある部分を内側になればなるほど、緑〜赤のグラデにしたものです。
6面全体に一部分だけが表示されてしまって、立方体の形状が出てこなくて…
>>351 各頂点にテクスチャ座標の0と1は渡ってるよ。
ActiveTextureは余計な気がするけどまぁいいか。
>>355 ありがとうございます。
とりあえず3次元テクスチャが格納されている側面が写し取られている、と確信がもてて安心しました。
ということはフラグメントプログラムの方なのかな…
fragmentの方でfor文を使うと
error C6001: Temporary register limit of 32 exceeded; 201 registers needed to compile program
こんなエラーが出てきて、本来走査するべきところまでいけなくて64回繰り返すところを
4回くらいしか深度を進めなくなっています
ただ、CgじゃなくてGL_TEXTURE_3Dでも同じような表示がされてわけがわからんくなってます。
Cgで同じようなエラーが出たことがある方がいたら…
よく知らないんだけどさ、文法上はforとか記述できるとしても、 実際はループ回数やテクスチャフェッチ回数には上限があるんじゃないの? 最新のグラフィックスカードを使えば、実行結果が変わったりとかー。
358ですが、シェーダを弄くって テクスチャの投影部分ではなく、シェーダーで反復回数が足りないせいだと判明しました。 原因はAtiだからだと思います。for文をまわすたびにレジスタが使用されているのか、、、
どのprofileのフラグメントシェーダを使うかにもよるがfor文はループ展開されてたりするよ。 何をしようとしているのかよくわかってないけど、GPUレイトレで3次元テクスチャをボリュームレンダリングするなら、 何故画面の各ピクセルからレイを飛ばさないの?
ATIのカードだとCgでは事実上arbvp/arbfp以外の選択肢がないから 動的なループ、分岐やら新しい技術が使用できないのがきつい、というか終わってるね 最近触ってないけどGLSLだとその辺どんな感じなの?
>>360 画面からするとバウンディングボックスとの交差判定が必要で
ものすごい遅くなっていたのです。
実際にarbvp1 arbfp1が選択されていました。
ATIしかない環境でCgを選択したのがマズイのですね…
nVidiaを購入するのに…10万か…お金が。。。ない
ATIでもX1000系以降ならGLSL使えるよ CgでもプロファイルのglslvとglslfでGLSLにコンパイルして使える …が、使ったことはないしLatestProfileでも出てこないのであんまりお勧めはできないかも つかGeForceで10万って何買うつもりだよwwww
ぁ、ぃぇ PCそのものを買わないといけなくて、結局10万くらい掛かるっていうことです。 glslv glslfについてちょっと調べてみます
glslプロファイルは去年触ったけどnvidiaでは問題なく動くけど ATIのドライバではコンパイルできないソース吐くから使うのあきらめたな あれからだいぶ時間たってるからその辺直ってるといいね
OpenGL3の続報がなかなか来ないな
すいません質問させてください openglのプログラムのビルドで、error C2381: exit' : 再定義〜とエラーが出てしまいます 何かstdlibとglutが関係ありそうなのですが、よくわかりません 解決策がありましたら教えてほしいのですが
367です #include<stdio.h> #include<cstdlib> #include<GL/glut.h> にしたら、解決しました 理由はわかりませんが・・・ありがとうございました
371 :
デフォルトの名無しさん :2007/10/30(火) 16:12:14
学校の課題でOPENGL使ってなんか作らないとダメなんだけどいい感じのサンプルない? インベーダーとかハノイとかルービックとか。。。 誰かおせーて
なんだ、まぁ頑張れ。 とにかく頑張れ。
>>371 OpenGLはあくまで動かすための道具なんだから基本は自分でできなきゃ
というか、たぶん基礎を調べるための課題だろ
がんばれ
GLSLとCgどっちを使うべき?DirectXは使わない. なるべくハード依存したくないならGLSL?
>>371 超初心者スレに同じ質問があるからそっちみれ
>>374 GLSLはWindowsではIntelGPUで使えない。Macなら使えるがLinuxとかは知らん
あとRadeonとかでもドライバが古いと酷いことになる
CgはGL_ARB_vertex_programとかGL_ARB_fragment_programのアセンブリシェーダにコンパイルできるので
SM2.0に対応してればIntelでもRadeonでもつかえる。もちろんGeForceなら最新機能も使える
ただし配布するには別途ランタイムも配布する必要があるし、プロファイルによっては機能制限もある
あと書き方の違いもあるんで好みでどうぞ。
俺はCgの方が好きだがGLSLのランタイム不要な点も捨てがたいな
なんでCgを標準にしなかったんだろうな GLSLをプッシュしておきながら結局撤退した3DLabs死ねよ
俺はインテル製はsm2.0に対応しててもfboやarb_fragment_shadow、 アンチエイリアシング、その他諸々が使えないから最初から無視してるな
>>375 なるほどCgの方がハードには柔軟ですね
RGBで取り込んだ画像データを表示したいのですが 何か関数は用意されてるんでしょうか?
glDrawPixels
ネットにあるOpenGLのサンプル書いて遊んでいたんですけど,普通に実行できます. でも3Dデスクトップ効果の Compiz を起動させて実行すると,描画ができません. 窓枠がでなかったり色とかも変だし. これって一緒には使えないものなんでしょうか? 使えるとすれば何かおまじないのようなものを書かないといけないとかあるんでしょうか? 教えてください.
グラボのドライバが最新でも駄目ならVISTAを窓から(ry
compizはvistaじゃないから・・・ compiz起動しながらOpenGLのアプリ動かしても 俺の環境では問題ないなー どのサンプル?
板違い 犬糞板池
別にここでもいいだろ
opengl 3d絵画の初心者用サンプルプログラムが多く置いてあるサイトありませんか? 解説もついているとありがたいです
(#^ω^)
絵画とはまた斬新な
389 :
デフォルトの名無しさん :2007/11/03(土) 11:33:46
OpenGLで、絵画を書くのって難しいんじゃないの? そういうシェーダーを書かないといけないような。 水彩シェーダーは、前に見かけた気がするが、 油絵ってみたことないな・・・
>>376 3DLabsをせめないで。
すべてにおいて糞なクリエイティブを呪ってください。
クリエイティブが3DLabsを駄目にした. そしてWildeCatは死んだ,あのボードも波乱だよなIntergraphが死んだりして
glDisplayFuncで指定した関数で 6000点ほどの頂点を取ってるのですが 起動して描画まではしてくれるのですが動作がとまってしまいます。 何か解決方法はないものでしょうか
boxとかじゃなくpointで描画すれば60万点くらいは描けるよ そういうのじゃないか
>>392 >glDisplayFuncで指定した関数で
glDisplayFuncって何。glutDisplayFuncのこと?
>6000点ほどの頂点を取ってるのですが
頂点を取る、って何。意味不明。
>起動して描画まではしてくれるのですが動作がとまってしまいます。
動作が止まる、って何。意味不明瞭。
単に再描画がされないってだけなら、glutPostRedisplay()でも呼んでみれば。
>何か解決方法はないものでしょうか
ある。
「正しい用語を正しい用法で使うこと」 これを必ず守れば良い。
なんでこれが解決方法なのか?の説明は面倒なので省く。
しかし、これを常に守る事を心掛けていれば、技術的な問題のうち半分以上は
君自身で答えを見つけられるはずだ。これはマジな話。
Kusakabe(void)論法みたいだが
>>394 の言うことは確か。
3D絵画とかじゃ当たらないし、状況を文字よりもキャプったりソース上げた方が確実。
void氏は相手のバカの壁より常に一歩外側でしか喋らないからな。 横で見てる分には楽しめるんだが。
ということにしたいのですね。
そんな感じw
399 :
初心者 :2007/11/05(月) 23:33:29
はじめまして。プログラミングのことについて初心者です。 次のことについてどなたか教えていただけないでしょうか。 OpenGL+glutでシミュレーション結果を表示しようとしています。 VC++で作成し、コンパイルエラーはなかったのですが、実行してみると 何も起こらずに"終了にはキーを押してください"というような画面のみでした。 しかるべき場所にそれぞれのライブラリなど置いたつもりですが... どのような原因が考えられるでしょうか。
ソース
401 :
初心者 :2007/11/05(月) 23:49:25
すみません、わかりません。
その作成したプログラムのソースファイルを見せろという意味だ
デバックしても原因分かんないの?
GLUTのメインループに入らないで、プログラム終了しちゃってるんじゃないの? VisualStudioならデバッガが使いやすいし、最低限printfデバッグくらいはするべきだ。
>400-402 ふいたw
texture座標の自動生成を使うと その前に使ったglColorの値がtextureの色と混じってしまうんだけど glColorの値の影響を受けないようにするにはどうしたらいいですか
glColor を白色にしとけばいい
テクスチャ座標の自動生成とは関係なくて、 単にテクスチャ色とglColorの色が乗算(GL_MODULATE)されてるだけですねん。 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); を実行してやると、テクスチャの色だけが描画されるようになるよ。
ありがとー できました
FreeBSD6.2R, Mesa 7.0.1をつかっているのですが プログラム自体は動くのものの、実行時に libGL warning: 3D driver claims to not support visual 0x4c とでるのが気になります どうすればいいんですかね?
該当のglvisualをサポートしてないってだけだからwarningってだけ。 本気でやるならデバイスドライバをハックしてみよう。 もっともgpu側がサポートしてなかったらどうしようもないけどさ。
ほとんど自力というのがまたカーマックらしいな
OpenGLの日本語リファレンスマニュアルってどっかでダウンロードできませんか? 本買わないとだめ?
駄目
やっぱりだめですか。 講座サイト漁ろう。
赤本の英語版なら読めたんじゃなかった?公式で 最新かどうかわからんけど
たしか読めるのは古い
赤本はともかく、古い青本読むくらいなら最新の仕様書を読んだ本がいいね
視点移動したらオブジェクトの一部が画面に現れないことがあるのですが どうすれば解決できますか?
znear,zfar
objデータがバカでかいので 視界に入ってる領域だけ読み込んで表示できるようにしたいです どうすればいいですか><
データのフォーマットによるが、視界に入ってない領域を読み飛ばせばいいのでは
視界に入ってるかどうかの領域はどうやって決めたらいいんですか><
頂点単位ならLookAtとかPerspectiveに渡してるパラメータから視錐台を求めてそこに頂点が入ってるかどうか判別 ポリゴン単位なら視錐台とポリゴンの交差判定 フラグメント単位ならオクルージョンクエリーでも使ったら?
ありがとうございます>< >>パラメータから視錐台を求めてそこに頂点が入ってるかどうか判別 >>ポリゴン単位なら視錐台とポリゴンの交差判定 これやるためには、バカでかいデータをメモリに載せないといけない気がするのですが載りません>< 視錐台に入る座標をまとめてデータにして、それをファイルポインタで読み込むときに 1頂点読み込み→視錐台内の座標か判定→視錐台内ならメモリに格納 そんな流れになるのでしょうか>< オクルージョンクエリーという言葉初めて聴きました!見てみたら難しそうでした!
オクルージョンクエリーは冗談だ。その用途では役に立たんと思うので忘れてくれ やり方としてはそれでいいが、実際には1頂点ずつやってたら大変だわな モデルデータを前もって適当に一度にメモリに載せられる範囲に区切っておいて その範囲と視錐台が重なってるかどうか判定して重なってれば読み込む、 という感じである程度の頂点数を一気に処理した方が速いだろうな
モデルデータのバウンディングボックスをあらかじめ計算しておく
431 :
デフォルトの名無しさん :2007/11/22(木) 21:08:48
平面の方程式 Ax+By+Cz+D=0 の係数をパラメータにとって 平面を表示させるプログラムを作っています 今はyz平面上に立方体を平べったく伸ばして平面をつくって そのあと原点回りに回転移動させてから平行移動をさせる方法で平面を表現しようと考えて ↓のような感じで組んでいます ----- dcos_x = A/sqrt(A*A+B*B+C*C); dcos_y = B/sqrt(A*A+B*B+C*C); dcos_z = C/sqrt(A*A+B*B+C*C); glPushMatrix(); glColor4d(0.5, 0.5, 0.5, 0.8); glTranslated(trans_x,trans_y,trans_z); glRotated(dcos_x, 1.0, 0.0, 0.0); // x軸に対する回転移動 glRotated(dcos_y, 0.0, 1.0, 0.0); // y軸に対する回転移動 glRotated(dcos_z, 0.0, 0.0, 1.0); // z軸に対する回転移動 glScaled(1.0, height, depth); glutSolidCube(1.0); glPopMatrix(); ----- 平行移動量trans_x,trans_y,trans_zはどう与えればよいのかがわからないので trans_x,trans_y,trans_zは今のところ0.0で実質回転移動のみを行う形になっています dcos_x,dcos_y,dcos_zの計算式はこれでいいのかどうか、 trans_x,trans_y,trans_zの与え方はどのようにすればいいのか どなたか教えていただけませんでしょうか? まあ・・・根本から間違っていたり、もっといい方法があるんでしょうけど・・・
trans_x、trans_y、trans_zにはその平面上のどこか1点を与えてやればいいんでないの? 回転はよくわかんね というか平面を描くなら立方体を変形させるより 平面上の4点とかを適当に求めてポリゴンで描いた方が楽だと思う
>>432 平行移動はそれでいいね。
平面に平行な移動は無意味だから (trans_x, trans_y, trans_z) には2次元の自由度(任意性)がある。
回転については、三角関数を経由して回りくどいことしなくても、
元のyz平面の法線(=x軸)を (A, B, C) に移すような正規直交3x3行列を作ればいい。
つまり、(A, B, C) に直交する2つのベクトルを適当に選んでやればいいだけ。
こっちは法線まわりの回転について1次元の自由度ある。
現在3Dゲームを製作中なのですが、学校から持ち帰ったものを家で動かそうとすると 1>fatal error C1900: 'P1' Version '20060201' と 'P2' Version '20050411' が一致しません。 1>LINK : fatal error LNK1257: コードの生成に失敗しました。 というエラーがでてきます。 思い当たる節としては ・「GLee」を入れてみた これぐらいです。どなたか解決策をお願いします。
「動かそうと」具体的に何をどうしたのか 「GLeeを入れる」とは具体的にどのファイルをどこに置いたのか
>>434 学校と家のコンパイラのバージョンが違うんでないか
全プロジェクトをリビルドしてみ
>>435 「GLeeを入れる」というのは
GLee.cをスタティックライブラリにして追加し
glBindBufferARBなどの関数を使っていることをいいたかったんです。
>>436 リビルドしてみましたが、同じエラーでとまってしまいました。
>>434 ググったがVC++の環境がおかしくなってるみたいだな
解決策としてはVC++2005のSP1を入れてみる
ダメならVC++を再インスコ
それでもダメならOSから再インスコするくらいかな
>>438 VC++2005のSP1を入れたらなおりました!!!!
課題の締め切りが明日までだったので、本当にうれしいです!!!
今日はこのうれしさをばねに、徹夜でやろうとおもいます。
嬉しさをバネにって初めて聞いたww
嬉しさのときは何て言えばいいの? 嬉しさを追い風にして?
こういうの突っ込む奴は言い回しに気を取られて言葉の意味なんて考えたことないんだろうな
喜びは 糧に でいーんでねーの。
糧にするのも大概はネガティブなものだと思うが。 〜をバネには単なる反発、糧には消化して教訓とするって感じじゃないか。
名誉返上、汚名挽回を思い出した。
嬉しさを肥やしにして
喜びなら「さめないうちに」とつなぐのがいいのでないの?
確信犯
>>449 さすがにその誤用をつっこむやつは最近なかなかいないが。
役不足
役不足だと言っているッ!
流れ断ち切って悪いけど質問。 モデルビューの行列から視点、注視点、アップベクトルを求めたいんだけどいい方法無い? gluLookAtの逆バージョンみたいなの もう1つ質問で 頂点にウェイトをつけたいんだけど、OpenGLだとどうやってやるんだ?
>>453 モデルビュー行列の左上3×3の各行が
それぞれ右方向ベクトル、上方向ベクトル、逆視線ベクトル。
モデルビュー行列の逆行列の4列目が視点。
のような気がする。
>>453 >頂点にウェイトをつけたいんだけど、OpenGLだとどうやってやるんだ?
いまどきならシェーダを書く
>>454 どうせ逆行列求めるなら、1〜4列目がそれぞれ
右、上、逆視線、視点
でいいと思ったw
あと頂点ウェイトは
glVertexWeightfEXT
かな。
ARB_vertex_blend拡張はATIにしかなく EXT_vertex_weighting拡張はNVIDIAにしかない 頂点ブレンドは汎用的な方法があんまりないから シェーダでやるのが一番無難だろうな
>>457 NVIDIAもARB_vertex_blend対応してるぞ。
>>458 まじか
うちのGeForce8600GTでは無いみたいなんだけど…
もしかしてExtensionStringに出てこないけど使えんの?
>>459 ソースはOpenGL Extensions ViewerのDatabase。
ちなみに8600は項目がなくてわからん。
8600Mならあるんだがなぁ
あ、原因わかったかも。 OSのフィルタでWindowsに絞ったらNVIDIA全滅した。 MAC使えって話っぽい。
462 :
453 :2007/12/01(土) 21:56:23
>>454-461 サンクス
う〜ん、モデルビュー行列から完全に元には戻せないのかな
注視点を求めたいんだけど、さっぱりわからない
ウェイトの件はシェーダを使うのが無難みたいですね
注視点は求まらんよ 見てる方向は求まるけど、その方向ですぐ目の前から無限遠までのどの点を見てるのかは失われる 奥行きをz=1とか適当に決めちゃって、そこを注視点ということにするくらいか
464 :
453 :2007/12/02(日) 01:39:56
やっぱり無理なのか 残念だけど諦めよう
2Dテクスチャを2^nに限定しない関数ってありましたよね。 それの1Dテクスチャ・3Dテクスチャのものってありますか?
GL_TEXTURE_RECT_ARBなんかのことか? それなら2D版しかない GL_ARB_non_power_of_two拡張があれば 特に何も考えずに1Dでも2Dでも3Dでも2の乗数じゃないサイズが使えるよ
おお、知らない言葉が出てきた ググります!
GL_ARB_non_power_of_twoって環境によってはクソ遅いんじゃなかったっけ。 標準にはなってるけど当然古いカードだと使えないし。なんだかなーという感じだ。
Radeon系だとクソ遅いらしいね。。 あとRadeonのドライバはOpenGLのバージョン2以降返しときながらGL_ARB_non_power_of_two対応してないこともあったり。
nvidiaだと快適サクサク 8600GT。 つーかシェーダ組んだときのRadeonのクソっぷりにビックリした 俺、今度からNvidia住人になるよ
ポリゴンを1000枚作って表示させたときと ポリゴンを1枚作って表示させたとき OPENGLではメモリの量違いますか?
違う
了解です!
違わない処理系ってどれよ?
描画領域のメモリは変わらんとか?
476 :
デフォルトの名無しさん :2007/12/12(水) 10:39:47
すみません。教えてください。 cpadでopenGLを起動できないのですが、どうしたらいいですか? 実行ファイルが作れません。というエラーがでます。
まず落ち着こう 次にCPadでOpenGLを使わないプログラムが実行できるか確認するんだ それができたら「実行ファイルが作れません」の前にもエラーが出てるはずなのでそれを確認しよう 前に出てるエラーの原因が分からない、となってから質問しても遅くないと思うぞ
478 :
デフォルトの名無しさん :2007/12/12(水) 15:03:05
お前らまだOpenGLなんか使ってんのかw
個人的にはカーマックにその手の質問したら何て答えるのか非常に興味あるなw そういえばPS3でGLやCgが採用されるってのは結局どうなったんだろ
PS3ではOpenGLもCgも実装されてる でもOpenGLはパフォーマンスが出ないからGPUのコマンド直に叩くのがほとんどと聞いた 最近はほとんどシェーダだしDirect3D10もGPU仮想化されてOpenGLとたいして違いがないし どっちでもいいわな
>>478 うん。組み込みとかそれしか選択肢がないの多いし…
ゲーム機があります PS3 Wii XBOX Microsoftゲイツ様仕様のDirectXをPS3やWiiが使えると思ってるのかな。 選択肢としてOpenGL+GPU言語(Cg・GLSL)くらいしか無いでしょうに。
誰に対して何の話をしてるのかわからない
わからないお前の神経がわからない
変な勘違いをして誰に対してるのか分からない見当外れな話をする誰かさんの神経が一番わからない
>>486 >二つの物体あわせてこういうのが作れるってことですか!
違う・・・
ググれ!
どう違うのか教えてください(;;
ぎろっぎこっプー
490 :
デフォルトの名無しさん :2007/12/13(木) 18:51:28
powerpc版のLinux(Debian GNU/linux 4.0)で OpenGLを実行したらこんな警告がでてくるんですが どう解決すればよいのでしょうか? *********************************WARN_ONCE********************************* File r300_render.c function r300Fallback line 428 Software fallback:ctx->Line.SmoothFlag ***************************************************************************
>>400 HWで対応してないからソフトウェアで処理すんぞってことでしょ
ビデオカードを換えるかglDisable(GL_LINE_SMOOTH)してみたらどうか
1か月越しか
493 :
デフォルトの名無しさん :2007/12/14(金) 00:59:11
シェーダーとかあるの?
OpenGLでテキスト描画したい場合ってどうするの? プラットフォーム非依存なんだから、とうぜん標準で glDrawText 関数なんてものは ないんだと思うんだけど、テキスト描画したい人はやっぱりゴリゴリコード書いて、 フォントイメージ持って来てそれを自力で転送してるの?
>>494 環境依存(任意のフォントでディスプレイリストを作成)
glXUseXFont
wglUseFontBitmaps
wglUseFontOutlines
環境非依存(フォントの種類が少なく、ディスプレイリストを作らないので遅い)
glutBitmapCharacter
glutStrokeCharacter
ここでくだらん質問するまえにNeheみれ
>>490 mesa-r300は色々と未実装なフォールバックになるやつが結構ある。
それもfglrxならフォールバックなしに使えたりする。
内部的にはlinesmoothはvs使って実相しているらしいが、
仕様公開後もっと開発が進むんじゃないかな。
498 :
453 :2007/12/14(金) 18:14:48
499 :
498 :2007/12/14(金) 18:15:43
すまん、名前はミスだ
500 :
デフォルトの名無しさん :2007/12/15(土) 07:48:28
二年前にCGのクラスでOpenGLを学んだが
忙しくてそれ以上続けられなかった俺様が
来年こそはと
>>500 をゲット
>>500 大丈夫だ。若いんだから年末年始だけでOK
知的欲望全開で突っ走れ
Dynabook A1/X85PMC(PenIII 450MHz メモリ384MB) で、OPENGL動かそうとしたら、止まった なぜ…研究が進められない
>>502 随分古いマシンだな
とりあえずグラフィックスドライバ更新
でもOpenGLなんて所詮は最後に表示を担当するだけなんだから
研究は進められるんじゃ?
doubleとか何に使うの?
頂点シェーダのレジスタ精度が32/24/16/8bitしかないから無くても問題ないな
>>503 画面サイズを小さくしたら出来ました。
研究室がいきなり工事やら停電やらで土日作業できず
自宅のはもらいもののノート。一応作業できますわ
ラデのドライバを最新にしたらツールが立ち上がらなくなったんで調べてみたら ARB_fragment program_shadowのサポートが無くなってやがった AMD氏ね
509 :
デフォルトの名無しさん :2007/12/21(金) 12:38:19
>>506 GL_FLOATが、16bitだよな?
32bitはなんだっけ?
テクスチャについての質問なんですが、ちょっと前までテクスチャが張れたのに、 アプリを再起動したらそれ以降全くテクスチャが張れなくなるのって何が原因 なんでしょうか? 昨日作ったソフトが今日になって全くテクスチャが張れなくなってしまって 困っています。バイナリ、テクスチャの元画像共に昨日テクスチャが張れた 時から全くいじっていません。また、ドライバの更新等もしていません。 思い当たるとしたらノートンの更新ぐらいですが…
Z座標が同じポリゴンが重なったときに重なった部分のアルファのあるテクスチャを 合成するにはどうしたらいいでしょうか? glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); は実行しているのですが、なぜか合成してくれません。 ┌―――┐ | | | | | ┌―┼―┐ └―┼―┘ | | | | | └―――┘ こんな具合です。
テクスチャのinternalformatはちゃんとGL_RGBA(あるいはその他アルファを含むフォーマット) にしてるかい??
はい、Z軸を0.0000001とかほんの少しずらすとアルファは通っているので 大丈夫です。ただ、Z軸が重なるとなぜか合成されずに上書きになってしまう orz
>>513 glDepthMask(GL_FALSE);
glDepthFunc(GL_LEQUAL);
描画
glDepthFunc(GL_LESS);
>>514 遅くなりましたが、上手くいきました!
ありがとうごさいます。
>>509 GL_FLOAT は float だから32ビット。
16ビットは GL_NV_half_float の GL_HALF_FLOAT_NV とか VGL_ARB_half_float_pixel の GL_HALF_FLOAT_ARB とか。
×VGL_ARB_half_float_pixel ○GL_ARB_half_float_pixel
518 :
デフォルトの名無しさん :2007/12/22(土) 22:59:39
>>516 float、32bitか。何年プログラマやっとんだ、アホか俺はw
void display(void) { gluLookAt(3.0,2.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glRotated(x,0.0,0.0,1.0); glColor3d(0.0,1.0,0.0); glutWireTeapot(0.5); glFlush(); } void myKbd(unsigned char key, int x, int y) { if(key == KEY_ESC) exit(0); else if(key == 'g'){ x += 1; glutPostRedisplay(); } } void init(void) { int width = 500, height = 500; double aspect = (double)width/(double)height; glClearColor(0.0,0.0,0.0,1.0); glutCreateWindow("Sample"); glutDisplayFunc(display); glutKeyboardFunc(myKbd); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0,aspect,1.0,100.0); }
>>519 キーボードを押したらティーポットが回転するプログラムを書いたんですが、
ティーポットが回転してくれません。それどころかポットがどっかに移動して
しまいます。どうしたら良いですか? 教えてください。
>>520 どう見てもコンパイルすら通りそうにないコードなんだが
C言語の基礎(変数のスコープとか)を勉強し直すことだな
>>520 glRotated(x,0.0,0.0,1.0);
これでxを+1しても回転にならないぞw
523 :
デフォルトの名無しさん :2007/12/25(火) 01:14:56
XP上のMicrosft VC++6.0でOpenGLを使いたいのですが、 どうもこうもOpenGL/gl.hが無いと言われます。 ググってみると、 XPはデフォルトであるから心配ないとしか書かれていないのです(泣) GLUTはインストール済みです。 もしよろしければ、対応策を教えていただけないでしょうか。
>>523 もし
#include <OpenGL/gl.h>
ってやってるなら、その行は削除。いらない。
525 :
522 :2007/12/25(火) 01:55:07
hahaha!
勘違いしたw 酔ってるので許せ。
>>520 描画のたびに
gluLookAt(3.0,2.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
で行列を掛けてるから、どっかへ飛ぶ。
526 :
デフォルトの名無しさん :2007/12/25(火) 04:32:13
> void myKbd(unsigned char key, int x, int y) で、 x += 1; は、何も影響を及ぼさない気がする・・・
質問です 物体(glutSolidSphereなど)を3次元空間で動かして 動かした三次元座標空間だけマスクして 動かせば動かすほど、画像が変わっていく(3次元空間がマスクされて、隠れている画像が出てくる) ということをしたいのですが。 どうやればいいかヒントをください
伝わりにくくてすみません 要は3次元空間にマスクをマウスで書き込んでいく、ということをしたいのです。 フォトショップとかの2次元空間でのクイックマスク処理を 3次元でやるイメージです
3次元でマスクってのが良くわからない… もしSculptみたいなことをやりたいならボクセルでも使うのが早いかなぁ
>>530 まさしくそんな感じです。
固体を削り取っていって、削られた部分だけ別の物体の色になっていくという感じです。
それか、マウスの範囲内の物体の色(不透明度)を強制的に0にしていければ…同じように出来ると考えてるのですが
マウスでglutSolidSphereの範囲内のカラーを変えていく、ということ出来ますか?
正直に脱がせゲーを作るといえばみんな協力するはず
…その発想はなかった!!!!! そっちにシフトします><
もし531のようなことやるのに 参考になるサンプルとか考え方あったら、レスお願いします。
2Dじゃなくて、3Dでか。 そもそも、サーフェスモデルが基本なので、 「削り取る」というのをどのように表現するか・・・だな
削り取るよりも >マウスでglutSolidSphereの範囲内のカラーを変えていく こっちのほうを実装するほうが、やりたいことが出来そうな気がしてきました まだ研究室で、2時くらいに帰るのですが かなりてんぱってきました
536ですが アキュムレーションバッファで変更したい部分を上書きしてく、ということはできるでしょうか? もし出来るなら、エリア内の画素のαを0にして上書き・エリアを動かして0にして上書き…で削り取れるかもと思ったのですが
サンプル弄くってみて エリア内の指定 全体が変化する でアウトでした。 もう夜も眠れません
ん、もしかして2Dでマスクできればいいのか? それならStencilBufferでいいと思うけど 初心者スレにそんな話題が出てたぞ
質問させて頂きます。 @FBOテクスチャに適当に描画。 A上のレンダリングテクスチャに、上のレンダリングテクスチャを別のオブジェクトに貼って描画。 としう事をしたいのですが、Aを行う際、@で作ったテクスチャを別のテクスチャにコピーする必要があると思います。 その、テクスチャを別のテクスチャにコピーをしたいのですがどのようにすればいいのでしょうか? できれば、高速な方法が良いです。宜しくお願いします。
すいません、くだすれと間違えました・・・。
OpenGL Distilledの邦訳OpenGLの神髄が出てたな さっと立ち読みしただけだがタイトル通り要点を押さえた本だった 神髄とか言うと上級向けっぽいがそうでもなく いきなり赤本を読む前に読んでおきたい本だな
とりあえず(あえて)7Yでポチった DirectXとか汎用言語書は自称初心者向け(笑)が増殖してるが、 買うヤツがほとんどいないOpenGL本をあえて出すということはそれなりのクオリティであると期待してみる
原書で読んだよ。邦訳出たのか。神髄ってのは何か違う気が……。 各章サンプルはあるんだけどあるだけって感じなんで、初心者で 手を動かしながら理解したいって人は合わせて別のチュートリアル読んだ方がいいかも。
OpenGLでバナナの腹筋はできますか? どこかからサンプルコードはダウンロードできないでしょうか?
そんな質問どこかで見たと思ったらこのスレの頭の方だった できるけど、OpenGLのサンプルコードがあるかどうかは知らない
ろぼっとアームをバナナに置き換えれば
Cgとかのシェーダ言語のスレってないね
ndsやってるかたいらっさいますか
仕事の質問なら帰れ 趣味でやってるなら聞くだけ聞いてやる
554 :
デフォルトの名無しさん :2008/01/16(水) 12:50:17
>>549 いっぱい有りますやん。
gpuでこの板検索してみそ。
>>554 GPGPUのスレしか見つからないが
グラフィックでのシェーダと使い方大分違くないか?
あっちで普通のシェーダ聞いたらすれ違い言われた
そりゃ当然
マウスで画面クリックしたら 3次元座標空間内の点が消える、という処理をしたいのですが 赤い○←クリック α値が0になって αテストで画面内から消滅。という流れでやろうと思っています。 ただ、どうにもクリックしたオブジェクトの選択方法・クリックによる色・αの変換方法がわからず どうにもわかりません。 参考サイトとかあったら教えてくださいませんか
定期的に同じような質問が来るな。 αで消すよりポリゴンそのものの描画をカットしたほうが楽じゃないか? ポリゴン選択なら glRenderMode(GL_SELECT); gluPickMatrix あたりで検索するといいよ。
それなら別にマウスピッキングなんかしないで、マウスポインタ座標と玉との距離で 処理すればいいんじゃない? 結構処理時間食うぞ、ピッキング。 他に意図があるなら別だけど。
普通にやるならマウス座標とスクリーン座標に変換したオブジェクトのバウンディングスフィアとの衝突判定を 手前のオブジェクトから順に判定して行く感じかな もはやOpenGL関係ないけど
床井さん復活おめ。
>>562 >もはやOpenGL関係ないけど
それが普通だよ。OpenGLの仕事は基本的に描画のみ。衝突判定やピッキングは別でやるのが当たり前。
セレクションモードとかは「場合によっては使えなくもない」ってだけの仕組み。
初心者は、無理してOpenGL使うより、適当なシーングラフライブラリを使ったほうがいいと思うんだよなー。
でも敷居の低いシーングラフってなかなか無いんだよなー。
javaなら低レベルなJOGLか、高レベルなJava3Dっていう選択肢があるんだけどな。 と、JOGLをRhinoから遊んでる俺が言ってみる。
JOGLってなんでGL.glHogeHogeみたくプレフィクスだぶらせてるんだ。 メソッドのglとか定数のGL_とか、クラス名があるんだから不要じゃん? 入力面倒だよ……。
定数の GL. は static import すればいい メソッドのはメンドイね
下らない質問なんですが、 戦場の絆みたいなゲームって、 blenderみたいなソフトでモデル(ガンダム)を作って、 その情報を取り込んでOpenGLでプログラミングして動かしているのでしょうか?
商業なら独自形式にエクスポートしたりしない? 絆のハード構成は最近のPCと同じ(チップセットがAMDでVGAがGF7800)でOpenGL使ってるからCg使ってるかもしれないけど。
>>569 むむ、言ってることが難しくて分からないです。
自分が何でこんなこと思ったのかと言うと、
たとえばもうちょっと簡単な例で、同人ゲームとかで3Dな奴ありますよね。
でも、自分にはOpenGLであんな複雑な人の形を作るなんて、とっても大変だと思うんです。
それで、たとえば何かのCGソフト(blenderとか六角大王とか)で人間の形を作って、
その人間の形を出力して、OpenGLで取り込んでプログラミングして動かすのかなと思ったんです。
実際のところどうやって3Dゲームは人の形を動かしてるんでしょうか?
>>570 基本はあってる。
3DCGソフト(ゲームなら、3DSMax、Maya、XSIあたり)でモデリングして、アニメーション付けて、
それを独自形式で適当に吐いて、
プログラムでデータとして読み込む。
後は、それをOpenGLなり、DirectXなりで画面に出力する。
572 :
デフォルトの名無しさん :2008/01/19(土) 09:05:08
>>571 なるほど!
とてもよく分かる説明、ありがとうございます。
ちなみに、モデリングしてアニメーションつける人と
OpenGLなりDirectXで動かす人は普通別なんですよね?
普通は別だろう 別である必要はないけど 技術的につらいし作業量的にも無理あるよな
そこそこ以上の規模のゲームでは 前者はデザイナー、後者はプログラマーの仕事だよな
今時の同人ソフトだってグラフィックデザイナとプログラマは別れてるんじゃないかな?
規模のでかいゲーム屋ならWebの募集要項の種類眺めるだけでも雰囲気つかめるんじゃないの
>>572
規模によるとしか言えない。1週間も3Dソフト触ればまずまずの絵は出てくるようになるよ。 ただゲームに適したポリーを吐くのは難しいときもある。
GLUTによる「手抜き」OpenGL入門読んだら、次に読むべきお勧めの本は何かありますか? 赤本より簡単なやつで。
とりあえず自分で何か作ってみる、のがいいんじゃないかなぁ 太陽系の模型とか、三次元テトリスとか
赤本は分厚いだけで難しくはないだろ。
OpenGLで3次元で人体を描画するとしたら 各関節を座標で与えて表示することは可能でしょうか? 現在は例として肩から肘まではxyz座標でそれぞれの軸に何度回転しているかで 描画しているのですが… よろしくお願いします
座標から角度を計算すればいいだろ
すいません、質問させて下さい。 今、複数のポリゴンに動画を貼り付けるようなことをやっているのですが、 どうしても8fps位しか出ず、複数のポリゴンと複数の動画を描画すると、0.5fps位になって しまいます。なにか高速化のヒントだけでもいただけるとうれしいのですが… テスト時の動画は400*400、処理は大体以下のような感じです。 1、カメラの設定 2、変換座標の設定 3、テクスチャの生成(1つの名前をglTexSubImage2Dで使い回し) 4、ポリゴン描画 1に戻る
どこが遅いか調べればいいじゃないか。 エスパーは出張中だ。
>>583 動画のデコードが遅いだけじゃないだろうな
動画でなく同じサイズの静止画を毎フレームglTexSubImageで設定してみて
遅いかどうかを確認してみなよ
>>585 試したところ、無変形では静止画の方が速くなりました。
ところが、回転や移動をすると、なぜか静止画の方はフレームレートが
半分ぐらいにまで落ちたのに対し、動画の方は変わりませんでした。
これはデコード以外の別なところにもネックがあると考えた方がいいんでしょうか?
>>ところが、回転や移動をすると、なぜか静止画の方はフレームレートが >>半分ぐらいにまで落ちた これはおかしいな。考えにくい。 プログラムうp。
>>587 ちょっといろいろ処理がからみついていて長くなっているのでうpは出来ませんが、モデルビューや
プロジェクションの設定は動画と静止画の時は全く同じ処理で動いてます。
違うとしたら、動画から静止画を切り出すか、静止画をコピーするかの違いしかないのですが、
それは無変形の時に速度差が出てるので原因になってるわけ無いですし…
動画と静止画のサイズは一緒で、800*800ですが、サイズによっては高速に
動くようです。400*400では問題ありませんでした。
>> 587 と、今もう一度試したところ、どうやらゴミがついていたようで、それを取ったら ちゃんと問題なく速度を維持してました。 お騒がせしてすいません orz
毎回すべてのデータを送りなおしているとか言って見る。
JOGLとJMFつかってJOGLに動画描画させたことあるが動画のデコードと動画の1フレーム毎にテクスチャオブジェクトに変換する処理に時間食ってるだけだったなぁ。
テクスチャデータ設定が遅いのはPixelBufferObjectでなんとかならんかな PBO2つ作って現在デコードしてるフレームの書き込み用と テクスチャ設定用でダブルバッファリングするのが速い気がする
594 :
デフォルトの名無しさん :2008/01/23(水) 22:13:25
>> 542 かめれす... 「OpenGLの神髄」買いました. 分かり易くってよいです.コメント参考になりました.ありがとです.
NicoAE開発頑張ってね
今更だけど個人でコツコツと何年もかけてソフト作るなら 基本的にインターフェース仕様が変わらないGLは相性いいね GLそのものが衰退しないという前提はあるけど
NicoAEの人かっ!!!がんばれー
しかしOpenGL 3.0ではガラッと変わるようなことをどこかで見たような……
3.0がでて今までのが動かなくなるわけじゃないんならいいんじゃね
今までのはそのまま動く予定みたいだな 3.0は従来とは別のコンテキストを作るようになる 両方使ってもコンテキストが別なんで全く別に処理されるって寸法らしい あと3.0の描画を2.1以前のテクスチャとして使える拡張も用意される…かもしれない
初心者です。 void display(void) { glClear(GL_COLOR_BUFFER_BIT); glFlush(); } void init(void) { glClearColor(0.0, 0.0, 1.0, 1.0); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); glutDisplayFunc(display); init(); なのですが、 init関数で塗りつぶす色を指定しているのに、 その前のglutDisplayFunc(display)で描画をしています。 何故init関数で色を指定する前にglutDisplayFunc(display)を実行しても ウィンドウが塗りつぶされるのでしょうか? 逆なのではないのでしょうか?
glutDisplayFuncはコールバック関数を「登録」する関数です。
initよりdisplayが後に実行されてるからだよ。
glutなんとかかんとかFunc は、コールバック関数を登録しているだけだから。 実際に登録した関数が実行されるのは、例えば glutDisplayFunc なら画面の再描画時、 glutMouseFunc ならマウスがクリックされたとき等など。 どの命令でどのタイミングのコールバック関数を登録するかはマニュアルを参照すること。
なんですと? 登録する関数? じゃあ、glutMainLoopが描画してるんですか?
MainLoopは名前のとおり中でぐるぐる回ってる。 そのなかでイベントに応じてコールバック関数を呼び出してる。
OpenGLというよりコールバック関数の勉強した方がいいんじゃないか? いまどき、コールバック関数ないのはHSPくらいだぞ。
んなこたーない 大量にある
>表示図形のサイズをビューポートの大きさにかかわらず一定にするには, >glOrtho() で指定するの領域の大きさをビューポートの大きさに比例するように設定します. >例えばワールド座標系の座標軸が上記と同様に l, r, t, b, n, f で与えられており, >もともとのウィンドウの大きさが W×H, リサイズ後のウィンドウの大きさが w×h なら, >glOrtho(l * w / W, r * w / W, b * h / H, t * h / H, n, f) とします. >上のプログラムでは, ワールド座標系の2点 (-1, -1), (1, 1) を対角線とする矩形領域を >200×200 の大きさのウィンドウに表示した時の表示内容の大きさが常に保たれるよう設定しています. ここの意味が良くわかりません。 例えばW×H 200×200 (-1,-1) (1,1)をw×h 400×400にすると(-2,-2) (2,2)となって、 ウィンドウのリサイズに比例して表示画像も大きくなるような気がするのですが...
>>609 縮尺を一定にしたいという話なんだからそれで正しいだろ
GLUTを使って3Dアニメーションを作っているのですが、 現在表示している画面を画像ファイルに吐いてくれるような関数を探してます。 ありましたらぜひ教えてください。
612 :
609 :2008/01/27(日) 09:37:39
614 :
609 :2008/01/27(日) 10:43:14
>>613 すいません。
考えないでやってみて不思議だから考えてるんですけれど...
そんな公式暗記しろみたいな事いわれても
>表示図形のサイズをビューポートの大きさにかかわらず一定にする この文章をどう理解するかという問題のような気がする
>>612 おまえが作ったその図を見る限り
「表示図形のサイズをビューポートの大きさにかかわらず一定にする」
がめでたく実現されているようだが、いったい何が問題なんだ?
617 :
609 :2008/01/27(日) 11:41:21
>>617 どこに「割合」なんて書いてあるんだよ。
サイズと言ったらサイズだろ。
619 :
609 :2008/01/27(日) 13:00:54
わかった! 今やっと分かったっす。 自分の日本語読解能力な無かったんです。 ありがとうございました。
>>619 わかったことをわかりやすく図に示してくれ
俺も不思議になってしまった
621 :
609 :2008/01/27(日) 14:27:22
>>620 つまり、そのまんまですよ。
自分の日本語読解能力が低かったんです。
円の大きさがウィンドウリサイズしたときに、
リサイズしたウィンドウの大きさに合わせて大きくなったり小さくなったりする場合が、
(
ttp://upload.fam.cx/cgi-bin/img-box/7o080127113738.jpgの赤い円の状態 )
glOrtho(-w / w , w /w , -h /h , h /h , -1.0, 1.0);
で常に表示される割合が一定で投影される範囲が(-1, -1), (1, 1)に固定。
ウィンドウの大きさにを変えても円の大きさが固定の場合が場合が、
(
ttp://upload.fam.cx/cgi-bin/img-box/7o080127113738.jpgの黒い円の状態 )
glOrtho(l * w / W, r * w / W, b * h / H, t * h / H, -1.0, 1.0);
でウィンドウをリサイズすると、合わせて(-2,-2)(2,2)...と投影される範囲が大きくなるから
逆に考えて円の大きさは変わらない。
みたいな理解で良いんでしょうか?
C言語でOpenGLをつかって物体の動く軌跡を描くプログラムをつくるにあたって2つ質問があります。 一つは、 OpenGLでアニメーションをするときにダブルバッファをいれても アニメーションのコマ毎に物体のオブジェクトが 制止している状態であっても点滅している風になってしまう場合があるのですが どのように解消すればよいのか。 もう一つは、 軌跡を描くということで再描画の際にも軌跡を表現するオブジェクトは そのまま残しておかなければならないと思うのですが この処理はどのようにコーディングすればよいのか。 この2点なのですが、ご教授のほどよろしくお願い致します。
>>622 glSwapBuffer()のタイミング。
windowsで使用しているなら、windowsでの再描画系のチェック。
軌跡に関してはopenGL関係ねえ。
適当に軌跡を保持しておけばいいんじゃない?
バッファをクリアしないだけで勝手に軌跡にならないか?
Zバッファなしで、奥から描画するように上書きすればそれっぽくなるかもね。
glBegin(GL_POINTS)を使い、glPointSize(size)で指定したsize*sizeの 四角形を描画したいのですが、四角形にならず円形しか描画されません。 GL_POINT_SMOOTHになってるのかと思い、Disableにしてみましたが 結果は変わりませんでした。 glDisable(GL_POINT_SMOOTH); glPointSize(10); glBegin(GL_POINTS); glVertex2f(x, y); glEnd(); GL_POINTSで四角形のpixelを描画するにはどうすれば良いのでしょうか? ご教授を宜しくお願いします。
GL_QUADSを使えば済むと思うけど。 どうしてもというなら、円が重なるようにたくさん打てば良いんじゃないか。
628 :
626 :2008/02/02(土) 16:41:23
>>585 確かにGL_QUADSでも良いのですが、GL_POINTSの方がポリゴンを描画するよりも高速だったので
GL_POINTSで四角形の点を表示したかったのです。(数万個のパーティクルを扱いたいので)
とりあえずGL_QUADSで処理する事にします。どうもありがとうございました。
昔のグラボで試したところ四角形で点が表示されました。
うーん、ハードウェアの問題なんでしょうか…?ELSA GLADIAC 786GTを使用してます。
赤本に描画を高速化するコツが載ってるよ。
630 :
629 :2008/02/02(土) 16:52:15
ごめん違った。 赤本じゃなくて、OpenGLの真髄でした。最近出た本です。
GLdouble color[7] for (i=0; i<7; i++) color[i] = (GLdouble)i/6.0; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); for(i = 0 ; i < 7 ; i ++){ for(j = 0 ; j < 7 ; j ++){ glColor3d(color[i], color[i], color[i]); glVertex2f(-1.0+i*0.3, -1.0+j*0.3); glColor3d(1.0, color[i], 0.0); glVertex2f(-0.8+i*0.3, -1.0+j*0.3); glColor3d(0.0, 1.0, color[j]); glVertex2f(-0.8+i*0.3, -0.8+j*0.3); glColor3d(color[i], 0.0, 1.0); glVertex2f(-1.0+i*0.3 , -0.8+j*0.3); } } glEnd(); みたいなコードって、 forの中身を glColor3d(color[i], 0.0, 1.0); glVertex2f(-1.0+i*0.3 , -0.8+j*0.3); glColor3d(color[i], color[i], color[i]); glVertex2f(-1.0+i*0.3, -1.0+j*0.3); glColor3d(1.0, color[i], 0.0); glVertex2f(-0.8+i*0.3, -1.0+j*0.3); glColor3d(0.0, 1.0, color[j]); glVertex2f(-0.8+i*0.3, -0.8+j*0.3); と順番をいろいろ入れ替えただけで 描画される形や色が変わるんですけど、同じ場所に同じ色で指定しているのに なんで順番を変えただけでグレデーションが変わってしまうのでしょうか?
7 X 7 のループにしないと再現しないのか? 聞きたいことを再現する最小限のコードを載せてくれよ。 だいたい、グレデーションってどこのよ?
>>631 頂点の順序は重要
その順番に繋いで形にするんだから
>>631 は確かに論点がわかりにくいコードだが、要するに
glColor3d (1)
glVertex2f (1)
glColor3d (2)
glVertex2f (2)
glColor3d (3)
glVertex2f (3)
glColor3d (4)
glVertex2f (4)
の順序を
glColor3d (4)
glVertex2f (4)
glColor3d (1)
glVertex2f (1)
glColor3d (2)
glVertex2f (2)
glColor3d (3)
glVertex2f (3)
に変えたと言ってるわけで、
GL_QUADSの定義からして特に問題はないように見えるんだよね・・・。
「順番をいろいろ入れ替えた」 って言ってるから、 やっぱりでたらめにいろいろ入れ替えてるんじゃないのかなぁ あとは、四角形を内部で三角形2枚に分割して処理してたりすると、 形や色の具合が変わることがあるかもしんない
ああ、確かにグーローシェーディングの補間結果は変わってくるな。
637 :
631 :2008/02/04(月) 12:25:38
>>632 すいません。
ttp://www2.uploda.org/uporg1233762.jpg に再現画像をのせました。
>>633 予測する方法は無いのでしょうか?
>>634 自分の言いたい事を分かりやすくいって頂いて有り難うございます。
えっと小さな四角形をグラデーションでたくさん表示したいなと思ったんですが、
プログラムを書いてる最中に「このグラデーションで表示したい」と思って
プログラムを書いているのに思っている物と違う物が表示されてしまって、
順番をかえると思った物が表示される事に気づきました。
色と点は同じ指定しているのに、順番を変えるだけで表示される画像が
かわってしまうので、最終的に表示される画像がどのようなグラデーションになるか、
法則?(色の補完の法則?)みたいなものは無いのでしょうか?
GL_QUADSやめてGL_TRIANGLESで描くようにすればいいかと
glVertexいじらずに色の順番だけ変えればいいじゃん
ポイントスプライトとかじゃだめなの?
どうみても学習始めたばかりの人にそれはない
642 :
デフォルトの名無しさん :2008/02/04(月) 20:42:08
床井先生のとこによさげなサンプルがあるよ。 OpenGL point sprite でググったら一番上にでてきた。
ageちまった。スマン。
GLUTでワールド座標系とデバイス座標系とマウスの座標の質問です。
「デバイス座標系とワールド座標系ではglutMouseFuncに渡されるマウスの座標の上下が反転している 」
というのがいまいち理解できません。
glutMouseFunc(mouse);
void mouse(int button, int state, int x, int y){
static int x0, y0;
switch(button){
case GLUT_LEFT_BUTTON:
if(state == GLUT_UP){
glColor3d(0,0,0);
glBegin(GL_LINES);
glVertex2i(x0,y0);
glVertex2i(x,y);
glEnd();
glFlush();
}else{
x0 = x;
y0 = y;
}
break;
printf("(%d %d)¥n",x,y);
というプログラムで、
glOrtho(-0.5,w - 0.5,w-0.5,-0.5,-1,1);
とやって上下を逆転させてやると正しく線が引ける事
glOrtho(-0.5,w - 0.5,-0.5,w-0.5,-1,1);
とやると引かれる線の状態が鏡のように反転する事を確認しました。
でもprintf("(%d %d)¥n",x,y);で渡されるxとyは、glOrthoで上下反転してもしなくても、左上が(0,0)で右下は(w,h)であるようです。
それに上下反転させると絵も下のように逆転しそうな気がするのですが...
http://tune.ache-bang.com/~vg/outitem/up/img/18549.jpg 上のように絵は逆転しないのでしょうか?なぜ上下が反転しているのに、printf("(%d %d)¥n",x,y)で渡される値は正しいのでしょうか?
対照物を行ったり来たりさせる代表的なアルゴリズムを教えてくれ! ifとかつかっても俺の頭では行きっぱなししかできん!
sin
647 :
644 :2008/02/04(月) 22:38:35
すいません。絵は上下逆転しますね。 でも、マウスをクリックして渡される座標は左上が(0,0)で右下が(w,h)で良くわかりません。 それとプロの方々はこのようにワールド座標系とデバイス座標系が逆転する時は、 わざわざ逆転したとき用にプログラムを書いているのでしょうか?
648 :
644 :2008/02/05(火) 01:39:33
よくわかんないけど、自演乙
OPENGLでつくったアニメーションをスクリーンセイバーにできますか? WindowsでVisual C++でつくりました。
もちろんできますよ!
.exe を .scr にする。 ほらできた!
最近勉強始めたんですけど、 OpenGLってHCLの道具として役に立つんですか?
塩酸?
>>652 ありがとう!できた!でもめちゃくちゃ重くなった!
スクリーンセーバーは正しい作り方があるからggr
>>653 HCLがなんだかさっぱりわからんけど
OpenGLは3D*描画用*のAPIだ
それが役に立つなら役に立つんじゃね?
>657 HCLじゃなくてHCIでした。単なる読み間違いでした。
>>658 HCIがなんだかさっぱりわからんけど
OpenGLは3D*描画用*のAPIだ
それが役に立つなら役に立つんじゃね?
ワロタ 俺もHCIがよくわからんのでググッタカス だがわからん
Human Computer Interaction とか Interface とかじゃないかなぁとまじれす。そして結論は >659
glEnable(GL_COLOR_LOGIC_OP); glLogicOp(GL_INVERT); glBegin(GL_LINES); 線を引く glend(); glDisable(GL_LOGIC_OP); というプログラムなのですが、 GL_COLOR_LOGIC_OPは「図形の描画の際に,ウィンドウに既に描かれている色と, これから描こうとする色の間で論理演算を行うことができるようにします」 という解説が有りました。 「GL_INVERT はウィンドウに描かれている内容の, これから描こうとする図形の領域を反転します」 とあります。 つまりコレは、以前引いてある同じ色の線の色を反転して、新しい線をまた反転した色で引くプログラムという 理解で良いのでしょうか? 「ウィンドウに描かれている内容の, これから描こうとする図形の領域を反転します」の意味がいまいち理解できないんです。
白地に青で書くと黄色になる。
>>662 黒が白に、白が黒になるのが反転
GL_INVERTは「これから描こうとする色」は使われない
「すでに描かれている色」を反転するのみ
>以前引いてある同じ色の線の色を反転して
以前に線を引いてある必要はない
たとえば真っ白のところにGL_INVERTで線を引くと黒い線になる
真っ黒のところにGL_INVERTで線を引くと白い線になる
>>663 それはGL_XORだろう
666 :
デフォルトの名無しさん :2008/02/15(金) 02:21:24
人間の顔の表面の形状を表した座標点のデータがあるのですが、これをポリゴンを使ってサーフェスモデルみたいにしたいのですが、これってどうやったらいいのでしょうか?
667 :
デフォルトの名無しさん :2008/02/15(金) 03:03:19
手作業でがんがれ!
点群をトライアングルメッシュに直してくれるソフトとかあるよ 超高いけど
669 :
デフォルトの名無しさん :2008/02/15(金) 03:19:02
>>668 お金がないので、フリーか、もしくはプログラミングの方法があればお願いします。
Delaunay法使ったら? vtkとかMayaViに逃げるとか。
671 :
デフォルトの名無しさん :2008/02/15(金) 09:52:25
>>670 ありがとうございます!
試してみます。
672 :
デフォルトの名無しさん :2008/02/15(金) 14:06:08
ドロネー図を書く場合って、どんな関数を使えばいいですか?
>>672 vtkならサンプルがある。
フルスクラッチで書く技量が無いなら取り敢えず他人のソースを参考にしろ
投影と射影って同じ意味ですか? 本を読んで勉強しているのですが、 「射影変換には、射影変換には透視射影と平行射影が〜」 または、 「投影変換には大きくわけて、透視投影と平行投影が〜」 みたいに、どう見ても同じ無いようなのに、ころころ文によって 射影と投影が使われていてとても疑問なんです。
一緒 どっちも projection の訳語
トンです。
VisualStudio2005でglpngを導入してテクスチャーをやりたいのですが glpng.hを設定しただけでは上手くコンパイルが通りませんでした。 調べたところd.hatena.ne.jp/minami_SC/20070425/1177462910 のページが出てきて この通りにやってみたのですが ここでもコンパイルが通らずエラーを吹いてしまいます。 VisualStudio2005でのglpngを導入方法はできないのでしょうか? できるのでしたら方法をご教授ください。
|:;:;:;:;:;:;:;:;:;:;:;:;:;:i;:;:;:;:;:;:;:;:;:;:;:;:;| |;:;:_:;:_:;:_:;:_;:;_:;:l:;_;:_:;:_:;:_:;:_;:_;| |______|_____| | 三| _ _ |三 ! | 三| 三シ ヾ三 |三 | | 三′ .._ _,,.. i三 | ト、ニ| <でiンヽ ;'i"ィでiン |三.| エラー内容も貼らずに質問とな!! ', iヽ! 、 ‐' / !、 ーシ |シ,イ i,ヽリ ,' : !. |f ノ ヾ! i ,、 ,..、ヽ lノ | _ _ イ l l ,ィチ‐-‐ヽ i /、 ゙i、 ゝ、二フ′ ノ/'"\ | \ ー一 / / _,ン'゙\ ,ィ|、 \ /_,、-'" _,.-''´ `丶、__ _, イ | ヽ_ 二=''" _,. -''´ """""´´ ``ー
>>677 d.hatena.ne.jp/minami_SC/20070425/1177462910
にある方法は使わずに、VS2005で普通に試してみた。
libc.lib のエラーがでたけど、無視するようにしたら、うまくいったよ。
それ以外のエラーだったら知らん。
すみません、エラー内容はこれです。 error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。 LIBCMT.lib 無視する方法とかあるんですか?
自己解決しました 最初の設定が悪かったみたいですorz
682 :
デフォルトの名無しさん :2008/03/03(月) 20:11:07
梅宮辰夫の歌に、シンボルロックいうのがあってな シンボル シンボル 外部のシンボルぅぅ〜 って
なんの誤爆だwww リンケージの話か?? しかもぐぐったら歌詞違うじゃん
ってうあおおぉ勘違いしてんの俺じゃんorz orz orz くだすれとごっちゃになってたorz
OpenGL 3.0
出たのかと思ってびっくりしたじゃないか >Don’t miss the great updates on OpenGL3 at the SIGGRAPH BOF! あと三ヶ月程待て
すみません。話題がないので悪戯してみました。
> OpenGL BOF August 13th 6pm - 8pm Wilshire Grand Hotel - Wilshire Room 俺はSIGGRAPH行けないので後は頼んだ…!
キューブマップもテクスチャ座標生成も無いOpenGL ES 1.1で 環境マップっぽいことをする方法は……無いよな……
つGL_OES_texture_cube_map
環境マップするだけなら球状マップかなにかにして テクスチャ座標だけ自前で毎フレーム計算して渡してやればいいな しかしES1.1な環境のCPUでそれをやるとなると……
693 :
デフォルトの名無しさん :2008/06/09(月) 19:28:49
OpenGLを使うんじゃなくてmesaみたいにソフトウェアで実装したいのですが、 参考になるソースを紹介していただけないでしょうか? なるべくシンプルで簡単なのがいいです。 (mesaは大きすぎる)
OpenGLやDirectXのようなAPIが出る前に書かれた
3DCGの解説書はだいたい
>>693 みたいのばっかりだ。
垂直同期待ってくれないので、ネットで垂直同期待つ関数をググったら wglSwapIntervalEXT という関数があるのはわかりましたが、 それを利用する方法がわかりません #include <gl/wgl.h> と書いても存在しないといわれます。 どうすればいいでしょうか?
697 :
696 :2008/06/12(木) 19:14:41
事故解決しました
698 :
697 :2008/06/12(木) 19:23:12
嘘です。 glewInit();でエラーが出ました。
エラーメッセージは?
glewInitはウィンドウ作ってから呼ぶんだぜ glewInit後wglSwapIntervalEXTに1を渡すと同期あり、0を渡すと同期無しになる しかしデフォルトは1のはずなんでドライバの設定いじってない限りは 同期取るはずなんだが、設定確認した方が良くないか?
この間Ubuntuで初めてOpenGLアプリ書いてみたら VSyncがオフになっててちょっとびっくり 拡張サポートはGLEEの方が個人的に好きです
702 :
698 :2008/06/13(金) 14:09:21
>>699 1です。
>>700 ウィンドウ作って呼ぶと行けました。
ありがとうございます。
>同期
glutInitDisplayMode を GLUT_SINGLE で設定してたので非同期でした。
GLUT_DOUBLE で同期しました。のでwglSwapIntervalEXTは、必要なくなりました><
まあ、でもglewは、今後お世話になりそうなので良かったです。
ありがとうございます。
くだすれが落ちてるけど、ここのネタも無いしいいか
704 :
デフォルトの名無しさん :2008/06/23(月) 18:35:21
OpenAge
705 :
デフォルトの名無しさん :2008/06/25(水) 23:26:09
RADEON HDはXPだとジオメトリシェーダーOpenGLでも使えないみたいですが、 Linuxでは使えるんでしょうか? あげ
使えません
707 :
デフォルトの名無しさん :2008/06/26(木) 19:55:46
使えるだろ 4.0プロファイルで
708 :
デフォルトの名無しさん :2008/06/26(木) 19:58:02
っていうかジオメトリシェーダとは言わない primitive shader
ピクセルシェーダーとバーテックスシェーダーは フラッグメントシェーダーとプリミッチブシェーダーになったのか
使わないので自信ないが、結局ジオメトリーシェーダーなんじゃない?
GL_EXT_geometry_shader4
>>705 くだすれでRADEON HDはドライバがどうのでダメとか言ってたような。
glGetStringとかで拡張が使えるか調べてみればわかるのでは
つか何に使ってます?ステンシルシャドウ以外の使い道がよくわからない
711 :
デフォルトの名無しさん :2008/06/26(木) 22:48:40
Fragment Shader Vertex Shader Primitive Shader
たしかに2006年ごろはそう呼ぶ予定だったっぽいが、 今はopenGL.orgのForumでもGeometry Shaderしか聞いたことない。 正式には調べが付かなかったが、Geometry Shaderでいいんじゃね。
713 :
デフォルトの名無しさん :2008/06/27(金) 21:57:25
ウィンドウズでOpenGLのプログラムを書いていて文字を描画しようと思っています。 以前はwglUseFontOutlinesを使ったフォントクラスを自作していたのですが、 FTGLを使おうと思い立ち既存コードを変更しています。 それで困ったのが、フォントをフォント変更ダイアログから変更する場合で、 これまではChooseFontで得たLOGFONT構造体からフォントを作り、 wglUseFontOutlines→ディスプレイリスト作成という流れで問題なかったのですが、 FTGLの場合はFTGLオブジェクトのコンストラクタにフルパスでフォント名のみを 指定するようになってます。両者で全然勝手が違うのですが、 LOGFONT構造体の情報をFTGLのフォントに簡単に反映させる方法というのは ないでしょうか?
無い LOGFONTにはFont自体の情報が入ってないみたいだし無理だね FTGLというかFreeTypeではファイル名か、ファイルの中身自体を指定するしかないよ それかなんとかしてタイプ名からファイル実体を拾ってくるのをWindowsAPI使ってやるか
715 :
デフォルトの名無しさん :2008/06/29(日) 21:35:21
突然ですが質問があります。WindowsでOpenGLやっています。 glTranslatef(0.0,0.0,5.0*sin(theta*PAI/180)); 図形 というのをコンパイルすると、図形が5.0*sin(theta*PAI/180)上を移動しますよね? で、その移動を制御するにはどうすればいいのでしょうか。例(10秒だけ関数上を動く) 分かりにくい質問文で申し訳ございません。どなたか分かる方がいらしたら 教えてくださいm(_ _)m
10秒だけ動かしたらいいんじゃない。 質問の意味もどのレベルの質問かもわからない。 アニメーションの基礎ならGLUTのサンプルでも見てみたらどうでしょう
717 :
705 :2008/06/30(月) 22:09:46
>>710 XPでもLinuxでもジオメトリシェーダー使えないんですか!?つまりVistaのみ?
ATI何やってんだ!!
今XP起動中なのでLinux対応はそのうち調べます。
>つか何に使ってます?ステンシルシャドウ以外の使い道がよくわからない
確かに使い道が・・
GeometryShaderは拡張だから対応してなくても責められるもんでもないけどな 使えるとなれば使い途は意外にあるもんだぜ GeForce8系では遅いって話だけどなー
GF2x0すらHD2900に負けるらしいけど、DX10でしか使えないのは何とかならんのかなぁ。
720 :
713 :2008/07/01(火) 04:20:04
>>714 ないですか。ないということを知ったのが収穫でした。
ダイアログからイタリックやボールド、フォントサイズ等を指定できればと思ったんですが、
LOGFONT構造体で得た情報をFreeType側に反映させるのは
全部自前でやらないといけないわけですね。面倒だなぁ・・・。
20msおきにセンサから計測、計算して結果をGLで表示するプログラム作ってます。 「20msおきにセンサから計測、計算」はdisplay()関数の中で 「前回display関数が呼び出されたときから20ms経過してたら計測、計算」ってやろうと思ってるんですが なんかそもそもアイドル時GlutPostRedisplay()呼ぶようにしてても display()が呼ばれる周期が20msより遅いように感じます。 1msおきくらいでdisplay()呼ぶ方法ないですか? (描画自体はもっと更新レート遅くていいんですが)
722 :
721 :2008/07/02(水) 21:43:49
もうちょっと言いますと プログラム起動してmain関数の中でglutMainLoop()に入っちゃった時点で その後のコードはプログラム終了時まで実行されない、という点さえ何とかなれば 描画部分のみGLのdisplay()関数で行って 20msごとの計測や計算はMain関数の中で for(;;) { 20ms経過してれば計測と計算 } みたいな無限ループ作ってやりたいなと思ってるんですが。
723 :
721 :2008/07/02(水) 21:50:02
なので理想系はglMainLoop()使わず処理のループは for(;;) { 前回から20ms経ってたら計測計算描画 } みたいにやりたいです。 要はGLが常時ループで回ってるんじゃなくて 必要なときだけ一瞬仕事してほしい(GDIでLineToで線描くような感覚で)です。
displayは表示だけにして idleの中で時間待ち・計測・計算するとか
計測計算を別スレッドにすればいいんじゃね
GLUTはそういう用途に向いてないので別なの使うといいよ glfwなんかが手軽でいい感じ
727 :
デフォルトの名無しさん :2008/07/03(木) 02:29:50
コリジョンの本が高くて買えません。 良質なサンプルとかありませんか?
>>721 個人的には、725→726の順で考えるのか良いかと。
boost::threadが手軽(?)に使えていいよ。
グラフィックドライバのOpenGL設定についてなのですが、 3Dゲームをなるべく高フレームレートで動かすことを考えて設定するとどうするのが良いですか? 以下に設定項目を書きますのでアドバイスお願いします。 非同期反転: オフ / オン トリプルバッファ: デフォルト / オフ / オン フリッピングポリシー: フリップ / ブリット 深度バッファ ビット深度: デフォルト / 16ビット深度バッファ / 24ビット深度バッファ S3TC テクスチャ圧縮の強制: オフ / オン FXT1 テクスチャ圧縮の強制: オフ / オン ドライバメモリフットプリント: 標準 / 低 / 高 テクスチャ色深度: デスクトップ色深度 / 16ビットテクセル / 32ビットテクセル 異方性フィルタ: アプリケーションコントロール / オフ / オン
「スレッドした最適化」(?)を問答無用でオフ
>>730 それのコピペなんですが本当にこの自己解決した回答であってるんですか?
ここはプログラム板なのでユーザはスレチ プログラムの質問にしてネ!
こんなもん初歩の初歩じゃねーか 初心者スレで乞食してろ
■CPU : Intel(R) Pentium(R) 4 CPU 3.20GHz VenderID : GenuineIntel CPUの数 : 2 CPUのスピード : 3188.7MHz ■OS : Microsoft Windows XP Service Pack 2 Ver 5.01.2600 ■メインメモリ容量 : 502 MB 空きメモリ容量 : 171 MB ■ハードドライブの容量 : C:\ : 空き容量: 54.90 GB 総容量: 213.17 GB D:\ : 空き容量: 18.92 GB 総容量: 19.72 GB ■DirectX : DirectX 9.0c installed ■サウンドカード : Realtek AC97 Audio ■グラフィックカード : Intel(R) 82915G/GV/910GL Express Chipset Family VidMemTotal : 116 MB GetAvailableVidMem : 116 MB VRAM : 128.0 MB DriverVersion : 6.14.0010.4764 このVRAM容量なんですがこれは3Dゲームをやるときにトリプルバッファを消したほうがいいですかね?
それはプログラム技術の質問か?
738 :
デフォルトの名無しさん :2008/07/08(火) 12:35:25
単純な質問ですみません。 glslにおいてですが、現在フラグメントシェーダ内で数千回のループであれば描画されるのですが、 数万回、数十万回になると黒塗りのオブジェクトあるいは何も描画されない状況になってしまいます。 for文の繰り返しに制限はあるのでしょうか?
いつもCgだし、そんなloopしたことないので外してるかもだけど for文の制御してる変数がoverflowしてるとかは? 65535回までならうまくいくとか、二重ループにするとうまくいくとかないだろか。
実行できる命令の数っていうのもあるよ GLSLだと命令と文が対応しないから明示されてないけど、ARB_fragment_programの制限を見るとなんとなくわかると思う でも最近のGPUだと制限がかなり緩いんだっけか? あとVistaだとあんまり長いことGPUに仕事させるとハングしたと思ってGPUの強制リセットがかかるから注意な
レスありがとうございます、返信が遅くなってすみません オーバーフローに関しては言われた通りだったので、ループ変数の型を変更しました。 しかしどうやら根本の原因はループ以外で起きているようです。 おおまかな処理としては1次元配列テクスチャとして色データを送り、その要素をループして足し合わせ計算しています。 この1次元配列テクスチャの要素数が2の15乗を超えると、描画がおかしくなることが新たにわかりました。 もう少し自分で調べてみて、また何か変化があれば質問しますのでよろしくお願いします。
GL_MAX_TEXTURE_SIZEを調べるんだ! というか最大のテクスチャサイズが8192を越えるGPUなんて見たことないぞ どうしてもというならGL_EXT_texture_buffer_objectなら2^23サイズまでいけるようだ ただし、普通のテクスチャと使い方がちょっと違うのとGeForce8以降でしか使えない
743 :
デフォルトの名無しさん :2008/07/09(水) 11:57:29
返信ありがとうございます やはりテクスチャサイズが8192を超えるとだめなんですね 教えていただいた方法を含め、何か別の方法を考えてみます
744 :
デフォルトの名無しさん :2008/07/15(火) 06:17:02
OpenGLのくだすれがねぇ… ここに質問しちゃうお!
はいどうぞ
元々質問以外に大した話題があるわけでもないしなw
747 :
デフォルトの名無しさん :2008/07/15(火) 08:04:34
glBindTexture(GL_TEXTURE_2D, 0);はどういう必要があるときに使われるんだお! ↓のコードがあって glGenTextures(1, &texid); //テクスチャオブジェクト名を生成 glBindTexture(GL_TEXTURE_2D, texid); // テクスチャオブジェクトを作成 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, imWidth, imHeight,0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); //グラボメモリにテクスチャをロード glBindTexture(GL_TEXTURE_2D, 0);//←???????? グラボのテクスチャメモリにロードしたらバインドを解除してもいいのか..... というかバッファオブジェクトについて詳しいサイトはどこかにないでしょうか。。。
>>747 OpenGL1.0の頃は、glBindTexture()でテクスチャオブジェクトを切り替えることができなかったんだヨ。
で、そのデフォルトのテクスチャが、OpenGL1.1以降ではテクスチャオブジェクトの0番になった。
0番だけが他のテクスチャと区別があるわけでもないので、glBindTexture(GL_TEXTURE_2D, 0);は
「バインドを解除」じゃなくてバインドを0番に戻すだけ。
どういう必要があるときに使われるかっていうと・・・0番のテクスチャに切り替えたい時に使われるね。
そのままだけどw
ヒント: glGetFloatv
>>749 そのページわざわざ難解に書いてる感じ
本屋か図書館行って自分が理解できる本を探すのが一番でしょう
3Dグラフィックスの本とベクトルの教科書を中心に
こんなところで説明するのは量的にとても無理
まぁそうなんだろうけど、glRotateで回転してんなら
>>750 のようにglGetでMODELVIEWを拾ってくればいいような
VIEW座標じゃいやなら、カメラ設定後にMODELVIEW(=VIEW)を保存しといて逆行列にしてかければワールドになるし
もちろん行列計算の基礎は知ってて当然だけど
>>750 一応リファレンスを全部読んでみましたがどう使ったらいいんでしょう??
>>752 ちょっと本借りてきます。ありがとうございます。
>>752 PcosθならPのそれぞれの成分にそれぞれcosθをかければよい、
ということでしょうか?それだとうまくいきませんでした。
計算が間違っているのかもしれませんが・・・・。
リンク先も参考にしてみます。
GLfloat matrix[16]; glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
>>753 なるほど・・・。そういう方法があるんですね。勉強不足であまり理解できていませんが・・・。
少し勉強してみます。ありがとうございます。
>>755 わざわざありがとうございます。
もしかしてこれで取得した行列にもともとの座標をかければ
ワールド座標上での回転後の座標になりますかね?
>>754 の人の話だとそう簡単じゃないか。
どちらにせよ勉強不足のようですね。みなさんありがとうございました。
758 :
752 :2008/07/16(水) 13:13:25
>>754 > PcosθならPのそれぞれの成分にそれぞれcosθをかければよい、
> ということでしょうか?それだとうまくいきませんでした。
> 計算が間違っているのかもしれませんが・・・・。
それでいいはずなんだけど…。間違っている可能性としてまず思いつくのは,
回転軸方向のベクトルaがちゃんと単位ベクトルになっていないんじゃないかな?
(glRotate() は単位ベクトルじゃなくても自動的に正規化して計算してくれる。)
次に思いつくのは回転方向が逆とか。(これは表示させればすぐわかると思う。)
それでもだめなら,ソース晒してみれば?
>>757 >>753 の言っているように、
>>755 の行列をかけるとワールド座標を飛ばしてビュー座標まで変換されちゃう。
OpenGLはモデル変換(ローカル→ワールド)とビュー変換(ワールド→ビュー)を区別せずに、
MODELVIEWという1つのスタックで管理してるからね。
ということで、これまた
>>753 の繰り返しになるが、
gluLookAt等でカメラを設定した直後にglGetでモデルビュー行列(=ビュー行列)を保存しておき、
あとでその逆行列をかけてやればいい。
[ワールド座標] = [ビュー行列の逆行列]×[モデルビュー行列]×[ローカル座標]
> libjpeg.libはネット上で発見してダウンロードし、 よーそんなこえーことできるなー
763 :
749 :2008/07/17(木) 23:15:46
そのプログラムについてはわからないけど(floatの配列をdoubleを受け取る関数に渡してたり?) ビューマトリックスは回転と移動しかしてないから、回転部分を転置行列にして逆移動成分を掛けたのが逆行列に。 でもとりあえずWindowsならD3DXMatrixInverseを使っちゃえば?
766 :
749 :2008/07/18(金) 17:03:51
わざわざプログラムまで示してくださってありがとうございます。 申し訳ないのですが実行してみたところやっぱりだめでした。 実行すると結果の行列のそれぞれの要素が他のプログラムで実行したとき同様に -1.#INDと表示されてしまいました。 関数内のLU分解のところで計算に失敗しているようです。 ビュー行列は、 1 0 0 0 0 0 1 0 0 -1 0 0 0 0 -80 1 に今なっているのですが、これが正則行列ではないので逆行列が求められないのでしょうか。 質問ばかりですみませんがよろしくお願いします。
どう見ても正則じゃん
本当にビュー行列がその値になってるのかprintfでもなんでも出力してみた? その行列なら手でも簡単に逆行列出せちゃうぜ
764だけどちょっと書いてみた。逆回転して逆移動してるだけだから、Viewマトリックス限定。 void getInverseVMatrix(float src[], float inv[]) { for(int x=0;x<3;++x){ for(int y=0;y<3;++y){ inv[y*4+x] = src[x*4+y]; } } inv[3] = inv[7] = inv[11] = 0.0; inv[12] = (-src[12]) * inv[0] + (-src[13]) * inv[4] + (-src[14]) * inv[8]; inv[13] = (-src[12]) * inv[1] + (-src[13]) * inv[5] + (-src[14]) * inv[9]; inv[14] = (-src[12]) * inv[2] + (-src[13]) * inv[6] + (-src[14]) * inv[10]; inv[15] = 1.0; }
770 :
デフォルトの名無しさん :2008/07/20(日) 01:48:42
(このスレでいいのかな)
Symbian OS上での携帯電話ソフトウェアの開発(C++)に関わっているのですが、
これからの業務でOpenGL ESを覚えないといけなくなりました。(普通のOpenGLも触ったこと無い)
無印OpenGLの資料ならぐぐればいくらでもあるんですが、
ESが付くほうは断片的にしか情報が無い、英語でしかない、という状況で、何から覚えればいいのかサッパリ。
無印OpenGLの資料もある程度は参考になるんですが、ESでは実装されていない関数があったりで難航しております。
2ちゃん見ても専用スレも無いようだし、手がかりも無さ過ぎて途方にくれています。どこかいい資料ありませんか?
あるいは、「こうやって習得した」など、経験者の方いらっしゃったらアドバイスいただけませぬか・・
いま悩んでいる問題について。
ある1平面を色がグラデーションになるように着色したいのですが、
ちょうどこんな感じに。
http://www.ccad.sist.chukyo-u.ac.jp/~mito/ss/program/C/DialogBase/openGL/model/index.htm 上記資料を見ると、glColor3f()で「頂点ごとの色指定」して、glShadeModel(GL_SMOOTH)に指定すれば中間色を計算して塗ってくれるようですが。
ESではglColor3f()は実装されていないようで・・・
頂点ごとの色は glColorPointer で色配列を指定して glEnableClientState(GL_COLOR_ARRAY) で有効化するといいよ
glColor3fとかがないのはESだったらもっとオーバーヘッドの小さいもの 使えってことじゃないかと。 まずはOpenGL Distillerとか読んでOpenGLの大体の感触を掴んだらどうでしょ。
仕事でGL触れる人裏山視す
>>770 ESは基本的に頂点配列での描画じゃない?
glDrawArrays, glDrawElements辺りを調べればいいんじゃないかと。
OpenGL ESゲーム開発技法っつー本があるよ ただしOpenGLを知っている人向けに書かれてるのでOpenGL知らないと難しいかもな
#define glColor3f(r,g,b) glColor4f(r,g,b,1.0)
そーゆー問題じゃないだろw
両端が丸まっていて、太くアンチエイリアシングが効いているラインを書きたいんだけど、GL_LINES に作用する何らかのモードがあったりしない? なければストリップで書くのだけど・・・。
端にアンチ効いたポイント置くのは?
質問なんですが… GLSLで描画コール(glDrawElements())に対してシェーダーを記述しているのですが、 この一連の描画を使うシェーダーを更にセットしたい場合、 glUseProgram()でそのシェーダーをセットして… あれ?最初の描画コール用のシェーダーセットしたら、シェーダー上書きしちゃう? って感じなのですが、何かやり方があるのでしょうか? よろしくお願いします。
目眩がするような質問だな。
>>780 その発想は無かった。やってみる。ありがと。
784 :
デフォルトの名無しさん :2008/07/23(水) 00:43:14
あんたらすげぇぜ
>>778 いや、実際こう書けるんだからglColor3fいらないよね、ってのがESのポリシーなわけで
質問者はグラデーションしたいって話なんで、 ESにはglBegin()が無いんだからglColor4fでどうこうなるってもんでもないんじゃ
787 :
デフォルトの名無しさん :2008/07/23(水) 08:45:21
2つの異なるスプライン曲線で囲まれた内側を塗りつぶしたいのですが、 glBeginとglEndの内側で↓のようにエバリュエータを切り替えることは できなかったと思います。良い方法はないでしょうか。 glBegin(GL_POLYGON); // ポリゴン描画開始 glMap1d(..., &ctrlpoint0[0][0]); // スプライン曲線その1 glEnable(GL_MAP1_VERTEX_3); for (int i=0; i<=30; ++i) glEvalCoord1d((GLdouble)i/30.0); // プロット glDisable(GL_MAP1_VERTEX_3); // その1終わり glMap1d(..., &ctrlpoint0[0][0]); // スプライン曲線その2 glEnable(GL_MAP1_VERTEX_3); for (int i=0; i<=30; ++i) glEvalCoord1d((GLdouble)i/30.0); // プロット glDisable(GL_MAP1_VERTEX_3); glEnd(); // ポリゴン描画終了
そもそもGL_POLYGONは凸型の形状しか塗れないと知ってる? 凹んでる頂点があったらアウト
>>787 2本の曲線で囲まれた内側とか言われても困るんで、
赤本の「エバリュエータとNURBS」のとこ読んでください
790 :
787 :2008/07/23(水) 09:49:13
>>788 例え話です。
>>789 うまく伝わらなかったかもしれませんが、
「端点A0〜端点A1」という曲線と「端点B0〜端点B1」という曲線があったとき、
A0 A1
■■■■■■
B0 B1
こんな形のリボンを描きたいと思っています。
つまり■で示したA0〜A1〜B1〜B0〜A0という領域を塗りつぶそうとしています。(曲線内部が潰れることは今は考えない)
各セグメントの座標がわかればA0からB1に向かってTRIANGLE_STRIPで
A、B、A、B…と交互に点を打っていけば目的は達成できるのですが、
エバリュエータから座標を取得する関数はOpenGLにはなかったように思います。
自前でベルンシュタイン関数を計算してもたかが知れてるのでそうしてもいいのですが、
その前によい案があればと思い質問しました。
赤本は手元にないのですが…解決方法が載っているならそちらを参照します。
openGLでやる方法がわからないのもあるけど、 自分だったら自前で計算するかな。そのほうが簡単で融通も利くような気がするし。 アニメーションしなければ1度の計算ですむし、アニメーションするならねじれた場合の再分割を処理できる
792 :
787 :2008/07/23(水) 13:26:29
ぐはぁ。末尾のようなコードを書きましたが毎回生成するとエバリュエータ使うより数倍遅いです…。
>>791 glTranslateやglScaleを使って端点の移動を効率良く反映させる方法を考えないといけなさそうです。
template <int N> struct power { static double value(double base) { return base*power<N-1>::value(base); } };
template <int N, int M> struct factorial { static double value(void) { return N*factorial<N-1,M-1>::value(); } };
template <int N, int M> struct combination { static double value(void) { return factorial<N,M>::value()/factorial<M,M>::value(); } };
template <int N, int M> struct bernstein_weight {
static vector<double> value(double par) {
vector<double> retval(1, combination<N,M>::value()*power<N-M>::value(1.0-par)*power<M>::value(par));
vector<double> tmp(bernstein_weight<N,M+1>::value(par));
retval.insert(retval.end(), tmp.begin(), tmp.end());
return retval;
}
};
template <int N> vector<vec2<double> > generate_spline_points(const vector<vec2<double> >& ctrlpoints, int number_of_segments) {
assert(ctrlpoints.size()==N+2); // +2は端点
vector<vec2<double> > retval(number_of_segments+1);
for (int i=0; i<=number_of_segments; ++i) {
vector<double> weight(bernstein_weight<N+1,0>::value(double(i)/number_of_segments));
for (int j=0; j<N+2; ++j) retval[i] += weight[j]*ctrlpoints[j];
}
return retval;
}
なんかすごい遅そうなコードなんだが。Cで書いてみれば?
794 :
749 :2008/07/23(水) 18:41:04
レスが遅くなって申し訳ありません。
>>769 わざわざ関数まで作っていただいてありがとうございます。
>>759 の方を参考に関数を使ってみたのですがうまく使うことができませんでした。
ビュー行列が
1 0 0 0
0 1 0 0
0 0 1 0
0 0 -80 1
その逆行列が
1 0 0 0
0 1 0 0
0 0 1 0
0 0 80 1
になりました。
(続きます)
795 :
749 :2008/07/23(水) 18:41:49
モデルビュー行列が、 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -90 1 これは、ためしにglTranslateで-10だけz軸方向にずらしたものです。 逆行列とビュー行列の積が、 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -10 1 になりました。 これをローカル座標にかけると上の行列の4行目が無視されて、 結局座標が移動されないことになってしまいます。 とりあえず縦、横逆にして掛けちゃえ、と思いましたが、 それだと回転がうまくいかないようです。 何度もすいませんがご指導お願いします。
>>795 ローカル座標を縦ベクトルとして、行列を左からかけてるってことだよね?
その場合、OpenGLの行列の解釈は次のようになる。
┌ m[0] m[4] m[8]. m[12] ┐
│ m[1] m[5] m[9]. m[13] │
│ m[2] m[6] m[10] m[14] │
└ m[3] m[7] m[11] m[15] ┘
赤本にも書いてある基本中の基本だね。
もし
>>794-795 の行列表記のままで行きたいなら、
座標を横ベクトルにして、行列を右からかけないと駄目。
その場合、
>>759 の掛け算の順序も全部逆になるから注意。
(DirectXのヘルプの流儀はこっち)
まあ、これはあくまで頭で考えるときの表記上の問題で、
コーディング的にはどっちもまったく同じことだけど。
797 :
769 :2008/07/23(水) 23:56:55
>>795 >>796 さんの言われてるとおり、
元の座標位置を p ( x, y, z, 1 )、モデルビューマトリックスをMv 逆ビューマトリックスをIvとすると
p * Mv * Iv がワールド座標位置になる
表記の違いで、移動成分を第4列に書く(openGL流)なら、位置がたてベクトルになって全部逆に書くが、
プログラム的にはなにも変わらない
赤本の付録F 「同時座標と座標変換行列」の所読めばわかるよ
798 :
デフォルトの名無しさん :2008/07/24(木) 22:19:50
すごいぜあんたら
すみません、3次元空間上で、BMP画像を貼り付けたテクスチャが手前と奥に2つあるんですが、 BMPの特定の色だけ、透過色に指定して、手前に配置されたテクスチャの透過色の部分から、 奥に配置されたテクスチャに貼り付けられたBMP画像が見えるようにするには、 どうしたらいいんでしょうか? よろしくお願いします。
800 :
デフォルトの名無しさん :2008/07/25(金) 01:31:52
長方形にテクスチャマップしたものを 台形に変えたときに斜線が入った感じにテクスチャマップされるのを 解消するにはどうしたらいいですか。
>>800 トランスフォーム済み頂点でやってるならXYZRHWのrhwをどうたらこうたら
802 :
801 :2008/07/25(金) 01:36:18
すまん、DirectXじゃなくてOpenGLのスレだった。 なんにしても、Perspective Correctが関係していると思う。
803 :
名無しのせんべえ :2008/07/25(金) 01:50:58
OPENGL初心者です。 お伺いします。 OSはVISTA、開発ツールはVisualC++2008 ExpressEditionです GLUT関連のファイルがあるホームページからglut-3.7.6-binをダウンロードし、 指定のディレクトリにそれぞれのファイルを置いたのですが、コンパイルが うまくいきません。エラー内容は以下になります。おたすけください。。 Shogi3DCon.obj : error LNK2019: 未解決の外部シンボル __imp____glutInitWithExit@12 が関数 _glutInit_ATEXIT_HACK@8 で参照されました。 C:\PRG\SHOGI\Shogi3DConsoleThree\Shogi3DCon\Debug\Shogi3DCon.exe : fatal error LNK1120: 外部参照 1 が未解決です。
804 :
749 :2008/07/25(金) 02:37:26
>>796 >>797 行列の表記法が間違っているとは思いませんでした。
無事に変換後の座標を取得することができました!
今までレスしてくださったみなさんも含めて本当にありがとうございましたm(_ _)m
MFC + OpenGL で組んでいるアプリがあるんだけど、本体となるSDIとモードレスダイアログがあり、 それぞれ両方のウインドウにOGL領域を持ち、OGLコンテキスト(主にテクスチャ)を共有したいのだけど、可能だろうか? 単純に、それぞれの領域に同じPIXELFORMATDESCRIPTORでOGL領域を作り、 wglCreateContext(SDI_DC)で作ったコンテキストのIDをモードレスダイアログと共有したんだけど、 モードレスダイアログ側の挙動が不可解な状態に陥るのみだった。(何故か、glClearColor のステートだけは有効) 何か、助言や参考になる資料などないだろうか?
コンテキストは別々に作って wglShareLists でテクスチャオブジェクト共有すればいいんじゃない
808 :
名無しのせんべえ :2008/07/26(土) 15:52:18
>>803 解決しました。
解決方法はプログラムソースがあるディレクトリに
glut32.libがありましたので、そちらを削除しました。
おさわがせしました
glGetString()についての質問なんですが、レンダリングコンテキストを作成し、 wglMakeCurrent()でカレントコンテキストを設定した後にglGetString(GL_EXTENSIONS) を実行するとAccessViolationが発生してしまいます。 カレントコンテキストを設定しない場合はNULLが帰ってくるのですが… 何が原因なんでしょうか?
810 :
デフォルトの名無しさん :2008/07/27(日) 17:01:04
今, TurboC++でOpenGLを学習中です。下のソースコードで, Coneを青色にするには, どうしたらいいんでしょうか? テクスチャの色と同じ赤色になって困っています。よろしくお願いします。 GLfloat blue[] = { 0.0, 0.0, 1.0, 1.0 }; void __fastcall TForm1::Display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCallList(listid); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, blue); glColor3f(0.0, 0.0, 1.0); glutSolidCone(1.0,0.5,3,3);// 青色にしたい glFlush(); } void __fastcall TForm1::MakeDisplayList() { listid=glGenLists(1); glBindTexture(GL_TEXTURE_2D,texname); glNewList(listid,GL_COMPILE); glBegin(GL_POLYGON); glTexCoord2d(0.0,0.0); glVertex3f(1.0,-0.5,0.0); glTexCoord2d(1.0,0.0); glVertex3f(2.0,-0.5,0.0); glTexCoord2d(1.0,1.0); glVertex3f(2.0,0.5,0.0); glTexCoord2d(0.0,1.0); glVertex3f(1.0,0.5,0.0); glEnd(); glEndList(); }
811 :
810 :2008/07/27(日) 17:36:38
glutSolidCone()の前にglDisable(GL_TEXTURE_2D);でいけました。 おさわがせしました
>>809 特に発生しないぞ。
wglCreateContext();
が失敗しているとか。
MFC使ってません?
C○○App::InitInstance()の中で、glGetString(GL_EXTENSIONS)する場合、
タイミングによっては、glGetString(GL_EXTENSIONS)が失敗する。
>>812 すいません、自己解決しました。
実際にはglGetString()で発生しているのではなく、マーシャリングを失敗しているのが原因でした。
VSの例外アシスタントがなぜか機能しなかったため、自分が勘違いしてたみたいです orz
スイマセン、2D画像表示の方法がイメージ掴めないんです 板ポリにはっつけて描画するのは分かるんですが LookAtで視点変えちゃうと傾くし、拡縮されるし・・・
>LookAtで視点変えちゃうと傾くし、拡縮されるし・・・ だったら視点を変えなければいいと思うよ
>815 そしたら3Dオブジェクトの描画が
パースで視野角をめちゃめちゃ小さくすればいいんじゃないの。 でもどんなに頑張っても若干はゆがむ。目に見えない程度にはできるはず。
2Dの時と3Dの時とそれぞれ適切なカメラ位置にすればいい
>>817 >>818 ありがとう、もう少しで解決できそうだ
2D描画の時と3D描画の時で射影行列もろもろを再設定してる
Perspective じゃなくて、素直に Ortho を使えって。
2D表示にパース付き射影行列使う男の人って…
ステキ!
素朴な疑問なんですが glTranslated(x, y, z); glBegin(GL_POINTS); glVertex3d(0, 0, 0); glEnd(); と glBegin(GL_POINTS); glVertex(x, y, z); glEnd(); では後者の方が速いですよね?
glTranslatedの呼び出し1回がない分、後者の方が速いだろうな
レベル低い質問に答えて頂いてありがとうございました
gl*っつー関数は(全部じゃないが)ドライバと通信するコストがかかるので、なるだけ呼ぶ回数は減らした方がよい。 が、コードの再利用をするならある程度処理を使い回せるようにした方がよい。 そしてgl*コールの関数を1つ減らすよりはもっと大枠を見直した方がずっと高速になる。 なので関数1つの有無に拘るのはやめといたほうがいい。老婆心ながら。
823の場合は、関数呼び出しのコストよりむしろ 行列操作のコストの方が大きな問題になる気がする。 まぁ、並行移動なら、逆行列の生成も早いだろうけど・・・。
アルゴリズムの改善はハードの進歩に優る
829 :
デフォルトの名無しさん :2008/08/04(月) 22:25:44
いいこと言うなぁ
テクスチャのサイズに関する質問なんですが、テクスチャの最大サイズを取得する場合、 glGetInteger(GL_MAX_TEXTURE_SIZE, &size) などとして取得すると思うのですが、2Dのテクスチャを使用する場合、この後に環境によっては2や4で 割らなければいけない環境もあるらしいのですが、そういう環境なども考慮して最大サイズを割り出す にはどうしたらいいでしょうか? GeForce7600GSでは最大サイズがそのまま使えたりするので、単純に2で割ればいいというわけではない みたいなのですが…
テクスチャプロキシ
>>831 ありがとうございます。うまくサイズを取得できました。
しかし、ついでにNPOTテクスチャも使用してみようと思ったのですが、最大サイズからとりあえず-1して
GLint maxTeSize = 4096;//取得した最大サイズ
GLint width = 0;
maxTexSize -= 1;
glTexImage2D(GL_PROXY_TEXTURE_2D, 0, 4, maxTexSize, maxTexSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
とすると4095が帰ってくるのですが、試しに4095x4095なイメージをでテクスチャを作ろうとしても
うまく作成できません。4096x4096なテクスチャは作成できるのですが…
うまく作成できませんだけじゃ何もわからないよ。 問題が再現する最小限のコードか、せめてglGetErrorの結果を貼ろうよ。
>>833 すいません、
>>832 を書いた後にOpenGLの設定をいじって遊んでいたら4095x4095のテクスチャが
作成できるようになり、また、以前の設定に戻しても作れるようになってしまいました orz
どうやらこちらの環境依存の問題だったようです。
もうちょっといじってみてまた作成できなくなったらちゃんとglGetError()の結果を張りにこようと思います。
お手数をおかけしてすいませんでした orz
ありがとうございました。
何がすいませんだ,何を叱られてるのか全然分かってないな 「以前の設定」を具体的に書かないと情報として(他の人の)役に立たないだろ 同じミスを二度しちゃダメだ
あっそw
837 :
デフォルトの名無しさん :2008/08/07(木) 04:45:58
自分からテスト専門です、って宣言してる派遣テスターって何なの? 将来プログラマとかSEになりたい、とかならわかるけど。 向上心ないよね、頑固だし。 そういう派遣テスターって、仕様書は読めない、 テスト仕様書も作れない、テストプログラムも作れない やれることは「テキトーにプログラムを触る」ことだけ。 俺は派遣プだけどさ、こういう派遣テスターがいると 派遣全体がバカにされるんだよ。 テスト専門派遣なんて氏んで欲しいよ、まったく。 今日も正社員の人が派遣テスターに仕様書を読んで テスト仕様書を作ってください、って説教してたよ。 その派遣は頑固に「何故、仕様書が必要なんですか?」って 反論してたから、きっとテスト専門派遣テスターだな。 仕様書も読まず、テスト仕様書も作らず、ただテキトーに プログラム触るだけで給料もらおうなんて頭おかしいんじゃねーの? あ〜あ、あの派遣テスターが3ヵ月後に切られるまで、 仕様書も読まねーでテキトーにテストしたバグ票がまわってくんのかよ。 そんな糞なもん、読んで処理する派遣プの身にもなってくれよ。 うわ〜、しかもそいつが切られる3ヵ月以内に中間納品あるじゃねーか! テスト仕様書もなしにテキトーにテストして納品か。 中間納品後にソッコウクレームでデスマ必至だな。俺の休みも返上かよ。 派遣専門テスターさんよ、少しは向上心持てよ! 頑固な性格直して仕様書読めよ!テスト仕様書作れよ!
スレタイ読めよ! まで読んだ
839 :
デフォルトの名無しさん :2008/08/07(木) 11:38:37
向上心がないから派遣やってるんじゃないの?
841 :
デフォルトの名無しさん :2008/08/07(木) 12:17:10
向上心もなくまともにテストができない派遣なんて切ればいいだろ
843 :
デフォルトの名無しさん :2008/08/09(土) 01:02:46
俺は日曜SWだけど俺は向上心ありすぎて仕事じゃできないだろうなぁ
844 :
デフォルトの名無しさん :2008/08/10(日) 21:05:21
簡単な光源の勉強をして、プログラムを組んだのですが、動きません。 いろんなサイトを見てもこれで動くような気がするんですが、環境的な問題でしょうか。 コンパイラはBorland C++ 5.5.1です。 #include <windows.h> #include <GL/glut.h> const GLfloat lightPos[] = { 3 , 0 , -2 , 0 }; const GLfloat lightCol[] = { 1 , 0 , 0 , 1 }; void disp( void ) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_POLYGON); glNormal3f(1.0 , 1.0 , 1.0); glVertex3f(0.0 , 0.0 , 1.0); glVertex3f(0.0 , 1.0 , 0.0); glVertex3f(1.0 , 0.0 , 0.0); glNormal3f(-1.0 , -1.0 , -1.0); glVertex3f(0.0 , 0.0 , -1.0); glVertex3f(0.0 , -1.0 , 0.0); glVertex3f(-1.0 , 0.0 , 0.0); glEnd(); glFlush(); }
845 :
デフォルトの名無しさん :2008/08/10(日) 21:06:20
int main(int argc , char** argv) { glutInit(&argc , argv); glutInitWindowPosition(50 , 50); glutInitWindowSize(400 , 400); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); glutCreateWindow(argv[0]); glutDisplayFunc(disp); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(1 , -1 , -1 , 1 , 2 , 10); glLightfv(GL_LIGHT0 , GL_POSITION , lightPos); glLightfv(GL_LIGHT0 , GL_DIFFUSE , lightCol); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glutMainLoop(); return(0); }
モデルビュー行列が初期化されてない。
847 :
デフォルトの名無しさん :2008/08/10(日) 21:34:37
disp()内でglClear()の次の行にglLoadIdentity()を入れてみましたがエラーで止まります。
glMatrixMode(GL_MODELVIEW); ってfrustumの下にでも書いてみ。
849 :
デフォルトの名無しさん :2008/08/10(日) 21:51:35
やっぱりだめです
850 :
849 :2008/08/10(日) 22:04:20
すいません解決しました。
なんでこう、人にものを尋ねておきながら、分かった後は 「解決しました」の一言で放ったらかしな人間が多いのかねぇ・・・。 理解に苦しむわ。
全く 何をどうしたら解決したかを書くのは最低限のマナーというか 掲示板のルールなんだが
853 :
デフォルトの名無しさん :2008/08/11(月) 01:25:43
あっそw
この内容では要らないだろう。
欲しいのか?
>>652
内容の程度によらず書くべき。
カンマの前にスペースって新しいな
OpenGLで、テクスチャ座標の補間についての質問なのですが、 正方形のテクスチャを台形のような形に張った場合に、線形に変形するのではなく、 Photoshopの変形の遠近法みたいな補間をしてくれる拡張があると ちらっと聞いたような気がするのですが、そんなものはないのが正解でしょうか。 つまり、上が狭い台形に張った場合に、下から上に向かって縦の座標もどんどん狭く 変形されていってほしいのですが。
>>858 テクスチャ座標の4番目の要素 (q座標) を狭さ・広さにあわせて調節する
>>859-860 ありがとうございます!
まさにそれで出来ました。感謝感激です!
OpenGLのテクスチャ座標は(s, t, r, q)で表されて、
最終的に使われる座標は(s/q, t/q, r/q)になる、という話ですよね。
で、glTexCoord2fで(x,y)とかすると、s=x, t=y, r=0, q=1になる、と。
助かりました。
Driver 177.89 - OpenGL 3.0
http://developer.nvidia.com/object/opengl_3_driver.html Desktop: GeForce 8000 series or higher; GeForce GTX 260, 280; Quadro FX 370, 570, 1700, 3700, 4600, 4700x2, 5600
Notebook: GeForce 8000 series or higher; Quadro FX 360M, 370M, 570M, 770M, 1600M, 1700M, 2700M, 3600M, 3700M
863 :
デフォルトの名無しさん :2008/08/16(土) 18:07:45
void display(void) { glPolygonMode(GL_FRONT,GL_LINE); glPolygonMode(GL_BACK,GL_LINE); glLineWidth(2.0f); glColor3f(0.0f,0.0f,1.0f); glTranslatef(0.0f,5.0f,0.0f); glRotatef(30.0f,0.0f,0.0f,1.0f); glScalef(10.0f,10.0f,10.0f); myglWireCube(); <-6面体のポイントとラインだけの ワイヤーフレームモデルの配列 }*/ こんなプログラムでワイヤーフレームの六面体をアフィン変換して空間上での 回転・並進・スケールチェンジをして絵としては出力できるのですが、アフィ ン変換後の各頂点のX,Y,Z座標を数字で抜き出すにはどうすればいいのでしょ うか? 要はグラフィック処理ではなく、空間上の任意のポイントの座標をアフィン変 換した後の座標を求める作業に流用したいわけですが。
GL_FEEDBACK
865 :
デフォルトの名無しさん :2008/08/16(土) 19:14:41
>>864 早速有りがd。そんな手があったか。
昨日届いたばかりの赤本にめっけたので読んでみる。
866 :
デフォルトの名無しさん :2008/08/17(日) 11:19:12
OpenGLの描画速度について伺いたいことがあります。 WinXP, GLUTを使ってポリゴン描画をやってるのですが、以下の状況のときにfpsが大きく落ちます。 ・ポリゴン数を増やし(300程度)、画面全体に隙間なく配置する。 ・ウィンドウを拡大(1600,1200,あるいは640,480のフルスクリーン)する。 ちなみに、ポリゴンを小さくした場合速度の低下が緩やかになります。 どこが原因なのかと以下のコードで検証した結果、画面の拡大に伴い idle関数終了から次にidle関数が呼ばれるまでの時間が増加(30ms程度)することが分かりました。 glutPostRedisplay関数自体どの条件でも1ms程度で終わるので遅くなる 直接的な原因が謎ですが、ご存知のかたいらっしゃらないでしょうか? 開発環境がビデオカードのしょぼいノートPCなのでそれが原因とも思いますが、 改善案がないかと思い相談させていただきました。 DWORD static t1 = 0; void idle() { printf("%d : ",timeGetTime()-t1); //idle終了から次が発生するまでの時間 DWORD t = timeGetTime(); static DWORD prevTime = timeGetTime()*3; // fpsを60に保つ while(timeGetTime()*3 - prevTime < 50); prevTime += 50; glutPostRedisplay(); // 描画関数 t1 = timeGetTime(); printf("%d\n", timeGetTime() - t); // 描画にかかった時間 }
glutPostRedisplayはキューにDeisplayイベントをPostするだけだから一瞬で終わる 実際に描いてるのはdisplayコールバック関数内部 whileのループは無駄にCPUを消費するからSleep()を噛ますなり、タイマー割り込み使うなりしたほうが良いかと 可能性は低いかもしれないが60fpsが突然30fpsになるなら垂直同期が強制ONになってるとか
>>867 ありがとう御座います。
timeGetTimeによる時間計測をglutPostRedisplay();終了後を基準として、
displayイベントの関数開始と終了に配置して調べてみました。
結果、glutPostRedisplay()を呼び出してから、実際にdisplayイベントが発生するまでの時間が
865の状況下で大幅に遅くなっていたようです。
この原因は、glutSwapBuffers();関数もglutPostRedisplay();関数同様に、
制御はすぐに返すものの、実際に画面が更新されるまで時間がかかることと感じます。
ポリゴンの描画面積に応じてSwap速度が変化するってのは若干すっきりしませんが一歩前進できました。
垂直同期に関しては、wglSwapIntervalEXTをサポートしていない腐れビデオカードなので
安西先生・・・垂直同期したいです・・・。と泣きたい状況です。
fps60に固定してもティアリングが軽減されるだけでやっぱり気持ち悪い。
ティアリングを感じないOpenGLのソフトもあるのだけど、どうやって対策してるのか不思議です。
使い方間違っているくさいけど、面倒なんで詳しくは指摘しない
>>869 うーん。
glewInit();は成功で、
glewGetExtension("WGL_EXT_swap_control")
でこけてるから無理かな〜と思ったんだけど間違ってたかなorz
ネットで拾ったvsyncのサンプルプログラムも全滅したんで諦めてました。
もし間違ってたらヒントくらい教えてもらえませんか?
ちなみに速度の問題はどうしようもなさげです。こっちは他のアプリケーションでも
かなりカクカクになることを確認したのでノートPCが原因っぽ。
さらに検証結果の追記です。 どうやらglVertex3d関数はSwap()と同じキューにタスクを放り込んで即制御を戻す気がします。 加えて、俺のPCだと計算時間はポリゴン数じゃなく、 glVertex3d関数で書き換わるバックバッファのピクセル数に比例するみたい。 ・画面外に馬鹿でかいポリゴンを表示しても速度に影響しない(バッファに影響しないため?) ・画面全体を埋めるポリゴンだと3枚くらいでfpsが60を切る。 ・上記より小さいポリゴン100枚(glVertex3d関数の呼び出し回数も100倍)のほうが圧倒的に早い。 キューにポリゴン表示によるバッファの書き換えも蓄積し、その後Swapが行われるから遅いってことかな。 こう考えればidle関数が2度目呼び出されるまで大幅に遅れるのも納得できる気がします。 初心者の戯言なので、間違ってたら指摘してください。
glGetString(GL_RENDERER) も検証してみて
>>872 Intel 965/963 Graphics Media Accelerator
って帰ってきました。
関数を調べてたらGL_EXTENSIONSってので拡張機能を分かるっぽいので見てみたら多すぎて泣けた。
GL_WIN_swap_hintってそれっぽい気がするのでちょっと調べてくる。
ついでにGL_VERSIONって入れてみたら1.5.0 build 6.14.10.4864とか出てきた。
何か強烈に嫌な予感がする。これも調べてみる。
というわけでOpenGLのVersionを最新にしようと思って格闘してはや2時間。 本家のページにSDKってあるのにどこからダウンロードしたらいいか分からんとか 俺どんだけゆとりなんだorz 目痛くなってきたんでちと休憩
スレに日記レス書き込む前にちゃんとチュートリアルとか読んだら?
>>873 おそろくし、勘違い暴走している。
> ついでにGL_VERSIONって入れてみたら1.5.0 build 6.14.10.4864とか出てきた。
> 何か強烈に嫌な予感がする。これも調べてみる。
これ、普通。
赤本でも買って勉強するがよろし。
>>871 なんだかよくわからないが、描画時間は描画ピクセル数にだいたい比例するぞ。
ポリゴン数ではなくて。
3角形ホリゴン100個・三角形一つの大きさが10ピクセルなら、
vertex shaderが300回、fragment shaderが1000回計算。
3角形ホリゴン1個・三角形の大きさが10000ピクセルなら、
vertex shaderが3回、fragment shaderが10000回計算。
画面外の場合は、ラスタライザがカットしてるんじゃないか?(よく知らないが)
赤本注文しました。修行してから出直します。
>>877 最初はglVertex3d関数を呼び出す回数に比例するんかなと思ったんだけど
関数呼び出し自体のコストは微々たるものだったという壮大な勘違いでしたorz
>>878 プログラム上だけで試行錯誤するよりも、本格的にGLを勉強するなら
やはり赤本が近道だと思う。がんばれ。
解決済みかもしれないけど、OpenGLのVersionを最新にするには
GPUベンダのドライバを更新することで実現します。
ただし、IntelのChip set内蔵GPUは、シェーダアーキテクチャでも
OpenGL 2.Xには対応していないので、最新GPUとドライバでも1.5まで。
880 :
デフォルトの名無しさん :2008/08/20(水) 09:23:56
> 赤本ってこれでいいんですよね? 新しい赤本ってこれでいいんですよね?
それでok
>>880 Cgでよければ、
http://www.amazon.co.jp/3D ‐CGプログラマーのためのリアルタイムシェーダー-理論と実践―「古典的ライティング・モデル」から「グローバル・イルミネーション」まで-I・O-BOOKS-金谷/dp/4777510875/ref=sr_1_1?ie=UTF8&s=books&qid=1219199126&sr=1-1
あんまりいい本ではないが、ほかに入門書がない、と思う。
日本語の資料が良いならシェーダーの勉強だけDirect3Dでやるのも悪くない
redbookってpdfでダウンロードできるのにわざわざ場所とる本かうの?
1,pdfが参照しやすさで書籍に相当劣る。 2,英語読めない(´・ω・`)
>>887 この頭の悪そうなレスはなんだろう?・・・
OpenGLを使っているアプリケーションのレンダリング画像 ビデオメモリから直接取り出したり出来ますか?
自分で描いた画像を自分で取り出すだけなら glReadPixels
自分で作ったのでないアプリケーションの画像は?
フック汁
PrintScreen
手動w
俺用メモ GLSL -OpenGLのシェーダ言語。コンパイラがドライバに依存してるため癖がある。日本語資料はそこそこ Cg -OpenGL、Direct3Dで使える。HLSLのルーツで構文が柔軟かつ簡単。日本語資料少なめ。将来性はぁゃιぃ HLSL-Direct3Dのシェーダ言語。Cgと構文がほぼ同じ。サンプル及び日本語資料大量。バグに悩まされることが非常に少なく初心者向き
redbookってpdfでダウンロードできるのにわざわざ場所とる本かうの?
>>889 煽りに釣られる低脳な自分に気づかない男の人って・・・
赤本のPDFダウンロードについて詳しく 1.1のならいらね
コンテキスト作ったのと別のスレッドでテクスチャの作成とか出来ないのきついな〜 MSなんとかしろ
それはMSに言ってもしょうがない
903 :
デフォルトの名無しさん :2008/08/25(月) 14:52:46
教えて下さい。 Win/C++ Builderでアプリ作りましたがOpenGL使った場合、 ライセンス表示とか必要なんでしたっけ? GLUTは使っていません。
DelphiでOpenGLやってるんですが、 Form.Canvas.Handle: HDC などのウインドウやコントロールなどのHDCをOpenGLに渡してやると きちんと画面に描画できるのですが、 TBitmap.Canvas.Handleなどのように画像のHDCを渡すと正しく描画されません。 このようなものなのでしょうか? オフスクリーンで画像を得たい場合は、 FBO、pbuffer, CopyTexImage2Dなどを使うしかない?のでしょうか。
905 :
904 :2008/08/25(月) 19:15:24
正しく描画されない、を探ってみましたところ、 初期化時にTBitmap.Canvas.Handleを渡したところ、SetPixelFormat に失敗し、 仮に他の(Form.Canvas.Handle)HDCなどで初期化した後、 BitmapのHDCを wglMakeCurrent に渡しても失敗するようです。
PIXELFORMATDESCRIPTOR の dwFlags に PFD_DRAW_TO_BITMAP が必要なんでない?
PolygonとSegmentの当たり判定の方法を教えて頂けないでしょうか。 コード付きだと最高です。よろしくお願いします。
>>907 GL関係ないやん。
自分で勉強しなさい。
メインはGLで作ってます。ぜひヒントでも。
ヒント:関係ない
ケチ
計算幾何の話しだしな。
知識はタダじゃない。 履き違えるな。 他人に教えを乞うときはそれ相応の礼儀が必要ということだ。
例えそれが2chだろうと関係なくな。 で、幼女どこ?
>>906 ありがとうございます。試してみます!
しかし、基本的なことを聞いてしまった気がします。
赤本どこいったんだろ・・・
>>907 「三角形 線分 交差判定」でぐぐればすぐ出てくるよ
917 :
デフォルトの名無しさん :2008/08/26(火) 08:48:34
>>915 赤本には載ってないと思うよ。白本じゃね?
920 :
デフォルトの名無しさん :2008/08/26(火) 18:11:21
二つのテクスチャマップした板の重なり部分をテクスチャの色でブレンディングしたいのですが、 重なり部分はうまくブレンディングできているようですが、 重なりでない部分が背景色とブレンディングされてしまうのですが、どうしたらよいですか。 またサンプルコードとかありましたら教えてください
921 :
904 :2008/08/26(火) 18:45:52
PIXELFORMATDESCRIPTOR の dwFlags に PFD_DRAW_TO_BITMAP を指定してみたのですが、 Windowに描画するコードと同じコードでは描画時に毎回行う wglMakeCurrentに失敗します。 原因を探っていましたところ、DelphiのTBitmap.Canvas.Handleで得られるHDCは ことあるごとに生成、解放されるようでして、 何故か描画時に wglMakeCurrent だけでは失敗するようです。 ChoosePixelFormat、SetPixelFormat、wglCreateContext、wglMakeCurrent まで全部やってしまうと、OKなのですがそうすると、コンテキストを引き継げず SetViewportなどを一通り全部を描画の度にやらないといけません。 異なるHDCに描画したい場合は、wglMakeCurrent だけ毎回すればよいと思っていたのですが、 こんなもんなのでしょうか? それとも、Delphiの変な仕様のTBitmapを捨てて、DIBSection自前でやるべきなのでしょうか?
922 :
904 :2008/08/26(火) 18:48:16
x SetViewport o glViewport > まで全部やってしまうと、OKなのですがそうすると、コンテキストを引き継げず まで全部、描画時に毎回やってしまうと、OKなのですがそうすると、コンテキストを引き継げず あとライブラリのソース読んだところ、変な仕様なのはTBitmapのせいというより TBitmap.Canvas(つまり、TCanvas)の仕様のようでした。
923 :
904 :2008/08/26(火) 19:04:49
925 :
920 :2008/08/26(火) 19:56:49
背景色は黒です。説明不足でした。 板が重なった部分だけをテクスチャの色をあるα値でプレンディングしたいんですが、 重なっていない部分がα値で原色されてしまっている状況なのです。
ポイントスプライトは正方形だけなのでしょうか? 長方形のポイントスプライトを作りたいのですが
長方形の絵を描いたテクスチャを貼ればいいかと
>>917 gl.hとかににSGIのライセンスがどうとか書いてある
だが俺には読んでもよくわからなかったのでGLeeを使った
実際のところどうすればいいのか俺も知りたい
>>925 板1を不透明で描く
板2をその上から不透明で描く
板1をα付きで描く
これでよくね?
>>926 正方形だけ
長方形は自分で描いてください
それかテクスチャを長方形になるようにαで抜くとか
929 :
デフォルトの名無しさん :2008/08/27(水) 11:28:03
質問です 3Dtextureのサイズについて何か制限があるのでしょうか 元データ480x480x96→動かない 周囲黒ピクセル480x480x128→動く 2の倍数かなと思ったのですがx,yの座標は違いますし…コンパイルは通るのですがアプリケーションを実行中に 0x693a1273 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x000003a4 を読み込み中にアクセス違反が発生しました。 と出て止まります。止まる位置は // Render enclosing rectangles glCallList(listName); でListは glNewList(listName, GL_COMPILE); glDrawArrays(GL_QUADS, 0, nElements); glEndList(); です。 OS:WindowsVista toglinfo: GL_VERSION: 2.0.6479 Release GL_RENDERER: ATI Mobility Radeon X1400 GL_VENDOR: ATI Technologies Inc. EXTENSION: GL_EXT_texture3D GL_MAX_3D_TEXTURE_SIZE_EXT: 2048 よろしくお願いします
>>929 メモリ関連で、変なところ書き込んじゃってるんじゃないか?
他に思いつかない
ドライバがおかしいというのも大いにありうる 最新のドライバにしてみる、もし可能なら別なグラボやPCで動かしてみるとどうだろう
>>929 RadeonはGL_VERSIONが2.0以上でも2のn乗テクスチャ対応してないことが多いから、そこが疑わしい気がする。
480x480x128はたまたま動いてるだけって可能性も。
OpenGLで花びら大回転というやつをしてみたいんですが、 どのようなコーディングをすればきもちよくなれますか? あ
934 :
デフォルトの名無しさん :2008/08/30(土) 00:56:12
おまいらGLでボーンとかどうやって実装してる? モデリングソフトでCOLLADAファイルに書き出したモデルのボーンをパースして利用する感じ?
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 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。