このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
OpenGL使いが優しくコメントを返しますが、
お礼はOpenGLの布教と初心者の救済をお願いします。
OpenGL・Home・Page
http://www.opengl.org/
2 :
デフォルトの名無しさん:2007/09/24(月) 12:01:13
糞スレで2ゲット!!!!!!!!!!!!!!!!
糞スレ立てんなカス
継続意見のほうが多かったじゃんw
荒らすなよボケ
>4の目的がわからないwww
ただ、スレタイにopengl2.0と入っているのはちょっとどうかと思う
まあ、
乙!
このスレ名はひどい
浮動小数のテクスチャってどうやったら使えるんですか?
GLSLで使いたいです
「GLUTによる「手抜き」OpenGL入門」を読み終えて、だいたい理解できました。
次は何をやったらいいでしょうか?
いまいち何が不足しているのかわかりません。
参考書籍やウェブサイトも教えていただけると嬉しいです。
大学2年生で、実行環境はCygwinです。
何かを作る。その過程でいろいろ覚える。
作りたいものがなければ、知識も身に付かないしやる気もおきないと思うよ。
14 :
12:2007/09/27(木) 18:32:38
>>13 目標ですが何にしたらいいかわかりません。
どの程度なら丁度良いのか漠然としすぎていて。
まだまだ基本中の基本しか出来ていないと思います。
いろいろサイトを見てプログラムを真似していくのも一つの手かなと思いますが。
目的があって、それを実現するための手段がGLUTじゃないのかなあ。
まあ、ただ何となく勉強しましたってのもありだと思うけど。
プログラミング自体何かを実現する為の道具だからね。
18 :
あ:2007/09/28(金) 12:11:11
テクスチャサイズが304*1440と19*360と19*1980の3つのテクスチャを
シェーダでマルチテクスチャ処理をしてるんですけど、
テクスチャが304*1728と19*360と19*2376にするとエラーが出ます。
これはテクスチャサイズの問題ですか??それとも
他の問題ですかね?
ちなみにGL_MAX_TEXTURE_SIZE 4096です。
19 :
あ:2007/09/28(金) 12:17:52
ちなみにRGBです
どんなエラーよ?
2のn乗かなにかじゃないと駄目
>>21 もともと2のn乗サイズじゃなくて動いてるらしいから関係なくね?
ARB_texture_non_power_of_twoがあるか2.0以上なら問題無い
やってみる価値はある
>>18 GL_MAX_TEXTURE_SIZE 4096 でRGBなら
実際のサイズは、4096*4096 / 3 のルートの 2365 が上限
だと思ったが・・・違ったっけ?
>>25 確かに半端だが、GL_MAX_TEXTURE_SIZE は1テクセルあたり8bitの場合の数値なので、
たとえばRGBA8bitだったら、実際に使用できるのは、テクセル数で1/4になる。
最大サイズがどうなるかは、知らん。適当にルートになると思ってた。
誰か実験してくれ。
>>26 赤本を確認したがGL_MAX_TEXTURE_SIZEが1テクセルあたり8bit云々ってのは無かったな
フォーマットの違いを気にしないから、容量がでかいフォーマットだとメモリ足りんかもしれないから気をつけてみたいなことは書いてあったけど
しかしどんなエラーが出てるのか分からないとテクスチャのサイズが問題なのかどうかも分からんな
28 :
あ:2007/09/29(土) 00:35:07
すいません!!エラーは単純なミスでした。
あと、GL_MAX_TEXTURE_SIZEが4096のときに
4枚のテクスチャを処理するときって
4枚とも4096*4096サイズ(RGB)までいけるってことですかね??
30 :
29:2007/09/29(土) 06:55:20
>>28 texture size 適当に変えて、上限が実際のところどうなってるか試してくんない?
眠い・・・
速度や容量とか、それこそドライバ依存なんじゃないの
32 :
あ:2007/09/29(土) 17:34:14
どうやらいけそうです!!
何度もすいませんが、最後の質問させてください。
GL_MAX_TEXTURE_SIZEの変更はできますかね??
4096から増やしたいんですが・・
できないよ。その値はGPUが扱えるテクスチャの最大解像度だから。
4K以上のテクスチャを扱いたいなら、複数のポリゴンに貼って並べるのが普通。
34 :
あ:2007/09/30(日) 06:25:10
ありがとうございます。
最近OpenGLを使い始めたばかりの初心者ですが、なんとか頑張ってモデリングツールのようなものを作ってみたいと思っています。そこで質問なのですが、
・3Dモデルをスクリーン上に変換した後の頂点の座標をGLの関数かなにかで取得することはできないのでしょうか?
・GLUquadricで生成した球や円柱などから頂点配列やインデックス配列を取得することはできないのでしょうか?
どなたか教えて下さい。
・gluProjectでできるんじゃないかな
・知らない
2365なんて2の累乗じゃない半端な数値が最大テクスチャサイズのはずはないだろう
各色32bitのfloatだったらもっと少なくなっちゃうジャン
38 :
35:2007/10/02(火) 20:09:57
>>36 まさに自分が探していた関数です。どうもありがとうございました。
39 :
デフォルトの名無しさん:2007/10/02(火) 21:17:19
ただいま頂点配列の辺りを勉強していて、色とベクトルの扱い方はわかったのですが
法線ベクトルを頂点配列で扱う方法がいまいちわかりません。
六面体を書くのに今は
glNormal3f(0.0,0.0,1.0);
glDrawElements(GL_POLYGON,4,GL_UNSIGNED_BYTE,frontIndics); //正面
glNormal3f(1.0,0.0,0.0);
glDrawElements(GL_POLYGON,4,GL_UNSIGNED_BYTE,rightIndics); //右面
以下略
という風に書いてます。
法線ベクトルをglDrawElements()に含めるなど、頂点配列でうまいこと扱う方法があれば教えてください
40 :
デフォルトの名無しさん:2007/10/02(火) 22:20:33
色を頂点配列に入れてるんなら、glColorPointerを使わなかった?
それと同じように、法線の場合はglNormalPointerを使うんよ。
(もちろん、glEnableClientState(GL_NORMAL_ARRAY)するのを忘れないように)
>>35 二番目
OpenGLのコールをフックするライブラリを描いてやればおk
でもスタブを書くのがめんどくちゃい
42 :
39:2007/10/03(水) 08:18:19
>>40 それらの使い方はわかったのですが
法線ベクトルの配列での扱い方で詰まりました
Vertexの場合は頂点座標を8個用意して各面を描画する為にさらに6つの配列でglDrawElements()の第4引数に使用していて、色も頂点の数だけ用意して対応したのですが
法線ベクトルはわからなくて悩んでいますorz
正確には色も頂点にしか対応してないので各面を別の色で描画出来たらと思っているのですが…
>>39 当然法線ベクトルも頂点の数だけ用意する。
39はそれまでのやりかたがOpenGLがステートマシンだから機能したってことの
理解がいまいちあやしそう。
>>42 座標が同じでも、色や法線が異なる場合は、別の頂点だと考える
各面の色が別々なサイコロを描くには、24頂点が必要
頂点や色や法線の配列に対して別々のインデクスを指定できる拡張があったような気がするんだけど
名前が思い出せないorz
46 :
39:2007/10/03(水) 18:41:27
アドバイスありがとうございます
法線ベクトル用に頂点を24個用意して試したところイマイチうまくいかず、頂点座標も8個から24個に増やして試したら無事正常に描画する事が出来ました
ひとまず結果オーライなのだけど頂点座標が8個だとうまく法線ベクトルが引けない理屈がよくわかりません…
俺はもしかしたらとんでもない勘違いをしていたのかもしれない…!
頂点っていうのは、座標+法線+色+テクスチャ座標で1組のデータになる。
glDrawElements が i 番目の頂点を参照するときは、
頂点配列の i 個めの座標と、
法線配列の i 個めの法線と、
色配列の i 個めの色と、
テクスチャ座標配列の i 個めのテクスチャ座標を、
1組の頂点データとして取り出す。
つまり頂点配列、色配列、法線配列、テクスチャ座標配列はすべて同数の要素が必要。
頂点座標と法線ベクトルの対応関係を指定した覚えないだろ?
技術とは関係ないのですがOpenGLは現在、何の用途で使われることが多いのでしょうか?
DirectXはゲームとかで聞くのですが、GLはあまり聞かないので。
idとその周辺のはOpenGLじゃないの?
てかDirectXついてねーし。
>>48 Windows以外は大体OpenGL(とかES)
仕事とかでGL使ってる奴いる?
どんなところに就職してるんだ?
ノシ
仕事は広告関係
ノシ
SGI
>53
ちょっw
なんでこんなところにいるwww
ノシ
零細ソフトウェア会社
>>48 ゲームで使ってます。
しかし、算術演算ライブラリとか整備してくると、正直DirectXで言い気がしたw
ノシ
げーむや
ノシ
無名CAD屋
ノシ
研究でGPGPU
学生だけどGPGPU
K平均法を高速化しなきゃならなくて英語の論文見っけて碌に読まずに手を出したが、
2ヶ月浪費した後でよく読んでみると高速化できたのは別のクラスタリングという結論に読めるなぁハハハ
ノシ げーむ屋
ノシ Webアプリ屋 (OpenGLは趣味プログラミングで)
glPushMatrix();
glPopMatrix();
この組み合わせが何をやっているのかイメージできません…
どなたかわかりやすく教えていただけませんか
今使ってる行列をどこかに取っておく
さっき取っておいた行列を持ってくる
「スタック」って言葉は知ってるかな?
やってることは、まさにそれなんだけど。
検索したらそれが当たって、図でも説明されているので意図はわかるのですが
その行列がglMatrixMode(GL_MODELVIEW);といったモデルビューの単位なのか
glMatrixMode(GL_MODELVIEW);に掛け合わせたglrotateといった類のものなのかがわからなくて
よくわからなくなってるのですが、「今使っている行列」がどこを指すのかわかってなくて
OpenGL には、行列が3つある。 GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE
glMatrixMode は、どの行列を操作するかを切り替える。
glMatrixMode で設定した、操作する対象の行列が、今使ってる行列。
glRotate は、今使ってる行列を回転させて、新たな今使ってる行列にする。 古い行列は捨て去る。
C言語的に書くと
今使ってる行列 = 今使ってる行列 * 回転行列;
みたいな感じ。
glTranslate とか glScale とかも一緒。
みんな今使ってる行列を変化させる。
だから、今使ってる行列っていったら、それしかない。
glPushMatrix は、今使ってる行列をスタックに保存しておく。
glPopMatrix は、保存したものを取ってきて今使ってる行列に戻す。
おk?
つまり
glMatrixMode(GL_MODELVIEW);
回転行列
glPushMatrix();
glMatrixMode(GL_TEXTURE);
拡大行列
glPopMatrix();
という風になった場合、popの後は
MODELVIEWで回転されてる状態、ということですか?
ようやく、頭の中が整理されてきました。
回転行列とかをスタックにぶち込むものとか考えてしまって
ありがとうございます!ばっちり、すっきり、ニッコリです!
いや、説明不足ですまんが、 glPushMatrix/glPopMatrix は glMatrixMode まで保存/復元したりはしない。
glMatrixMode はそのままで、現在の行列を保存/復元するだけ。
スタックも行列の種類ごとに別々にある。
つまり MODELVIEW 行列用のスタックと、PROJECTION 行列用のスタックと、TEXTURE 行列用のスタックがある。
>>68 の例でいくと、
glPushMatrix は回転した MODELVIEW 行列を 「MODELVIEW 行列用のスタック」 に保存する。
glPopMatrix は 「TEXTURE 行列用のスタック」 から TEXTURE 行列を取り出す。
>>68 いや、その、なんだ、全然違ってるぞw
それだと、最初の状態と比べて
・MODELVIEW行列は回転してる
・かつその回転した行列がMODELVIEW行列スタックに一段積まれた
・TEXTURE行列は拡大した
・しかしその拡大した行列はTEXTURE行列スタックから取り出した行列で上書きされた
・MatrixModeはTEXTUREになった
ちなみに上のシーケンスをTEXTURE行列スタックが空の状態でやると、GLエラーが起こる。
行列スタックは、MatrixModeごとに別のスタックが用意されてるんよ。
スタックに保存できる行列の個数もそれぞれ違う。
・・・って69の書き込みの方が早かったか。でもいいや送信エイ
>>69-70さん
ありがとうございます
つまり
model tex projec
|| || ||
|| || ||
 ̄  ̄  ̄
みたいなスタックがあって、それごとに別々に保存されていて
glPushをすると、今のモードで弄くってる行列が保存されて
glPopをすると、スタックからそのモードの行列を取り出して「上書き」する、ということですね
上書き、ということはpopする前の行列はあまり意味がないのかな…
なんとかスッキリしてきたのでソースをちゃんと読むことができそうです
それとは別に、今メモリ(テクスチャ?)が解放されなくて
glutPostRedisplay();をするたびにメモリが増加していく現象が発生して悩まされています…
popする前の行列は、それを使って何か別のことをするんでしょ。
何にも使わないんなら、そりゃ意味はない。
>>71 今メモリ(テクスチャ?)が解放されなくて
毎フレームglGenTextures&glBindTextureしちゃってるとか?
てか先にGL以外の部分を疑った方がいい気もするけど
>>72さん
おっしゃるとおりです。
popの前にモードを変えて、何かするのが普通なのですよね。
>>73さん
毎フレームglGenTextures&glBindTextureは以前やってしまったのでそこは注意してました
init的な初期設定のところでテクスチャを読み込んでいるので大丈夫だと思います。
どうも色々見てみたのですが、手本にしたサンプルでも同様の現象が出るみたいです。
すいません…はじめに言っておけばよかったのですが
行列もわかっていない身のくせにCgを使っているので
長いソースになってしまっています。
どうもCgでアニメをさせると徐々にメモリが増えていってしまうみたいです
/(^o^)\ナンテコッタイ
理由は分からないんだけど、どう考えてもメモリリークなんて起こらない
(トライアングルを一枚くるくる回してるだけの)プログラムで、SwapBuffersするたびに
メモリが少しずつ増えてく現象に悩まされた事があったなァ・・・。
で、数十KBだか数百KBだかメモリが増えた時点で、メモリ消費の増加が止まるんだこれが。
わけがわからん。
10分くらい動かしてみて、メモリ増加が止まるんなら気にしなくていいんじゃない??
(ちなみに、nVIDIAのボードだった)
>>78さん
サンプルを動かしているとまさしくその状態です。
あるところで止まるのですが
自作のものでFPSを表示させていると止まらなくなってしまっていて
450MBから初めて780MB 最悪1GBまでメモリが増えていっています。
>保持しているテクスチャデータのサイズがグラフィクスメモリの容量を超える場合,
>テクスチャデータはメインメモリーに格納され, テクスチャは描画に使われる度にグラフィ
>クスカードに転送される.
論文でこういうのを見つけたのですが、小さいテクスチャで試しても増加するみたいです
ATIのせいかと思っていたのですがnvidiaもそうなのですね
Cgはバグ持ちの駄目な子だけどメモリリークには遭遇したことないな
ループ毎にオブジェクト生成とかやってるんじゃ?
>>79 状況がよくわかんないな
ATIのグラボでCg動かしてるの???
ソース見ないと確かなことは言えないが
450MBから始まって1GBまでいっちゃうのは
常識的に考えてプログラムミスだと思うぞw
少しソースのチェックしてきます orz
もしよろしかったらCgのサンプルの
07_two_texture_accesses でアニメーションしたときのメモリの様子を見ていただけませんか?
私の環境だとこのサンプルでも増加していってしまって
538MB→560MBで増加中という…
2007sepに入ってた実行ファイルをそのまま動かしたけど19Mから増えないな
XpHome,GF7800GTX,163.71_forceware_winxp_32bit
ソースを見て怪しいところをコメントアウトしても増加が止まらず…
サンプルを動かしてみて473→500 増加中です。
Win2k ATI RadeonXpress200(128MB) 32bit Athron64 メモリ1GBでした。
オンボードGPUでATIというのが原因なのかもしれません。。。
ドライバ最新でその状態ならちゃんとVRAM載ってるグラボか
デスクトップマシン買った方がいいんじゃないかな
ソース見たけど少なくともCgはメモリリークの原因じゃないよ
ああ他にglslかDirect3Dに乗り換えるって選択肢もあった
さらに書き忘れ
とりあえずglsl乗り換えをお勧めしておくよ
88 :
デフォルトの名無しさん:2007/10/12(金) 19:31:07
板と視点の角度によって違うテクスチャを貼りたいのですが、
どうしたらいいですか?光源とかは使っていません。
どなたか教えてください。
※つまり、板の、ある場所(座標)から視点へのベクトルによって
テクスチャを変えたいということです。
視線ベクトルの値によって、読み込むテクスチャを変えたらいいんでないの?
switchとかelse ifで
settexture( vec );
みたいな関数を作って、テクスチャセットとか。
>>88 GLSLが使えるなら、話は簡単。
使えないなら、プログラム書いていちいちやるしかないかなぁ・・・。
視点からの距離が一定なのならミップマップを利用できるカナ、とかも思ったけど。w
91 :
88:2007/10/12(金) 23:42:28
視線ベクトルの値ってどうやって得るんですか?
GL_nomal?みたいなのがあるんですか?
一応、GLSLを使っています。(使えているかは別ですが)
>>91 眼点座標系の視点位置は(0, 0, 0)
でおk?
93 :
88:2007/10/14(日) 00:46:13
てことは、オブジェクトの座標が視点ベクトルになる
ことですね!
ありがとうございます!とりあえずがんばってやってみます!
>>93 固定関数はそうなるけど…
Cgやgglslは本人次第というかなんというか…
3次元テクスチャの意味を本当に理解しているのか、と思うが
実際に何をどうしてみた?
3次元テクスチャでサンプルのようなサイコロ状のデータを作成して
それをテクスチャとして読み込んで、同じように-1〜1の平面に投影しようとしました
texture2Dの部分を単純に全部3Dにしてマッピングできるかと思っていたのですが
>>95 どうでもいいけど、そのサンプルはinit()内でスタック破壊してるね。大丈夫かいな。
で、95と97を何度読んでもイマイチ意味が分からない・・・。
とりあえず適当にいくつか挙げてみる。
・3Dテクスチャのデータはどう作ってどう転送したの?
・ちゃんとglEnable(GL_TEXTURE_3D);してる? (2Dじゃないよ)
・3Dテクスチャのテクスチャ座標は当然3次元なんだけど、ちゃんとglTexCoord3?();使ってる?
てなとこでしょうか。
>>97 人にわかるように説明できないならソースうpれ
>>95のサンプルを
solidcubeなどを描いたものをポリゴンに描くのではなく
for(i<10)for(j<10)for(k<10) texture[i][j][k][4]=1
みたいな感じで作った1辺10の、点の集合体としで立方体をあらわしているテクスチャを
ひとつの平面に映し出すということをしたいのです
>・ちゃんとglEnable(GL_TEXTURE_3D);してる? (2Dじゃないよ)
>・3Dテクスチャのテクスチャ座標は当然3次元なんだけど、ちゃんとglTexCoord3?();使ってる?
これはちゃんとやりました。teximage3Dは
PFNGLTEXIMAGE3DPROC glTexImage3D;
glTexImage3D =
(PFNGLTEXIMAGE3DPROC)wglGetProcAddress("glTexImage3D");
で呼び出しています。
急に体調が悪くなって今まで横になっていました。レスしてもらっていたのにすみません
要するにボリュームレンダリングをしたいってことか?
ボリュームレンダリングというよりも
平面にモノを投影するほうがメインです
3次元形状をテクスチャで扱っていきたいのでやっているのですが
出だしでつまづきました
100の言ってる事をそのままに受けとると、
CPUなりGPUなりでレイキャスティングするしかないと思うんだけど・・・。
>>102 >ボリュームレンダリングというよりも
>平面にモノを投影するほうがメインです
ボリュームレンダリングしたものをテクスチャにして貼ればいいんじゃないの?
95の「こちらのソースのように」ってのはそういう意味じゃなかったの??
で、えーと想像してみるに95さんは、3Dテクスチャを使えば
ボリュームデータをある方向から見た様子が描画できる
と思ってるのかな?
だとしたら大きな勘違い。
一つのフラグメントに対して適用されるテクスチャのサンプル点は一つ
でしかない(マルチテクスチャやGLSLを使わない場合)んだから、
ボリュームデータをボリュームっぽく見せるためには
重描きする か レイキャスティングするか
のどっちかしかないよ。
3Dテクスチャが魔法のように問題を解決してくれるわけじゃない。
あと一番大切な事は、元気に楽しく暮らす事だと思うので
無理せずお体をお大事に。
>ボリュームレンダリングしたものをテクスチャにして貼る
それをやろうとして「テクスチャにする」という部分と
「貼る」という部分
でつっかかっていました。
>>104さん、お気遣いありがとうございます
どうにかコレを片付けて、早目に休めるようにします
>>105 「テクスチャにする」も
「貼る」も
95のサンプルで既にできているのでは???
108 :
デフォルトの名無しさん:2007/10/15(月) 10:34:11
質問させてください。
例えば、イタリアの国旗のようなテクスチャがあったとき、
国旗の緑、白、赤のなかの、
緑と赤の部分をくっつけてテクスチャマッピングする
ってことはできますか?
また、そのテクスチャと元の国旗テクスチャとのマルチテクスチャ
はできますか??ちなみにマルチテクスチャはシェーダで行う予定です。
ttp://www.pyramid-inc.net/technical/rd_file/wavelet_jp.pdf これを読んで、Wavelet Lightingをやろうと思ったんですが
1.遮蔽情報テクスチャをウェーブレット変換
2.絶対値順にソートして小さい係数を切り捨て
3.最大値と最小値を調べ、8bitに量子化
4.積和計算??
4をどうやってやるんでしょうか・・?現在なんとなく分かるような、分かんない様な感じです。
出来ればGPUでやりたいんですが、処理が複雑すぎ、係数多すぎで無理な気がします。
HLSLで、TEXCOORD0から7まで使ってデータ渡すにしても int4 * 8で32しか使えないのでは・・?
110 :
109:2007/10/15(月) 22:41:05
思いっきり誤爆した・・・
>>109 俺もウェーブレットやろうとしてる
というかpyramid見てるあたりが同じすぎる
ウェーブレットのわかりやすいサイトとかサンプルソース見せてくれー頼むー
>>108 できるヨ
テクスチャ座標を(例えば)-0.5〜0.5とかの範囲で使えばいい
0〜1の範囲を超えるテクスチャの扱いは、glTexParameterのGL_TEXTURE_WRAP_?を参照のこと
113 :
108:2007/10/16(火) 09:24:05
>>112 回答ありがとうございます。なんとかできそうなのですが、
ちなみに、もし緑、白、赤、黒、黄のなかの
緑、赤、黄をくっつけるときはどうすればいいのでしょうか??
>113
普通にやるなら、ポリゴンを分割しないとダメ
だけどシェーダ使うならテクスチャ座標を適当に指定すればいいっしょ
115 :
113:2007/10/16(火) 17:02:36
ポリゴンを分割する方法にしようかと思うんですが、
glCallListについて質問があります。
Listに登録するときに、頂点座標を1つ1つ変えて登録するのと、
1つの頂点(形状)を登録して、translateで呼び出すのとでは
どちらがいい(もしくは高速)のでしょうか??
それぞれの板に違うテクスチャをマッピングする予定です。(113をやりたい)
ちなみにポリゴンは50〜100ぐらい作る予定です。
>Listに登録するときに、頂点座標を1つ1つ変えて登録するのと、
どういう登録の仕方?詳しく
できれば両方のコードの例を
117 :
デフォルトの名無しさん:2007/10/16(火) 18:36:17
ListName = glGenLists(N);
for(int=0;i<N;i++){
glNewList(ListName+i, GL_COMPILE);
glBegin(GL_GL_QUADS);
glVertex3f(0.0+i, -1.0, 0.0);
glVertex3f(1.0+i, -1.0, 0.0);
glVertex3f(1.0+i, 1.0, 0.0);
glVertex3f(0.0+i, 1.0, 0.0);
glEnd();
glEndList();}
か、もう1つは上のループをなくして描画のときに
for(int i=1;i<N+1;i++){
glTranslatef(0.0+i, 0.0, 0.0);
glCallList(i);
}
という感じですが、もしかしてテクスチャマップするとなると
前者の方でテクスチャ座標指定等も一緒に登録するしかないですか??
テクスチャ座標を自動生成にすると
各頂点座標がそのままテクスチャ座標になるという理解でよいのでしょうか?
仮に、そうだとした場合
glVertex3f(30.f, 30.f, 30.f)
とかだと大幅にテクスチャ座標の範囲(0〜1)と大きくずれますよね?
119 :
デフォルトの名無しさん:2007/10/16(火) 19:41:27
ポリゴンに色が着かなくなったんですが、
どんな原因が考えられますか???
120 :
デフォルトの名無しさん:2007/10/16(火) 19:47:49
>>118 テクスチャ座標は自動生成はせず、別で指定する予定です。
そもそもテクスチャ座標の自動生成を使ってないんですが、
テクスチャ座標を自動生成にすると
各頂点座標がそのままテクスチャ座標になるんですか??
>>117 全部の頂点に同じテクスチャ座標を使う場合は、ディスプレイリストに含めないでおけば外部から指定することができる
でもそんな使い方はありえないので、普通はテクスチャ座標も一緒にディスプレイリストに含めることになる
テクスチャ座標は最終的にテクスチャ行列で変換されるので、ディスプレイリストに含めててもテクスチャ行列を操作すれば拡大縮小・回転・平行移動して投影範囲を調節するくらいならできる
>>118,120
自動生成にもいろいろモードがあるが、まぁ GL_OBJECT_LINEAR だとして
各頂点座標そのままじゃなく、変換行列をかけてからテクスチャ座標になる
さらにそのテクスチャ座標がテクスチャ行列でもう一度変換される
だから拡大縮小・回転・平行移動して範囲を調節することくらいは出来る
123 :
120:2007/10/16(火) 23:01:05
回答ありがとうございます。
テクスチャ座標も一緒にディスプレイリストに含める形で
いこうと思います。
124 :
デフォルトの名無しさん:2007/10/17(水) 17:57:43
>>122 テクスチャ座標(0〜0.5)をディスプレイリストに含めたとき、
描画するときに0.1〜0.2のテクスチャ座標で描画するってできます?
どうしたらいいですか?
テクスチャ行列の操作でできることですか??
これでどうかな
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslated(0.1, 0.1, 0.1);
glScaled(0.2, 0.2, 0.2);
126 :
デフォルトの名無しさん:2007/10/18(木) 20:11:43
できました!ありがとうございます!
質問です
テクスチャ座標でも
gluPerspective(30.0, 1.0, 1.0, 100.0);
gluLookAt(0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
といったことができるとあったのですが。
これはテクスチャ座標上でz軸が上、y=2のところから視野角30度で…と設定したのですよね?
こういう設定をしないときのデフォルトのテクスチャ座標上での「視点」なんてものが存在するのでしょうか
gluPerspective も gluLookAt も変換行列を設定するだけ
テクスチャ座標は行列に従って変換されるだけ
何も設定してなければ与えたテクスチャ座標がそのまま使われるだけ
テクスチャ座標に視点とか考えてもムダ
まぁシャドウマッピングをしたいんなら話は別だが
>何も設定してなければ与えたテクスチャ座標がそのまま使われるだけ
そのまま、というのは0〜1の間にあるテクスチャが
そのまま対応したところにマッピングされるということですか?
gluPerspectiveやgluLookAtが入ってくると0〜1のが
なんかウニョウニョ変換されて貼り付けられる、と。
>まぁシャドウマッピングをしたいんなら話は別だが
やりたいと思ってることです。
くだらないことなのですが
openglで何も設定しないときの視点位置は原点ですよね。
それで物体を glTranslatef(-0.5,-0.5,-0.5); して表示しているのですが回転したりしたときにポリゴンが欠けます。
改善しようと
glutReshapeFunc(); のところで
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (double)w / (double)h, 0.0, 100.0);
gluLookAt(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
としたのですが、見え方が初期状態と違ってしまいます。
初期状態の視点について教えてください。
つ gluLookAtのパラメータをチェック
間違えました
glTranslatef(0.0,0.0,-0.5);です
gluLookAtのパラメータは 視点 視線先 上下ですよね?
これで同じになると思ってたのですが。。。
>>133 つ gluLookAtのパラメータをチェック
135 :
132:2007/10/20(土) 03:10:20
原点から原点見たんじゃ視線が定義できないだろw
gluLookAt(0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0);
とかにして、視点と視線先をずらさないと。
すみません、間違っていました
訂正したのですが、今度は表示されなかったりしてます
訂正の仕方が悪いか、他のところが悪いかだな
エスパーしてみると、glMatrixMode を元に戻してないんじゃないか
OpenGLで高速テクスチャ表示を行う必要があって
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize);
とするとうちの環境ではtextSizeが2048とでました
一般的には色々なPCでハードウェアアクセレーションを
安全に効かせられるテクスチャのサイズはどのくらいなのだろう・・・
現在は512*512でテクスチャを持っていますが640*480以上(または画面サイズ以上)に
対応していないビデオカードで低速になるのでは?とちょっと不安です。
512*256に統一すべきなのだろか・・・
void glBlendFunc(GLenum sfactor , GLenum dfactor);
sfactor には新しい色の、dfactor には現在の色の計算方法を指定します
この、新しい色、と現在の色という意味が、
いろいろ変えてみてもよくわからないので教えてください。
>>138 詳しくは知らないが、512*512くらいの大きさなら心配ないんじゃないかな。
>>139 いろいろやるとこんがらがるので、とりあえず
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
でどうなるかをみて、その後GL_ZEROとGL_ONEを試すと
いいと思うよ。
>>138 保証はできないけど、512x512ならまず大丈夫だよ。
画面サイズとテクスチャサイズは何の関係もないので、512x256にしても意味ないよ。
ちなみに規格で保証されてるのは64x64だけどね。
>>139 「新しい色」ってのは、パイプラインを通り抜けてきたフラグメントの色、
「現在の色」ってのは、フレームバッファのピクセルの色だよ。
OpenGLの日本語訳はイマイチなのが多いよね。
DirextXも10以降はデバイスロストを気にしなくて良くなってるみたいですが
OpenGLでデバイスロストが発生しないのは何故ですか?
>>140 >>141 thxです!
もしものときは読み込んだ後、プログラム側で縮小とUVの調整をすればよさそうですし、512*512で行くことにします。
最近OpenGL始めまして、まだまだ全然わからないのですが、
glDrawElementsを使う時にアンビエントなどマテリアルは
どうやって設定すればいいでしょうか?
glDrawElementsを使わない時にアンビエントなどマテリアルを設定する方法と一緒
>>144 OpenGLの方がハードに合わせることが出来るっていうやつですか、なるほど
>>146 ありがとうございます。
glBegin(GL_TRIANGLES);
アンビエントとディフューズの設定
glVertex3f(頂点A);
glVertex3f(頂点B);
glVertex3f(頂点C);
glEnd();
という処理をfor文で複数回行い、
面一枚一枚に対して設定していたのですが、
glDrawElementsを使う時に、
各面に設定するにはどうすればいいでしょうか?
それなら GL_COLOR_MATERIAL を有効にして glColorPointer で設定すればいいんじゃないかな
>>149 glColorPointerというのはアンビエントやディフューズと
同意義のものなのでしょうか?
glDrawElements 使おうってのに glColorPointer わかりませんってのはちょっと。
もしかしなくても glDrawElements 自体わかってなかったりするか?
>>151 glDrawElements自体は分かります。
プリミティブを構成しての描画ということは分かりますが、
頂点情報の他にどの情報が使えるかが分からないです。
glColorPointerで設定するのはglColor3fのようなものでしょうか?
それともglMaterialfのようなものなのでしょうか?
そこらへんがよく分かってなかったりします。
今試してみたのですがベタ塗りの色が出ました。
アンビエントやディフューズをせっていするには
GL_COLOR_MATERIALを有効にする以外に
何か設定しなければいけないのでしょうか?
glColorPointer は glColor3f のようなもの。
ただし GL_COLOR_MATERIAL が有効になってると、glColor3f でマテリアルのアンビエントとディフューズが設定される。
ベタ塗りになるのは、ライティングが有効になってないか、法線情報がないか、色が強すぎるか。
とりあえず GL_LIGHTING を有効にして glNormalPointer で法線を与えてみ。
分かりました。試してみます。
ありがとうございます。
あー、もしかして単に GL_COLOR_ARRAY を有効にしてないだけとかかもしんない。
ぬwぬ
openglを始めたばかりなのですが
3つのポリゴンをglbeginで描いているのですが
そのうち1つだけを平行移動したい場合はどのような処理をすればよいのですか?
glbegin~glend が3つ続いていて
そのひとつに平行移動行列を掛けるというのはわかるのですが
行列関係(GLMATRIXMODE)が難しくて、先に動かして状況だけ見たいと思いまして
glPushMatrix と glPopMatrix で囲むのが簡単
glMatrixMode(GL_MODELVIEW);
glBegin〜glEnd
glBegin〜glEnd
glPushMatrix();
平行移動とか回転とか
glBegin〜glEnd
glPopMatrix();
glBegin〜glEnd
glBegin〜glEnd
>>159 やってみます!ありがとうございます!
glPushやPopが何なのか難しかったんですがやってみます!
>>148できました。ありがとうございます。
glDrawElementsの第4引数に
std::vector<GLushort>で設定した配列を使おうと思うのですが、
「'srd::vector<_Ty>'から'const GLvoid *'に変換できません」
と出ます。どのように指定すればいいのでしょうか?
&v[0] でおk
>>162 ありがとうございます。
ただ、コンパイルは通りましたが、VCのアサートで止まりました。
vectorファイルの中でのアサートのようで、
if (size() <= _Pos)
{
DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
この箇所だと思われます。
これ以前にresizeでサイズ指定はしているのですが、
この場合何が原因なのでしょうか?
>>162 ちゃんとresizeされてないんじゃないかな
直前でsize()取ってみて確認してみたら?
>>164 直前でsize()を使い確認したところ、
サイズの指定で間違っていた所が分かりました。
ありがとうございます。
なんというC++初心者教室。
法線ベクトルからその直交する面を得たいのですが
OpenGLで何かその方法はありませんでしょうか?
入力:法線ベクトルの始点と終点
出力:入力のベクトルの始点若しくは終点を通る
そのベクトルに直交する面に含まれる座標2つ
イメージしづらい…
法線が決まったら、面は自動的に求まるはずだけど
その面から任意の座標は自分で出すしかないんじゃないかな
OpenGL以前に数学だろ…
法線が(a, b, c)の場合直交する面は ax+by+cz = 0
これを満たす(x, y, z)の点はどれも直交する面上にあるからあとは好きにして
>>169 ax+by+cz+d = 0
でもおk
現在openglとC++を勉強中しています
GLUTでウィンドウを作成して表示してるんですが
ウィンドウズアプリケーションのようなメニューや各ボックスなどを付け加えるにはどうしたらいいのでしょうか?
GLUI
>>171 OpenGLとC++に縛られて良いならQt使えば?
GLUT/UIよりは難しいけど
>>173 VisualC++使ってるんですが
普通OpenGL使ってアプリケーション(ウィンドウズアプリケーションのようなメニューが付いてたりボックスが付いてたり)を作る場合
どのように作るんですか?
OpenGLのコンテキストを作って
普通のウィンドウに関連付けて使う
wglとかで検索かければそれっぽいの見付かるとおもう
>>174 MFCでコントロール配置が主流,最近だとC++/CLIでFormsか
それらの上にOpenGLを乗っけるなら
Win32APIでSetPixelFormatしてフォーマット決めて
wglCreateContextでOpenGLのコンテキストを作る
再描画タイミングでウインドウハンドルからGetDCしてwglMakeCurrentする
後はgl*系の描画コマンド実行して glFlushなりwglSwapBuffersする
GetDCしたらReleaseDCも忘れずに
>>175 コンテキストってのはウィンドウに描画される部分を表すもの?
感覚的に普通のウィンドウにOpenGLの表示ウィンドウを貼り付けるみたいな
そうした場合GLUTでやってた部分を完全にwglでやるようにしなくてはダメですか?
>>178 yes,再描画イベントハンドラ内でコンテキストをカレントに設定しちゃえば
初期化と・SwapBuffer以外にGLUTと違いは無い
>>177 サンプルを2005EEでビルドしてみたけどなんかエラー出てダメでした
エラー内容はこんな感じ
なんか設定が足りないんでしょうか?
\Form1.h(91) : error C3867: 'GLTest::Form1::timer1_Tick': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&GLTest::Form1::timer1_Tick' を使用してください
\Form1.h(91) : error C3350: 'System::EventHandler' : delegate コンストラクタには 2 つの引数が必要です
\Form1.h(109) : error C3867: 'GLTest::Form1::button1_Click': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&GLTest::Form1::button1_Click' を使用してください
\Form1.h(109) : error C3350: 'System::EventHandler' : delegate コンストラクタには 2 つの引数が必要です
\Form1.h(119) : error C3867: 'GLTest::Form1::pictureBox1_Paint': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&GLTest::Form1::pictureBox1_Paint' を使用してください
\Form1.h(119) : error C3350: 'System::Windows::Forms::PaintEventHandler' : delegate コンストラクタには 2 つの引数が必要です
>>179 申し訳ないけどわかんないです
VC++でGLUTしか使ったことないし普通のアプリケーション作ったこともないからよくわからないんだと思うんですが
なんかいいサイトとかないですか?
>>180 そいつはサンプルの作者に聞いてくれ
・・・といいたいところだけど、エラーから見て多分サンプルのフォームの整合性がおバグリになられてるっぽいので
Form1.hダブクリ→なんかGUIパーツをダブクリ→リビルドでいけるんじゃないかな
今GUIを組みたがってる人と俺は近い感じがする
そういうTIPが欲しいんだろ?
俺も欲しい。探してくれ
185 :
デフォルトの名無しさん:2007/10/29(月) 18:30:41
例えば、5個のオブジェクトにそれぞれテクスチャマップしたときに、
vertex-shaderで5個のオブジェクト頂点を
それぞれ得る(アクセスする)ことはできるんですか??
その頂点と視線ベクトルとの角度によって、テクスチャ座標を
いじってテクスチャマップしたいのですが。。
できるよ、と言って
やり方を言わないのがこの板には多いと思うんだ
そりゃできるかどうかが質問されてるから
>>185 できるんですかもなにも
それをやるのがまさにvertex shaderの仕事ジャマイカ
それって
「あいつのメアド教えて?」
「ごめん、俺あいつの電話番号しかしらないや」
「おめー、番号知ってんならメアドくらい聴いてくれたっていいじゃねぇか」
っていうのと同じじゃん。それじゃ可哀想じゃね?
>>185 俺も複数オブジェクトのときの頂点の対応ってのがよくわからんけど
GLSLなのかCgくらいかは書いておいたほうがアドバイスもらえるんじゃないかな
191 :
185:2007/10/30(火) 13:01:49
すいません。
どうしたらいいのでしょう??教えてください。
GLSLを使っています。
>>190 複数オブジェクトのときの頂点の対応・・・??
「対応」って何????
185は全然そんなこと言ってないと思うんだけど。
できるよとしか書かなかったのは
それしか答えようがないような質問だったからなんだが…
GLSLならgl_MultiTexcoord0とかで入力されたテクスチャ座標が取れる
あとはそれを視点と頂点座標との位置でお好みでいじって
gl_TexCoord[0]とかに代入してやればFragmentShaderとかに渡っていくよ
194 :
デフォルトの名無しさん:2007/10/30(火) 15:15:24
OPENGLを使ってCGアニメーションを何か作ろうとしているのですが、何か簡単にできるものはありませんか?
マウス操作ができて、ホップアップメニューを使用したいのですが、、、
個人的にはハノイの塔やルービックキューブなどを考えています
知識は全然ないので何からはじめればいいのかわかりません。どこかサンプルがのっているサイト等を教えてもらえるとうれしいです。どなたかお願いします
196 :
185:2007/10/30(火) 21:00:26
>>193 説明が下手で申し訳ないんですが、
それぞれのオブジェクトの頂点の座標をvertex-shaderで扱いたいんです。
vertex-shaderで頂点が扱えるのは分かるんですが、
このときのvertex-shaderにおけるgl_Vertexには何が入ってるのか
分かりません。どのオブジェクトの頂点なのか、それとも全体のものなのか。
オブジェクトAならgl_Vertex[A]、オブジェクトBならgl_Vertex[B]のように
できるのかなと思いまして。
なるほど、そもそもVertexShaderについて理解してないと見える
VertexShaderは頂点一つずつしか扱わないよ
gl_Vertexにはその時処理してる頂点座標が入ってる
で、VertexShader全体が全頂点に対して毎回実行されるものだ
>>196 頂点の数だけVertex shaderが実行される
例えば5個のオブジェクトそれぞれに頂点が10個ずつあったら、同じシェーダが合計50回実行される
199 :
デフォルトの名無しさん:2007/10/31(水) 01:03:08
なるほど!分かりました。ありがとうございます。
ちなみにfragment-shaderに渡すときの処理も、
ループ(オブジェクトの(頂点の)数){
vertex→frag
}
でしょうか?
vertex→fragって何よ
何のことを言ってるのかわからん
201 :
デフォルトの名無しさん:2007/10/31(水) 01:58:53
処理の流れです。。
オブジェクトAの頂点処理をして、fragmentでAに対するテクスチャ処理
オブジェクトBの頂点処理をして、fragmentでBに対するテクスチャ処理
・
・
と言いたかったのですが、違いますか?
1. glVertex とかで渡された頂点1個ごとに頂点シェーダが実行され、その頂点の座標を出力する。
2. 頂点シェーダが出力した座標を元に、実際に画面上のどのピクセルを描くか描かないかが決まる。これは自動的に決まる。
3. 描くべきピクセル1個ごとにフラグメントシェーダが実行され、テクスチャを取り込んだりしてそのピクセルの色を出力する。
4. フラグメントシェーダが出力した色を元に、実際に画面上にピクセルが描かれる。
だいたいこんな感じ。
>>202さんを勝手に補足すると、
1.は vertex shader の仕事。このシェーダプログラムを書いてやる必要がある。
2.はラスタライザの仕事。これは固定機能で、プログラミングできない。
3.は fragment shader の仕事。このシェーダプログラムを書いてやる必要がある。
4.はバックエンドプロセッサの仕事。これは固定機能で、プログラミングできない。
要は、
vertex shaderのプログラムは一つの頂点だけの処理を考えればいいし、それしか処理できない。
fragment shaderのプログラムは一つのフラグメントだけの処理を考えればいいし、それしか処理できない。
ってこと。
てか、185さんはまず根本的なグラフィクスパイプラインの仕組みを知る必要があると思うよ。
次に、その中でどの部分がプログラマブルになったのかを知るという順番で進めていかないと、
どのみち座標系への無理解からくる壁にぶちあたると思う。
204 :
デフォルトの名無しさん:2007/10/31(水) 13:02:14
OpenGLに動画を取り込んで再生させることは可能でしょうか?
OpenGL自体に動画再生機能はないが
動画をRGB等のデータにできればそこからテクスチャにして貼ることはできるよ
206 :
185:2007/10/31(水) 13:14:45
ありがとうございます。
おっしゃる通りでして、グラフィクスパイプラインの仕組みが
全然理解できていません。
がんばって勉強します。
207 :
デフォルトの名無しさん:2007/10/31(水) 14:04:41
>>205 そうですか。。
処理が膨大になりそうですね。
検討してみます。ありがとうございました!
208 :
デフォルトの名無しさん:2007/10/31(水) 14:44:52
185ではないのですが
私もグラフィクスパイプラインの仕組みを詳しく知りたいと思っています。
OPENGLのグラフィクスパイプラインの仕組みについて詳しく書かれた
お勧めの本やサイトはありませんか?
赤本は読んだので多少理解したつもりなんですが、まだモヤモヤしています。
209 :
デフォルトの名無しさん:2007/10/31(水) 16:25:41
壁にボールをぶつけて返ってくるって処理がよくわからないんだがどうやって書けばいいんですか?
テニスみたいなのを作りたいんだが。。。
物理の素養が無いんですか
>>194 371 名前:デフォルトの名無しさん[] 投稿日:2007/10/30(火) 16:12:14
学校の課題でOPENGL使ってなんか作らないとダメなんだけどいい感じのサンプルない?
インベーダーとかハノイとかルービックとか。。。
誰かおせーて
なんか九州工科大だかそこらへんのページでそんな課題を見たな
俺もグラフィクスパイプラインの仕組みについて知りたい
なんかそれについて、わかりやすく描いてるのが少ない
>>180 一応できるようになったよ
原因はよくわからなかったけど
VC2005Eで新しく作り直そうと思ったんだけどどれ選ぶんだろう?
学校でVC2005SでMFCプロジェクトを作ったんだけど2005Eだと動かないし
217 :
デフォルトの名無しさん:2007/11/01(木) 22:52:03
VB6で、Formに描画した内容をglreadpixelsで配列に読み込んでbmpファイルに
保存する関数を作成しています。
この関数を、描画先のFormが画面からはみ出た状態で実行すると、
glreadpixelsで読み込んだ中身のうち画面外に当たる部分が0(真っ黒)
になってしまいます。
いろいろ試してみたところ、設定するピクセルフォーマットによっては
画面外の部分も正しく読み込めるようです。
(なお、画面外が読み込めないピクセルフォーマットはPFD_SWAP_COPYか
PFD_SWAP_EXCHANGEを持っていて、読み込めるピクセルフォーマットは
これらを持っていませんでしたが、関係あるのかな?)
このようなことが起きるのはなぜでしょうか?
また、現状で画面外が読み込めないピクセルフォーマットを使っていても
画面外を読み込めるようにする方法は無いでしょうか?
PFD_SWAP_COPY というより PFD_DOUBLEBUFFER なんじゃないかと推測してみる
219 :
208:2007/11/02(金) 14:43:40
>>215 ありがとうございます。
理解が深まりました。
220 :
デフォルトの名無しさん:2007/11/06(火) 08:14:29
GLSLでtexture2Dのtexture2DProjの違いが分からないんですけど、
誰か教えてください。
できれば使うときの例とかを載せていただけたら
うれしいです。
221 :
デフォルトの名無しさん:2007/11/06(火) 08:15:20
↑
texture2Dとtexture2DProjの違いです。。
xyzをwで割るか割らないか
単純に矩形を回転させたいだけなんだが,どうも回転しているときに歪んでしまう
(回転角0度のときは長方形なんだが,回転しているときの四隅の角度が90度にならない)
glPushMatrix()
glRotatef(angle, 0.0, 0.0, 1.0)
glColor4f(0, 0, 0, 0.5)
glRectf(-0.5, -0.5, 0.5, 0.5)
glPopMatrix()
ウィンドウサイズは800,600なんだが,下のような設定だとまずいのだろうか.
glViewport(0, 0, 800, 600)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
angle に PI / 2 を指定したりしてない?
angle は度なので 90 にするといいよ
>>223 ちゃんと投影行列を設定しないとダメ。ビューポートのアスペクト比に合わせてね。
(そのプログラムでは眼点座標系からクリップ座標への変換の際にzが反転してしまうよ。)
glMatrixMode(GL_PROJECTION);
glLoadItdentity();
の後に、
glOrtho(-4, 4, -3, 3, -1, 1);
とでも書いてやればいいかと。
226 :
デフォルトの名無しさん:2007/11/08(木) 01:30:56
視線とオブジェクト頂点の角度はvertexで
position = vec3(gl_ModelViewMatrix * gl_Vertex);
これとか使って求められたんですけど、
オブジェクトからの光線?(オブジェクト面と視点のベクトル)
は、vertexでどうやって求めるんですか?
視線ベクトルというよりオブジェクト面から光線ベクトルが
欲しいんですけど。
gl_LightSource[0].position とかで光源の位置が取れるんじゃない?
228 :
デフォルトの名無しさん:2007/11/08(木) 08:21:29
ちょっと急ぎです。
directxは触ったことがあります。
openglは初めてです。
即席でglutとglpngだけで製作中です。
極力組み込みで済ませたいです。
far-planeギリギリ半径の球にテクスチャを貼り天球を表現しようとしましたが、うまく貼れません。
最悪、カメラが向く方向を相対的に認識でき、空っぽく見えればいいです。
あわよくば、簡単にそれらしいエフェクト(雲や日光及びそのスペキュラー等)が掛けれると尚良いです。
何か良い方法があればご教授願います。
うまく貼れない=変な風に貼られる?
よくわからんが、far-planeギリギリなのが問題だというのならfar-planeを遥か彼方へ持っていけばいいのでは
むしろfar-planeなんか無限大に(ry
それともfar-plane関係なくてそもそもテクスチャが貼れないという問題?
どこで詰まってるのかよくわからない
230 :
226:2007/11/08(木) 11:32:29
(光線という言葉がまずかったかもしれませんが、)
光源は使っていません。。
やりたいことは板と視点の位置が固定なら、
いくら視線方向を変えても同じテクスチャで良くて、
板と視点の位置が変わると、違うテクスチャを貼るようにしたいです。
gl_ModelViewMatrix * gl_Vertexを使うと、視線ベクトルでテクスチャを
切り替えられてしまって、やりたいことと違って、
(gl_Vertex - 視点)ベクトルを使うと、板の両サイドでこのベクトルの
向きが違うので、うまくテクスチャマップされないんです。
そもそもvertex-shaderでできないことなんですかね?
231 :
デフォルトの名無しさん:2007/11/08(木) 11:43:08
far-planeは関係ないです。すみません。
球の生成にglutの補助関数を使っているので、各頂点毎にテクスチャ座標を指定出来ないので、自動生成に頼るつもりが、それが出来ていないのだと思います。
うまくラッピング出来る生成方は無いでしょうか。
>>230 文章から動きがイメージできないが…
>(gl_Vertex - 視点)ベクトルを使うと、板の両サイドでこのベクトルの向きが違うので
両サイドってのは板の両端って意味でおk?
テクスチャを切り替える基準は頂点の位置じゃなくて板の位置なわけか?
頂点の位置じゃない板の位置っていうのは何だろう。 中心点かなにかか。 それを与える必要があるんじゃないか。
233 :
226:2007/11/08(木) 12:10:38
はい、板の両端ってことです。
やっぱり中心点かなにか必要ですよね。了解しました。
なんとかがんばってみます。
>>231 単純に (x, z) を (s, t) にマップさせればいいんじゃないかな、少々大雑把かもしれんが
float size = 10000;
float s_plane[] = { 0.5/size, 0, 0, 0.5 };
float t_plane[] = { 0, 0, 0.5/size, 0.5 };
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGenfv(GL_S, GL_OBJECT_PLANE, s_plane);
glTexGenfv(GL_T, GL_OBJECT_PLANE, t_plane);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glutSolidSphere(size, 10, 10);
実際のテクスチャの様子みながらglScalefで球を平べったくするなり調節した方がいいかもしれない
235 :
デフォルトの名無しさん:2007/11/08(木) 17:09:18
GLEWでシェーダを使ってますが、
デバックとかできないんですか?
>231
空っぽく見せるのに球にする必要はない。skyboxでぐぐれ
>>235 知りたい変数を1.0~0.0の範囲に収まるように調整してからフラグメントの色に出力する方法が一番いいと思うよ
>>224,225
ありがとうございます.うまく回転させることができました.
glOrthoについてもう少し聞きたいんですが,ここで指定したleft, right, top, bottomが
glRectやglVertex2などで指定できる画面の端であるという理解でよいのでしょうか?
これに関連してglOrtho(-4, 4, -3, 3, -1, 1);とやって-4から4の間で指定しても
glOrtho(-1,1,-0.75,0.75,-1,1);とやって-1から1の間で指定しても同じような気がしますが,
ここの値を任意に大きくしたり小さくする意味はなにかあるのでしょうか?
>>238 そういう理解でよい
結局は同じだけど、-1〜1 と 0〜640 では扱いやすさが異なるだろう
場合に応じて使いやすい座標系を設定すればよい
>>235 シェーダってGLSLでいいんだよな?
WindowsならgDEBuggerの30日体験版が使えると思う
いざ買おうとするとイスラエルにfaxする必要があるんだが
あとはglslDevilってのがWindowsとLinuxなんかで使えてフリーだ
使ったことは無いがスクリーンショットを見る限り便利そう
MacならOpenGL Profilerが標準で付いてる
Cgだとデバッグ方法は分からん
FX Composerとかでやるしか無いんじゃないかな
241 :
235:2007/11/09(金) 12:47:35
ありがとうございます。
gDEBugger使ってみます。
242 :
デフォルトの名無しさん:2007/11/09(金) 14:10:49
マルチサンプリングアンチエイリアスというのをやりたいのですが、
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB |GLUT_MULTISAMPLE);
とした後、
glGetIntegerv (GL_SAMPLE_BUFFERS_ARB, buf);
glGetIntegerv (GL_SAMPLES_ARB, sbuf);
でbufとsbufに0が帰ってきて失敗してしまいます。
おそらくビデオカードがこれに非対応なのでしょうが、
マルチサンプリングアンチエイリアスをする方法は他にありますか?
シェーダを使ってやるしかないのでしょうか?
243 :
デフォルトの名無しさん:2007/11/09(金) 17:09:44
228でし。
なんとかなりました。
ありがとうございました。
>>242 他にはシェーダで自前でAAかけるくらいしかないね
つか今時MSAA対応してないグラボってもしかしてIntel?
そうであればシェーダでやってもまともな速度で動くとは思えんよ
245 :
デフォルトの名無しさん:2007/11/09(金) 23:24:38
モデリングソフトで作ったファイルを読み込むライブラリで
何か代表的なものあったら教えてください。
Blenderでエクスポートできるやつ希望。
lib3dsなんかどうよ
openglで2Dの木の描画に必要なのは線の描画と再帰処理だけど
3Dの場合はどうすればいいんだ?
座標変換を勉強するよろし
>>249 3Dの場合も線の描画と再帰処理だと思うけど?
半透明の板同士の交差ってどうやったらちゃんと描画される?
交差というか貫通した感じで交わっている場合、半分はブレンドされるが半分はやってくれない
描画順入れ替えてもこればかりは解決できないす…
>>252 あまり詳しくないので、答えるのもあれなんだが
複数重なった半透明処理をH/Wでちゃんとやってくれるボードのほうが珍しいというか
高額なやつじゃないとやってくれないんじゃなかったっけ?
ソフトウェアモードだとちゃんとできたりしない?
はじめてOpenGLを使うことになり、C#で使うためにCで書かれた
サンプルを見ながらC#に書き換えていったのですが、
どうしてももHGLRCが取得できずに困っています。SetPixelFormatまでは
上手くいってるみたいなのですが(Marshal.GetHRForLastWin32Error()は0x80070000)…
行数圧縮のため見づらいですが下にコードを書きます。
HDC = user32.GetDC(this.Handle);//Formのハンドル
wgl.wglSwapBuffers(HDC);
PIXELFORMATDESCRIPTOR pfd = new PIXELFORMATDESCRIPTOR();
pfd.nSize = Marshal.SizeOf(typeof(PIXELFORMATDESCRIPTOR));/*40byte*/
pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = 0; pfd.cColorBits = 32; pfd.cRedBits = 0; pfd.cRedShift = 0; pfd.cGreenBits = 0;
pfd.cGreenShift = 0; pfd.cBlueBits = 0; pfd.cBlueShift = 0; pfd.cAlphaBits = 8; pfd.cAlphaShift = 0;
pfd.cAccumBits = 32; pfd.cAccumRedBits = 0; pfd.cAccumGreenBits = 0; pfd.cAccumBlueBits = 0;
pfd.cAccumAlphaBits = 8; pfd.cDepthBits = 16; pfd.cStencilBits = 8; pfd.cAuxBuffers = 0; pfd.iLayerType = 0;
pfd.bReserved = 0; pfd.dwLayerMask = 0; pfd.dwVisibleMask = 0; pfd.dwDamageMask = 0;
int pixelFormat = gdi32.ChoosePixelFormat(HDC, ref pfd);
bool success = gdi32.SetPixelFormat(HDC, pixelFormat, ref pfd);
HRC = wgl.wglCreateContext(HDC);
pixelFormatも0ではないので多分大丈夫だと思います(実験時は7)。
どこが原因なのかさっぱりです orz
一体何が原因なのでしょうか?
>>252 交差してるところでポリゴンを割り、一番奥から順に描画するしかない。
>>252 基本的には、交差させないのが一番。
交差するならCPUで計算してポリゴン割る。
分割せずに半透明ポリゴンを順序非依存で正しく描画する方法といったら、
1. Depth Peeling
2. シェーダで半透明情報をバッファ上に蓄積、最後に合成
の二通りかな。
1.はdepth complexityに応じてnパスレンダリングをおこなう必要がある。
2.は事前に決めた枚数(バッファの深さと精度のトレードオフ)より沢山は重ねられない。
まぁどっちにしても非常に負荷の大きい処理なわけで、半透明処理は鬼門ですわね。
実装が簡単なのは1.だけど、今後2.のアプローチが流行りそうかもしれないので
チャレンジしてみてください是非!
半透明ポリゴンが交差せざるを得ない状況が思いつかなかったので
懸命に頭ひねってみたんだが
白スク水着せたおにゃのこが家庭用プールで遊んでる構図しか浮かばなかった
258 :
252:2007/11/13(火) 03:56:59
なんにしてもややこしそう…ですね
色々試してみます
>>259 濡れた白スクと水面じゃねーの?
>>256 この2の方法てAバッファとか言うんだっけ?
これって遅延シェーディングと似たようなもんだと理解してるんだけど
それだとAAって自前でかけないとならないよな
それともAAかけて描画した結果を蓄積しちゃっていいのか?
ただの興味だけなんだが誰か分かる人がいたら頼む
261 :
デフォルトの名無しさん:2007/11/13(火) 11:54:17
>>244 GeForce FX 7600です。
調べるとMSAAに対応しているみたいですね。
赤本のサンプルソース(multisamp.c)なのですが動かないです。
加えたのは
#include <GL/glew.h>
だけです。
何か足りないのでしょうか?
262 :
261:2007/11/13(火) 14:52:50
ちょっとだけ自己解決しました。
ビデオカードのコントロールパネルのアンチエイリアシング設定を
アプリケーションによるコントロール → 2xMS
にしてやると動きました。
しかしアプリ任せのMSAAをやるには
なにかピクセルバッファのようなものが必要なのでしょうね。
Windows XP + GeForce 7900 GS で、glutではなくwglMakeCurrent使って
コントロールに描画しているが、242と同じくマルチサンプリングアンチエイリアスできない。
同じようにbufとsbufに0が返ってくる。
PIXELFORMATDESCRIPTOR にはマルチサンプリング関係の設定はないみたいだし。
>>242 はglutで描画してるの?
264 :
254:2007/11/13(火) 18:37:16
やはり場違いなようなのでC#のスレ行ってきます。
スレ汚しすいませんでした。
>>261 GeForceにFX7600なんてないのはともかく、それならHW的には十分だな
opengl.orgに繋がらないので違うところにあったそれっぽいWindows版のGLUTのソースを確認したが、
そのソースを見る限りWindowsではGLUT_MULTISAMPLEは無視されてるみたいだな
俺の見たソースが最新ならGLUTでは改造しないと無理そうだ
>>263 SetPixelFormatじゃ設定できない
WGL_ARB_pixel_format拡張のwglChoosePixelFormatに
属性としてWGL_SAMPLE_BUFFERS_ARBとWGL_SAMPLES_ARBで指定するとできるはず
すいません、超初心者ですorz
glutDisplayFunc( DisplayTri );
glutDisplayFunc( DisplayTri2 );
glutMainLoop();
例えばこういう場合、glutMainLoopによって上2行の関数がどちらともループしてしまいます。
1行目glutDisplayFunc( DisplayTri )を初めの1回だけ実行し、その後2行目のglutDisplayFunc( DisplayTri2 )をループで実行し続けるにはどうしたらいいでしょうか?
glutDisplayFunc って 2 回目呼んだら上書きされるのでは?
だから DisplayTri1 を最初の 1 回しか実行してほしくないなら↓のようにすればいいはず
void DisplayTri2(void)
{
/* なにか素敵なものを描画 */
}
void DisplayTri1(void)
{
/* なにか楽しいものを描画 */
glutDisplayFunc(DisplayTri2);
}
int main(....)
{
...
glutDisplayFunc(DisplayTri1);
glutMainLoop();
}
その前に glutMainLoop をそもそも誤解してるような気もするが。
FBOについて質問があります。
FBOを作成し空のテクスチャを割り当て、ディプス、ステンシルバッファは割り当てないとします。
そして、FBOへ書き込み先を変更し描画を行った場合、深度値やステンシル値はデフォルトのバッファに書き込まれるのでしょうか?
それとも何処にも書き込まれないのでしょうか?
もちろん、glEnableでディプス、ステンシルをONにした状態です。
分かる方宜しくお願いします。
>>263 glutです。
>>265 わざわざソースを見ていただいてありがとうございます。
おそらく私の問題も結局は
>>263の人と同じだとおもうので
GLUTの中を調べながらもう少しやってみます。
>>268 どこにも書き込まれないのが正しいと思う
そのFBOをBindした状態ではDepthBitsとStencilBitsが0になってるはずだ
glslでマトリックスとベクトル型のかけ算にmulを使うと
warning C7506: OpenGL does not define the global function mul
と出ますが、ちゃんと動作しちゃいます。
これは、どういう事なのでしょうか?
グラボによっては動作しないのでしょうか?
OSはXP,グラボGeForceです。
>>271 その警告の通りGLSLではmulなんて関数は無くて、普通に*演算子で計算できるよ
しかしGeForceだとGL_EXT_Cg_shaderというGLSLでCgの命令も使える拡張がある
これのおかげでmulが警告ありながらも使えて、たぶんfloat4なんかも使えるはずだ
動きはするけどRadeon積んだマシンに持っていくと途端に動かなくなるから
ちょっと迷惑な拡張なんだよな
とりあえず警告潰すようにしていけばGL_EXT_Cg_shader頼りになることも無いんじゃないかな
ベンダによって、GLSLコンパイラがエラーに寛容だったりするから困るよね。
ATIの方がわりと厳しいんだっけ?
Radeonで昔試したら時はGLSLのコンパイルエラーメッセージが3DlabsのGLSLValidateと全く同じだったな
多分GLSL Frontendとか使ってたんじゃないかと思う
今は別物になってるのか手を入れて使ってるのかは良く知らないけど。
GeForceで開発してRadeonに持っていく時にはGLSLValidateによくお世話になった
275 :
デフォルトの名無しさん:2007/11/15(木) 18:40:07
ウインドウの色(背景部分?)を上半分が白、下半分が黒って
できますか?教えてください。
上半分を白で、下半分を黒で、四角形を描けばいいだけ
277 :
271:2007/11/15(木) 20:02:19
>>272 レスありがとうございます。
本当に迷惑な拡張ですね・・・。
以後、気を付けたいとおもいます。
278 :
275:2007/11/15(木) 22:06:37
>>276 ありがとうございます。初歩的なことですいません。
glClearColor(0.3, 0.3, 1.0, 0.0);
をいじってできるかと思いました。
いじってたらできるのは子供だけ
280 :
デフォルトの名無しさん:2007/11/16(金) 00:56:17
子供ってすげーーーーーーー
glMultiTexCoordの使い方がよくわかりません。
どうやってTEXCOORD0〜7に座標を指定していくのでしょうか
>>281 それはglMultiTexCoordのリファレンスを読んだ上で言ってるのか
http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml >Parameters
>target
> Specifies the texture unit whose coordinates should be modified.
> The number of texture units is implementation dependent, but must be at least two.
> Symbolic constant must be one of GL_TEXTUREi, where i ranges from 0 to GL_MAX_TEXTURE_COORDS - 1,
> which is an implementation-dependent value.
>s, t, r, q
> Specify s, t, r, and q texture coordinates for target texture unit.
> Not all parameters are present in all forms of the command.
>>282 その仕様は理解しているのですが…
すみません日本語おかしくなるかも知れないんですが、まとめて質問させてください。
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0, 1.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, 1.0);
glVertex3d(-1.0, -1.0, 0.0);
…中略
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0, 0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, 0.0);
glVertex3d(-1.0, 1.0, 0.0);
glEnd();
こういう風に使った場合(-1.0, -1.0, 0.0)の
TEXCOORD0にはテクスチャ0番での、(0 1)がテクスチャ座標として与えられて
TEXCOORD1にはテクスチャ1番での、(0 1)がテクスチャ座標として与えられるわけですよね。
で、Cgのvertexシェーダーで
IN{
float4 objectPosition : POSITION,
float4 color : COLOR,
float4 texCoord0 : TEXCOORD0,
float4 texCoord1 : TEXCOORD1,
}
とした場合、vertex(-1.0, -1.0, 0.0)のとき、
texCoord0には(0 1) texCoord1にも(0 1)の値が入力されるということでしょうか?
TEXCOORDセマンティックが、数字としてどこを指しているのか確認したくて質問しました。
それはMultiTexCoordというよりCgの質問じゃないか
それもCgのマニュアル見れば書いてあるわけだが、
TEXCOORD0-TEXCOORD7
Input texture coordinates (texcoord0-texcoord7)
through MultiTexCoord command
だそうだ
ウォークスルーのプログラムで、ウィンドウいっぱいに表示されるくらい、ポリゴンに近づくと処理が重くなります。
GL_QUADSで描いたごく単純な長方形でも重くなるので、なにが原因なのかよくわかりません。
286 :
263:2007/11/17(土) 10:40:52
>>285 ソフトウェアレンダリングになってるってことはない?
>>284 すみません、ということは
>>283は合ってるのでしょうか?
それだと、MultiTexCoordは常に0〜1の範囲の座標をCgに渡して
それ以外の値をTexCoord0〜1はもてない、ということになりますよね
>>288 なんで?
100でも-20でも好きな座標を渡せばいいじゃん
元々glTexCoordに渡すテクスチャ座標は0〜1に制限されてはいないんだし
なるほど
テクスチャの有無云々じゃなくて、座標を優先すればいいわけですか。
ようやくわかってきました。ありがd
>>287 確認できませんでした。。
ソフトウェアレンダリングというものは、プログラムの内部で決定するのでしょうか?
例えばOpenGLの初期化の際に、ソフトウェアレンダリングを指定するみたいな…
あるいはドライバの設定で変更するものなのでしょうか?
>>291 とりあえず↓をOpenGLの初期化後にやってみそ
printf("%s\n", glGetString(GL_VENDOR));
printf("%s\n", glGetString(GL_RENDERER));
printf("%s\n", glGetString(GL_VERSION));
293 :
291:2007/11/17(土) 15:32:22
>>292 NVIDIA Corporation
GeForce 6200/AGP/SSE2
2.0.3
こんな感じになりました
294 :
291:2007/11/17(土) 15:47:46
検索したところGL_RENDERERがGDIになってるとソフトウェアレンダリングってことらしいですね(Windowsでは)
ってことはおそらく自分の環境はソフトウェアレンダリングではなく、他に原因があるってことでしょうね
もう少し調べてみます
GeForceだと
glEnable(GL_POLYGON_SMOOTH)やらglEnable(GL_LINE_SMOOTH)は
遅くなるかもね
296 :
291:2007/11/17(土) 19:01:50
>>295 Enableしないようにしてみたところ、見違えるほど速く動くようになりました
ほんとうにありがとうございます
openglで3次元テクスチャを使おうと赤本を見たら
image[r][t][s][3]
という風に3次元テクスチャの領域を取ってるのですが
これってなんで
struct 3Dtex{
int r,g,b;
}3Dtex[r][t][s];
みたいなのではダメなのでしょうか。
0〜2がrgbに対応している、と解釈してるのですがそれだとカラッポの領域も確保しなくてはならなくて
256×256×256でものすごい重くなります。
1次元で 3Dtex[]={r,g,b r,g,b r,g,b…}みたいに確保したら動かないのでしょうか?
>みたいなのではダメなのでしょうか。
別にだめなことはない
>1次元で 3Dtex[]={r,g,b r,g,b r,g,b…}みたいに確保したら動かないのでしょうか?
それでも動く
どの方法を取るにしても、256×256×256 のテクスチャを扱うつもりならそれだけのメモリは要るから(48MBくらいか?)、結局同じ
どれでも好きなやり方でどうぞ
1次元だと、ボクセルの座標がよくわからないのですが
4 4 4の3次元テクスチャだと、1項目が0 0 0 最後が4 4 4だとなんとなくわかるのですが
2項目はボクセルのどこに当たるのでしょう
下の○にrgbが入ってるとして、それを1次元で○だけ確保したら
○×○○×
3Dtex[]={○ ○ ○}と格納されますが、rgb情報はあってもxyz情報が消えませんか?
そこら辺が1次元で確保するときよくわからなくて
1番目は 0 0 0
2番目は 0 0 1
3番目は 0 0 2
4番目は 0 0 3
5番目は 0 1 0
:
8番目は 0 1 3
9番目は 0 2 0
:
12番目は 0 2 3
13番目は 0 3 0
:
16番目は 0 3 3
17番目は 1 0 0
:
32番目は 1 3 3
33番目は 2 0 0
:
48番目は 2 3 3
49番目は 3 0 0
:
64番目は 3 3 3
全部で4×4×4=64個分必要
301 :
300:2007/11/22(木) 14:37:53
あぁ悪い、それ z y x の順だ
2番目は 0 0 1 ・・・ z=0, y=0, x=1 ってことね
つまり1次元で確保するときも
×の領域分作らないとダメってことですね。
ありがとうございました。それなら3次元で確保したほうがプログラムでアクセスしやすい(^^;
隙間?
padding
306 :
デフォルトの名無しさん:2007/11/25(日) 01:02:04
OpenGLをCygwinに入れたいのですが、
わかりやすい手順が書いてあるWEBページないですか?
cygwinのsetup.exe起動して、パッケージの選択画面でgraphics/openglにチェック入れるだけ
309 :
デフォルトの名無しさん:2007/11/25(日) 03:59:28
>>307 ファイル作ったんですが、コンパイルが通らなくて、設定がおかしいのかな?
と思ってて、探してるんですが。
bashにglut32のコマンドが無いってでるんですよ。
助けて〜
mingw 使うんならコンパイル時に -mno-cygwin オプションを付けてる?
cygwinはそのあたりのことを解決できない奴が使うもんじゃないと思うぞ。
素直にVS入れたらどうよ。
>>308 とりあえずglut.hを
..\cygwin\usr\include\mingw\GLに移してみては
みなさんレスありがとうございます。
cygwinは大学で買ったPCにプリセットされてて
講義とかでもそれを使わなければいけないので使ってます。
あとopenGLは大学の講義では扱わないので自分で調べてやってみようと思いました。
>>312さん
freeglutはネットで探しても情報が…と言ってみるけど、知りませんでした。
調べてみます。
>>313さん
GLフォルダが無かったので勝手につくって入れてみたけど変わりませんでした。。
>>310さん
-mno-cygwinオプションつけると
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccu7vLOg.o:test.c:(.text+0x1c): unde
fined reference to `___glutInitWithExit'
みたいなエラーが大量に表示されてしまうんですけど…いいのでしょうか!?
調べてみますというか、cygwinで使うならsetup.exeからfreeglut選ぶだけなんだが
>>314 もう面倒くさいから自分で入れるの諦めてsetup.exeに任せちまえよ
317 :
デフォルトの名無しさん:2007/11/25(日) 15:44:22
入れてから、どうすればいいのかわかりません
>>315,
>>31さんレスありがとうございます。
そうですね、もうsetup.exeでインストールし直したほうが早そうですね;
それではインストールしてきます。
319 :
318:2007/11/25(日) 15:53:55
320 :
デフォルトの名無しさん:2007/11/25(日) 20:08:06
makefileの作り方教えてください
openGLのmakefileの作り方教えてください
323 :
デフォルトの名無しさん:2007/11/25(日) 20:45:23
OPENGLで、コンパイルすると
makeは、なんですか?って聞かれるんです。
どういう手順でコンパイルしたら誰に訊かれるんだよ
OPENGLで右クリックをしたら〜したいというとき
どういう風にしたらいいのですか?
床井先生のところで左クリックはあったのですが、右クリックが見当たらず
助けてください(;;
すいません、解決しました。
見ていたサンプルにmouse_down[3]というのがあって
それで判別してるようでした。
gluPerspectiveを使うと座標が-1~1になります。
これを透視投影でglOrthoみたいに-10~10等にすることってできますか?
単に拡大縮小すれば?
glScaled(0.1, 0.1, 1); とか
まてまて、glOrtho使ってもスクリーン座標系は-1〜+1の範囲だろ
なんにせよ拡大縮小すればいいだろうけど
glFrustum 使えばいいのでは。
そういう意味ではない?
マウスを使って視点の移動(カメラを動かすみたいに)はどのように実装したらいいでしょうか?
マウスの方向とは逆向きになることは3Dソフトを使っていてなんとなくわかるのですが。
視点といえばgluLookAtですが、どう使ったらいいかいまいちわかりません。
解説しているサイトはありますか?
床井先生のところのクォータニオン使ったやつか、
polarviewで検索すると色々出てくるやつあたりが簡単だね。
333 :
331:2007/11/27(火) 00:07:31
>>332 有り難うございます。
いろいろと検索してみます。
>>334 それで使い良いのが出来れば製品として売れるくらい、色々と難しい問題なんだよなぁ。
とりあえず簡単(ベタ)な実装としては、視点とマウスを通過するレイと、ポリゴンとの交差を
計算して、あとは適当にごにょごにょと。
「交差判定」あたりでぐぐってみたらどうでしょう。
クリック点=スクリーン座標点として
レイを放って、バウンディングボックスとの交差判定して
それとポリゴンとの交点を求めれたとして
…
すげぇ難しそうだ
昔nvidiaに3Dペイントのデモがあった気がするからそれが参考になるかも
関係ないけど任天堂はwiiリモコンでポリゴンに落書きするようなソフト出してくんないかな
とりあえず俺の脳内シミュレーションでは単一マテリアル単位でならハードウェアアクセラレーション付きで出来た
と思ったけどポリゴンが重なってると隠れてるポリゴンのテクスチャも編集されてしまって俺涙目www
その脳内ソースをフルでうpってくだしあ><
>>337 交点を求めたら、それをトライアングルの重心座標に変換、
それをさらにテクスチャ座標に変換だな。これで点は打てる。
334みたいに、投影面に平行でなくポリゴンに平行、かつ視点の向きに非依存な
パターンであれば、あとはテクスチャにスタンプを繰り返すだけ。
もし、投影面に平行なパターンを、投影面に平行でないポリゴン(テクスチャ)に
スタンプしたいなら、話は一気に難しくなる。(というより面倒臭くなる)
>>338 それいいね。あったら欲しい。
3Dモデラも、任天堂が作るとえらい分かり易いインターフェースになるんだよな。
64DDのポリゴンスタジオで感動した。
あくまで脳内シミュだから間違ってても文句言わないように
・描画に使うテクスチャをfbo等レンダリング可能なテクスチャ(以下rtt)にコピーする
・rttをレンダーターゲットに設定
・頂点シェーダ出力のポジションにuvを、texcoordとか適当なやつにスクリーン座標を入れる
・ピクセルシェーダでtexcoordで持ってきた座標とマウスの座標を適当に比較して線の色を出力
・rttをテクスチャとして使いモデルを描画
・ 超 完 成 !
まあぶっちゃけポリゴンの重なりで破綻するだろとかテクスチャの張り方制限あるだろとかテクスチャ空間で比較すんなと
突っ込み所満載過ぎてこの方法でモデリング補助ツールとか作るのは無理。あくまで遊び用
ZBrushを買え
それかデカールでぐぐれ
zbrushの3Dペイントってテクスチャにも描けるの?
>>343 テクスチャ空間で比較するのは目から鱗
難しくないし面白そうだね
あくまで脳内シミュだから間違ってても文句言わないように
・レンダリングするモデルの各頂点に以下のデータを設定
・頂点座標, uv座標, テクスチャID(適当に0.0~1.0にエンコする)
・頂点シェーダ出力のポジションに普通に変換済み頂点座標を、texcoordとか適当なやつにuvとテクスチャIDを入れる
・フラグメントシェーダでRGにuv, B(テクスチャIDの数に応じてAにも)にテクスチャIDを入れる
・今レンダリングしたカラーバッファをメインメモリへ送ってマウスの位置に対応するフラグメントの値をゲッツ!!
・BとかRGの値を見て、対応するテクスチャのピクセルに魂を刻む。
・次はモデルを普通にレンダー。
・ 超 完 成 !
補足するとテクスチャIDってのは複数テクスチャを扱うときに必要なんで、一枚テクスチャならIDいらいないし
ID値をfloatに変換すんなとかOpenGLスレなのにフラグメントシェーダのことをピクセルシェーダと呼ぶなとか云々。
なんか僕も
>>334みたいなの作ってみたくなってきたw
これ頭の体操には丁度イイ感じの題材かも〜
>>343 あらかじめデプスだけレンダリングしておけば、ポリゴンの重なりは処理できるんジャマイカ?
(シャドウマップみたいな感じで…)
改訂版2
・深度バッファ付レンダラブルテクスチャを作成
・オリジナルテクスチャをそれにコピー
・レンダーターゲットに設定
・深度バッファのみれんだりんg
・深度比較をequalに
・頂点シェ(中略)
・copyteximage2dでオリジナルテクスチャを更新
・レンダーターゲットを戻す
・ 超 完 成 !
>347
nvidiaもglのドキュメントでピクセルシェーダとかジオメトリシェーダとか言ってるから問題無し
どうでもいいけど2と3は逆のがよかたな
後のマリオペイント2である。
353 :
デフォルトの名無しさん:2007/11/29(木) 02:16:36
エラー 1 fatal error LNK1104: ファイル 'winmm.lib' を開くことができません。 test
glutいれてVC++2005つかったらこんなエラー出てきたんですけどさっぱりなんで
どなたか解決法教えてくれませんか
>>353 ExpressだったらWin32SDKを入れる必要がある
質問です
openglのテクスチャで
image[i][j][0]= image[i][j][1]= image[i][j][2]=0〜255の値
image[i][j][3]=255;
みたいにして、テクスチャに値を入れてるのですが。
このときimageに入ってるのは0〜255の値ですよね。
で、それをシェーダのCOLORセマンティックに入れたりするときは
0〜1の値になります
これは何故なのでしょうか?
テクスチャは0〜255の値で扱ってもOKということですか?
>このときimageに入ってるのは0〜255の値ですよね。
そのときimageに入れる値は、glTexImage2D に渡す type 引数の値によって意味が決まる。
たぶん GL_UNSIGNED_BYTE を指定してるんだろうが、その場合に限り 0〜255 だ。
何をどう指定された場合でもシェーダでは統一して 0〜1 で扱う。
なるほどGL_UNSIGNED_BYTEをいつも使っていました。
ということは image[i][j][0] を printfなんかした場合は
0〜255が出てくるのですね。ありがとうございました。謎が一つ解けました。
あと、もう一つ質問なのですが
テクスチャアニメのようなことをしたくて。
imageに格納したRGB値をヒントに時間刻みでテクスチャをアニメさせたいのです
シェーダー側ではシェーダーを使えばいいと思うのですが
CPU側で計算
テクスチャのRGB値更新
再びglteximageということは出来るのでしょうか?
というのも、やりたいのが2Dテクスチャじゃなくて、3Dテクスチャで
3DテクスチャをGPU側で扱うのがひどく大変なので。
3DテクスチャをCPU側で更新
glteximage3dでGPU側のテクスチャ更新
アニメーション。ということは可能でしょうか
シェーダとは関係ない気がするけど
glTexImage?D でテクスチャを更新するのはもちろん可能
だけど更新の場合は glTexSubImage?D の方が軽いかもしんない
まぁ使い分けるのが面倒かったらどっちでも
ありがとうございます
今から研究室行って試してみます。
今週中に完成させるぞー。。。安定剤を飲む生活はもういやだ
今OpenGLをインストールしようとしているのですが、方法をネットで調べたところ、
「開発環境には Visual C++ 6.0 を想定しています.
windows用のバイナリ (glut-3.7.x-bin.zip) を展開した後, 各ファイルを以下のように「手で」配置してください.
glut.h をコンパイラのヘッダファイルのパス (C:\Program Files\DevStudio\Vc\include\GL )に貼り付ける」
とあるのですが、自分はvisual C++ Express Editionを使っていて、
C:\Program Files\DevStudio\Vc\include\GLのIncldeの中にGLというのが見当たらないのですが、どこに貼り付けたら
いいんでしょうか。(C:\Program Files\Microsoft Visual Studio 8\VC\includeのファイルの中にGL以外にはたくさんファイルがあったのですが)
初心者ですいません。
参考にしたサイトは、↓の、2.GLUT をインストールする のところです
ttp://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#2
PlatformSDKのincludeにGLフォルダがあるはず
>>361 小文字ですがglがありました!
やってみます〜。多分これだと思うので・・
ありがとうございました
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA16F_ARB, TEXSIZE, TEXSIZE, 0, GL_RGBA, GL_FLOAT, NULL);
のテクスチャを使って深度バッファーをやろうとしているのですが
(深度を色分けしてあります)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
をコメントアウトすると表示されるのですが、テクスチャが常駐されず
これを入れると表示されなくなるのですが、テクスチャが常駐されます。
GLboolean blState = GL_TRUE;
glAreTexturesResident(1 , &texName , &blState);
printf("テクスチャは常駐%s\n" ,
blState == GL_TRUE ? "しています" : "していません");
原因がまったくわからず、行き詰まっています。よろしくお願いします
っ 常駐状態なんか気にしない
GPU上でテクスチャを計算用に使うため
常駐できてないとアウトなのです…
昨日ためしに組んだときは表示も常駐もできてたのに
なぜか…今日は
しかも昨日のソースが消えてしまい…鬱すぎです
>>363ですが
PFNGLMULTITEXCOORD3FARBPROC glMultiTexCoord3fARB =
(PFNGLMULTITEXCOORD3FARBPROC)wglGetProcAddress("glMultiTexCoord3fARB");
を使っていて、これが原因でした。
これをコメントアウトして、glutCreateWindowより前でテクスチャの設定をすると常駐され表示されました…
ただ、これだとGPUでTEXCOORDが認識されず、扱えません…
解決策などありますでしょうか
>>366 常駐状態は気にしなくていいんだって
常駐してなくても必要あれば勝手にVRAMに入るから
なので最初の状態が正解
あ、あとどうしても常駐させたいんだったら
glPrioritizeTexturesなんてのもある
使って意味あるかどうかは知らないが
369 :
デフォルトの名無しさん:2007/11/30(金) 21:43:37
長方形の板2枚で一枚にはテクスチャマップ、
もう一枚にはただ色づけしたものを描画しているのですが、
テクスチャマップした板に色づけした板の色が混ざって
描画されるのはなぜですか?
はじめに描画されるときはうまくいくのですが、視点を変えたりなど
再描画すると上記の現象が起こってしまいます。
テクスチャを使い終わったあと GL_TEXTURE_2D を glDisable していない
色を使い終わったあと白に戻してない
明示的に戻さない限り、設定したものは以後ずーっと有効
テクスチャマップを色づけより先に描画していて、
テクスチャマップの方にはglMaterialを指定してない。
と予想。
先を越された orz
>>369 デフォルトではテクスチャ貼っても頂点色と混ぜられる
色を指定したポリゴンを描いた後にテクスチャ貼ったポリゴンを色指定せずに描くから前のポリゴンの色が適用されてるんだ
テクスチャ貼る方は色を白に設定しておくか、glTexEnviでGL_TEXTURE_ENV_MODEをGL_DECALかGL_REPLACEにするといい
なんという重複
このスレどんだけ人いるんだよ
お前ら本当にいい奴らだなw
原点にglutSolidSphereで太陽、周りに地球と月を設置して公転のアニメーションを作りました。
GL_POSITIONを使って原点から全方向に向かって光を出しています。
この場合、原点から光を出しているので太陽が薄っぺらくなってしまいます。
原点から光を出しつつ、太陽も立体的に見せるにはどうしたらいいでしょうか?
太陽を描くときだけだけ別の場所から光を当てる
太陽にそれっぽいテクスチャを貼りつける
破線の直線を引く場合に、patternで指定するbit列の0, 1の色をそれぞれ任意で指定したいと思っています。
ですが、どう設定したらよいのか分かりません。どなたか力を貸していただけないでしょうか?
glLineStipple_color(GLubyte *color0, GLubyte *color1, GLint factor, GLushort pattern)
{
~~~~~~~~~
}
glLineStipple_color
なんて関数はじめて見た。ぐぐっても出てこないが本当にあるの?
color0, pattern を設定して描画
color1, pattern^0xFFFF を設定して描画
383 :
380:2007/12/01(土) 20:29:42
微妙に空気読めなかった orz
あ、0と1が反対だった
glEnable(GL_LINE_STIPPLE);
glColor4ubv(color0);
glLineStipple(factor,pattern^0xFFFF);
線の描画
glColor4ubv(color1);
glLineStipple(factor,pattern);
線の描画
描画を2回呼ばないといけないので、
>>379のような関数の形では無理
>>384さん
ありがとうございます。できました。
386 :
369:2007/12/02(日) 03:32:32
遅れまして、たくさんの回答ありがとうございます。
NURBSで円を描画しても、
だんだん縮小していくとカクカクになっちゃうんですが、
これはこういうもんなんですか?
そりゃ、液晶がツブツブだもん
うーん…、ドットの影響以上のものがある気がするんですが。
縦横の幅が大体20〜100ドットあたりの大きさで描画すると
なんかカクカクが顕著に見えます。
GL_POLYGONとかで多めの多角形作ったほうが綺麗っぽいっす。
とりあえずコード書いてみます。
たぶんどっかの大学の資料をグーグルで見つけてきて元にしてます。
#define ROUTETWO 1.4142135623730950488016887
GLUnurbsObj *theNurb;
System::Void Circle(float x)
{
GLfloat knotvec[] = {0.0, 0.0, 0.0, 1.0, 1.0, 2.0, 2.0, 3.0, 3.0, 4.0, 4.0, 4.0};
GLfloat cpoint[9][4]={
{ 0.0, -x, 0.0, 1.0},
{-x/ROUTETWO, -x/ROUTETWO, 0.0, 1.0/ROUTETWO},
{ -x, 0.0, 0.0, 1.0},
{-x/ROUTETWO, x/ROUTETWO, 0.0, 1.0/ROUTETWO},
{0.0, x, 0.0, 1.0},
{x/ROUTETWO, x/ROUTETWO, 0.0, 1.0/ROUTETWO},
{x, 0.0, 0.0, 1.0},
{x/ROUTETWO, -x/ROUTETWO, 0.0, 1.0/ROUTETWO},
{0.0, -x, 0.0, 1.0}};
theNurb = gluNewNurbsRenderer();
gluBeginCurve(theNurb);
gluNurbsCurve(theNurb,12,knotvec,4,&cpoint[0][0],3,GL_MAP1_VERTEX_4);
gluEndCurve(theNurb);
gluDeleteNurbsRenderer(theNurb);
}
使ったことないけれど gluNurbsProperty で調整できるんじゃないだろうか
マウスで画面をクリックして
ポリゴン上に描写されている、テクスチャにアクセスするのってどうやればいいでしょうか
gluUnProjectで実装しようとしているのですが
GLdouble model[16], proj[16];
GLint view[4];
GLfloat z;
GLdouble ox, oy, oz;
glGetDoublev(GL_MODELVIEW_MATRIX, model);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
glGetIntegerv(GL_VIEWPORT, view);
glReadPixels(x, wh - y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z);
gluUnProject(x, wh - y, z, model, proj, view, &ox, &oy, &oz);
これで、ox oy ozのワールド座標の3次元位置が出せても
その後で詰ってしまいました
すみません、どういう関数使うかも検討つかず
お願いします。。。・゚・(ノω;)・゚・
すみません、足りてませんでした
欲しいのはポリゴン上に描写されている、1Pixelのテクスチャ座標の位置です。
クリック点から、ポリゴン上までラインを引いて
そこにあるテクスチャの色を赤くする、ということをしたいのです。
がい視感(なぜか変換できない)を感じた
>>392 そこまで行けば、あと一息な気がしますが。
テクスチャ座標と大きさ、テクスチャ張ってるポリゴンの座標値から求められません?
ポリゴンが複雑なのかな?
少し前に関連したレスがあったような希ガス。
関連したレス探してみます。
ポリゴンの点から、どうやってテクスチャ座標にするのか
そこがまったくわからなくて
あと、ポリゴンの中でテクスチャが繰り返しで動いてたりしたらどうするのかとか…
考えすぎて気持ち悪くなってきました
>>395 テクスチャをいろいろ加工したいんだったら、繰り返しは考えない方がいいと思うぞ。
俺も気持ちが悪くなったw
>>391 上〜の方でも同じ話してるけど・・・
これはOpenGLの問題ではないし、どういう関数を使うとかいう問題でもないよ。
単純に幾何の問題。
まず交点だけじゃなく、どのトライアングルと交差したのかを求めないといけない。
それが求まったら、交点のトライアングルにおける重心座標に変換する。
(barycentric coordinate でぐぐれば何か出てくるかも)
重心座標まで出れば、あとは自ずと解決するでしょう。
アンチエイリアスにつついての質問なんですが、
glEnable(GL_POLYGON_SMOOTH)
としてアンチエイリアスを有効にした後、
glDisable(GL_POLYGON_SMOOTH)
としてもなぜかアンチエイリアスが無効になりません。
他に特別なことはしていない(四角を書いてテクスチャを張るのみ。
glHintやglBlendFuncも未使用)ので何が原因だかさっぱりです orz
これって一回有効にすると無効にならないのでしょうか?
>>398 んなわきゃーない
disableすれば無効になるよ
>>399 ですよね。でも出てくる絵を見るとどう考えてもアンチエイリアスが…
glDisable(GL_POLYGON_SMOOTH)ってglFlushの後でも別に問題はありませんよね?
もちろん問題ないよ
それ以降に描画するポリゴンのPOLYGON_SMOOTHが無効になる
・・・まさか、
glEnable/glDisableするだけで、描画済みの絵のアンチエイリアシングが
有効になったり無効になったりするだなんて、思ってないよね?????????
402 :
389:2007/12/06(木) 00:06:32
>>390 できましたー!
ありがとうございますっっっ。
>>401 本来無効になってくれるものが無効にならないとしたらこっちが
なにか変な事してるとしか考えられませんよね… うーん orz
ちなみに、glEnable()、glDisable()するたびに描画し直してる(VS上で
動いてるのを確認済み)のでそれはないです >描画済みの絵
>>403 追記:glClear(GL_COLOR_BUFFER_BIT)もちゃんとやってます
>398
テクスチャのバイリニアフィルタとアンチエイリアスは違うよ
そうなるとよく分かんないな
ちなみにglFlushの後でglDisable(GL_POLYGON_SMOOTH)するのってなんで??
あとはソースあれば話はやいんだけど
>>405 アンチエイリアスを掛けたいのは四角形のポリゴンの方で、テクスチャ
ではないです。
>>406 glDisable()するのは複数回連続で描画するのですが、描画のたびに
条件が変わる(アンチエイリアスを掛ける・掛けない、ライトの位置の変更等)ので、
全てにアンチエイリアスを掛けるのならばglDisable()しなくても良いのですが、
そういうわけにも行かないので…
いや、そーじゃなくて・・・
ポリゴンのアンチエイリアシングをenable/disableしたいなら、
そのポリゴンを描画する直前にglEnable/glDisableすればいいのに
なんでglFlushの後でやるのかなと
>>408 描画の流れとして
設定
↓
描画
↓
設定
↓
描画
↓
…
という感じなのですが、ライトや回転・平行移動等がglBeginの前にあるので
そこでglEnable()、glDisable()するようにしているのですが、二回目以降アンチエイリアス
を掛けない場合はglFlush()の後にglDisable()することになるので、これがだめなのかなーとか
思ったのですがそうではないみたいですし…
コレは諦めてドライバーのバグという事に
そういうことは十分にありえるのでは・・
FSAAの有効無効の設定はデバイス初期化時以外では出来ないよ
これはDirect3Dも同じ
glutKeyboardFuncとglutDisplayFuncで変数を共有したかったらグローバル変数使うしかないんですか?
しかないな
main関数で変数作って
参照渡し・参照渡しでダメかな?
>>416 そもそもdisplayfuncに引数が無いから
418 :
414:2007/12/07(金) 10:40:17
ありがとうございました
glclipplaneで物体の断面表示させてるのですが
断面用planeの輪郭線描こうと思って色をつけたら(glcolor3f(1.0,0.0,0.0))
全部の物体が赤くなりました
助けてください!
輪郭線を描き終わったら、元の色 (白) に戻す。
おおおおおおおおおおおおおおおお!!!!
できました!!!!ありがとうございます!!!
なんでこんなこと知ってるんですか!!!
一度設定した内容は、もう一度変えるまでずっと有効になるってことくらい、覚えとけ
心に刻んでおきます!!!
ステンシルバッファがどう更新されててどういう状態になってるかを確認するといいんじゃないかな
ステンシルバッファを使うのが初めてで
どういう感じにやっていくのですか?
glReadPixelsのGL_STENCIL_INDEXで現在のステンシルバッファの中身を取得できる
そもそもステンシルバッファがどういう働きをするのか理解してる?
>>428 ありがとうございます。試してみます。
大まかに、こういうものというのは文字で読んだのですが
いまいちイメージが出来ていません。
FBOとかもよくわかっておらずです
>>425ですが
色々試していたのですが、どうも上手くいきません
glReadPixels(0.0, 0.0, width , height , GL_STENCIL_INDEX , GL_UNSIGNED_BYTE , bits);
glDrawPixels(width , height , GL_LUMINANCE , GL_UNSIGNED_BYTE , bits);
で、ステンシルの状況を見たのですが、まったくマスクがされてない感じです。
ポリゴンを積み重ねるせいでうまくいっていないのかもしれません
丸い形状のマスクを作って、そこに描画しない=くり貫くということをしたいのですが
もう少しヒントいただけませんか
マスクを描いた時のStencilOpとStencilFuncの設定
マスクされる方を描いた時のStencilOpとStencilFuncの設定はどうなってる?
基本的には
マスクを描いてStencilバッファの値を適当に設定
glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
//ここでマスク描画
マスクされる方はStencilの値が設定されてないところだけに描く
glStencilFunc(GL_NOTEQUAL, 1, 0xFFFFFFFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
//ここでマスクされる方を描画
適当だけどこんな感じでいいと思う
>>430 床井先生のコードではどういう風にステンシルバッファが動いてるのか、を確認して、比較してみればいいと思う
vipろだマジやめて
vipがうざいとかそういうんじゃなくて、とにかくYAMETE
>433
>ただ、あと少しというところで
>球面が裏側からも見える
まさか半透明で描画してないでしょうね?
>>434 理由がよくわかりませんが、すみません。
>>435 そう思い、解除したのですが
>断面の球体が塗りつぶされている
こちらが改善されて、球面は見えたままでした。
マスクを見てみると、常に○が描画されるようになっていて
モノに隠れたときに、消えるようにしないとダメみたいです
テクスチャについてよくわかんなくなったので質問させてください
スクリーンセーバーの製作途中です
http://nullpo.vip2ch.com/upload.cgi?mode=dl&file=13841 DLkey:OpenGL
にUpしましたが、テクスチャにしたい画像をリソースに格納し
それを読み込んでBITMAPクラスにしましたが、それをテクスチャに
するのにイメージ配列にしないとならんとわかりましたがその形式がわかりません
int *tex
tex[0]=R1;tex[1]=G1;tex[2]=B1;tex[3]=R2;tex[4]=G2;
のようにRGBの順で格納していけばいいだけでしょうか?
GLintで、RGBを順番に格納して
glteximage2dで貼り付けたらいいと思うよ!!!
opengl テクスチャで検索して出てくるところを参考に
はい、それを元にいじくっています
ポリゴンを積み重ねている関係で、おかしくなるのと
右の方の丸が、立方体の外・中の状態で片方が見えるという状況になります。
やりたいのは任意形状のクリッピングなので、マスクで全部潰れてしまうとまずいので…
442 :
デフォルトの名無しさん:2007/12/13(木) 20:22:08
vertex-shaderにおけるgl_Vertexってどの座標系での値ですか?
>>441 ちゃんと閉じた物体になってる?
偶数回描画された部分をステンシルでマスクするんだよ?
なんか根本的なところが違う気がするんだが。
何をしようとしているかもう少しわかりやすく書いてくれると、
良い助言ができるかも知れません。
>>442 glVertex3fとかで渡した値そのまんま
座標系で言うならたいていはモデル座標系だね
円なのか球なのかはっきり汁
球です。glutSolidSphereで囲まれた領域をクリッピングしたいんです
>>447 ステンシルでふたをするのとは、話がぜんぜん違う。
積み重なったポリゴンをどうやって描画してるの?
まさか、立方体をひたすら描いてる?
その場合、球体でクリッピングなんてそんな簡単な話じゃないぞ。
立方体というか
for(float i=-1.0;i<=1.0;i+=0.025){
glBegin(GL_POLYGON);
glTexCoord3f( 0, i, 0); glVertex3f( -1.0, i,-1.0);
glTexCoord3f( 1, i, 0); glVertex3f( 1.0, i,-1.0);
glTexCoord3f( 1, i, 1); glVertex3f( 1.0, i, 1.0);
glTexCoord3f( 0, i, 1); glVertex3f( -1.0, i, 1.0);
glEnd();
}
これでポリゴンを大量に描いています。いわゆるボリュームレンダリングで
clipplaneで出来たので出来るものだと思ってやっていたのです
>>449 それを球で削り取るの?
無理。
発想を変えたまえ。
ムリですか…
glclipplaneの構造はどこかで見れるでしょうか
(削りとられた部分)
デプステストを遠方優先にし、デプスバッファを手前側で初期化
カラーバッファの書き込みを禁止(デプスバッファだけを有効)にして球を描画
カラーバッファの書き込みを許可、デプスバッファの書き込みを禁止
ポリゴンを描画
(削り残し)
デプステストを手前優先にし、デプスバッファを遠方側で初期化(一般的な設定)
カラーバッファの書き込みを禁止(デプスバッファだけを有効)にして球を描画
カラーバッファの書き込みを許可
ポリゴンを描画
で、どうかな?
シェーダでフラグメントが球の範囲に入っていたらdiscard
なんて考えた俺はシェーダ脳
OPENGLで
たくさんある物体から、マウスで1個クリックして
マウスの動く方向にピッキングして動かす
ということをしたいのですが
参考になるソースとか教えてくあさい
OpenGLで射影変換をセットするときにglFrustumを使いますが、
射影変換の設定の時にニアクリップとファークリップを設定したくないのですが(どこに
ポリゴンがあってもZ軸でクリッピングしたくない)、どのようにしたら出来るでしょうか?
glFrustumではどちらも自然数でなくてはだめみたいですし…
int x = 0;
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);
}
>>456 キーボードを押したときにティーポットが回転するプログラムを書いたんです
が、キーを押しても回転しません。理由を教えてください。
>>458 それは向こうのスレのレス番だ。
>>454 glRenderMode(GL_SELECT)
gluPickMatrix
このへんでぐぐれ。
>>455 near と far を設定しなかったら透視投影にならないだろ。
>>459 射影変換行列そのものにはnear/farなんてパラメータは出てこないのだから、
透視投影にはなるだろう。
>>455 near/farを設定しないで描画することはできないよ。
(正確にはちょっと違うっていうかまぁ
>>460さんの言う通りなんだけど
多分
>>455さんにとってはどうでもいい細かい話だろうし、行列をどう解釈するか
という問題でもあるので、near/farは必要と思っていても間違いではないでしょう。)
どうしてもクリッピングしたくないなら、レイトレでもやるしかないんじゃないかなぁ。
ニアクリップしないとカメラ側の鏡像が出ちゃわないかね?
463 :
デフォルトの名無しさん:2007/12/25(火) 22:36:43
Linux用のOpenGLの関数のmanってどこかにありますか?
テクスチャのサンプリングで
0.5の位置にあるものを、X方向に+0.5移動して
1の位置にあるテクスチャをサンプリングしたいのですが
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glTranslated(0.5,0,0);
glutSolidCube(1.0);
glPopMatrix();
で、物体を移動したらサンプリングしてくれると思ったのですが
0.5の位置のテクスチャをサンプリングして、X方向に0.5移動しました
どうすれば1の位置でサンプリングしてくれますか
GL_TEXTURE_GEN_MODEがGL_OBJECT_LINEARだったら、モデルビュー行列をいじっても
生成されるテクスチャ座標は変わりませんよ。(→GL_EYE_LINEARとかじゃないと)
それよりテクスチャ行列いじった方が早いのでは?(→glMatrixMode & GL_TEXTURE)
大きい方がドデカヘドロン
変な方がヘンデカヘドロン
mingwのgccでglut3.7を使う方法はありませんか?
すんません glTexSubImage2D で2の累乗でない矩形を転送したいのですが歪んでしまいます
ttp://uproda11.2ch-library.com/src/1155021.jpg.shtml 32x32矩形と34x34矩形を転送した結果、ピクセル配列はコンソールに書いてみて正常
512x512 のアルファテクスチャを板ポリに貼り付けてます
転送先のテクスチャフォーマットは glTexSubImage2D 同様 ALPHA/UBYTE
SubImage2Dでも2の累乗以外の矩形転送はドライバ依存ですか?(GF7600GTです)
>>469 画像のテキスト間違ってしまった・・・下は34x34のglTexSubImage2Dの結果です
Not Foundって言われてしまうんだが…
見れないのでよくわからないが
GL_TEXTURE_MAG_FILTERとかGL_TEXTURE_MIN_FILTERが
GL_LINEARになってるとちょっと端がぼけたりするよ
全然違ってたらすまん
>>469 glTexSubImage2Dに渡した引数を見せてくれないとわからんがな。
まぁ32x32で渡してしまっただけな気がするが。
1,1 1,2 1,3 ・・・ 1,32
1,33 1,34 2,1 ・・・ 2,30
見た感じこんなじゃね?傾きが1/2っぽいし1行で2列ずれるのと符合する。
うん
俺もよくそれやるよl。
質問させて頂きます。
@FBOテクスチャに適当に描画。
A上のレンダリングテクスチャに、上のレンダリングテクスチャを別のオブジェクトに貼って描画。
としう事をしたいのですが、Aを行う際、@で作ったテクスチャを別のテクスチャにコピーする必要があると思います。
その、テクスチャを別のテクスチャにコピーをしたいのですがどのようにすればいいのでしょうか?
できれば、高速な方法が良いです。宜しくお願いします。
475 :
474:2007/12/31(月) 18:39:12
glCopyTexSubImage2Dでできました。すいません。
>>469 glPixelStorei()のGL_UNPACK_ALIGNMENTを確認
>>477 物体の位置を覚えておく変数を追加したらいいんじゃね。
static int xPos;
void drug(int x, int y)
{
//以下を追加
xPos += dst_x;
}
void display(void)
{
//以下に変更
glTranslatedxPos, , );
}
y,zも同様に。
うーん、、上手くいかなかったです
移動量がマウス座標だと200とか400なので
それを随時加算していくと、びゅーんと吹っ飛んでしまいます
0.001とかを掛けて移動しても、移動量が大きくなると吹っ飛んでしまって
なんでマウスドラッグで移動はサンプルどこにもないのだろう
随時加算だと、等比級数的に増えてかない?
そういうときは、
マウスの移動した差分を加算するか、
最初の座標と最初のマウス座標を記録しておいて、その時との差分と最初の座標をを加算するの
それをやりたいのですが
始めのポイントを記憶
マウスがUPの時に移動分を算出 translateすると
ドラッグ中のが表示されなくて。
そもそもglutIdleFuncの使い方がおかしい。ドラッグ中はidleじゃないから最描写されないのは当たり前。
アニメーションさせるわけじゃないからこのプログラムの場合glutIdleFuncは使わなくていい。
ドラッグ中は必ず画面を最描写するんだからそこからglutPostRedisplayを呼べばいい。
state == GLUT_UPのときも同様。
ドラッグ中もidleには違いないんだからこれでもいいんじゃね。
とりあえず
>>477のプログラムに
マウス押した時に現在のキューブの位置を覚えておいて(外部変数x1,y1追加)
case GLUT_DOWN:
x1 = dst_x; y1 = dst_z;
printf("down");
drug()はそれを元に動かせば
dst_x = x-x0+x1;
dst_z = y-y0+y1;
お望みの結果に。
あとカメラ位置によってどう動かすのか、マウスの上下はZなのかYなのかは自分で好きなように計算すればいい
>>482-483 ありがとうございます。ほんとにありがとうございます。
自分の頭の悪さに泣けてきました
ほんとありがとうございます
質問です
glNormal3f( 0.0f, -1.0f, 0.0f);
glBegin( GL_QUADS );
glVertex3f( -10.0f, 0.0f, -10.0f );
glVertex3f( 10.0f, 0.0f, -10.0f );
glVertex3f( 10.0f, 0.0f, 10.0f );
glVertex3f( -10.0f, 0.0f, 10.0f );
glEnd( );
このようにして面を書きたかったのですが
描画されてほしい面が描画されず、片面しか描画されません
(回転させると裏側は光を反射してました)
両面描いたり、反対側を描画するといった設定にはできないのでしょうか
GLfloat sphereColor[] = { 1.0, 1.0, 1.0, 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, sphereColor);
>>486 ありがとうございます
教えてもらった情報ではできませんでしたが座標を変えてたらできました
どうやらxyz座標軸の認識を間違えていたみたいです
すいません
あとポリゴンには表と裏があるよ
glCullfaceとか弄くってみて
489 :
デフォルトの名無しさん:2008/01/09(水) 03:28:12
立方体を同時に複数個回転させたいのですが、それぞれの回転数をランダムなものにするにはどうしたらいいでしょうか
for(i = 0; i < iDivision * iDivision; i++)
{
glViewport((i % iDivision) * cxClient / iDivision, (i / iDivision) * cyClient / iDivision,
cxClient / iDivision, cyClient / iDivision);
glRotatef(lprquad[i]++, 1.0f, 1.0f, 1.0f); // Rotate The Quad On The X axis ( NEW )
glColor3f((float)rand() / (RAND_MAX + 1), (float)rand() / (RAND_MAX + 1), (float)rand() / (RAND_MAX + 1));
glBegin(GL_LINES); // Draw A Quad
立方体を描画
glEnd(); // Done Drawing The Quad
}
あとに表示される立方体の回転速度が速くなってしまいます。
glPushMatrix();
glRotate*()
glBegin();
glVertex*();
glEnd();
glPopMatrix();
こんなかんじ
491 :
デフォルトの名無しさん:2008/01/09(水) 04:32:56
492 :
デフォルトの名無しさん:2008/01/09(水) 06:02:08
>>490 できました。
だけど、最初の一つが動かなくなったorz
なんでだ
ビルボードを作るために逆行列を求める関数を実装しようとしているのですが、
なにか参考になりそうなものってありますか?
今のところなにも思いつかないので
double element[4][4];
double i00 = ((elements[1][1] * elements[2][2] * elements[3][3]) +
(elements[1][2] * elements[2][3] * elements[3][1]) +
(elements[1][3] * elements[2][1] * elements[3][2])) -
((elements[3][1] * elements[2][2] * elements[1][3]) +
(elements[3][2] * elements[2][3] * elements[1][1]) +
(elements[1][3] * elements[2][1] * elements[1][2]));
…
とやって余因子を求めつつ、求めたところで行列式を出して判別・逆行列の計算
をしようと思ってるのですが、なんかもっと早くなりそうな気が…
double element[4][4];→×
double elements[4][4]→○
でした orz
どこかで拾ったものが手元にある。
床井さんのところにあったような記憶が・・・
D3DXMatrixInverseを使(ry
>>495 床井さんのところでは、逆行列は使わないで逆変換を出して掛ける方がいいとの
事でしたが、gluLookAtによる視点の移動って逆行列じゃなくても逆変換できる
んですかね?出来るならこの方が早くなりそうですが…
>>496 それは最終手段に取っておきますw
>>498 gluLookAtはglTranslateとglRotateをやってるだけだから逆変換できるのでは。
回転成分(3x3)の転置行列に逆移動(-[12,13,14])を掛ければ求まる
>>499 なんかループ多くて余因子求めるよりも効率悪そう…
>>500 elements = new double[][] {
new double[] { elements[0][0], elements[1][0], elements[2][0], elements[0][3] },
new double[] { elements[0][1], elements[1][1], elements[2][1], elements[1][3] },
new double[] { elements[0][2], elements[1][2], elements[2][2], elements[2][3] },
new double[] { -elements[3][0], -elements[3][1], -elements[3][2], -elements[3][3] } };
としてみましたが、平行移動の部分が上手く消えずに単位行列にはならなかったです orz
502 :
500:2008/01/10(木) 16:43:21
>>501 それ掛けてなくて足してるというか掛けるのが逆。openGLは列と行があれだからほらw
最後の行が
ele[0][0] * (-ele[3][0]) + ele[0][1] * (-ele[3][1]) + ele[0][2] * (-ele[3][2]), ele[1][0]*(........
みたくなる。
(Matrix4型のoperation*()を実装してからやったほうがいいかも)
確認だけしたかったら現在の行列に転置行列、逆移動行列の順にglMultMatrix()すれば確認できるはず。
>>501 上手くいきました!
…が、誤差の関係で完全には単位行列にならず、1.00000000002や
0.00000000000125といった値になるものもあるのですが、これは閾値を決めて
自分で削っていくしかないですかね?
完全な単位行列ってそんなに価値あるものなのか
その程度の微小な誤差が結果にそれほど影響を与えるとは思えないが
本当に必要なことならまぁ何か考えるのもいいけれど
>>503 実数値は、=で比較しちゃいかんよ。と言ってみる。
>>505 なんだか、位置を調整しても消えたり出てきたりとちらちらしてるのが気になったので、
この微少な差でニアクリップやファークリップの外に出てるのかなと。
508 :
500:2008/01/10(木) 21:52:41
プログラミングやってれば誤差とは長い付き合いになるからいろいろ実験してみ
丸めてみてまだちらちらするなら誤差のせいだし、そうじゃなきゃ別のとこに問題がある
ビルボードだったらその程度の誤差は問題にならないと思うけどね
>>508 丸めてみたところ、小数点以下5桁目から削ればほとんどちらつかなくなりました。
長々とお付き合いいただきありがとうございました。
Win32 SDKでプログラムしてるんですが
子ウィンドウ内でGlutに描画させる事はできますか?
>>510 MSDNライブラリにサンプルコードがついてたよ。MFCだけどOPENGLのAPI呼んでるだけだったし。
>>510 glutで描画ってのは具体的にどのglutの関数?
glutDisplayFuncとかが使えるかって意味ならまず無理じゃね
513 :
デフォルトの名無しさん:2008/01/15(火) 10:14:40
枠だけの立方体を、各頂点を線分でつないで作成し、glRotateですこしづつ回して表示しています。
このとき立方体の、本来見えない部分というんでしょうか、奥にある辺を
普通の線ではなくて、点線にするなり、色を薄くするなりして表示させたいのですが
どうすればいいでしょうか?
複雑な図形なら別の手法をとるかもしれんけど、立方体なら、
奥の辺=共有する面が2枚とも裏を向いてる=視線ベクトルとの内積が負
とかでいいんじゃね。
自分で計算すんのめんどかったらglPolygonModeでLINEにしといてglCullFaceを変えてポリゴンを2回描けばいい
515 :
デフォルトの名無しさん:2008/01/22(火) 12:23:25
テクスチャのMAXサイズを超えるテクスチャがあるとき、
そのままだとshaderに渡して処理することはできないので、
あらかじめテクスチャ座標をuvとも半分とかに指定して、
MAXサイズ以内におさえて、shaderに渡すことはできますか?
そもそもこういう考え方はダメなんでしょうか。
カーマックはメガテクスチャという考え方を導入したな
どういう風に実装しているかは分からんが
uv座標を半分にしてもテクスチャのサイズは変わらんのでは?
518 :
515:2008/01/22(火) 18:27:15
了解しました。ありがとうございます。
ありがとうございます!保存しました!英語は一応読めます!
でも、こういう論文が概念ばかり書かれていて
実装の細部になると、一切書かれていないのでわからないです!
ペンを画面上で描くところは出来ました!
ttp://www.vipper.org/vip722020.jpg 画面とマウス座標を
glOrtho(-0.5, (GLdouble)w - 0.5, (GLdouble)h - 0.5, -0.5, -1.0, 1.0);
で一致させてるので、3次元空間でどうすればいいのかわかりません><
Javaだから逆コンパイルすれ
>>521 べつに3次元空間でも同じでいいんじゃね?
Z=0のXY平面に描いたならそれでも立派な3次元だ
次は論文読んでその図形をまず三角ポリゴンにしてみるといい
Figure 13のfの状態にするんだ
逆コンパイルできません><
>>521ですが、
glOrtho(-0.5, (GLdouble)w - 0.5, (GLdouble)h - 0.5, -0.5, -1.0, 1.0);
で画面を固定させると、点が保持されてるのに
画面の中で物体を回転させたりすると、点が全部消えます!
この点が3次元空間に掛かれていたら、全部回転すると思ったのですが
回転しません>< 助けてください!
ためしに、glunprojectで3次元空間に直接点を打ったのですが
1個打って、次のを打ったら消えます
わけわかりません(;;
どういう状態だかよくわからんが、
描画する時は今まで描いた点も全部描き直さなきゃならんのは分かってるか?
>>524 タッチ差でレスありがとうございます><
>その図形をまず三角ポリゴンにしてみるといい
点で描いた図形をポリゴンに、ということですか!splineとかで、難しそうです!
glOrtho(-0.5, (GLdouble)w - 0.5, (GLdouble)h - 0.5, -0.5, -1.0, 1.0);
だとよくわかんないので、
gluPerspective(30.0, (double)w / (double)h, 1.0, 10.0);
で描こうとしてます!でもこれだとXYがマウス座標系で200とか300とかいってしまって
glunprojectで点を打つようにしました!
ttp://www.vipper.org/vip722238.jpg こんな感じです。
これを回転したら点が全部きえました><
3次元の中で点が動いてくれると思ったのに!
>描画する時は今まで描いた点も全部描き直さなきゃならんのは分かってるか?
初耳でした!
vine4.1なんですが、インストールができません。lib/glutでmakeしても
分離記号が欠けています。中止
と出ます。どうしたらいいですか?
OpenGLの関数ってハンドルみたいのが無いんですけど、wglMakeCurrentで選択したコンテキストは、そのスレッド内だけで有効ですか?
>>529 vineは知らんけどソースからじゃなくて普通にパッケージから入れたらどうよ
glOrtho(-(GLdouble)w/320.0, (GLdouble)w/320.0,
-(GLdouble)h/240.0, (GLdouble)h/240.0, -1.0, 1.0);
gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
視点を指定して、そこからglorthoで指定した領域を正射影っていうのは
どうやればできるのでしょう?
glMatexiMode(GL_PROJECTION);
glOrtho(〜);
glMatrixMode(GL_MODELVIEW);
gluLookAt(〜);
こうしたいっていう意味か?
立方体の表面に色をつけて、くるくる回したりしています。
glEnable(GL_LIGHTING);で光源からの光をONにすると、立方体が白黒?みたいになっちゃうんですが
理由が分からず困ってます。
光の設定は、
GLfloat fLightAmbient[4] = {0.5f, 0.5f, 0.5f, 1.0f}; //環境光(anbient light)の設定
GLfloat fLightDiffuse[4] = {1.0f, 1.0f, 1.0f, 1.0f}; //拡散光(diffuse light)の設定
GLfloat fLightPosition[4] = {0.0f, 0.0f, 2.0f, 1.0f}; //光源の位置の設定
のようにしたのですが、光にも色をつけないといけないのでしょうか?
>>535 普通は光は白にしといて、glMaterialで色をつける。
ライト使うなら頂点ごとに法線が必要。glNormal*()
>>537さん
それはすでにやってます。
陰はついてるんですが、色が光の色になってしまうんです
>>536さん
glMaterialって、glMaterialColorとはまた違うんでしょうか?
glBeginの直前においても、変化がないですorz
>>536 glMaterialColor なんてあったんだ。知らなかった。
素直にglMaterialでやってみてくれ。
>>535 の間違いだった orz
glMaterialColor て赤本にもないし、ぐぐっても出てこない。どこから持ってきたんだ?
glcolormaterial
すいません、glDrawPixelsで質問があります。
真っ白のイメージを描画しているのに、なぜか黄色で表示されます。しかも半透明で
背景が透けてしまいます。
どんな原因が考えられますでしょうか…OTL
543 :
542:2008/02/10(日) 18:42:48
glDisable( GL_BLEND );
で半透明になるのは解決しましたが、黄色になる問題が残ったままです。
何か色に関係あるパラメータって何でしょうか?
glColorを試してみたのですが、結果は変わりませんでした。
RGBの順序が間違ってるとか
>>544 自分も最初それを疑いましたが、それなら0xffffffffで緑色(よく見たら緑色でした)
になるのはおかしいです…。
glColorMaskとか
どこかで GL_GREEN_BIAS とか
548 :
542:2008/02/10(日) 20:28:20
自己解決しました。
直前に張ったテクスチャの色に引っ張られるのを発見したので、
glDisable( TEXTURE_2D );
を挿入したところ、上手くいきました。
ところでTexture関連のパラメータがglDrawPixelsに影響を及ぼすという挙動というのは、
意図されたものなのでしょうか?界隈では常識だったりしますか?
初めて知った。
glDrawPixels 使うくらいならテクスチャで描画しちゃうからな。同時に使うことがない。
ドライバの実装が適当ってだけじゃね?
テクスチャやらアルファブレンドやらいらんからBltBlt並に高速にしろよ
と5年位前に思ったけどもうどうでもいいや
>>551 ありがとうございます。確認しました。他にもDrawPixels使う上でDisableにしたほうがいい
パラメータがあるようですね。
ポリゴン描画するパラメータ全部影響あるよ。シェーダーとかもね。
glBindTexture(GL_TEXTURE_2D, 0);でもいいのでは
それじゃ0番のテクスチャが適用されるじゃないか。
この問題は俺もこのあいだそれで嵌まったんだが、
RadeonX1600のMacOS10.5.1ではテクスチャが無視されて、
GF8600GTのWindowsXPマシンでは変に影響するし、
めちゃくちゃ重くなるしでまさかテクスチャが影響するとは思わなかったぜ。
DrawPixelsではいったいどんな座標のテクスチャがサンプリングされるのか
さっぱりわからないし、無視してくれればいいのに。
ちゃんとDisableしとけば問題ないんだけどな。
逆に考えるとglDrawPixelsでテクスチャの内容をアウトプット出来るんだな
って意味ないか
0番テクスチャ=テクスチャなしと思ってた
0番テクスチャ = OpenGL 1.0のテクスチャ
for(cycle=1;cycle<=100;cycle++){
glutMainLoop();
}
というふうなプログラムを作ったんだけど、glutMainLoop()の中でexit(0);を実行してループを抜け出すと、
プログラム自体が終了してしまう(for文関係なしに終了する)。
exit(0)だからダメなのか不明。もしかしたらexit(0)以外に何か抜け出す方法ってある?
exit(0)はプログラムを終了する関数。終了するのが正常動作
glutMainLoop()は制御をglutに任す関数。抜け出す方法は無いし、その必要も無い。
100回描画するなら、カウントはdisplayFiunc()の中で数えるなどして、glutMainLoopからは抜けないで処理する
562 :
初心者:2008/02/14(木) 10:30:44
距離画像のような、被写体の距離値を輝度(0から255)として持った500*500の画像があります。
これを使って、OpenGLで各距離値に対応した場所に四角の平面を作るといった事がしたいのですが、どのようなプログラミングをくめばいいでしょうか。
まだ、ほとんどOpenGLを使ったことがないので、よく分かりません。
質問が分かりにくいかもしれませんが、何かヒントをいただけるとうれしいです。
よろしくお願いします。
その500x500の元画像は例えば、
253 110 200 90 255 ...
というのが記録してあるということでOK?
で、253なら例えば視点から 253 の距離だけ離れた場所に1つの平面を描き、
110なら例えば視点から 110 の距離だけ離れた場所に1つの平面を描き……、
というのを 500x500 枚描くということでOK?
564 :
初心者:2008/02/14(木) 13:01:35
>>563 その通りです!
よろしくお願いします!
>>562 どこの課題?
画像ファイルから画素値を得るところまでは自分でできるの?
OpenGLの勉強用にメタセコイアモデルのViewerを作ってみたので、もしよかったらどうぞ。
実行ファイルとソース付です。
吉祥 100M 1kichi4918.zip DLKEY:glstudio
568 :
初心者:2008/02/14(木) 23:16:14
>>567 ありがとうございます!
インストールさせていただきました。
動かしてみると、
NULL pointer(NULL array pointer is passed)
in function cvGetMat,C:\User\VP\opencv\cxcore\src\cxarray.cpp(2780)
というエラーが出るのですが、これはどうしたらいいんでしょうか。
誰か教えていただけると助かります。
569 :
初心者:2008/02/14(木) 23:18:40
>>566
そうなんです。こんな感じのが作れるとうれしいんですが。
三角形を書くのは出来るのですが、距離画像を読み込んで、それぞれの点をどのように読み込み、指定していけばいいかで悩んでいます。
よろしくお願いします。
>>568 すみません。dllフォルダのOpenCV用のdll(4つあります)をsystem32にコピーすると動くと思います。
3角形が書けるなら、画像を読み込んでその点に応じてポリゴンを書けばいいじゃない
画像の読み込みができないの?なにに悩んでるの?
572 :
デフォルトの名無しさん:2008/02/15(金) 02:14:44
超初心者丸出しな質問です
OpenGLをそこそこ使えるようになれば、ドラえもんを立体表示させてグリグリ動かしたりもできるようになるんでしょうか?
あと赤本ってみなさん読んでるんですか?
573 :
デフォルトの名無しさん:2008/02/15(金) 03:07:15
OpenGLをそこそこ使えるようになっても、ドラえもんのモデリングを行う造形センスがなければ難しい。
それにそれを公開するならコピーライツ関連をクリアする交渉能力も必要だな。
>>569 画像フォーマットぐらい書かないと、おまえの大好きな
そのまま提出できる「答え」は、書いてもらえないよ。
575 :
デフォルトの名無しさん:2008/02/15(金) 09:55:40
>>574 BMPだとうれしいです。よろしくお願いします。
>>569 そこまでやってるなら、
・座標系と座標軸を画面に表示してみる
・拡張して「地面」を定義して描画してみる
・地面から一定距離にある三角形を1つ表示してみる
・複数にチャレンジ
でいいんじゃないかな
BMPから読み込むのはその後の話。
>>572 OpenGL で何ができるかもよくわからない段階での質問だよね、たぶん。
可能か不可能かで言えば、可能。
ただ、OpenGL自体は平面を描くような単純な機能しかない。
ので、ドラえもんみたいな複雑な造型を描くには普通は OpenGL 単体ではやらない。
まず Shade とかメタセコイアとかで物体を作っておいて、
それを、ちょうど
>>567氏がやってるようにローダを使って、
OpenGLの空間上にその物体を表示、という感じでやる。
表示できればグリグリも動かせる。ただ、腕だけをグリグリ動かすとかは、
また工夫が必要。
579 :
デフォルトの名無しさん:2008/02/15(金) 21:34:00
>>578 へーぇ
自分のパソの画面で自由自在に動かせたら素敵だなぁと思う
>561
やっぱりそうかー
for文分解してLoopの中に突っ込んだらいけた。
どうもありがとう
突然すいません。
gluBuild2DMipmapsで、300*300の画像データを渡したところ、突然終了してしまったのですがどうしてでしょうか?
ソースは
glGenTextures(1,&texid);
SDL_Surface *sur=SDL_LoadBMP("test.bmp");
SDL_LockSurface(sur);
gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,sur->clip_rect.w,sur->clip_rect.h,GL_RGB,GL_UNSIGNED_BYTE,sur->pixels);
SDL_UnlockSurface(sur);
となっております。
どなたかわかる方教えてください。
よろしくお願いします。 m(_ _)m
bindTextureが抜けてない?
>>582 追加してみましたが、まだ駄目でした。
あと、GDBで走らせたところ、
Program received signal SIGSEGV, Segmentation fault.
0x72cb76af in gluEndPolygon () from C:\Windows\system32\glu32.dll
(gdb) Error: dll starting at 0x6e3f0000 not found.
こんなエラーが出てきました。
non_power_of_twoに対応してる?
300*300なら512*512に直してもう一度実験してみたらどうでしょう?
>>584 ペイントで512*512に直してやってみましたが、同じエラーで止まってしまいました。
デバッガで追跡するしかないですね。
surがNULLになっていないか、sur->clip_rect.w,sur->clip_rect.hが300,300になっているか全部疑ってみるべき。
>>586 GDBで周辺をステップ実行した結果、
(gdb) >
Program received signal SIGSEGV, Segmentation fault.
0x72cc76af in gluEndPolygon () from C:\Windows\system32\glu32.dll
と出ました。
また、surや、sur->clip_rect.w,sur->clip_rect.hの値もチェックしましたが、問題ありませんでした
sur=13c2b60,sur->clip_rect.w=512,sur->clip_rect.h=512
先ほどのアドバイスに従い、画像の大きさを512*512にしたため、この数値になっています。
半透明物体が混じる場合の描画について質問なんですが、
今普通の方法って
1、不透明ポリゴンを全部描く
↓
2、半透明ポリゴンを奥行きでソート
↓
3、Zバッファを参照しながら半透明ポリゴンを描く
のような手順なんでしょうか?
(半透明プリミティブ同士が重ならないなら、2は省略できるかな)
>>587 そのgluEndPolygonはどの関数から呼ばれてるの?落ちているのはgluBuild2DMipmaps()なの?
あとglGetError()とかでなんか出てたりしないかをチェックしてみるとか
590 :
587:2008/02/17(日) 00:42:47
>>589 gluEndPolygonは自分は呼んでないので、わからないです。(gluBuild2DMipmapsかな?)
また、gluBuild2DMipmapsの前後をprintfでくくったら、処理前の方だけ出力されたのでgluBuild2DMipmapsがおちているんだと思います。
>>588 今っていうかZバッファ法を使うなら昔からそうだと思うけど。
半透明ポリゴンが交差してるとちょっと面倒だけどね。
592 :
588:2008/02/17(日) 01:11:24
>>590 gdbならbtでバックトレースが出るよ
test.bmpが24bitカラーじゃないと上手くいかないと思うけどそこは大丈夫?
594 :
587:2008/02/17(日) 01:22:12
>>593 test.bmpを24bitカラーに変更したらうごきました。
ありがとうございました。
おめ。
こういうのはエラーメッセージだけからじゃわからなくて
キツイやね。
Vistaではドライバの作りが変わったから
ドライバのOpenGLの最適化がまだ進んでないのかもね
いちおうVistaではちょっとオーバーヘッドはあるものの
パフォーマンスの低下はそれほど無いという話にはなってたはず
ベンダーのドライバ入れなかったら、Vistaはクソみたいな重さだったぞ。
オラたまげたぞ
それ多分XPや2kでも同じだよ
600 :
デフォルトの名無しさん:2008/02/20(水) 01:29:13
gluiを使ったアイドル中のアニメーションでわからないことがあるので教えてください。
描画用のメインウィンドウでアニメーション中に、gluiで作ったサブウィンドウの上にマウスポインタを移動させると
メインウィンドウのアニメーションが止まってしまいます。
ウィンドウサイズを変更するとアニメーションが動き出しますが、
サブウィンドウの上にマウスポインタを移動させてもアニメーションを止めない方法はないでしょうか。
また、ウィンドウをリサイズせずにアニメーションを再開させる方法はないでしょうか。
なにとぞよろしくお願いします。
601 :
600:2008/02/20(水) 01:54:34
602 :
デフォルトの名無しさん:2008/02/21(木) 04:51:36
>>567 も、もう一度ソーソを
後学のために
頼みます
しかしOpenCV使っているのね....
>>602 吉祥 20M 2yoshi4303.zip
shaderとマウスセレクトの実験でちょっとコードが汚くなってます。
OpenCVはtexture読込みの部分でしか使ってないので、誰か読込み関数作ってくれれば外せるんですけどねー。
アルファチャンネルを持ったTIFFを矩形ポリゴンに貼り付けて、
アルファの形に切り抜いたオブジェクトを複数作りました。
手前から奥に描画していくと、手前のオブジェクトの透明部分が透けてくれません。
どうやったらちゃんと透けて見えるようになるでしょうか。(描画順が逆だと透けます。)
>>605 デプスバッファがどうやってポリゴンの前後関係を処理してるのか調べてみるといいよ
607 :
デフォルトの名無しさん:2008/02/22(金) 15:31:05
>>605 「透ける」てのが、半透明を使わないただの穴でいいなら
glAlphaFunc()を設定して、glEnable(GL_ALPHA_TEST)すればいいよ。
この方法だと穴のふちが汚いから半透明を使いたい、というのなら
もうそれは半透明ポリゴンと同じ問題になるので、ソートして奥から描くしかないかな。
608 :
605:2008/02/23(土) 06:19:00
できました!ありがとうございます。確かに縁が汚くなりましたが、大方満足です。
できれば透明部分がマウスクリックを無視できればいいのですが、それはできないみたいで、
自力で実装してみます。
glutの質問なんですが、良いでしょうか?
glutDisplayFuncとglutReshapeFuncの違いって何なのでしょうか? 例えば、
void display(void){
int i; static int r = 0;
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glRotated((double)r, 0.0, 1.0, 0.0);
glColor3d(0.0, 0.0, 0.0);
glBegin(GL_LINES);
for (i = 0; i < 12; ++i) {
glVertex3dv(vertex[edge[i][0]]);
glVertex3dv(vertex[edge[i][1]]);
}
glEnd();
if (++r >= 360) r = 0;
}
void resize(int w, int h){
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
}
int main(void){
glutDisplayFunc(display);
glutReshapeFunc(resize);
....
でglutReshapeFuncでは、画面がリサイズされたときに「画面をどのように表示するか」しか設定していないのに、
実際リサイズすると立方体が回転します。
なぜリサイズしたときに、glutDisplayFuncで登録した関数が呼び出されるのでしょうか?
glutReshapeFuncでは画面表示の設定しかしてないので、リサイズしても立方体は回転しないのが正しいような気がするのですが...
displayfuncで描画しないようにしてみ
リサイズした後描画しなかったらどうなるか分かるから
DisplayFuncはPostRedisplayコール以外にもウインドウの移動をした場合など
画面を再描画する必要がある場合は必ず呼ばれる
つまりDisplayFuncでは描画以外の処理は入れないのがセオリー
お返事有り難うございます。
>>610 >displayfuncで描画しないようにしてみ
リサイズする前に表示さえされませんでした。
>>611 >画面を再描画する必要がある場合は必ず呼ばれる
つまり、この再描画には画面のリサイズが含まれると考えてよいのでしょうか?
つまり、リサイズすると
glutReshapeFunc
の後に
displayfunc
が呼ばれて、再描画していると考えてよいのでしょうか?
>>612 そういうことになる
ちなみに、いつdisplayfuncが呼ばれるかは、すべてウィンドウシステム(≒OS)の判断による
OSが、そのウィンドウの再描画が必要だと思ったら、呼ばれる
例えば、GLUTのウィンドウの上に他のアプリケーションのウィンドウをかぶせて移動させると、
OSによっては再描画が必要になるので呼ばれるが、
OSによっては再描画が必要にならないので呼ばれない
自分でglutPostRedisplay()を呼べばdisplayfuncが呼ばれるのは確実だが、
それ以外にいつdisplayfuncが呼ばれるかはわからないという前提でプログラムを書く方がいい
615 :
デフォルトの名無しさん:2008/02/25(月) 19:44:24
まずコードが何をしているか理解することから始めろ
617 :
デフォルトの名無しさん:2008/02/26(火) 02:49:31
>>603 以前アップしていただいてたソフトなんですが、解析エラーが出て開けません。
どうしたら使えますか?
XML 解析中に次のエラーが発生しました:
行: 10
列: 2
エラー メッセージ:
'9.00' が、'7.00 7,00 7.10 7,10 8.00 8,00' の 'enumeration' 制約に違反しています。
値 '9.00' を持つ属性 'Version' を解析できませんでした。
618 :
デフォルトの名無しさん:2008/02/26(火) 03:36:06
BMP形式の画像データがあるのですが、これを読み込んでR,G,Bの数値だけ読むのってどうすればいいですか?
普通にC++のプログラムでやってみたのですがうまくいかないんです・・・。画像は読めるけど、数値が取り出せないんです。
OpenGLでBMPって読めないんでしょうか?
OpenGLじゃ読めないな
読み込めてるんならファイル形式は理解してるんだろ?
RGBデータが格納されてるところを参照すればいいだけじゃん
そもそもOpenGLにファイルを読み込む機能なんて無いしな
読めてるということは自分でファイルを読み込んでるはずだ
もうさ、
GLbitmap glLoadBitmapFile(const char *filename);
とかの関数をでっちあげて
>>2くらいにソース貼っておけばよくね?
BMPネタは一人がしつこく貼っているだけだろ。気にするな。
typedef char* GLbitmap;
GLbitmap glLoadBitmapFile(const char *filename)
{
FILE* f = fopen(filename, "rb");
if(FILE==NULL) return 0;
fseek(f, 0, SEEK_END);
int sz = ftell(FILE)
fseek(f, 0, SEEK_SET);
int image_width, image_height;
image_width = image_height = (int)sqrt(sz/3);
sz = image_width*image_height*3;
GLbitmap b = malloc(sz+8);
*(int*) b = image_width;
*((int*) b+1) = image_height;
fread(b+8, sz, 1, f);
return b;
}
でいいんでね(?_?)
ちょwそれでちゃんと読めるbmpファイルは一個も無いと思うんだがww
ヘッダとか全く読んでないしな……。
ほんとにビットマップか。
GLUとかGLUTに無いのかな?
JavaだとTextureクラスがあるからえらい楽なんだが。
libpngとかopenEXRとかDevILとかを使いたまえ(`・Д・´)
image_width = image_height = (int)sqrt(sz/3);
おもしろいw
glfwにならあるんだけどな。TGAだけど
そこでSDLですよ。glut使うより使いやすいと思うからみんな試せばいい。
こんな感じでいいんでない?
#include <vector>
#include <fstream>
#include <algorithm>
struct RGB {GLubyte r,g,b;};
struct BMP : public std::vector<RGB> {
int width,height;
void load(const char *filename) {
std::ifstream f(filename, std::ios::binary); // ファイル開く
f.seekg(2); int header[6]; f.read((char *)header, sizeof(header)); // ヘッダ読み込み
resize((width=header[4])*(height=header[5])); // サイズ設定
f.seekg(header[2]); f.read((char *)&at(0), size()*sizeof(RGB)); // 画像読み込み
std::for_each(begin(), end(), swap_rb); // BGR→RGB変換
}
static void swap_rb(RGB &rgb) {std::swap(rgb.r, rgb.b);}
};
ただしWindows形式24bitビットマップ限定、横幅が4の倍数でないと変になるけど。
あと実行マシンがリトルエンディアンであることを仮定。エラー処理一切無視。
画像ロード→ BMP bmp; bmp.load(ファイル名);
テクスチャ転送→ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bmp.width, bmp.height, 0, GL_RGB, GL_UNSIGNED_BYTE, &bmp[0]);
とりあえず手元のBMPファイルでは表示確認しますた。
glfw好きなんだけどあまり流行ってないよね・・・
SDLも良いらしいけど、サウンド機能とかイラネって人にはオヌヌヌ
glfw調べてみたがいいな
SDLよりコンパクトでライセンスも楽だわ
なによりWindowsでリサイズしてもコンテキストが作り直されなくて済むのが良い
サウンドはOpenAL使ってるしこっちに乗り換えようかな
635 :
デフォルトの名無しさん:2008/02/28(木) 10:35:25
display(void){}の中で、普通の割り算をしたいんですが、なぜか値がでません。
0になってしまいます。理由を教えてください!
デバッグしてみた?
なぞなぞかよw
ぜんぶintなんじゃね
>>637 可能性くらいは思い当たりそうなところが凶悪だよな。
639 :
デフォルトの名無しさん:2008/02/28(木) 11:56:00
デバッグしてみたのですがよく分かりません。
p=1/1024;という計算をしたいだけなのですが・・・。
-1.07374e+008という答えになってしまいます。
pはGLfloatで宣言してます。
1/1024はfloatか?
>>639 INT型の1と1024を計算しちゃったみたいだね
p = 1.0f / 1024.0f;←って感じにすればちゃんとした値が出るよ
642 :
デフォルトの名無しさん:2008/02/28(木) 15:15:27
>>641 ありがとうございます!
ちゃんと計算できました!
GL以前の問題だったな
質問です。
shd形式のファイルを読み込むOpenGLのライブラリは無いでしょうか?
>>645 たぶん無い。
Shadeから他の形式に書き出して読み込んだ方がいいと思うよ。
>>646 どういう形式が読み込めるのでしょうか?
どっちかっていうと3Dエンジンの役割だな>モデル読み込み
OpenGL対応の3Dエンジン探してみれば?
>>648 そうなんですか。
友達がshadeを勉強していて、自分はOpenGLを勉強しているので、
友達がモデリングしたデータをOpenGLで読み込んでグルグルまわしてみたいと思ったんですが....
何か良い方法は無いですかね?
そーゆーのはOpenGLの範疇じゃないから
OpenGLは規格であって、ライブラリではない。
君が使っているのはOpenGLの規格に沿うように開発されたライブラリだ。
上の画像を読みたいとかもそうだが、そもそもOpenGLがなんなのかわかってないのが多いな。
>>652 初心者には、その辺の切り分けとか理由とかが分かりにくいんじゃないかな。
うまく簡単に説明できるといいんだけど・・・。
DirectXと比較されやすいから同じようなものだと思われやすいんだろうな
GLはあくまで3次元を表示するだけ?
GPU用アセンブリ言語みたいなもん
Direct3Dだって、3Dを表示するだけでしょ
D3DXとか便利なものが付いてるだけで
誰かOGLX開発しない?
>>656 その説明、感動的に気に入った。
…が、新人にそれで説明しようとすると
十中Hack「アセンブリ言語って何ですか?」と言われそう……。
OpenGL3時代のGLUTはD3DXみたいになるんじゃないかと妄想しているが
肝心のGL3が出ないしな…
このまま3.0は飛ばしで今夏予定の4.0までお預けなんですかね
openglで3次元テクスチャを扱うときのことで質問です
テクスチャを格納するとき
Texture[x][y][z][4]と作って
Texture[x][y][z][0〜3]にRGBAの値が入るんですよね?
実質、4次元配列になるのでしょうか?
これをTexture[ ]といったように1次元配列で格納するためには
Texture[x*y*z*4]で格納して RGBARGBARGBA…RGBA
という風になるのですか?
単色(輝度値のみ)のテクスチャの場合
Texture[x*y*z] に AAAAA…A
といった風に値を格納することは可能なのでしょうか?
質問の仕方が下手ですみません。わかる方教えてください
>>662 ありがとうございます。
今までTexture[x][y][z][4]で格納して
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, x, y, z, 0,
GL_RGBA, GL_UNSIGNED_BYTE, Texture);
で3次元テクスチャをGPUに送ってたのですが
やってることが別にRGBの値が要らなくて輝度値だけ必要でしたので
余分にメモリを食っていました。
これを輝度値だけに直すときは
GL_RGBAのままだとまずいですよね。
GL_LUMINANCEなどに変えるのでしょうか?
GL_LUMINANCEでおk
665 :
リライト:2008/03/02(日) 11:17:20
質問です。
これから書くプログラムをどのように変更して
次のようにするにはどうしたらいいでしょうか??
足の付け根を原点にして,太ももと足の付け根の角度と太ももの長さから膝の位置ベクトルを求め、
次に膝の位置を原点にして,膝の角度とすねの長さから足先の位置ベクトルを求め、
この2つを足して,足の付け根(=胴体)から足先の位置を求める。
足先の位置を原点にした時の胴体の位置はその逆ベクトルにする。
プログラムは以下のようになります。
#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>
#define STEPCYCLE 400 /* 手足のひと振りに要する時のフレーム数 */
#define WALKCYCLE 4000 /* ステージ上を一周するのに要するフレーム数 */
static int r1 = 0, r2 = 0, r3 = 0 , r4 =0;
static int face[][4] = {
{ 0, 1, 2, 3 },
{ 1, 5, 6, 2 },
{ 5, 4, 7, 6 },
{ 4, 0, 3, 7 },
{ 4, 5, 1, 0 },
{ 3, 2, 6, 7 }
};
static GLdouble normal[][3] = {
{ 0.0, 0.0,-1.0 },
{ 1.0, 0.0, 0.0 },
{ 0.0, 0.0, 1.0 },
{-1.0, 0.0, 0.0 },
{ 0.0,-1.0, 0.0 },
{ 0.0, 1.0, 0.0 }
};
static GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 };
666 :
リライト:2008/03/02(日) 11:19:50
続きです。
void myBox(double x, double y, double z)
{
GLdouble hx = x * 0.5, hz = z * 0.5;
int i, j;
GLdouble vertex[8][3];vertex[0][0]=-hx;vertex[0][1]=-y;
vertex[0][2]=-hz;vertex[1][0]=hx;vertex[1][1]=-y;
vertex[1][2]=-hz; vertex[2][0]=hx;vertex[2][1]=0.0;
vertex[2][2]=-hz; vertex[3][0]=-hx;vertex[3][1]=0.0;
vertex[3][2]=-hz; vertex[4][0]=-hx;vertex[4][1]=-y;
vertex[4][2]=hz;vertex[5][0]=hx;vertex[5][1]=-y;
vertex[5][2]=hz; vertex[6][0]=hx;vertex[6][1]=0.0;
vertex[6][2]=hz;vertex[7][0]=-hx;vertex[7][1]=0.0;
vertex[7][2]=hz;
/* 材質を設定する */
glMaterialfv(GL_FRONT, GL_DIFFUSE, red);
glBegin(GL_QUADS);
for (j = 0; j < 6; ++j) {
glNormal3dv(normal[j]);
for (i = 4; --i >= 0;) {
glVertex3dv(vertex[face[j][i]]);
}
}
glEnd();
}
667 :
リライト:2008/03/02(日) 11:20:31
続きです。
void armleg(double girth, double length, double r1, double r2)
{
glRotated(r1, 1.0, 0.0, 0.0);
myBox(girth, length, girth);
glTranslated(0.0, -0.05 - length, 0.0);
glRotated(r2, 1.0, 0.0, 0.0);
myBox(girth, length, girth);
}
668 :
リライト:2008/03/02(日) 11:20:57
続きです。
void myGround(double height)
{
static GLfloat ground[][4] = {
{ 0.6, 0.6, 0.6, 1.0 },
{ 0.3, 0.3, 0.3, 1.0 }
};
int i, j;
glBegin(GL_QUADS);
glNormal3d(0.0, 1.0, 0.0);
for (j = -5; j <= 5; ++j) {
for (i = -5; i < 5; ++i) {
glMaterialfv(GL_FRONT, GL_DIFFUSE, ground[(i + j) & 1]);
glVertex3d((GLdouble)i, height, (GLdouble)j);
glVertex3d((GLdouble)i, height, (GLdouble)(j + 1));
glVertex3d((GLdouble)(i + 1), height, (GLdouble)(j + 1));
glVertex3d((GLdouble)(i + 1), height, (GLdouble)j);
}
}
glEnd();
}
669 :
リライト:2008/03/02(日) 11:36:47
void idle(void)
{
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN) {
glutIdleFunc(idle);
}
else {
glutIdleFunc(0);
}
break;
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN) {
glutPostRedisplay();
}
break;
default:
break;
}
}
670 :
リライト:2008/03/02(日) 11:42:15
void display(void)
{
static GLfloat lightpos[] = { 3.0, 4.0, 5.0, 1.0 }; /* 光源の位置 */
static int frame = 0; /* フレーム数 */
double t = (frame % STEPCYCLE) / (double)STEPCYCLE;
double s = (frame % WALKCYCLE) / (double)WALKCYCLE;
double ll1 = 20.0*sin(t*3.14*2.0); /* 箱男の左足の股関節の角度 */
double ll2 = 20.0*sin(t*3.14*2.0); /* 箱男の左足の膝関節の角度 */
double rl1 = -20.0*sin(t*3.14*2.0); /* 箱男の右足の股関節の角度 */
double rl2 = -20.0*sin(t*3.14*2.0); /* 箱男の右足の膝関節の角度 */
double la1 = -20.0*sin(t*3.14*2.0); /* 箱男の左腕の肩関節の角度 */
double la2 = -20.0*sin(t*3.14*2.0); /* 箱男の左腕の肘関節の角度 */
double ra1 = 20.0*sin(t*3.14*2.0); /* 箱男の右腕の肩関節の角度 */
double ra2 = 20.0*sin(t*3.14*2.0); /* 箱男の右腕の肘関節の角度 */
double px = 2.0*cos(s*3.14*2.0), pz = -2.0*sin(s*3.14*2.0); /* 箱男の位置 */
double r = 90.0; /* 箱男の向き */
double h = 0.0; /* 箱男の高さ */
/* フレーム数(画面表示を行った回数)をカウントする */
++frame;
/* 画面クリア */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* モデルビュー変換行列の初期化 */
glLoadIdentity();
/* 光源の位置を設定 */
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
/* 視点の移動(物体の方を奥に移す)*/
glTranslated(0.0, 0.0, -10.0);
/* シーンの描画 */
/* 地面 */
myGround(-1.8);
671 :
リライト:2008/03/02(日) 11:44:55
/* 箱男の位置と方向 */
glTranslated(px, h, pz);
glRotated(r, 0.0, 1.0, 0.0);
/* 頭 */
myBox(0.20, 0.25, 0.22);
/* 胴 */
glTranslated(0.0, -0.3, 0.0);
myBox(0.4, 0.6, 0.3);
/* 左足 */
glPushMatrix();
glTranslated(0.1, -0.65, 0.0);
armleg(0.2, 0.4, ll1, ll2);
glPopMatrix();
glPushMatrix();
glRotated(15*sin(t*3.14*2.0), 1.0, 0.0, 0.0);
glTranslated(0.1, -1.40, -0.1);
myBox(0.2, 0.1, 0.4);
glPopMatrix();
/* 右足 */
glPushMatrix();
glTranslated(-0.1, -0.65, 0.0);
armleg(0.2, 0.4, rl1, rl2);
glPopMatrix();
glPushMatrix();
glRotated(-15*sin(t*3.14*2.0), 1.0, 0.0, 0.0);
glTranslated(-0.1, -1.40, -0.1);
myBox(0.2, 0.1, 0.4);
glPopMatrix();
おまえ
テキストにしてうpろだにうpしなよ
673 :
リライト:2008/03/02(日) 12:00:24
glRotated やglTranslated はただの行列演算。
元の位置座標に掛けていけば、おのずと位置は求まるし、
ベクトルも求まる。
プロジェクションは考慮しなくていいみたいだから、
そんなに難しくないと思うが。
ただ、PI を3.14はどうかと。
675 :
リライト:2008/03/02(日) 12:42:36
デフォルトの名無しさん>
それがわからないんです…。
もっと具体的にどこをどう変えたらいいのか教えていただけないでしょうか?
677 :
リライト:2008/03/02(日) 14:09:06
デフォルトの名無しさん>
参考ページを見てみたのですが、
これをどう活用すればいいのかわかりません。
具体的にプログラムのどこをどう変えればいいのか
教えていただけないでしょうか??
最悪だな
宿題っぽいな〜w
適切なアドバイスをしていると思うんだがな。
そもそもプログラムを書き換える話ではないと思うが。
681 :
リライト:2008/03/02(日) 15:43:13
プログラムに疎くて、ここで聞いています。
どうか教えてもらえないでしょうか?
プログラムに疎くてまともに動くプログラムを作れるはずがない
基礎から勉強しなおせ
数学ができるなら、プログラムの基礎が有れば普通にできるだろうな。
はい落第
glRotateやglTranlateは基本的な座標変換だからそれを理解せずにOpenGLを使うのは難しいと思うよ。
入門書を読んだほうがいいよん。
687 :
リライト:2008/03/02(日) 18:28:29
もともとのサンプルプログラムは和大の床井先生のところからお借りしています。
それを足の付け根を原点にして,太ももと足の付け根の角度と太ももの長さから膝の位置ベクトルを求め、
次に膝の位置を原点にして,膝の角度とすねの長さから足先の位置ベクトルを求め、
この2つを足して,足の付け根(=胴体)から足先の位置を求める。
足先の位置を原点にした時の胴体の位置はその逆ベクトルにする。
このようにしたいのですが、どうすればいいのかわからないのです。
宿題スレが助けてくれるかもしれないけど、OpenGLもできるやつとなるとまずいないなw
留年しな〜。
このしつこさが、ちゃんと勉強する方向へ向いていれば・・・
>>687 とりあえず位置ベクトルは理解できているのか?
690 :
リライト:2008/03/02(日) 19:24:46
689さん>
位置ベクトルの理解はあまりできていません…。
>>690 さすがにそれはきついな。
どうりで話が噛み合わないわけだ。
位置ベクトルと行列による一次変換を理解してからじゃないと、
その課題はクリアできないよ。
ひょっとしてまだ高校生かな?
「太ももの長さから膝の位置ベクトル」を専ブラNGワードに入れた
胴体と足先でMODELVIEWをglGetして、かたっぽ逆行列にしてから掛けた行列で(0,0,0,1)を変換すればなんか求まんじゃね
695 :
リライト:2008/03/02(日) 21:52:08
692さん>
どうかプログラムのどこをどのように
変えればいいのか教えていただけないでしょうか?
694さん>
イマイチ理解できないのですが…。
プログラムを提示して教えていただけないでしょうか?
さすがに釣りじゃないかと思えてきた。
>>695 だ か ら、
とりあえず位置ベクトルを求めなさいって。
プログラムを変える話ではない。
お前ら優しすぎw
こいつ理解する気なんか無いんだって。コードが欲しいだけ。
スルーでおk。延々ageてるし。
答えが欲しいなら黙って待つか宿題スレへ
待っててもたぶん無駄だから宿題スレに行っとけ
位置ベクトルや行列の掛け算もわからないのか。
もし大学生だったら、日本オワタ\(^o^)/
分布の端っこにいる人間というのもいるわけで
日本を終らせるにはサンプル数が少ない
つか教えてじゃなくて
答えください、が正解だよな
超初心者とか超低レベルとかって以前の問題だな、ここまでくると・・・。
あのさ、リライトさん。
このスレで教える人ってのは、教えることで相手が成長できると思うから、教えるんだよ。
その喜びがあればこそ、無償で、貴重な時間を費やしても、助けてあげたくなるんだよ。
せっかくいくつかの回答や学習の方針が出てきてるのに、それに対する返答が「分かりません答え教えてください」ばっかりじゃ、
ボット並の知性とみなされても仕方ないよ。
人に何かを聞きたいなら、まずその姿勢から改めないとダメだよ。
教えても無駄だと分かりきってる相手に対して時間を使ってくれる人なんていないよ。
704 :
リライト:2008/03/03(月) 13:24:24
私の場合、自分でプログラムを組もうとするとわからなくなるんです。
他の人の作ったプログラムを見て説明してもらって初めて理解できるんです。
だから自分じゃ何もできないのが現実です…。
みなさん不快な思いをさせてすいませんでした…。
>>704 何か人の作ったプログラムを説明してもらって一度理解したら、
それと同じプログラムを今度は何も見ずに白紙の状態からちゃんと書けるか?
ネタ無いからって無理に引っ張らなくていいんだよ
そこはスルーしていいんだよ
すみません
vector<GLubyte> texture;
こんな使い方出来ないでしょうか
要は、可変(不定)のテクスチャを読み込むのにvector型の
動的配列を使いたく
すみません、解決したようです。
&texture[0]
を入れたら読み込んでくれました
ただ、別のところでダメっぽい状況になってしまって…
前途多難です
>>707ですが、別のことで質問させてください。
textureが
○●●○○
○○○○●
●●●○○
…
○○●○●
●=値なし ○=値有り
という感じで並んでいて、GL_LUMINANCEで値有りの部分だけを輝度テクスチャとして描こうとしています。
vectorを使っていたのは○が不定のためです。
●の部分が穴が空いたような効果を狙っています。
texture[○の数]={αααα…αα};
で確保したテクスチャを
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, TEXWIDTH, TEXHEIGHT, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE, &texture[0]);
で貼り付けたらひどい画像になりました。(ノイズのようなもの)
どうやったら意図した通りになるでしょうか…
texture.resize(○の数);
じゃなく
texture.resize(○の数+●の数);
でないと駄目。
あと、テクスチャの幅と高さはともに2のべき乗でないと駄目。(OpenGL2.0未満の場合)
ついでにいうとデフォルト状態では横1ラインのbyte数は4の倍数である必要もある。
>>710のやり方ではaccess violationが起きる可能性があるよ。
参考までに聞きたいんだけど、textureの配列長が○の数でいいと思った理由は?
●の部分に値を入れなくて良いと思った理由は何?●の部分を飛ばして描画するという情報を、なんらかの形でGPUに与えたの?
常識的に考えれば、
{(1), (2), (3), (4), (5), ,,,}
という情報を与えれば
(1)(2)(3)(4)(5)
・・・
という形のテクスチャになって、
(1)●●(2)(3)
(4)(5)・・・
というふうにはならない、と分かりそうなもんだと思うんだけど・・・。
もしよければ、その辺の思考過程を教えてもらえると嬉しいな。
>>710 texture[○の数+●の数]={α00ααα…α0α};
とかにすべきなんじゃないの?
いまいち意図がわからないが。
glTexImage2Dの立場に立って考えれば、全部○だけのデータよこしたってどこに●はさめばいいかわかんないじゃん
TextureサイズはTEXWIDTH x TEXHEIGHTにして穴はαで指定。使ったことないがGL_LUMINANCE_ALPHAってのがあるっぽい
穴の向こうになんかあるなら
>>607の話題を参照
座標変換はCPU側でやるのとGPU側でやるのとでは、どちらが速いでしょうか
CPUとGPUのスペックの関係もあるしどちらが速いとは一概に言えないが、
本当に座標変換だけならちゃんと最適化すればCPUでも十分速いだろう
一方GPUで計算させるのは、その間CPUは別なことできるのがメリット
変換した座標をそのまま描画するならGPUの方がいいけど、
そうでなくCPUで再処理したいなら転送などのオーバーヘッドがある分GPUは不利
計算したい座標の数や用途を考えて、良さそうな方を選んでください
GPUの方が速いに決まってる
と書こうとした俺は715の丁寧なレスに感動した
ありがとうございます
両方とも作ってみます
>>617 返事が遅くなってすみません。同じところに上げておきました。
2yoshi4468.zip
GLUTで作ったプログラムを配布する場合のライセンスってのは自分で決めても良いのですか?
720 :
デフォルトの名無しさん:2008/03/09(日) 17:13:59
いいよ
721 :
デフォルトの名無しさん:2008/03/09(日) 18:50:00
Win32APIを使い、C++でプログラムを組んでいます。(DirectXも使っています。)
//質問
PCゲームなど、セーブ、ロード画面に演出の一つとして使われている
現在のウィンドウ画面を小さくして表示しているサムネイル画面?
について質問です。
やり方がわかりません。そういうAPIが用意されているのでしょうか?
教えてください。
なんでリファレンスとか読まないの?
スレタイも読めないようではリファレンスも読まんだろう
glReadPixels
glReadPixels使うならできればPBOがいいな。
MRTでシェーダから縮小かけてFBOに書き込むのも手か。
俺だったら、glCopyTexImageでtextureにコピー→bindして描画、かな。
ほとんどの環境で動くし。
サムネイルならセーブデータと一緒にファイル保存しないといけないんだろうからglReadPixelsでいいんじゃね
つか
>>721がDirectX3D使ってるなら関係ない話か
FBO の機能を利用して、フォトショップのレイヤーみたいなシステムを作っています。
今ここで、ある FBO レイヤーになめらかな透明情報を含む画像を何枚も重ねて描くことを考えます。
普通に
(1) FBO にレンダーターゲットを設定
(2) イメージを glBlend(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); で重ねて描く
でレイヤー内に描いてしまうと、半透明で描かれてしまうため、このレイヤーを更に
(1) FBO にバインド
(2) FBO を glBlend(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); で下地に描く
で描くと、レイヤー内で描かれた画像はより薄く表示されてしまいます。
これを薄くならないように、まるで直接下地に描いたような結果にしたいのですが、どのようにすれば良いのでしょうか?
>>728 どうしたいのか正確にわからないので、なんともいえないが、
>>(2) FBO を glBlend(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); で下地に描く
をglBlend(GL_ONE, GL_ONE_MINUS_SRC_ALPHA ) にすれば期待した結果になるのでは?
>>729 すいません、まだ頭の中で整理が出来ていないのですが。
その通りにすれば、ズバり私の期待した結果を得ることができました。
実はこのことで何ヶ月も悩んでました。本当にありがとうございました (TT
つglGetError
テクスチャを
GLubyte **texture;として取って値を入れて渡すとき
glTexImage2Dの最後の引数はどういれたらいいのでしょうか
&texture textureでもエラーが出てしまいます
?
ようはポインタのポインタの先にちゃんとデータがあるなら
*texture でいいんじゃない?
ですよね
なのにエラーが出てTexImageのところで動作が止まる、というエラーを吐き出すだけで
なんでじゃあぁああぁ
*textureだが・・・とんでもない使い方をしようとしている気がする
ポインタについて勉強しなおしたほうがいい
&textureじゃまずいだろう
GLubyte bits[TEXSIZE][TEXSIZE][3];
は
GLubyte* bits = new GLubyte[TEXSIZE * TEXSIZE * 3];
と同じ。トリプルポインタじゃない。
739 :
738:2008/03/13(木) 20:37:04
>>733 書いてて思ったんだが、なぜ
>>GLubyte **texture;
なんだ?カラーではなくモノクロ?
glTexImage2Dの他の引数間違ってない?
>>733 **textureの領域をどのように確保しているのか教えてもらわないとみんな答えようがないと思うよ
そもそもダブルポインタにする意味が分からないんだよね
二次元配列を表現しようとしてダブルポインタにしたなら間違ってるよ
1枚のテクスチャの領域を確保したいなら↓のようにすればいいだけだしね
GLubyte *texture;
texture = ( Glubyte )malloc( sizeof( GLubyte ) * Width * Height * 3 ); /* αなしの場合 */
//texture = ( Glubyte )malloc( sizeof( GLubyte ) * Width * Height * 4 ); /* αありの場合 */
それとも、複数枚のテクスチャを一気に読み込んでるのかな?
もし、そうなら↓のようにすればいけるんじゃないかな?
for( Loop = 0; Loop < texture_count; Loop++ ){
/* αなしの場合 */
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, Width[Loop], Height[Loop], 0, GL_RGB, GL_UNSIGNED_BYTE, ( *texture + Loop ) );
/* αありの場合 */
#if 0
glPixelStorei( GL_UNPACK_ALIGNMENT, 4 );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, Width[Loop], Height[Loop], 0, GL_RGBA, GL_UNSIGNED_BYTE, ( *texture + Loop ) );
#endif
}
エスパーだが、もしかしたら画像読み込みライブラリ( libjpeg とか libjpeg )
を使おうとしてるんじゃないかな。
あれは画像を一行一行スキャンして読み込むから、一行の先頭へのポインタを配列で管理すると
必然的に void ** みたいになる。
でもその場合、画像全体は連続したメモリ空間に存在しないから、glTexImage2D に直接
渡したらエラーになるよ。
auxWireSphereで作成した球に、テクスチャマッピングで画像を貼り付けたいんですが
どうすればいいのかわかりませんをorz(==
世界地図を貼り付けて地球儀にしようと思ったのに
自分で球を描画するしかないと思う。
あ、テクスチャ自走生成を用いればできるかもしれん。
Wireじゃ地球儀にならないよ
auxなつかしす。たしかglSphere使ってんだっけ。
static GLUquadricObj *quadratic=gluNewQuadric();
gluQuadricNormals(quadratic, GLU_SMOOTH);
gluQuadricTexture(quadratic, GL_TRUE);
gluSphere(quadratic,r,s,t);
ならこんな感じか
はぁ?なめてるのか?
745=746?
何で検索すらしないの?
チョイト質問させて頂きます。
Windows環境でOpenGLを利用しているのですが、OpenGL2.1対応の参考書を参考に学習を進めているうちに、
利用しているDLLが、OpenGL1.1までしか対応していない事に気が付きました。
そこで、
http://www.opengl/org/でSDKを探したところ、OpenGL1.1のDLLしか見当たりませんでした。
OpenGL2.1に対応しているDLLというのは、一体どこで手に入れる事ができるのでしょうか。
グラフィックボードがOpenGL2.1に対応してないと無理
対応してるならドライバ入れれば動く
>>750 回答ありがとうございます(*´∀`*)
私が利用しているパソコンはオンボードですので、現在の状況から考えてOpenGL2.1を利用する事は不可能な様ですね。
ですので、近いうちにコンピュータを買換えるとします。
では、失礼させて頂きます。
最近のオンボは割りと性能がいいのもあるからとりあえずドライバを更新してみるんだ
>>752 またしても回答ありがとうございます(*´∀`*)
私も、もしかするとと思いまして、SISのホームページでドライバを確認・更新してみたところ、
私が利用しているSIS661FXというチップセットでは、DirectXでいう7.0程度のグラフィック能力しか持ち合わせていないらしく、
DirectX9.0cレベルに相当するOpenGL2.1を利用する事は、やはり無理な様です。
ですが、現状は3D技術を学び始めた程度でして、シェーダ等の高度なグラフィックを利用する予定もまだありませんので、
引き続き学習を進めていきながら、機会があり次第購入に踏み切ろうかと思いますです。
754 :
デフォルトの名無しさん:2008/03/26(水) 22:29:04
テクスチャを張ったポリゴン2枚を重ねて、下のポリゴンが透けて見えるようにしたいのですが
glEnable(BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
を指定して描くと、上側のポリゴンの地の色とブレンドされてしまい、
下のテクスチャが透けて見えるようになりません。
ポリゴンに張ってあるビットマップのアルファを触ると、それに応じた透明度になるのですが
何故か対象は下側のテクスチャ画像ではなく、テクスチャが貼り付けられている地のポリゴンが
透けて見えます。
どなたか、解決の糸口でも良いので、お願いします。
アホな質問ですいません。
アホな質問ですいません
「GL_DEPTH_TEST 透明度」でぐぐれ
たぶん
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
これ系だとみた。
757 :
デフォルトの名無しさん:2008/03/27(木) 07:51:52
>>755 行きました!
有り難う。本当に有り難う。これでグッスリです。
GL_DEPTH_TESTをenableしてから、透けないポリゴンを描いてやり
glDepthMask(GL_FALSE)とglDepthMask(GL_TRUE)の間に半透明ポリゴンを描いたところ
上手く行きました。
GL_DEPTH_TESTがマズイとあのような結果になるとは、思いも由りませんでした。
や。本当に有り難う。
OPENGLを使う関係の業種ってどこ?
医者
すいません。10分前にopenglの勉強を始めたのですが、
環境を整えてVC++でウィンドウを表示するプログラムを実行させたのですが、
なぜかウィンドウと一緒にコマンドプロンプトのウィンドウも表示されます
コマンドプロンプトのウィンドウの方は表示されないようにするにはどうしたらいいですか
exit(0);
glut console でググる
glutって「ぐるっと」でいいの?
サンクス
何故コンソールを表示させないようにするだい?
デバック用のメッセージを表示させたりとかできて便利なのに・・・
なぜ!?
無様じゃん
glTexImage2dで浮動小数のバッファを作るときのパラメータ教えてください
赤のみ32bitと、RGBA各色32bitの
だってあいつ
「続行するには何かキーを押してください...」
とか言ってくるしキモイじゃん
コンソール画面って違和感あるよな。
FreeConsole();
しとけばいいんじゃね?
ネットとかで配布するときはコンソール使うと動かない場合があるから注意するんだぞ
>>760 GLUTを使わずにOpenGLを使う。
>>767 GL_ARB_texture_float拡張が使えるかチェックする必要がある
RGBAはGL_RGBA32F_ARB、
Rのみは無いのでGL_LUMINANCE32F_ARB辺りでどうぞ
Blenderというソフトではコンソール画面が表示されます。
そして俺の環境ではPythonがインストールされてないよと警告がでます。
コンソール画面って便利でカッコイイじゃん。
DOS思い出してしょぼく感じる
メッセージ表示のUI作成が面倒な時の手抜き策だけどな。
コンソールがかっこいいって意見は初めて聞いたなw
ま、開発中はなにかと便利だよね。
ぐるっと、クリエイト・ウィドウ!(未亡人)
ダサッ
781 :
デフォルトの名無しさん:2008/04/11(金) 19:41:48
GLUTで終了時に動的に確保したものを解放したいのですが
何か方法はありますでしょうか
解放すればいい
784 :
デフォルトの名無しさん:2008/04/11(金) 23:59:33
>783
GLUTのラッパークラスを作る場合に、
glutMainLoopはどうするのでしょうか?
どうするのでしょうか、とは?
もうちょっと詳しくたのむ。
VRAM容量を検出する方法を探しています。AGPメモリ等を除いた、
ビデオカードのメモリ容量です。どなたかいい方法ご存知でしたら
ご教授ください。よろしくお願いします。
OpenGLではワールド座標を行列変換して最終的にスクリーン座標までたどり着いたとき、一行四列の行列に格納されてる情報ってスクリーン上のx,yとあと二つは何が入ってるんですか?
ワールド座標の時点ではx,y,zと最後の要素としてダミーの0が入ってると思うんですけど、同じように0が二つ入ってるんでしょうか?
ご教授願います
x,y,z,w
ワールド座標のwは通常1のはず (glVertex3fとかでxyzだけ指定してる場合、w=1)
変換行列をかけた後のwはx,y,zを割るのに使う (ので、0ではない)
zはデプステストに使う
>>787 変換の仕組みについては、赤本の第3章の頭数ページ(カメラの説明)に詳しく書いてあるから一度読んでみ
790 :
デフォルトの名無しさん:2008/04/17(木) 22:53:11
glut.hの中の、球やトーラスのような図形描画の関数が
どういう風に書かれているのか知りたいのですが、
どうすれば見れるのでしょうか?
「C:\cygwin\usr\include\mingw\GL」の中に
"glut.h"は見つけたのですが(これしか入ってない)
中を見ても関数宣言だけで、具体的なアルゴリズムなどの
中身はかかれてませんでした。
どうかお願いします。
見方を教えてください。
792 :
デフォルトの名無しさん:2008/04/17(木) 23:28:42
>>791 ありがとうございます。しかし
この中の「GLUT 3.7 Source Code Download for Win32」 を落として
中身を見たのですが、同じく関数の宣言しか見当たりません。
すいませんが、どのファイルに載っているとか分かりますでしょうか?
793 :
デフォルトの名無しさん:2008/04/18(金) 00:02:44
すいません、見つかりました。
>>787 詳しいことは赤本その他を参照してもらうこととして、簡単に書くと
ローカル座標(x,y,z,w)
【モデルビュー変換】
視点座標(x,y,z,w)
【投影変換】
クリップ座標(x,y,z,w)
【透視除算】
正規化デバイス座標(x,y,z)
【ビューポート変換】
スクリーン座標(x,y,z)
とゆー流れで、途中から4要素じゃなくなるんよ。
795 :
デフォルトの名無しさん:2008/04/18(金) 03:04:50
>>794 透視除算っていうのは単純な行列変換じゃないってことですか?
4要素のものが三要素になるってことは4x4の行列を掛け続ける限りでは起こらないと思うんですが…
っと赤本を嫁とのアドバイスが多いのでそいつでそこらへんお勉強します
794じゃないが、同次座標系について勉強しろ。クリップ座標系のx,y,z要素をwで割るのが透視除算(perspective division)で、これ以降は(x,y,z)を使う。
>795
描画パイプラインの最初から最後まで、4x4行列による変換を続けるわけじゃないからね。(行列が出てくるのは投影変換まで)
透視除算では、クリップ座標(x, y, z, w)、正規化デバイス座標(X, Y, Z)とすると
X = x / w, Y = y / w, Z = z / w とゆー変換がおこなわれるよ。
ちなみにビューポート変換も行列じゃなくて、要素ごとの定数倍&定数加算。
なんでこんな除算が必要なのかは・・・いちど、OpenGLを頭の中から捨てて、3次元座標を画面に投影するプログラムを考えてみればいいと思う。
どこかしらで必ず除算する部分が出てくるからー。
画像ファイル読み込んでglutSolidSphereで描いた球体に貼り付けようと思
っています。
しかし読み込んだものの、上手く球体に貼り付ける方法がわかりません。
GL_OBJECT_LINEARで貼り付けると変になってしまうし、GL_SPHERE_MAPだと
回転しても(環境マッピングなんで当然)画像が回転してくれません。
どうすれば上手く画像を球体に貼り付けられますか?
>>798 テクスチャ座標も回転させろ。
もしくはglutSolidSphere使うのあきらめろ。
ふつうにテクスチャを貼りたいなら、uv座標を設定しないといけない。
glutSolidXXX()はteapotだけがuv座標を生成する。
よって自分で球をuv付きで描く関数を作るしかない
glutSolidSphereのソースを見ると、gluSphereを呼んでいるだけの関数なのがわかる
void APIENTRY
glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
{
QUAD_OBJ_INIT();
gluQuadricDrawStyle(quadObj, GLU_FILL);
gluQuadricNormals(quadObj, GLU_SMOOTH);
/* If we ever changed/used the texture or orientation state
of quadObj, we'd need to change it to the defaults here
with gluQuadricTexture and/or gluQuadricOrientation. */
gluSphere(quadObj, radius, slices, stacks);
}
gluSphereの仕様を見るとテクスチャ座標の生成にはgluQuadricTextureを使えとある。ので
>>744
>>800 返答有難うございます。
勿論、glMatrixMode(GL_TEXTURE)で回転させてみたんですが、z軸方向の回転以外は
変に引き延ばされてしまいます。
GL_TEXTURE_2Dを使ってるのがまずいんでしょうか・・・
>>801 おお、そうなんですか。
試してみます。情報有難うございます。
gluSphereで描いてみたのですが、uv座標の自動生成やっぱり結果は同じでした。
やはり一つ一つuv座標を計算しないといけないんですね。
uv座標を緯度方向と経度方向の分割数でばらばらにするのはわかるんです。
しかし、肝心のポリゴンの方の座標がわかりません。
どうすればいんでしょうか?
変わらないってことはないと思うが。
glEnable(GL_TEXTURE_GEN_X);
が有効になったまんまなんじゃないの?
gluQuadricTextureでuvを指定したのなら、自動生成はOFFにしないとだめ
sin/cos/行列を勉強すればいいと思うよ>球の座標
あきらめて球描画を実装した方が早くないか?
一からポリゴンで作ってみることにしましたorz
ウィンドウの右上の×ボタンで終了処理をしたいんだけど、どうやったらでき
るんですかね?
普通に押してもウィンドウが消えるだけで終了処理ができません。
毎回タスクマネージャで消す羽目に。
ウィンドウが表示されている内にキーボードやマウスで終了処理をさせる以外
に手はないんですか?
タスクマネージャってとこみるとWindows?
ならWM_CLOSEメッセージを処理すればいいんじゃね。
それともglutを使ってって話?環境書かなきゃわかんねって
すみません。
自分はWindowsXP SP2なんですがOSに依存しない処理にしたいんです。
glut上で片付けようと思ったんですが、それらしき方法がわからなかったので。
atexit()使えばいいんじゃないだろうか
最初atexitを使ってみたんですが、×ボタンでウィンドウが消えると何も起こらな
いので、結局タスクマネージャのお世話になってしまいます。
もしかして、コンパイル時にオプションで -mno-cygwin -mwindows としてるのが
マズいんでしょうか?
cygwinか..使ったことないからわからないけど、異常終了になっちゃうのかも。
glutInitをglutInit_ATEXIT_HACK(glut.hにある)にしてみるとか
つか×で終了しないようにすればいい
昔その症状になったことがあるな
その時はopengl.orgあたりから拾ってきたglut32.dllに入れ替えたらちゃんと終了するようになった
Windowsに標準でついてるglut32.dllとmingwの相性が悪いんだと思う
glut32.dllはちゃんと拾ってきたものにしたんですけどねぇ...
>>813 ついつい癖で×ボタン押しちゃうんで、何とかしたいんです。
glutInit_ATEXIT_HACKですか、初めて聞きました。
ちょっと調べてみます。
「思うように動かせない」って言われても・・・
>>816さんがどう思ってるのか分からねーですよ。
自機&視点の、位置&姿勢を、計算する部分はもうできてるの?
それすらできてないなら、それはOpenGLとは関係ない、幾何学やプログラミングの問題
(あるいは航空力学の問題w)なので、このスレで聞いても意味が無いかと。
もしそれらの情報がすでに計算できてるなら、その先はOpenGLの問題なので
もっと詳しいコトが分かればお手伝いできるかもですよ。
あと、そのpilot.cを元に、大まかにどう作ったのかも分からないな。
早い話がソース晒せw
そのpilot.cで視点の移動はできるように見えるんだが、
それ以上に何かしたいってことだよな?
それが何かを言ってくれると答えられるかもしれない
キーボードのxXyYzZrRpPhHで動かすんだよ
GLUTで動的に生成するクラスに変更を加えると終了時にエラーが出ます
しかし、オブジェクトファイルを消してリビルドするとエラーは出ません
何が原因なのでしょうか
芸術的質問だな。しばらく鑑賞してしまった
>818 確かに視点は動かせるんですが、細かい機体の動かし方をどう連動させ
ればいいのかわからないんです。
マウスの動きに合わせて斜めに移動したりしたいんですが・・・
どなたか820に答えて頂けませんか
>>820 偶然じゃね?リビルド実行を10回くらいすればはっきりすると思う。
コンパイルやビルドの設定を見直してみるといいかも
あとはプロジェクトを作り直してみるとか
>>820 動的に生成、終了時にエラーってことは実行時の話?リビルドすると直るってことはコンパイル時の話?
この質問で原因がわかったら超能力者だろ。せめてそのエラーってのが何かくらい書けと
820ですが、オブジェクトファイルの更新がされていなかったと予想しています
エラーは不明なハンドルがどうたらということです
デストラクタの部分で出ました
リビルドしてオブジェクトファイルを更新したらエラーが消えたのなら、それで問題解決だろ
もう
GLUTを使うのをやめてglfwを使うようにしないかい?
GLUTより機能が多いしプログラミングしやすいし。
欠点はGLUTほど日本語のドキュメントが充実してないって事ぐらいかな。
未だにGLUT使うのは(`・д・´)ヤメタマエ
好きなの使えばいい。個人的にはglfwは複数ウィンドウが使えないからダメかな
glfwは英語でもドキュメント充実してないぞ
複数ウィンドウ使えなくて良ければSDLもいいよ
SDLのインスコでつまづく者ですが。
SDL1.2.13はちゃんと入ったのに、他のSDL_imageやらsmpegで下記のエラーで何度も
弾かれるが解決策が分からずorz
sh configure
(中略)
checking for SDL - version >= 1.2.10... no
*** Could not run SDL test program, checking why...
*** The test program failed to compile or link. See the file config.log for the
*** exact error that occured. This usually means SDL was incorrectly installed
*** or that you have moved SDL since it was installed. In the latter case, you
*** may want to edit the sdl-config script: /usr/local/bin/sdl-config
configure: error: *** SDL version 1.2.10 not found!
$ sdl-config --version
なんと出る?
$ sdl-config --version
1.2.13
大丈夫なようなんですが・・・
試しにもう一度インストールし直すと、さっきの所は通りました。
が、今度は別の所でエラーが出てしまい、先に進めません。
無視して先に進めば、makeの時にwarningが出ました。
ざ、挫折しそうorz
(sh configure時)
checking for SDL - version >= 1.2.0... yes
checking for sqrt in -lm... (cached) yes
checking for gtk-config... (cached) /usr/bin/gtk-config
checking for GTK - version >= 1.2.1... no ←ここで別窓のコンソールが開いてエラーが出て止まる。
checking for OpenGL support... yes
(make時)
*** Warning: This library needs some functionality provided by -lstdc++.
*** I have the capability to make that library automatically link in when
*** you link to this library. But I can only do this if you have a
*** shared version of the library, which you do not appear to have.
*** Warning: This library needs some functionality provided by -lmingw32.
*** I have the capability to make that library automatically link in when
*** you link to this library. But I can only do this if you have a
*** shared version of the library, which you do not appear to have.
(もう少しWarningが続く)
今気づいたがスレ違いじゃんか
837 :
デフォルトの名無しさん:2008/05/08(木) 16:16:03
LinuxでOpenGLのバージョンを知りたい場合、glxinfoで見れるそうですが、↓のようになりました。
OpenGL version string: 1.2 (2.0.3)
どっちがバージョンの番号なんでしょうか?
質問です
同時座標変換のための関数glTranslate, glRotateを用いて
glRotate(...);
glTranslate(...);
glBegin(...);
...
glEnd();
という順に記述した場合、行列の掛け順は内部的には
Rotate * Translate * 座標
ということになるんですよね?
840 :
839:2008/05/08(木) 16:55:01
ありがとうございます!
841 :
sage:2008/05/08(木) 21:20:14
OpenGLで三角形、四角形、五角形を同じウィンドウ上に表示させたいのですが、どうしたらいいでしょうか?
それぞれの図形を独立させたいのですが、どうしても一筆書きみたいになってしまいます。
下記は四角形のみを表示するプログラムの一部です
void display( void )
{
glClear( GL_COLOR_BUFFER_BIT );
glColor3f( 1.0, 1.0, 1.0 );
glBegin( GL_POLYGON );
glVertex3f( 0.1, 0.1, 0.0 );
glVertex3f(-0.1, 0.1, 0.0 );
glVertex3f(-0.1,-0.1, 0.0 );
glVertex3f( 0.1,-0.1, 0.0 );
glEnd();
glFlush();
}
それに続けて5角形とか6角形とか書けばいいだけ
843 :
837:2008/05/08(木) 21:34:30
>>839 ありがとうございます。
すると、()内の数字は何を表してるんでしょうか・・・?
WinXPとGeForceFX5200でGLUTやってるのですが、
テクスチャが出ません。(glTexImage2DでGL_RGB指定)
Fedora8とGeforce3でも同様でした。
Geforceの場合、何か必要な手順があるのでしょうか?
845 :
sage:2008/05/08(木) 22:04:42
>>842 ありがとうございます。
つまりこんな風にしたらいいんでしょうか?
glBegin( GL_POLYGON );
glVertex3f( 0.1, 0.1, 0.0 );
glVertex3f(-0.1, 0.1, 0.0 );
glVertex3f(-0.1,-0.1, 0.0 );
glVertex3f( 0.1,-0.1, 0.0 );
glColor3f(1.0, 0.0, 0.0 );
glVertex3f( 0.1, -0.3, 0.0 );
glVertex3f( 0.3, -0.2,0.0);
glVertex3f( 0.1, -0.1, 0.0 );
glEnd();
glFlush();
}
glBegin〜glEndの説明をもう百度よく読んだほうがいいと思うな
くだすれだし
>>844 GeForce以外だとうまく動くの?単にglEnable(GL_TEXTURE_2D)してないだけだったり。
>>845 それは途中で色が赤に変わる7角形。4角形と3角形なら2回glBegin-glEndを使う
848 :
844:2008/05/08(木) 22:50:31
849 :
sage:2008/05/08(木) 23:01:16
>>847 できました!
ありがとうございました!
>>848 opengl32.dll や glu32.dll
が壊れてるんじゃないか?
851 :
837:2008/05/09(金) 22:25:02
自己解決レスを
>()内の数字は何を表してるんでしょうか・・・?
ドライバのバージョンのようです。
teraterm越しにglxinfoを使ったため、1.2となったようです。
ローカルでやると↓になりました。端末に合わせて変わるんでしょうかね。
OpenGL version string: 2.1.2 NVIDIA 169.07
>>844 GL_RGBA指定じゃだめか?
こんな感じで↓
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
ウチもGeForceだが無問題。
>>844 GL_RGBA指定じゃだめか?
こんな感じで↓
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
ウチもGeForceだが無問題。
>844
そのテクスチャのサイズを記せ
クォータニオンの勉強をしています。
クォータニオンを使ってマウスで回転させるソースはたくさんあって、ソースを書いたらプログラムは自分で作れました。
しかし、キーボードからの入力でクォータニオンを使って回転操作をさせるソースが見あたりません。
キーボードからだと難しいのでしょうか?
マウス入力をキーボード入力に書き換えればいいんじゃね
てかクオータニオンとOpenGLは関係ないよね
ピッキングに関して質問です。
OpenGLを使用したやり方だと、セレクションモードから
ヒットレコードを見てポリゴンを判別できているのですが、
ウィンドウ座標から、ワールド座標に変換して
頂点を判別する方法を教えて頂きたいです。
何か、サンプルコードのあるところがあれば、教えて下さい。
859 :
844:2008/05/12(月) 00:25:46
どうやってもダメでした、いろんなサンプルを試したのですが。
(もう一台持ってるGeForce3のLinuxPCは正しく出るんだが。。)
ASUS P5S800+GeForceFX5500はOpenGLのテクスチャは出ない、と思って諦めます。
ただ、なぜかCgやGLSLのテクスチャのサンプルは正しく動作するので
このPCではシェーダの勉強を進めますw
>>860 あ、いえ、gluUnProjectではなく
数学的な行列計算の場合に、
ウィンドウ座標からどのように頂点を判別しているのかが知りたいのです。
できれば、数式でなくコードで書くと、
どうなるのかが分かると有難いです。
ワールド座標→モデルビュー変換→射影変換→ビューポート変換→ウィンドウ座標
なので、ウィンドウ座標からワールド座標を求めるならこの逆をやればいい
ダミーウインドウを使用したバックバッファを作って使用しているのですが、OpenGLのレンダリング
範囲はディスプレイ解像度に依存するのでしょうか?
ウインドウサイズを2048x2048としても1032x756といった中途半端なサイズ(使用している
ディスプレイはXGA)の範囲にしか書き出してくれないので困っています。
もっとも、このサイズもおかしいので解像度に依存しているかどうかも怪しいですが…
オフスクリーンでこういった巨大なイメージをレンダリングするにはどうしたらいいのでしょうか?
FBO
>>864 早っw
やっぱりFBOですか…
拡張はあまり使いたくなかったのですが、どうがんばってもバックバッファでは
無理っぽいので使うことにします。
ありがとうございました。
>>862 >ワールド座標→モデルビュー変換→射影変換→ビューポート変換→ウィンドウ座標
(´・ω・`)俺、質問者じゃないけど、このへんよくわからない……
ウインドウのマウスクリック相対座標を取得して、相対化して
例えばプロジェクションモードやモデルビューモードにしてGLGETとかで変換行列をえて、
逆行列を作ってかければおk?
ビューポート変換行列はどうやってとるの?
たしかに、モデルビューとプロジェクションでは足らん気がする。行列の値みる限り。
携帯だから日本語がふじゆうになるスマン
>>866 ビューポートもglGetIntegervしてくればいい。
それらを自分でかけてもいいが、変換してくれるのがgluUnProject()
# 変換先はワールド座標ではなくオブジェクト座標
>>867 d
ビューポートもゲット出来るのか、それに使える関数もあるんだね
調べてみるね(^ω^)ノシ
(;^ω^).。oO(すでに逆行列求める関数とか、その他色々手作りしちゃったんだよな……おれアホだわ)
ポリゴンで光源を置くとある角度になると白く光ってしまうんですが。
ちゃんとGL_NORMALIZEを有効にしてるのにおかしいと思ったら、どうやらglScalef
が原因みたいなんです。
ある大きさ以上にglScalefでポリゴンを縮小すると過度に白く光ります。
どうしたら普通にシェーディングできますか?
ポリゴンを大きくするしか手だてはないんでしょうか?
つ glEnable(GL_AUTO_NORMAL);
ごめん間違えた
つ glEnable(GL_NORMALIZE);
と思ったらすでに有効にしているのか・・・
872 :
865:2008/05/14(水) 17:41:13
すいません、昨日に引き続き質問させてください。
OpenGLの拡張機能を使用するにはwglGetProcAddressで関数を取得すると思うのですが、
ビデオカードが2.0対応しているのに関数へのポインタが取得できないのはなぜでしょう?
一応OpenGL Extension Viewerにてサポートが確認されている関数(glGenRenderbuffersEXTなど)
を取得しようとしてみましたが、nullしか帰ってきませんでした。それどころか、glMaterialfといった
1.0から使用できる関数へのポインタまでもが帰ってきません。
何が原因なのでしょうか…
使用しているビデオカードはGeForce 7600 GSです。
>>872 WGLは、GLコンテキストが存在しないとwglGetProcAddressがNULLで返る仕様になっているので、
コンテキストを生成してから取得すればOKかと。
>>873 うまく取得できました。
が、今度はGL_INVALID_OPERATIONが… orz
なんか設定してないものがあるんでしょうか?
ごめんなさい、関数を取得した後すぐにカレントコンテキストをnullにしてしまったことが
原因でした。カレントを外さずにそのままやるとうまくいきました。
ありがとうございました。
>>869 スケールによって点光源との角度が変わってスペキュラで白く光るとかじゃないの?
ポリゴンの大きさで照明処理ができないなどということはない
>>869 それが一度はSPECULARが原因とを疑って色々弄ったんですが・・・
やっぱりglScalefである一定以上縮小した時に現象が発生します。
>>877 ミップマップが適用されちゃってるってコトはない?
なんにしても、状況が再現する最小のコード片があればいいんだけど・・・。
すいません。OpenGLに渡す行列データの仕様についてなのですが、
glLoadMatrixなどに渡す配列は行優先(と言っていいのか判らないのですが)で
Direct3DのD3DMATRIXとメモリ上の並びは同じで合ってるでしょうか?
つまり配列[12][13][14]にそれぞれ平行移動量XYZが入る形という意味で。
同じであれば、OpenGL=列優先、Direct3D=行優先で違うという話をよく見るのですが、
メモリ上の配列が違うという意味ではなく、ドキュメント表記が違うだけで
内部メモリの順序はOpenGLもDirect3Dもどちらも同じと考えて良いですか?
DirectX使ってないので同じかどうかわからないが、
GLfloat nMat[16];
glGetFloatv(GL_MODELVIEW_MATRIX, nMat);
などとすると、メモリ上の位置はわかる。
>>879 [12][13][14]には平行移動成分が入るます。
それを、
列ベクトルの左に掛ける行列の4列目と見るか、
行ベクトルの右に掛ける行列の4行目と見るか、
は解釈の違いに過ぎないので、どちらであるとも言えまする。
まぁ、OpenGLではベクトルを列ベクトルで表記することが多いので、
Matrixの読み出し/格納は列優先でおこなわれると覚えたほうが分かりやすい鴨。
OpenGLではcolumn major
Direct3Dではrow major
OpenGLでは行列の後ろからベクトルを掛ける
Direct3Dでは行列の前からベクトルを掛ける
ってことは・・・?!
>>880-882 どうもありがとうございました。
自前で行列計算してワールド変換に使用していて、D3DからGLに持っていくときに
多くのサイトで行列は転置する必要があると書いてあったのですが、
その通りやってもどうも正常に動作しないのでおかしいと思っていたところです。
結局、ドキュメントが行列xベクトルかベクトルx行列となっているかが違ってて根本的には同じだよ。
大抵の3Dとか数学とか物理だと行列xベクトルの書き方のほうが多いので
Direct3D使うときも行列xベクトル+column majorでやってました。
あんまりスレとは関係ないけど、みんな自前で行列やベクトル計算のクラスや関数を用意してない?
そろそろ3D用の標準となるそういうライブラリが出てこないかな・・・。
探せばいいのがあるのかもしれないが。
ゲームで壁に銃で撃つと弾痕のテクスチャが壁に貼られます。何発も撃つと幾重にも
貼られますが、あれはどういう手法でインタラクティブに表示しているのですか?
壁テクスチャ用のUV座標とは別に弾痕用のUV座標があると思うのですが、そもそもUVの位置が
未定だからどうやって決めているのかなと思って。
あと幾重にも弾痕が重なるってことはUVCoordもたくさんあるのですかね?
概念だけでも教えていただければ助かります。
実際にどうやってるのかは色々あると思うが、その方法なら、UV座標は1つでできる。
描くときのUVを変えればよい。テクスチャ行列( glMatrixMode(GL_TEXTURE) )について調べてみる
自分なら、弾痕用のポリゴン1個作って、ブレンドモードで重ね書きする。
888 :
885:2008/05/16(金) 22:15:51
>>886>>887 ありがとうございます。DirectXで解説しているサイトがいくつかありました。
それによると投影テクスチャでやるっぽいです。
けどいろいろやり方があるらしいですね。お二方の方法も勉強してみます。
>>887 大抵のゲームでは弾痕用のポリゴンを壁に貼り付けるらしい。
こういうのをデカール(decale)っていうらしい。
普通に壁面にポリゴンを張って弾痕を前に表示されるようにするには
Zバッファをオフにしてz値でソートして順番に表示するか
ある程度壁から離した場所に弾痕用ポリゴンを置かなくちゃならない。
そうしないとZバッファ法の誤差でノイズみたいのがでるからね。
3Dグラフィックス数学の本には
Zバッファの精度を考慮してどれだけ浮かすか(深度値オフセット)を計算する方法が書いてあるよ
890 :
デフォルトの名無しさん:2008/05/19(月) 20:58:50
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,・・・)
したとき、グラフィックメモリにはheight*width*3bitだけ
使われるという解釈で良いですか?
いいえ
幅*高さ*3ビットじゃなくて3バイトだな
正確にどれだけ使われるかは分からないが、普通大体そのくらいではある
例えば640x480のRGBテクスチャを作ろうと思ったら内部では1024x512x4で作られてると思っておけば問題ない
894 :
890:2008/05/19(月) 22:39:22
てことは、ビットマップと同じ感じで作られるということでよい?
ていうか、まあ、ビットマップだよね。
896 :
890:2008/05/19(月) 23:55:28
ありがとうございました。
テクスチャも上下逆なんだっけ?
ボトムアップでもトップダウンでも選択できる。
ウィンドウズビットマップも選択できるけどな。
すまんSDK落とすならSDK 9.5落としてくれ
SDK10には新しいサンプルしか入ってないのな
トゥーンやってたけど
それで境界決めるのを細かくやればソフトシャドウになりそうな…ならないな
903 :
899:2008/05/22(木) 22:37:23
テクスチャ描画がうまく行かないのですが、
もしかしてglBeginとglEndの間にglBindTextureを呼び出すのってまずいですか?
まずいです
そのリンク先に書いてあるじゃないか
glTexParameteri( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE );
をやっておけばLuminaceテクスチャとして扱われるよ
>>908 やって出来なかったから書き込みました。説明不足すみません。
そんでもって自己解決。
GL_TEXTURE_COMPARE_MODEをGL_NONEにしてからじゃないとダメなんですね。
910 :
887:2008/05/27(火) 02:21:19
>>889 亀レスですが(レスった直後に事故って入院してたw)ありがとうございます!
ちょっと頭吹っ飛びましたが改めて勉強してみます。
事故で頭が吹っ飛んだのかと思ったw
退院できてよかたねw
一枚のポリゴンが0,0,-100から0,0,0の位置に迫ってくる場合にだんだん光が当たって見えてくるようにしたいですが、うまくいきません。
簡単なコードで教えてもらえないでしょうか。
空間をグルグル回ってる状態の場合は陰影が出るようにはできてます。
GLfloat ambient[] = [0.2f, 0.2f, 0.2f, 1.0f];
GLfloat diffuse[] = [1.0f, 1.0f, 1.0f, 1.0f];
GLfloat specular[] = [1.0f, 1.0f, 1.0f, 1.0f];
// GLfloat position[] = [0.0f, 5.0f, 5.0f, 0.0f]; // 近い
GLfloat position[] = [1.0f, 10.0f, 10.0f, 0.0f]; // 遠い
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient.ptr);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse.ptr);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular.ptr);
glLightfv(GL_LIGHT0, GL_POSITION, position.ptr);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
点光源はw(position[3])を1に
距離による減衰までやりたいならGL_CONSTANT_ATTENUATIONとかで調べる
3Dゲームとかに出てくるまばいゆい光の演出はなんて用語で言うんですか?
間倍 唯(13)
加算アルファ
グレア
Irrlichtという3DエンジンをGL2.1とジオメトリシェーダーに対応させたいです。
でもGLって使ったこと無いですし
それなのに情報が少なすぎ・・・
XPとRADEON HD 2600 XTで使えるでしょうか。
920 :
デフォルトの名無しさん:2008/05/31(土) 00:28:27
前進を自然にしている中で、キーボードBを押すとそこから後退、またFを押すと再び前進しだすプログラムを作成しています。
後退はできるようになったのですが、前進がどうしてもしてくれません。どうしたらいいでしょうか?
void idle(void)
{
dist = fmod( dist + 0.05*d_dist, 32.0 );
theta = fmod( theta + 0.5, 360.0 );
glutPostRedisplay();
}
void myKbd( unsigned char key, int x, int y )
{
if ( key == KEY_F) d_dist =-0.5;
if ( key == KEY_B) d_dist =-0.5;
if ( key == KEY_ESC ) exit( 0 );
}
>>920 KEY_FもKEY_Bも両方マイナスになってるように見えるが
922 :
920:2008/05/31(土) 01:04:56
すみません。
いろいろ試していてFを元に戻すのを忘れていました。
Fが+です。
F押してもB押してもd_distが-0.5になってるやん
デバッガを使うなり要所にprintfを入れるなりして、
FやBを押すとd_distやdistがどう変化するか出力してみなよ
勘でだけど、+0.5でもダメなら、KEY_Fが'f'になってないとかあたりか
リロード忘れてたorz
Fが+なら逆向きに動くんでないの?
あとはfmodの使い方の問題かな。
>>919 ジオメトリシェーダ使ってないのでよくわからないが、
Cg なのか GLSL なのかによって、動くかどうか
変わってくるんじゃないかな>RADEON HD 2600 XT
ATIならGLSLの方がいいのかな?
>>919 OpenGLからジオメトリシェーダを使うのは現状WindowsとRadeonの組み合わせでは無理
ドライバが対応してないから、MacかGeForce使え
IrrlichtはOpenGL2.0対応みたいだから2.1対応させるのは簡単そう
2.0と2.1の違いってあまり無いんだがなんで2.1対応させる必要があるんだ?
ドライバが対応さえしていればジオメトリシェーダ対応させるのはそれほど大変でもない
しかしOpenGLの知識が無いとかなり難しいと思うぞ
あ、すまん、新しいドライバ使えばRadeonでもジオメトリシェーダいけるかもしれん
俺はRadeonHD持ってないので確実なことはわからないが、
なるべく新しいドライバ入れてGL_EXT_geometry_shader4拡張があるかどうか調べてくれ
あれば使える
寺西さんだっけ?
そんな名前の性格悪いおっさんが、txtにそういう情報表示させるツールがあったな
なんかGLのメーリスが検索に当たるたび
なんでこんな性格わりーんだろーと思う
>>930 リヌクスのコミュも似たようなもんだよ。
2chで言っても始まらんが、あの手のヲタは
『知ってるが、お前の態度が気に入らない』を素でやってるタイプがほとんど。
金もらってるんじゃないんだから気に入らない相手に親切にしてやる義務も無いだろ
回答者はお前らのカーチャンでも先生でもないんだぞ
今OpenGLの情報調べるならOpenGL Extensions Viewerが良くね?
ttp://wisdom.sakura.ne.jp/system/opengl/gl6.html このページに載ってある一番下のサンプルプログラムを
cygwinでコンパイルしたんですけど描画結果が点線の三角形ではなく
普通の直線の三角形になってしまいました
glEnable(GL_LINE_STIPPLE);
glLineStipple(1 , 0xF0F0);
この2行を反映させるのってどうすればいいですか?
他にも点線が描画されるような簡単なものも書いてみたけどやはり結果は普通の直線でした
MacならRadeon全般で使えるっぽい?
ソフトエミュになるかもだけど
そこのページは嘘が多い
あるいはドライバのバグ
>>934 VS2005 + Geforce8800GT
の環境ならうまくいったぞ。
そちらのグラボは何?
>>937 仕様表を見たら
VIA/S3 Graphic社製 UniChrome Pro (VIA社製K8N800 チップセットに内臓)
となっていました
939 :
sage:2008/06/01(日) 15:28:28
プログラムを実行すると
glMaterialでアクセス違反が発生します。
コンパイルは通ります。
glMaterialを使用してる部分をコメントアウトすると実行できますが
描画がきちんと出来ません。
glBegin(GL_QUADS);
glNormal3d(0.0, 1.0, 0.0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow);
for (j = -30; j < 30; j++) {
for (i = -30; i < 30; i++) {
//glMaterialfv(GL_FRONT, GL_DIFFUSE, ground[(i+j) & 1]); アクセス違反
glVertex3d((GLdouble)i, -1.0, (GLdouble)j);
glVertex3d((GLdouble)i, -1.0, (GLdouble)(j + 1));
glVertex3d((GLdouble)(i + 1), -1.0, (GLdouble)(j + 1));
glVertex3d((GLdouble)(i + 1), -1.0, (GLdouble)j);
}
}
glEnd();
ソースはこのような感じです。
groundやyellowにはRGBA色を格納しています。
もしエラーの起きる原因をお知りであれば、ご教授お願いします。
940 :
sage:2008/06/01(日) 15:30:52
sage間違えた
ふははwすんません
groundの定義が見れないとなんとも。
(i+j)&1 ってのはi+jが偶数か奇数かで0,1を選択してんの?
(自分は臆病なんで(i+j+60)%2ってやるかな。)
デバッガが使えないとしても、ground[0]やground[1]に固定してエラーが出ないか調べたり、
ねんのため(i+j)&1が幾つになるか表示させてみたりすれば
>>942 はい、偶数奇数を選択しています。
そして赤と白のチェック柄を出すために使用しています。
上記のソースは床の描画で、
その床を囲むように、床と同じような処理で壁も描画しています。
壊れたような表示はされますが、アクセス違反は発生しません。
エラーが起きる瞬間は
j=24
i=7で
0x02b6cad3でハンドルされていない例外が発生しました:
0xC0000005:場所0x02b43e88に書き込み中にアクセス違反が発生しました。
となります。
942だが
ソースの一部だけじゃわからないので、推理だがw
iとjがint型ではなくfloatとかで宣言されてんじゃね。
他にエラーの原因があるかもしれんからglGetErrorとかもみたらいいと思うよ
↑違いますね。すんません。
ちなみに
>>939のコードそのままでやってみたら表示した
GLfloat ground[2][4] = { {1,1,1,1},{1,0,0,1}};
な感じで。原因は他の場所かも
>>946 わざわざありがとうございます。
glGetErrorも試してみたのですが常に0が返ってきました。
原因を探しているのですが、検討がつきません。
友達のPCで試したところ通常通り描画できました。
また他の友達のPCで試したところ、描画は944のようになりましたが
エラーは出ませんでした。
試しにglBegin〜glEndの範囲を狭めてみたらどうなる?
こんな感じで↓
・・・
for (i = -30; i < 30; i++) {
//glMaterialfv(GL_FRONT, GL_DIFFUSE, ground[(i+j) & 1]); アクセス違反
glBegin(GL_QUADS);
glVertex3d((GLdouble)i, -1.0, (GLdouble)j);
glVertex3d((GLdouble)i, -1.0, (GLdouble)(j + 1));
glVertex3d((GLdouble)(i + 1), -1.0, (GLdouble)(j + 1));
glVertex3d((GLdouble)(i + 1), -1.0, (GLdouble)j);
glEnd();
}
・・・
解決できました!!
ありがとうございます。
データを送りすぎていたみたいですね。
極端に重たくなってしまったので、これから改良していこうと思います。
本当にありがとうございました。
952 :
919:2008/06/01(日) 22:01:49
OpenGL Extensions Viewer 3.0で見てみましたが、
GL_EXT_geometry_shader4 was not found, but is available in driver version 2.0 ATI-1.5.24
となっています。Catalyst8.5で入るのでしょうか?(現在8.4)
>>928 IrrlichtはOpenGL2.0ではなくて1.5のはずです。
953 :
919:2008/06/01(日) 22:34:11
|ι´Д`|っ < 8.5でも だめぽ
そもそも2.0 ATI-1.5.24とは?
最近OpenGLを使い始めたんですが、市販のゲームでもよくあるサンプルみたいにコマごとにポリゴンを描画しまくって画面作ってるんですか?
そーだよ
958 :
919:2008/06/03(火) 23:03:08
GDIのEllipse,Arc,LineTo等を使って、2Dのペン幅付きラインやポリゴン(抜き、凹、Arc含)を
大量に描画するプログラムを作っています。
描画の高速化を検討しているのですが・・・・
OpenGLを使うならば、円弧を線分に分割、幅付きラインの外形抽出、テセレーション等の前処理が必要なのでしょうか?
そうであれば、描画以前の処理に時間が掛かりすぎてしまいます。
OpenGLでなくても良いですので、何か良い方法やツールを御存知の方がいれば
教えていただけないでしょうか?
よろしくお願い致します。
なにでやるにしろ線分に分割とかその辺の処理はCPUでやってるよ
隠蔽されてるか自分でやる必要があるかの違いくらいだ
その程度の処理がボトルネックになるんだったら何で描画しても速度変わらないぞ
.NETが使えればWPFなんかどうだろう
GDI+もいいが遅いと聞く
cairoでglitzバックエンド使えばOpenGLで描画してくれる
あとは自分でビットマップをレンダリングしてそのままコピーでもいいんじゃないだろうか
961 :
959:2008/06/05(木) 23:42:32
>>960 ありがとうございます。
> その程度の処理がボトルネックになるんだったら何で描画しても速度変わらないぞ
ペン幅付きポリラインも面も何千何万とあるので、どうやら「その程度」で済みそうにないです・・・・
> cairoでglitzバックエンド使えばOpenGLで描画してくれる
まずはこれを検討してみます。
すべての図形が毎回変わるわけでなければ、線分に分割した円弧とか
幅付きラインの外形とかは一度だけ計算して保存しとけばいいんじゃないか
メモリ食うけど
>>961 いや、960さんが言ってるのはそーゆーことじゃなくて、円弧の分割だとかは結局GDI内部で
CPUを使ってやってるだろうから、APIにやらせようが、APIに渡す前に自前で計算しようが、
速度は変わらないよってことでしょ。
(一般化しなくて良い分、自前でやる方が速くできるかもね)
ちなみにテセレーションはgluTessほにゃらら関数を使うと便利。
線分分割はCPUでやるけど、各頂点をどこに置くかはVertex shaderで計算させるようにすれば高速化するかも。
geometry shader使えばテセレーションもGPUで計算できて高速化できるんじゃなかろうか。
とりあえずVertex shader、Geometry shaderについて調べてみたら
メタセコイアで作ったモデルをOpenGL使ったプログラムで表示するのってどんな方法があるんでしょうか?
いろいろな方法があるなあ。
俺は工学ナビさんのところのを使ってるー
工学ナビさんの試したんですが、サンプルは動くものの自分で使うとなぜか表示できない現象が。
空間の設定が悪いのかと思っていろいろ試してます。
OpenGLではなくて3D一般の質問ですいません。聞くところが
わからなかったもので…
二つのベクトルの角度は内積で求まると思いますが、出る結果は
cosなので、右回転か左回転かを知ることができません。
回転方向を知る方法はありますでしょうか?
右回転、下から見れば左回転
右か左を語るってことは、二つのベクトルと同一平面に無いなにか別のベクトルがあるはず。例えばZ軸とか法線とか
二つのベクトルの外積と、その基準になるベクトルの内積の符号で判断できると思う
>>971 なるほど!
本当に助かりました、ありがとうございます。
973 :
969:2008/06/08(日) 21:04:58
bmpについては自己解決しました。
256色でないときちんと表示できないものだったのに
違うフォーマットのものを読み込んでいました。
ただ毎回Ctrl-cで終了せざるを得ない状況は続いています。
スポーツのアニメーション作ろうかと考えているのですが、
OpenGLとFLASHのどちらが向いているのでしょうか?
条件が少なすぎるが、たぶんどっちもゼロから勉強すんでしょ?
FLASHとこたえとく。
FLASHとOpenGLって直接比較するようなものか?
まずはどちらがどんなものなのか、もっと詳しく調べることをおすすめする。
Papervision3DやらAway3Dやらと比較してるんじゃないの?
3DじゃないならOpenGLと比較する意味ないからな。
現在進行形で使ってる身から言うと、3D目的でFlashはやめといたほうがいい。
貧弱な環境で試行錯誤しながらコーディングするっていう楽しさはあるけど、
どうしてもブラウザ上で実行しないといけない案件だとか、特殊な状況じゃな
いならOpenGLがいいよ。
flashは手を出したこと無いがGLでやるなら3年はかかるだろうし
それまでにflashの環境が良くなるんじゃないか?
>>974です。
現在、3Dプログラミングの制作+研究をやろうかと考えており
一応1年間プログラミングの勉強を経験してきたので
OpenGLをやってみたいという思いがあったのですが
手軽だからという理由でFLASHを勧められたことで迷い、質問させていただきました。
ですが、やはり完成度の高い作品を作りたいので、元々の希望通り
OpenGLをやることにします。
アホみたいな質問に応えていただきありがとうございました。
どうしてもブラウザ上でやりたきゃ、ActiveX使えばいい。
俺はIE嫌いだけど。
OpenGLの勉強を1はじめて一週間で紙飛行機を飛ばせれるようになったよ
>>978 Astroの話?だったら期待はずれだよ。テクスチャ付き三角形を表示
できるようになるだけ。
速度はだいぶ改善されるが、それでもハードウェアをフルに生かせる
OpenGLと比べられない。
それと、Flashの3Dの手軽さはOpenGL+3Dエンジンの手軽さのそれと一緒。
プログラミング経験たった一年じゃ、モデル表示するだけで数ヶ月は必要
だろうから、何かしらの3Dエンジンを使うことをオススメしとく。
Silverlightもそうなんだけど、なんで普通の3Dサポートしないかな。
絶対需要あるのに。
1.5時間/週 x 20回くらい? 半年で30時間とか効率わるそうだ
そのサイトおもしろいね。関連する授業の図が凝ってる
>>983 一応偏差値60後半程度の国立の情報系だけど、授業でやるのって基本的に教科書
なぞる程度だから、それだけで応用できるかって言ったらまた別問題だよ。
それと1〜2年次でプログラミングの基礎やると思うから、半年ってのは言いすぎ。
東工大か?