【超初心者】くだすれOpenGL2.0【質問用】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
OpenGL使いが優しくコメントを返しますが、
お礼はOpenGLの布教と初心者の救済をお願いします。

OpenGL・Home・Page
http://www.opengl.org/
2デフォルトの名無しさん:2007/09/24(月) 12:01:13
糞スレで2ゲット!!!!!!!!!!!!!!!!
3デフォルトの名無しさん:2007/09/24(月) 12:18:10
4デフォルトの名無しさん:2007/09/24(月) 12:18:44
>>1
死ね!

くだすれOpenGL(超初心者用)
http://pc11.2ch.net/test/read.cgi/tech/1131208166/
5デフォルトの名無しさん:2007/09/24(月) 13:27:40
糞スレ立てんなカス
6デフォルトの名無しさん:2007/09/24(月) 14:18:47
継続意見のほうが多かったじゃんw
荒らすなよボケ
7デフォルトの名無しさん:2007/09/24(月) 16:28:13
>4の目的がわからないwww

ただ、スレタイにopengl2.0と入っているのはちょっとどうかと思う
まあ、
乙!
8デフォルトの名無しさん:2007/09/24(月) 17:22:21
このスレ名はひどい
9デフォルトの名無しさん:2007/09/24(月) 17:53:22
2.0はどうかと思・・・
でも乙乙>>1
10デフォルトの名無しさん:2007/09/26(水) 22:15:30
浮動小数のテクスチャってどうやったら使えるんですか?
GLSLで使いたいです
11デフォルトの名無しさん:2007/09/26(水) 23:25:57
12デフォルトの名無しさん:2007/09/27(木) 17:45:18
「GLUTによる「手抜き」OpenGL入門」を読み終えて、だいたい理解できました。
次は何をやったらいいでしょうか?
いまいち何が不足しているのかわかりません。
参考書籍やウェブサイトも教えていただけると嬉しいです。
大学2年生で、実行環境はCygwinです。
13デフォルトの名無しさん:2007/09/27(木) 17:55:07
何かを作る。その過程でいろいろ覚える。
作りたいものがなければ、知識も身に付かないしやる気もおきないと思うよ。
1412:2007/09/27(木) 18:32:38
>>13
目標ですが何にしたらいいかわかりません。
どの程度なら丁度良いのか漠然としすぎていて。
まだまだ基本中の基本しか出来ていないと思います。
いろいろサイトを見てプログラムを真似していくのも一つの手かなと思いますが。
15デフォルトの名無しさん:2007/09/27(木) 19:00:19
目的があって、それを実現するための手段がGLUTじゃないのかなあ。
まあ、ただ何となく勉強しましたってのもありだと思うけど。
16デフォルトの名無しさん:2007/09/27(木) 19:11:20
プログラミング自体何かを実現する為の道具だからね。
17デフォルトの名無しさん:2007/09/27(木) 23:46:58
>>14
次のステップとしてここらが参考になると思う。

http://marina.sys.wakayama-u.ac.jp/~tokoi/?blogcategory=OpenGL
http://nehe.gamedev.net/

この本は買うべき。絶対元は取れる。
http://www.amazon.co.jp/OpenGLプログラミングガイド-原著第5版-OpenGL策定委員会/dp/4894717239
第5版を買うように!これ以前の版は内容がかなり古い。
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です
20デフォルトの名無しさん:2007/09/28(金) 12:27:43
どんなエラーよ?
21デフォルトの名無しさん:2007/09/28(金) 17:46:04
2のn乗かなにかじゃないと駄目
22デフォルトの名無しさん:2007/09/28(金) 18:01:07
>>21
もともと2のn乗サイズじゃなくて動いてるらしいから関係なくね?
ARB_texture_non_power_of_twoがあるか2.0以上なら問題無い
23デフォルトの名無しさん:2007/09/28(金) 18:04:37
やってみる価値はある
24デフォルトの名無しさん:2007/09/28(金) 22:12:11
>>18
GL_MAX_TEXTURE_SIZE 4096 でRGBなら
実際のサイズは、4096*4096 / 3 のルートの 2365 が上限
だと思ったが・・・違ったっけ?
25デフォルトの名無しさん:2007/09/28(金) 23:06:31
>>24
そんな半端なわけが・・
26デフォルトの名無しさん:2007/09/28(金) 23:32:32
>>25
確かに半端だが、GL_MAX_TEXTURE_SIZE は1テクセルあたり8bitの場合の数値なので、
たとえばRGBA8bitだったら、実際に使用できるのは、テクセル数で1/4になる。
最大サイズがどうなるかは、知らん。適当にルートになると思ってた。
誰か実験してくれ。
27デフォルトの名無しさん:2007/09/29(土) 00:05:43
>>26
赤本を確認したがGL_MAX_TEXTURE_SIZEが1テクセルあたり8bit云々ってのは無かったな
フォーマットの違いを気にしないから、容量がでかいフォーマットだとメモリ足りんかもしれないから気をつけてみたいなことは書いてあったけど

しかしどんなエラーが出てるのか分からないとテクスチャのサイズが問題なのかどうかも分からんな
28:2007/09/29(土) 00:35:07
すいません!!エラーは単純なミスでした。
あと、GL_MAX_TEXTURE_SIZEが4096のときに
4枚のテクスチャを処理するときって
4枚とも4096*4096サイズ(RGB)までいけるってことですかね??
29デフォルトの名無しさん:2007/09/29(土) 06:52:07
>>27
ごめん。ちょっとうろ覚えで適当に書いてた。
あらためて調べてみたが、
OpenGLプログラミングガイド-原著第5版の p363 下部の
GL_MAX_TEXTURE_SIZEによる問い合わせは〜のくだりとか
http://chihara.naist.jp/people/STAFF/imura/computer/OpenGL/texture_speed_test/disp_content
辺りを見ると、どう解釈していいのかよくわからない。
3029:2007/09/29(土) 06:55:20
>>28
texture size 適当に変えて、上限が実際のところどうなってるか試してくんない?


眠い・・・
31デフォルトの名無しさん:2007/09/29(土) 12:20:02
速度や容量とか、それこそドライバ依存なんじゃないの
32:2007/09/29(土) 17:34:14
どうやらいけそうです!!
何度もすいませんが、最後の質問させてください。
GL_MAX_TEXTURE_SIZEの変更はできますかね??
4096から増やしたいんですが・・
33デフォルトの名無しさん:2007/09/29(土) 20:01:17
できないよ。その値はGPUが扱えるテクスチャの最大解像度だから。
4K以上のテクスチャを扱いたいなら、複数のポリゴンに貼って並べるのが普通。
34:2007/09/30(日) 06:25:10
ありがとうございます。
35デフォルトの名無しさん:2007/10/01(月) 13:16:41
 最近OpenGLを使い始めたばかりの初心者ですが、なんとか頑張ってモデリングツールのようなものを作ってみたいと思っています。そこで質問なのですが、

・3Dモデルをスクリーン上に変換した後の頂点の座標をGLの関数かなにかで取得することはできないのでしょうか?
・GLUquadricで生成した球や円柱などから頂点配列やインデックス配列を取得することはできないのでしょうか?

 どなたか教えて下さい。
36デフォルトの名無しさん:2007/10/01(月) 16:08:20
・gluProjectでできるんじゃないかな
・知らない
37デフォルトの名無しさん:2007/10/01(月) 22:50:10
2365なんて2の累乗じゃない半端な数値が最大テクスチャサイズのはずはないだろう
各色32bitのfloatだったらもっと少なくなっちゃうジャン
3835: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)するのを忘れないように)
41デフォルトの名無しさん:2007/10/02(火) 22:35:56
>>35
二番目
OpenGLのコールをフックするライブラリを描いてやればおk
でもスタブを書くのがめんどくちゃい
4239:2007/10/03(水) 08:18:19
>>40
それらの使い方はわかったのですが
法線ベクトルの配列での扱い方で詰まりました
Vertexの場合は頂点座標を8個用意して各面を描画する為にさらに6つの配列でglDrawElements()の第4引数に使用していて、色も頂点の数だけ用意して対応したのですが
法線ベクトルはわからなくて悩んでいますorz
正確には色も頂点にしか対応してないので各面を別の色で描画出来たらと思っているのですが…
43デフォルトの名無しさん:2007/10/03(水) 08:30:36
>>39
当然法線ベクトルも頂点の数だけ用意する。
39はそれまでのやりかたがOpenGLがステートマシンだから機能したってことの
理解がいまいちあやしそう。
44デフォルトの名無しさん:2007/10/03(水) 11:47:53
>>42
座標が同じでも、色や法線が異なる場合は、別の頂点だと考える
各面の色が別々なサイコロを描くには、24頂点が必要
45デフォルトの名無しさん:2007/10/03(水) 14:24:32
頂点や色や法線の配列に対して別々のインデクスを指定できる拡張があったような気がするんだけど
名前が思い出せないorz
4639:2007/10/03(水) 18:41:27
アドバイスありがとうございます
法線ベクトル用に頂点を24個用意して試したところイマイチうまくいかず、頂点座標も8個から24個に増やして試したら無事正常に描画する事が出来ました

ひとまず結果オーライなのだけど頂点座標が8個だとうまく法線ベクトルが引けない理屈がよくわかりません…
俺はもしかしたらとんでもない勘違いをしていたのかもしれない…!
47デフォルトの名無しさん:2007/10/03(水) 19:08:29
頂点っていうのは、座標+法線+色+テクスチャ座標で1組のデータになる。

glDrawElements が i 番目の頂点を参照するときは、
頂点配列の i 個めの座標と、
法線配列の i 個めの法線と、
色配列の i 個めの色と、
テクスチャ座標配列の i 個めのテクスチャ座標を、
1組の頂点データとして取り出す。

つまり頂点配列、色配列、法線配列、テクスチャ座標配列はすべて同数の要素が必要。

頂点座標と法線ベクトルの対応関係を指定した覚えないだろ?
48デフォルトの名無しさん:2007/10/03(水) 20:00:56
技術とは関係ないのですがOpenGLは現在、何の用途で使われることが多いのでしょうか?
DirectXはゲームとかで聞くのですが、GLはあまり聞かないので。
49デフォルトの名無しさん:2007/10/03(水) 21:05:54
idとその周辺のはOpenGLじゃないの?
てかDirectXついてねーし。
50デフォルトの名無しさん:2007/10/03(水) 21:25:07
>>48
Windows以外は大体OpenGL(とかES)
51デフォルトの名無しさん:2007/10/03(水) 21:38:24
仕事とかでGL使ってる奴いる?
どんなところに就職してるんだ?
52デフォルトの名無しさん:2007/10/03(水) 22:29:06
ノシ
仕事は広告関係
53デフォルトの名無しさん:2007/10/04(木) 00:12:23
ノシ
SGI
54デフォルトの名無しさん:2007/10/04(木) 00:26:28
>53
ちょっw
なんでこんなところにいるwww
55デフォルトの名無しさん:2007/10/04(木) 01:18:44
ノシ
零細ソフトウェア会社
56デフォルトの名無しさん:2007/10/04(木) 13:37:47
>>48
ゲームで使ってます。
しかし、算術演算ライブラリとか整備してくると、正直DirectXで言い気がしたw
57デフォルトの名無しさん:2007/10/06(土) 02:04:02
ノシ
げーむや
58デフォルトの名無しさん:2007/10/06(土) 07:46:18
ノシ
無名CAD屋
59デフォルトの名無しさん:2007/10/06(土) 20:56:06
ノシ
研究でGPGPU
60デフォルトの名無しさん:2007/10/08(月) 21:15:21
学生だけどGPGPU
K平均法を高速化しなきゃならなくて英語の論文見っけて碌に読まずに手を出したが、
2ヶ月浪費した後でよく読んでみると高速化できたのは別のクラスタリングという結論に読めるなぁハハハ
61デフォルトの名無しさん:2007/10/09(火) 10:55:47
ノシ げーむ屋
62デフォルトの名無しさん:2007/10/09(火) 11:25:12
ノシ Webアプリ屋 (OpenGLは趣味プログラミングで)
63デフォルトの名無しさん:2007/10/10(水) 20:34:59
glPushMatrix();
glPopMatrix();

この組み合わせが何をやっているのかイメージできません…
どなたかわかりやすく教えていただけませんか
64デフォルトの名無しさん:2007/10/10(水) 21:28:25
今使ってる行列をどこかに取っておく
さっき取っておいた行列を持ってくる

「スタック」って言葉は知ってるかな?
やってることは、まさにそれなんだけど。
65デフォルトの名無しさん:2007/10/10(水) 21:29:33
66デフォルトの名無しさん:2007/10/10(水) 21:53:15
検索したらそれが当たって、図でも説明されているので意図はわかるのですが

その行列がglMatrixMode(GL_MODELVIEW);といったモデルビューの単位なのか
glMatrixMode(GL_MODELVIEW);に掛け合わせたglrotateといった類のものなのかがわからなくて


よくわからなくなってるのですが、「今使っている行列」がどこを指すのかわかってなくて
67デフォルトの名無しさん:2007/10/10(水) 22:14:28
OpenGL には、行列が3つある。 GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE
glMatrixMode は、どの行列を操作するかを切り替える。
glMatrixMode で設定した、操作する対象の行列が、今使ってる行列。

glRotate は、今使ってる行列を回転させて、新たな今使ってる行列にする。 古い行列は捨て去る。
C言語的に書くと
今使ってる行列 = 今使ってる行列 * 回転行列;
みたいな感じ。
glTranslate とか glScale とかも一緒。
みんな今使ってる行列を変化させる。
だから、今使ってる行列っていったら、それしかない。

glPushMatrix は、今使ってる行列をスタックに保存しておく。
glPopMatrix は、保存したものを取ってきて今使ってる行列に戻す。

おk?
68デフォルトの名無しさん:2007/10/10(水) 22:28:11
つまり
glMatrixMode(GL_MODELVIEW);
回転行列
glPushMatrix();
glMatrixMode(GL_TEXTURE);
拡大行列
glPopMatrix();

という風になった場合、popの後は
MODELVIEWで回転されてる状態、ということですか?

ようやく、頭の中が整理されてきました。
回転行列とかをスタックにぶち込むものとか考えてしまって

ありがとうございます!ばっちり、すっきり、ニッコリです!
69デフォルトの名無しさん:2007/10/10(水) 22:55:16
いや、説明不足ですまんが、 glPushMatrix/glPopMatrix は glMatrixMode まで保存/復元したりはしない。
glMatrixMode はそのままで、現在の行列を保存/復元するだけ。
スタックも行列の種類ごとに別々にある。
つまり MODELVIEW 行列用のスタックと、PROJECTION 行列用のスタックと、TEXTURE 行列用のスタックがある。

>>68 の例でいくと、
glPushMatrix は回転した MODELVIEW 行列を 「MODELVIEW 行列用のスタック」 に保存する。
glPopMatrix は 「TEXTURE 行列用のスタック」 から TEXTURE 行列を取り出す。
70デフォルトの名無しさん:2007/10/10(水) 22:57:08
>>68
いや、その、なんだ、全然違ってるぞw

それだと、最初の状態と比べて
 ・MODELVIEW行列は回転してる
 ・かつその回転した行列がMODELVIEW行列スタックに一段積まれた
 ・TEXTURE行列は拡大した
 ・しかしその拡大した行列はTEXTURE行列スタックから取り出した行列で上書きされた
 ・MatrixModeはTEXTUREになった
ちなみに上のシーケンスをTEXTURE行列スタックが空の状態でやると、GLエラーが起こる。

行列スタックは、MatrixModeごとに別のスタックが用意されてるんよ。
スタックに保存できる行列の個数もそれぞれ違う。

・・・って69の書き込みの方が早かったか。でもいいや送信エイ
71デフォルトの名無しさん:2007/10/10(水) 23:16:45
>>69-70さん
ありがとうございます

つまり
model tex projec
|| || ||
|| || ||
  ̄   ̄    ̄
みたいなスタックがあって、それごとに別々に保存されていて

glPushをすると、今のモードで弄くってる行列が保存されて
glPopをすると、スタックからそのモードの行列を取り出して「上書き」する、ということですね
上書き、ということはpopする前の行列はあまり意味がないのかな…

なんとかスッキリしてきたのでソースをちゃんと読むことができそうです


それとは別に、今メモリ(テクスチャ?)が解放されなくて
glutPostRedisplay();をするたびにメモリが増加していく現象が発生して悩まされています…
72デフォルトの名無しさん:2007/10/10(水) 23:28:06
popする前の行列は、それを使って何か別のことをするんでしょ。
何にも使わないんなら、そりゃ意味はない。
73デフォルトの名無しさん:2007/10/10(水) 23:33:51
>>71 今メモリ(テクスチャ?)が解放されなくて
毎フレームglGenTextures&glBindTextureしちゃってるとか?
てか先にGL以外の部分を疑った方がいい気もするけど
74デフォルトの名無しさん:2007/10/10(水) 23:51:55
>>72さん
おっしゃるとおりです。
popの前にモードを変えて、何かするのが普通なのですよね。

>>73さん
毎フレームglGenTextures&glBindTextureは以前やってしまったのでそこは注意してました
init的な初期設定のところでテクスチャを読み込んでいるので大丈夫だと思います。


どうも色々見てみたのですが、手本にしたサンプルでも同様の現象が出るみたいです。
75デフォルトの名無しさん:2007/10/10(水) 23:57:22
>>74
小さいソースならどっかにうp
76デフォルトの名無しさん:2007/10/11(木) 00:02:41
すいません…はじめに言っておけばよかったのですが

行列もわかっていない身のくせにCgを使っているので
長いソースになってしまっています。

どうもCgでアニメをさせると徐々にメモリが増えていってしまうみたいです
77デフォルトの名無しさん:2007/10/11(木) 00:04:12
/(^o^)\ナンテコッタイ
78デフォルトの名無しさん:2007/10/11(木) 00:12:23
理由は分からないんだけど、どう考えてもメモリリークなんて起こらない
(トライアングルを一枚くるくる回してるだけの)プログラムで、SwapBuffersするたびに
メモリが少しずつ増えてく現象に悩まされた事があったなァ・・・。
で、数十KBだか数百KBだかメモリが増えた時点で、メモリ消費の増加が止まるんだこれが。
わけがわからん。

10分くらい動かしてみて、メモリ増加が止まるんなら気にしなくていいんじゃない??
(ちなみに、nVIDIAのボードだった)
79デフォルトの名無しさん:2007/10/11(木) 00:22:11
>>78さん
サンプルを動かしているとまさしくその状態です。
あるところで止まるのですが
自作のものでFPSを表示させていると止まらなくなってしまっていて
450MBから初めて780MB 最悪1GBまでメモリが増えていっています。

>保持しているテクスチャデータのサイズがグラフィクスメモリの容量を超える場合,
>テクスチャデータはメインメモリーに格納され, テクスチャは描画に使われる度にグラフィ
>クスカードに転送される.

論文でこういうのを見つけたのですが、小さいテクスチャで試しても増加するみたいです
ATIのせいかと思っていたのですがnvidiaもそうなのですね
80デフォルトの名無しさん:2007/10/11(木) 00:22:19
Cgはバグ持ちの駄目な子だけどメモリリークには遭遇したことないな
ループ毎にオブジェクト生成とかやってるんじゃ?
81デフォルトの名無しさん:2007/10/11(木) 00:32:57
>>79
状況がよくわかんないな
ATIのグラボでCg動かしてるの???
ソース見ないと確かなことは言えないが
450MBから始まって1GBまでいっちゃうのは
常識的に考えてプログラムミスだと思うぞw
82デフォルトの名無しさん:2007/10/11(木) 00:39:29
少しソースのチェックしてきます orz

もしよろしかったらCgのサンプルの
07_two_texture_accesses でアニメーションしたときのメモリの様子を見ていただけませんか?
私の環境だとこのサンプルでも増加していってしまって
538MB→560MBで増加中という…

83デフォルトの名無しさん:2007/10/11(木) 00:45:48
2007sepに入ってた実行ファイルをそのまま動かしたけど19Mから増えないな

XpHome,GF7800GTX,163.71_forceware_winxp_32bit
84デフォルトの名無しさん:2007/10/11(木) 00:52:27
ソースを見て怪しいところをコメントアウトしても増加が止まらず…

サンプルを動かしてみて473→500 増加中です。
Win2k ATI RadeonXpress200(128MB) 32bit Athron64 メモリ1GBでした。

オンボードGPUでATIというのが原因なのかもしれません。。。
85デフォルトの名無しさん:2007/10/11(木) 01:03:33
ドライバ最新でその状態ならちゃんとVRAM載ってるグラボか
デスクトップマシン買った方がいいんじゃないかな

ソース見たけど少なくともCgはメモリリークの原因じゃないよ
86デフォルトの名無しさん:2007/10/11(木) 01:05:48
ああ他にglslかDirect3Dに乗り換えるって選択肢もあった
87デフォルトの名無しさん:2007/10/11(木) 01:07:27
さらに書き忘れ
とりあえずglsl乗り換えをお勧めしておくよ
88デフォルトの名無しさん:2007/10/12(金) 19:31:07
板と視点の角度によって違うテクスチャを貼りたいのですが、
どうしたらいいですか?光源とかは使っていません。
どなたか教えてください。

※つまり、板の、ある場所(座標)から視点へのベクトルによって
テクスチャを変えたいということです。
89デフォルトの名無しさん:2007/10/12(金) 23:03:20
視線ベクトルの値によって、読み込むテクスチャを変えたらいいんでないの?

switchとかelse ifで
settexture( vec );

みたいな関数を作って、テクスチャセットとか。

90デフォルトの名無しさん:2007/10/12(金) 23:12:41
>>88
GLSLが使えるなら、話は簡単。
使えないなら、プログラム書いていちいちやるしかないかなぁ・・・。

視点からの距離が一定なのならミップマップを利用できるカナ、とかも思ったけど。w
9188:2007/10/12(金) 23:42:28
視線ベクトルの値ってどうやって得るんですか?
GL_nomal?みたいなのがあるんですか?

一応、GLSLを使っています。(使えているかは別ですが)
92デフォルトの名無しさん:2007/10/12(金) 23:52:37
>>91
眼点座標系の視点位置は(0, 0, 0)
でおk?
9388:2007/10/14(日) 00:46:13
てことは、オブジェクトの座標が視点ベクトルになる
ことですね!
ありがとうございます!とりあえずがんばってやってみます!
94デフォルトの名無しさん:2007/10/14(日) 02:59:41
>>93
固定関数はそうなるけど…
Cgやgglslは本人次第というかなんというか…
95デフォルトの名無しさん:2007/10/14(日) 11:43:15
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/5227/note/GLTest.lzh
こちらのソースのようにテクスチャに描いたものを映すということをしたいのですが
映したい対象が3次元テクスチャです

そうなったときにteximage3dとかにしても、上手くモノが映し出されません
こういうばあいはどうやるのでしょうか
96デフォルトの名無しさん:2007/10/14(日) 11:56:50
3次元テクスチャの意味を本当に理解しているのか、と思うが
実際に何をどうしてみた?
97デフォルトの名無しさん:2007/10/14(日) 12:12:46
3次元テクスチャでサンプルのようなサイコロ状のデータを作成して
それをテクスチャとして読み込んで、同じように-1〜1の平面に投影しようとしました

texture2Dの部分を単純に全部3Dにしてマッピングできるかと思っていたのですが
98デフォルトの名無しさん:2007/10/14(日) 12:38:41
>>95
どうでもいいけど、そのサンプルはinit()内でスタック破壊してるね。大丈夫かいな。

で、95と97を何度読んでもイマイチ意味が分からない・・・。
とりあえず適当にいくつか挙げてみる。
・3Dテクスチャのデータはどう作ってどう転送したの?
・ちゃんとglEnable(GL_TEXTURE_3D);してる? (2Dじゃないよ)
・3Dテクスチャのテクスチャ座標は当然3次元なんだけど、ちゃんとglTexCoord3?();使ってる?

てなとこでしょうか。
99デフォルトの名無しさん:2007/10/14(日) 14:38:44
>>97
人にわかるように説明できないならソースうpれ
100デフォルトの名無しさん:2007/10/14(日) 20:14:39
>>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");
で呼び出しています。

急に体調が悪くなって今まで横になっていました。レスしてもらっていたのにすみません
101デフォルトの名無しさん:2007/10/14(日) 20:45:03
要するにボリュームレンダリングをしたいってことか?
102デフォルトの名無しさん:2007/10/14(日) 20:48:42
ボリュームレンダリングというよりも
平面にモノを投影するほうがメインです

3次元形状をテクスチャで扱っていきたいのでやっているのですが
出だしでつまづきました

103デフォルトの名無しさん:2007/10/14(日) 21:31:54
100の言ってる事をそのままに受けとると、
CPUなりGPUなりでレイキャスティングするしかないと思うんだけど・・・。

>>102
>ボリュームレンダリングというよりも
>平面にモノを投影するほうがメインです
ボリュームレンダリングしたものをテクスチャにして貼ればいいんじゃないの?
95の「こちらのソースのように」ってのはそういう意味じゃなかったの??


104デフォルトの名無しさん:2007/10/14(日) 21:53:23
で、えーと想像してみるに95さんは、3Dテクスチャを使えば
  ボリュームデータをある方向から見た様子が描画できる
と思ってるのかな?

だとしたら大きな勘違い。

  一つのフラグメントに対して適用されるテクスチャのサンプル点は一つ
でしかない(マルチテクスチャやGLSLを使わない場合)んだから、
ボリュームデータをボリュームっぽく見せるためには
  重描きする か レイキャスティングするか
のどっちかしかないよ。
3Dテクスチャが魔法のように問題を解決してくれるわけじゃない。

あと一番大切な事は、元気に楽しく暮らす事だと思うので
無理せずお体をお大事に。
105デフォルトの名無しさん:2007/10/14(日) 21:54:49
>ボリュームレンダリングしたものをテクスチャにして貼る

それをやろうとして「テクスチャにする」という部分と
「貼る」という部分
でつっかかっていました。
106デフォルトの名無しさん:2007/10/14(日) 22:02:29
>>104さん、お気遣いありがとうございます
どうにかコレを片付けて、早目に休めるようにします
107デフォルトの名無しさん:2007/10/14(日) 22:04:16
>>105
「テクスチャにする」も
「貼る」も
95のサンプルで既にできているのでは???
108デフォルトの名無しさん:2007/10/15(月) 10:34:11
質問させてください。
例えば、イタリアの国旗のようなテクスチャがあったとき、
国旗の緑、白、赤のなかの、
緑と赤の部分をくっつけてテクスチャマッピングする
ってことはできますか?
また、そのテクスチャと元の国旗テクスチャとのマルチテクスチャ
はできますか??ちなみにマルチテクスチャはシェーダで行う予定です。
109デフォルトの名無しさん:2007/10/15(月) 22:40:08
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しか使えないのでは・・?
110109:2007/10/15(月) 22:41:05
思いっきり誤爆した・・・
111デフォルトの名無しさん:2007/10/15(月) 22:42:47
>>109
俺もウェーブレットやろうとしてる
というかpyramid見てるあたりが同じすぎる

ウェーブレットのわかりやすいサイトとかサンプルソース見せてくれー頼むー
112デフォルトの名無しさん:2007/10/15(月) 23:27:51
>>108
できるヨ
テクスチャ座標を(例えば)-0.5〜0.5とかの範囲で使えばいい
0〜1の範囲を超えるテクスチャの扱いは、glTexParameterのGL_TEXTURE_WRAP_?を参照のこと
113108:2007/10/16(火) 09:24:05
>>112
回答ありがとうございます。なんとかできそうなのですが、
ちなみに、もし緑、白、赤、黒、黄のなかの
緑、赤、黄をくっつけるときはどうすればいいのでしょうか??
114デフォルトの名無しさん:2007/10/16(火) 10:45:02
>113
普通にやるなら、ポリゴンを分割しないとダメ
だけどシェーダ使うならテクスチャ座標を適当に指定すればいいっしょ
115113:2007/10/16(火) 17:02:36
ポリゴンを分割する方法にしようかと思うんですが、
glCallListについて質問があります。
Listに登録するときに、頂点座標を1つ1つ変えて登録するのと、
1つの頂点(形状)を登録して、translateで呼び出すのとでは
どちらがいい(もしくは高速)のでしょうか??

それぞれの板に違うテクスチャをマッピングする予定です。(113をやりたい)
ちなみにポリゴンは50〜100ぐらい作る予定です。
116デフォルトの名無しさん:2007/10/16(火) 18:01:26
>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);
}
という感じですが、もしかしてテクスチャマップするとなると
前者の方でテクスチャ座標指定等も一緒に登録するしかないですか??
118デフォルトの名無しさん:2007/10/16(火) 19:26:41
テクスチャ座標を自動生成にすると
各頂点座標がそのままテクスチャ座標になるという理解でよいのでしょうか?

仮に、そうだとした場合
glVertex3f(30.f, 30.f, 30.f)
とかだと大幅にテクスチャ座標の範囲(0〜1)と大きくずれますよね?
119デフォルトの名無しさん:2007/10/16(火) 19:41:27
ポリゴンに色が着かなくなったんですが、
どんな原因が考えられますか???
120デフォルトの名無しさん:2007/10/16(火) 19:47:49
>>118
テクスチャ座標は自動生成はせず、別で指定する予定です。
そもそもテクスチャ座標の自動生成を使ってないんですが、
テクスチャ座標を自動生成にすると
各頂点座標がそのままテクスチャ座標になるんですか??
121デフォルトの名無しさん:2007/10/16(火) 21:32:21
>>119
lightを付けてる。
122デフォルトの名無しさん:2007/10/16(火) 22:31:32
>>117
全部の頂点に同じテクスチャ座標を使う場合は、ディスプレイリストに含めないでおけば外部から指定することができる
でもそんな使い方はありえないので、普通はテクスチャ座標も一緒にディスプレイリストに含めることになる
テクスチャ座標は最終的にテクスチャ行列で変換されるので、ディスプレイリストに含めててもテクスチャ行列を操作すれば拡大縮小・回転・平行移動して投影範囲を調節するくらいならできる

>>118,120
自動生成にもいろいろモードがあるが、まぁ GL_OBJECT_LINEAR だとして
各頂点座標そのままじゃなく、変換行列をかけてからテクスチャ座標になる
さらにそのテクスチャ座標がテクスチャ行列でもう一度変換される
だから拡大縮小・回転・平行移動して範囲を調節することくらいは出来る
123120:2007/10/16(火) 23:01:05
回答ありがとうございます。
テクスチャ座標も一緒にディスプレイリストに含める形で
いこうと思います。
124デフォルトの名無しさん:2007/10/17(水) 17:57:43
>>122
テクスチャ座標(0〜0.5)をディスプレイリストに含めたとき、
描画するときに0.1〜0.2のテクスチャ座標で描画するってできます?
どうしたらいいですか?
テクスチャ行列の操作でできることですか??
125デフォルトの名無しさん:2007/10/17(水) 23:03:52
これでどうかな
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
できました!ありがとうございます!
127デフォルトの名無しさん:2007/10/19(金) 14:04:23
質問です
テクスチャ座標でも
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度で…と設定したのですよね?

こういう設定をしないときのデフォルトのテクスチャ座標上での「視点」なんてものが存在するのでしょうか
128デフォルトの名無しさん:2007/10/19(金) 14:18:44
gluPerspective も gluLookAt も変換行列を設定するだけ
テクスチャ座標は行列に従って変換されるだけ
何も設定してなければ与えたテクスチャ座標がそのまま使われるだけ
テクスチャ座標に視点とか考えてもムダ

まぁシャドウマッピングをしたいんなら話は別だが
129デフォルトの名無しさん:2007/10/19(金) 14:44:02
>何も設定してなければ与えたテクスチャ座標がそのまま使われるだけ
そのまま、というのは0〜1の間にあるテクスチャが
そのまま対応したところにマッピングされるということですか?

gluPerspectiveやgluLookAtが入ってくると0〜1のが
なんかウニョウニョ変換されて貼り付けられる、と。

>まぁシャドウマッピングをしたいんなら話は別だが
やりたいと思ってることです。
130デフォルトの名無しさん:2007/10/19(金) 15:17:24
>そのまま対応したところにマッピングされるということですか?

そう
glTexCoord2f とかで指定した座標は、テクスチャ行列で変換されてから使われるが、初期状態ではテクスチャ行列は単位行列なので、何も変わらずにそのままの座標でマッピングされる
>>125 みたいにすればテクスチャ座標を拡大したり平行移動したりできる

>なんかウニョウニョ変換されて貼り付けられる、と。 

具体的には↓のページに書いてあるような行列になる
http://pyopengl.sourceforge.net/documentation/manual/gluLookAt.3G.html
http://pyopengl.sourceforge.net/documentation/manual/gluPerspective.3G.html

自前で同じ行列を計算して設定してやっても同じ効果が得られるから、gluXxxを使う必要は必ずしもない
シャドウマッピングの前にもう少し座標変換あたりの理解を深めた方がいいかもな (テクスチャじゃなくて普通の頂点座標のね)
どっかからサンプルを拾ってきてコピペするだけなら別に理解する必要もないけれど
131デフォルトの名無しさん:2007/10/19(金) 23:05:31
くだらないことなのですが
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);

としたのですが、見え方が初期状態と違ってしまいます。
初期状態の視点について教えてください。
132デフォルトの名無しさん:2007/10/19(金) 23:24:11
つ gluLookAtのパラメータをチェック
133デフォルトの名無しさん:2007/10/20(土) 01:14:54
間違えました
glTranslatef(0.0,0.0,-0.5);です

gluLookAtのパラメータは 視点 視線先 上下ですよね?
これで同じになると思ってたのですが。。。
134デフォルトの名無しさん:2007/10/20(土) 02:42:24
>>133
つ gluLookAtのパラメータをチェック
135132: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);
とかにして、視点と視線先をずらさないと。
136デフォルトの名無しさん:2007/10/20(土) 16:16:26
すみません、間違っていました
訂正したのですが、今度は表示されなかったりしてます
137デフォルトの名無しさん:2007/10/20(土) 16:46:39
訂正の仕方が悪いか、他のところが悪いかだな

エスパーしてみると、glMatrixMode を元に戻してないんじゃないか
138デフォルトの名無しさん:2007/10/20(土) 17:56:32
OpenGLで高速テクスチャ表示を行う必要があって
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize);
とするとうちの環境ではtextSizeが2048とでました

一般的には色々なPCでハードウェアアクセレーションを
安全に効かせられるテクスチャのサイズはどのくらいなのだろう・・・

現在は512*512でテクスチャを持っていますが640*480以上(または画面サイズ以上)に
対応していないビデオカードで低速になるのでは?とちょっと不安です。
512*256に統一すべきなのだろか・・・
139デフォルトの名無しさん:2007/10/20(土) 21:32:12
void glBlendFunc(GLenum sfactor , GLenum dfactor);
sfactor には新しい色の、dfactor には現在の色の計算方法を指定します

この、新しい色、と現在の色という意味が、
いろいろ変えてみてもよくわからないので教えてください。
140デフォルトの名無しさん:2007/10/20(土) 21:51:17
>>138
詳しくは知らないが、512*512くらいの大きさなら心配ないんじゃないかな。

>>139
いろいろやるとこんがらがるので、とりあえず
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
でどうなるかをみて、その後GL_ZEROとGL_ONEを試すと
いいと思うよ。
141デフォルトの名無しさん:2007/10/20(土) 22:46:37
>>138
保証はできないけど、512x512ならまず大丈夫だよ。
画面サイズとテクスチャサイズは何の関係もないので、512x256にしても意味ないよ。
ちなみに規格で保証されてるのは64x64だけどね。

>>139
「新しい色」ってのは、パイプラインを通り抜けてきたフラグメントの色、
「現在の色」ってのは、フレームバッファのピクセルの色だよ。
OpenGLの日本語訳はイマイチなのが多いよね。
142デフォルトの名無しさん:2007/10/21(日) 21:34:51
DirextXも10以降はデバイスロストを気にしなくて良くなってるみたいですが
OpenGLでデバイスロストが発生しないのは何故ですか?
143デフォルトの名無しさん:2007/10/21(日) 23:47:53
>>140 >>141
thxです!
もしものときは読み込んだ後、プログラム側で縮小とUVの調整をすればよさそうですし、512*512で行くことにします。
144デフォルトの名無しさん:2007/10/22(月) 12:30:40
>>142
ドライバが頑張ってるからだよ
145デフォルトの名無しさん:2007/10/22(月) 17:49:52
最近OpenGL始めまして、まだまだ全然わからないのですが、

glDrawElementsを使う時にアンビエントなどマテリアルは
どうやって設定すればいいでしょうか?
146デフォルトの名無しさん:2007/10/22(月) 19:19:37
glDrawElementsを使わない時にアンビエントなどマテリアルを設定する方法と一緒
147デフォルトの名無しさん:2007/10/22(月) 19:44:34
>>144
OpenGLの方がハードに合わせることが出来るっていうやつですか、なるほど
148デフォルトの名無しさん:2007/10/23(火) 14:59:14
>>146
ありがとうございます。

glBegin(GL_TRIANGLES);
アンビエントとディフューズの設定
glVertex3f(頂点A);
glVertex3f(頂点B);
glVertex3f(頂点C);
glEnd();

という処理をfor文で複数回行い、
面一枚一枚に対して設定していたのですが、
glDrawElementsを使う時に、
各面に設定するにはどうすればいいでしょうか?
149デフォルトの名無しさん:2007/10/23(火) 16:44:02
それなら GL_COLOR_MATERIAL を有効にして glColorPointer で設定すればいいんじゃないかな
150デフォルトの名無しさん:2007/10/23(火) 17:06:25
>>149
glColorPointerというのはアンビエントやディフューズと
同意義のものなのでしょうか?
151デフォルトの名無しさん:2007/10/23(火) 17:27:16
glDrawElements 使おうってのに glColorPointer わかりませんってのはちょっと。
もしかしなくても glDrawElements 自体わかってなかったりするか?
152デフォルトの名無しさん:2007/10/23(火) 17:43:33
>>151
glDrawElements自体は分かります。
プリミティブを構成しての描画ということは分かりますが、
頂点情報の他にどの情報が使えるかが分からないです。

glColorPointerで設定するのはglColor3fのようなものでしょうか?
それともglMaterialfのようなものなのでしょうか?
そこらへんがよく分かってなかったりします。
153デフォルトの名無しさん:2007/10/23(火) 17:50:04
今試してみたのですがベタ塗りの色が出ました。
アンビエントやディフューズをせっていするには
GL_COLOR_MATERIALを有効にする以外に
何か設定しなければいけないのでしょうか?
154デフォルトの名無しさん:2007/10/23(火) 18:04:11
glColorPointer は glColor3f のようなもの。
ただし GL_COLOR_MATERIAL が有効になってると、glColor3f でマテリアルのアンビエントとディフューズが設定される。

ベタ塗りになるのは、ライティングが有効になってないか、法線情報がないか、色が強すぎるか。
とりあえず GL_LIGHTING を有効にして glNormalPointer で法線を与えてみ。
155デフォルトの名無しさん:2007/10/23(火) 18:16:31
分かりました。試してみます。
ありがとうございます。
156デフォルトの名無しさん:2007/10/23(火) 18:37:52
あー、もしかして単に GL_COLOR_ARRAY を有効にしてないだけとかかもしんない。
157 ◆Y.AUlD3oVM :2007/10/24(水) 04:47:53
ぬwぬ
158デフォルトの名無しさん:2007/10/24(水) 14:57:23
openglを始めたばかりなのですが
3つのポリゴンをglbeginで描いているのですが
そのうち1つだけを平行移動したい場合はどのような処理をすればよいのですか?

glbegin~glend が3つ続いていて
そのひとつに平行移動行列を掛けるというのはわかるのですが
行列関係(GLMATRIXMODE)が難しくて、先に動かして状況だけ見たいと思いまして
159デフォルトの名無しさん:2007/10/24(水) 15:12:53
glPushMatrix と glPopMatrix で囲むのが簡単

glMatrixMode(GL_MODELVIEW);
glBegin〜glEnd
glBegin〜glEnd
glPushMatrix();
平行移動とか回転とか
glBegin〜glEnd
glPopMatrix();
glBegin〜glEnd
glBegin〜glEnd
160デフォルトの名無しさん:2007/10/24(水) 15:42:23
>>159
やってみます!ありがとうございます!
glPushやPopが何なのか難しかったんですがやってみます!
161デフォルトの名無しさん:2007/10/26(金) 12:06:52
>>148できました。ありがとうございます。
glDrawElementsの第4引数に
std::vector<GLushort>で設定した配列を使おうと思うのですが、

「'srd::vector<_Ty>'から'const GLvoid *'に変換できません」

と出ます。どのように指定すればいいのでしょうか?
162デフォルトの名無しさん:2007/10/26(金) 12:14:50
&v[0] でおk
163デフォルトの名無しさん:2007/10/26(金) 13:01:12
>>162
ありがとうございます。
ただ、コンパイルは通りましたが、VCのアサートで止まりました。
vectorファイルの中でのアサートのようで、

if (size() <= _Pos)
{
  DEBUG_ERROR("vector subscript out of range");
  _SCL_SECURE_OUT_OF_RANGE;
}

この箇所だと思われます。
これ以前にresizeでサイズ指定はしているのですが、
この場合何が原因なのでしょうか?
164デフォルトの名無しさん:2007/10/26(金) 13:35:16
>>162
ちゃんとresizeされてないんじゃないかな
直前でsize()取ってみて確認してみたら?
165デフォルトの名無しさん:2007/10/26(金) 13:50:24
>>164
直前でsize()を使い確認したところ、
サイズの指定で間違っていた所が分かりました。

ありがとうございます。
166デフォルトの名無しさん:2007/10/26(金) 14:12:16
なんというC++初心者教室。
167デフォルトの名無しさん:2007/10/26(金) 16:03:39
法線ベクトルからその直交する面を得たいのですが
OpenGLで何かその方法はありませんでしょうか?

入力:法線ベクトルの始点と終点

出力:入力のベクトルの始点若しくは終点を通る
   そのベクトルに直交する面に含まれる座標2つ
168デフォルトの名無しさん:2007/10/26(金) 17:18:36
イメージしづらい…
法線が決まったら、面は自動的に求まるはずだけど

その面から任意の座標は自分で出すしかないんじゃないかな
169デフォルトの名無しさん:2007/10/26(金) 17:36:39
OpenGL以前に数学だろ…
法線が(a, b, c)の場合直交する面は ax+by+cz = 0
これを満たす(x, y, z)の点はどれも直交する面上にあるからあとは好きにして
170デフォルトの名無しさん:2007/10/26(金) 18:02:23
>>169
ax+by+cz+d = 0
でもおk
171デフォルトの名無しさん:2007/10/27(土) 06:21:28
現在openglとC++を勉強中しています
GLUTでウィンドウを作成して表示してるんですが
ウィンドウズアプリケーションのようなメニューや各ボックスなどを付け加えるにはどうしたらいいのでしょうか?
172デフォルトの名無しさん:2007/10/27(土) 11:09:43
GLUI
173デフォルトの名無しさん:2007/10/27(土) 15:20:04
>>171
OpenGLとC++に縛られて良いならQt使えば?
GLUT/UIよりは難しいけど
174デフォルトの名無しさん:2007/10/27(土) 17:38:50
>>173
VisualC++使ってるんですが
普通OpenGL使ってアプリケーション(ウィンドウズアプリケーションのようなメニューが付いてたりボックスが付いてたり)を作る場合
どのように作るんですか?
175デフォルトの名無しさん:2007/10/27(土) 17:50:18
OpenGLのコンテキストを作って
普通のウィンドウに関連付けて使う
wglとかで検索かければそれっぽいの見付かるとおもう
176デフォルトの名無しさん:2007/10/27(土) 18:12:16
>>174
MFCでコントロール配置が主流,最近だとC++/CLIでFormsか

それらの上にOpenGLを乗っけるなら
Win32APIでSetPixelFormatしてフォーマット決めて
wglCreateContextでOpenGLのコンテキストを作る
再描画タイミングでウインドウハンドルからGetDCしてwglMakeCurrentする
後はgl*系の描画コマンド実行して glFlushなりwglSwapBuffersする
GetDCしたらReleaseDCも忘れずに
177デフォルトの名無しさん:2007/10/28(日) 02:21:09
>>174
C++/CLIが実に楽だったよ、VS2005EE無料だしお勧め。
http://tpot.jpn.ph/t-pot/program/127_OpenGLNET/index.html
ここのサンプル参照
178デフォルトの名無しさん:2007/10/28(日) 05:06:47
>>175
コンテキストってのはウィンドウに描画される部分を表すもの?
感覚的に普通のウィンドウにOpenGLの表示ウィンドウを貼り付けるみたいな
そうした場合GLUTでやってた部分を完全にwglでやるようにしなくてはダメですか?
179デフォルトの名無しさん:2007/10/28(日) 05:25:59
>>178
yes,再描画イベントハンドラ内でコンテキストをカレントに設定しちゃえば
初期化と・SwapBuffer以外にGLUTと違いは無い
180デフォルトの名無しさん:2007/10/28(日) 05:39:58
>>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 つの引数が必要です


181デフォルトの名無しさん:2007/10/28(日) 05:42:35
>>179
申し訳ないけどわかんないです
VC++でGLUTしか使ったことないし普通のアプリケーション作ったこともないからよくわからないんだと思うんですが
なんかいいサイトとかないですか?
182デフォルトの名無しさん:2007/10/28(日) 06:27:19
>>180
そいつはサンプルの作者に聞いてくれ
・・・といいたいところだけど、エラーから見て多分サンプルのフォームの整合性がおバグリになられてるっぽいので

Form1.hダブクリ→なんかGUIパーツをダブクリ→リビルドでいけるんじゃないかな
183デフォルトの名無しさん:2007/10/28(日) 15:06:59
今GUIを組みたがってる人と俺は近い感じがする

そういうTIPが欲しいんだろ?
俺も欲しい。探してくれ
184デフォルトの名無しさん:2007/10/28(日) 15:54:26
てかスレちゃんと読んでるのかよw

LINUXやUNIXで動かす必要があるなら
>>172 >>173のいうように
GLUIとかQtとかじゃない?日本語がちょい怪しいらしいけど。

WinでいいならMFCかC++/CLIだぜ
使い方はググりゃでるハズ
http://www.google.co.jp/search?q=MFC+openGL
C++/CLI
http://tpot.jpn.ph/t-pot/program/127_OpenGLNET/index.html
>>176の言っていることも↑のサンプルのソースに書いてある。

いつもはUNIXで開発してるんだけど、ちょっとしたtoolが必要になって
そのときはVS2005EEとC++/CLIで作った
ほとんどソースコード変えずに表示でき、便利なフォームデザイナも利用可。
185デフォルトの名無しさん:2007/10/29(月) 18:30:41
例えば、5個のオブジェクトにそれぞれテクスチャマップしたときに、
vertex-shaderで5個のオブジェクト頂点を
それぞれ得る(アクセスする)ことはできるんですか??
その頂点と視線ベクトルとの角度によって、テクスチャ座標を
いじってテクスチャマップしたいのですが。。
186デフォルトの名無しさん:2007/10/30(火) 00:08:10
>>185
できるよ
187デフォルトの名無しさん:2007/10/30(火) 01:49:57
できるよ、と言って
やり方を言わないのがこの板には多いと思うんだ
188デフォルトの名無しさん:2007/10/30(火) 01:52:58
そりゃできるかどうかが質問されてるから
189デフォルトの名無しさん:2007/10/30(火) 01:59:58
>>185
できるんですかもなにも
それをやるのがまさにvertex shaderの仕事ジャマイカ
190デフォルトの名無しさん:2007/10/30(火) 02:01:37
それって
「あいつのメアド教えて?」
「ごめん、俺あいつの電話番号しかしらないや」
「おめー、番号知ってんならメアドくらい聴いてくれたっていいじゃねぇか」
っていうのと同じじゃん。それじゃ可哀想じゃね?

>>185
俺も複数オブジェクトのときの頂点の対応ってのがよくわからんけど
GLSLなのかCgくらいかは書いておいたほうがアドバイスもらえるんじゃないかな
191185:2007/10/30(火) 13:01:49
すいません。
どうしたらいいのでしょう??教えてください。
GLSLを使っています。
192デフォルトの名無しさん:2007/10/30(火) 13:02:24
>>190
複数オブジェクトのときの頂点の対応・・・??
「対応」って何????
185は全然そんなこと言ってないと思うんだけど。
193デフォルトの名無しさん:2007/10/30(火) 13:36:35
できるよとしか書かなかったのは
それしか答えようがないような質問だったからなんだが…

GLSLならgl_MultiTexcoord0とかで入力されたテクスチャ座標が取れる
あとはそれを視点と頂点座標との位置でお好みでいじって
gl_TexCoord[0]とかに代入してやればFragmentShaderとかに渡っていくよ
194デフォルトの名無しさん:2007/10/30(火) 15:15:24
OPENGLを使ってCGアニメーションを何か作ろうとしているのですが、何か簡単にできるものはありませんか?
マウス操作ができて、ホップアップメニューを使用したいのですが、、、
個人的にはハノイの塔やルービックキューブなどを考えています
知識は全然ないので何からはじめればいいのかわかりません。どこかサンプルがのっているサイト等を教えてもらえるとうれしいです。どなたかお願いします
195デフォルトの名無しさん:2007/10/30(火) 17:07:26
196185:2007/10/30(火) 21:00:26
>>193
説明が下手で申し訳ないんですが、
それぞれのオブジェクトの頂点の座標をvertex-shaderで扱いたいんです。
vertex-shaderで頂点が扱えるのは分かるんですが、
このときのvertex-shaderにおけるgl_Vertexには何が入ってるのか
分かりません。どのオブジェクトの頂点なのか、それとも全体のものなのか。

オブジェクトAならgl_Vertex[A]、オブジェクトBならgl_Vertex[B]のように
できるのかなと思いまして。
197デフォルトの名無しさん:2007/10/30(火) 21:07:34
なるほど、そもそもVertexShaderについて理解してないと見える
VertexShaderは頂点一つずつしか扱わないよ
gl_Vertexにはその時処理してる頂点座標が入ってる
で、VertexShader全体が全頂点に対して毎回実行されるものだ
198デフォルトの名無しさん:2007/10/30(火) 22:55:21
>>196
頂点の数だけVertex shaderが実行される
例えば5個のオブジェクトそれぞれに頂点が10個ずつあったら、同じシェーダが合計50回実行される
199デフォルトの名無しさん:2007/10/31(水) 01:03:08
なるほど!分かりました。ありがとうございます。
ちなみにfragment-shaderに渡すときの処理も、
ループ(オブジェクトの(頂点の)数){
vertex→frag
}
でしょうか?
200デフォルトの名無しさん:2007/10/31(水) 01:26:16
vertex→fragって何よ
何のことを言ってるのかわからん
201デフォルトの名無しさん:2007/10/31(水) 01:58:53
処理の流れです。。
オブジェクトAの頂点処理をして、fragmentでAに対するテクスチャ処理
オブジェクトBの頂点処理をして、fragmentでBに対するテクスチャ処理


と言いたかったのですが、違いますか?
202デフォルトの名無しさん:2007/10/31(水) 02:19:33
1. glVertex とかで渡された頂点1個ごとに頂点シェーダが実行され、その頂点の座標を出力する。
2. 頂点シェーダが出力した座標を元に、実際に画面上のどのピクセルを描くか描かないかが決まる。これは自動的に決まる。
3. 描くべきピクセル1個ごとにフラグメントシェーダが実行され、テクスチャを取り込んだりしてそのピクセルの色を出力する。
4. フラグメントシェーダが出力した色を元に、実際に画面上にピクセルが描かれる。
だいたいこんな感じ。
203デフォルトの名無しさん:2007/10/31(水) 12:09:07
>>202さんを勝手に補足すると、
1.は vertex shader の仕事。このシェーダプログラムを書いてやる必要がある。
2.はラスタライザの仕事。これは固定機能で、プログラミングできない。
3.は fragment shader の仕事。このシェーダプログラムを書いてやる必要がある。
4.はバックエンドプロセッサの仕事。これは固定機能で、プログラミングできない。

要は、
vertex shaderのプログラムは一つの頂点だけの処理を考えればいいし、それしか処理できない。
fragment shaderのプログラムは一つのフラグメントだけの処理を考えればいいし、それしか処理できない。
ってこと。

てか、185さんはまず根本的なグラフィクスパイプラインの仕組みを知る必要があると思うよ。
次に、その中でどの部分がプログラマブルになったのかを知るという順番で進めていかないと、
どのみち座標系への無理解からくる壁にぶちあたると思う。
204デフォルトの名無しさん:2007/10/31(水) 13:02:14
OpenGLに動画を取り込んで再生させることは可能でしょうか?
205デフォルトの名無しさん:2007/10/31(水) 13:11:26
OpenGL自体に動画再生機能はないが
動画をRGB等のデータにできればそこからテクスチャにして貼ることはできるよ
206185: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
壁にボールをぶつけて返ってくるって処理がよくわからないんだがどうやって書けばいいんですか?
テニスみたいなのを作りたいんだが。。。
210デフォルトの名無しさん:2007/10/31(水) 16:34:01
物理の素養が無いんですか
211デフォルトの名無しさん:2007/10/31(水) 16:39:20
>>209
http://keirinkan.com/kori/kori_physics/kori_physics_2/index.html
第1部第1章くらいは読んでみては
212デフォルトの名無しさん:2007/10/31(水) 19:09:56
>>194
371 名前:デフォルトの名無しさん[] 投稿日:2007/10/30(火) 16:12:14
学校の課題でOPENGL使ってなんか作らないとダメなんだけどいい感じのサンプルない?
インベーダーとかハノイとかルービックとか。。。
誰かおせーて


なんか九州工科大だかそこらへんのページでそんな課題を見たな
213デフォルトの名無しさん:2007/10/31(水) 19:15:15
俺もグラフィクスパイプラインの仕組みについて知りたい

なんかそれについて、わかりやすく描いてるのが少ない
214デフォルトの名無しさん:2007/10/31(水) 20:06:08
>>212
そんな大学ありません
215デフォルトの名無しさん:2007/10/31(水) 22:11:34
ttp://www.iit.bme.hu/~szirmay/gpugi_link.htm
ここのPDF version of the tutorialのfigure3にレンダリングパイプラインを図にしたものがあるよ。
その周辺に具体的な説明があるよ。

パイプラインはDirect3Dとほぼ同じなのでdirect3dのSDKのドキュメントを読むのもいいかも?
216デフォルトの名無しさん:2007/11/01(木) 00:09:50
>>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を持っていて、読み込めるピクセルフォーマットは
これらを持っていませんでしたが、関係あるのかな?)
このようなことが起きるのはなぜでしょうか?
また、現状で画面外が読み込めないピクセルフォーマットを使っていても
画面外を読み込めるようにする方法は無いでしょうか?

218デフォルトの名無しさん:2007/11/01(木) 23:31:14
PFD_SWAP_COPY というより PFD_DOUBLEBUFFER なんじゃないかと推測してみる
219208: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の違いです。。
222デフォルトの名無しさん:2007/11/06(火) 11:29:38
xyzをwで割るか割らないか
223デフォルトの名無しさん:2007/11/07(水) 02:49:13
単純に矩形を回転させたいだけなんだが,どうも回転しているときに歪んでしまう
(回転角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()
224デフォルトの名無しさん:2007/11/07(水) 09:06:18
angle に PI / 2 を指定したりしてない?
angle は度なので 90 にするといいよ
225デフォルトの名無しさん:2007/11/07(水) 11:08:38
>>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でどうやって求めるんですか?
視線ベクトルというよりオブジェクト面から光線ベクトルが
欲しいんですけど。
227デフォルトの名無しさん:2007/11/08(木) 02:00:29
gl_LightSource[0].position とかで光源の位置が取れるんじゃない?
228デフォルトの名無しさん:2007/11/08(木) 08:21:29
ちょっと急ぎです。
directxは触ったことがあります。
openglは初めてです。
即席でglutとglpngだけで製作中です。
極力組み込みで済ませたいです。

far-planeギリギリ半径の球にテクスチャを貼り天球を表現しようとしましたが、うまく貼れません。
最悪、カメラが向く方向を相対的に認識でき、空っぽく見えればいいです。
あわよくば、簡単にそれらしいエフェクト(雲や日光及びそのスペキュラー等)が掛けれると尚良いです。
何か良い方法があればご教授願います。
229デフォルトの名無しさん:2007/11/08(木) 09:31:53
うまく貼れない=変な風に貼られる?
よくわからんが、far-planeギリギリなのが問題だというのならfar-planeを遥か彼方へ持っていけばいいのでは
むしろfar-planeなんか無限大に(ry

それともfar-plane関係なくてそもそもテクスチャが貼れないという問題?
どこで詰まってるのかよくわからない
230226:2007/11/08(木) 11:32:29
(光線という言葉がまずかったかもしれませんが、)
光源は使っていません。。
やりたいことは板と視点の位置が固定なら、
いくら視線方向を変えても同じテクスチャで良くて、
板と視点の位置が変わると、違うテクスチャを貼るようにしたいです。

gl_ModelViewMatrix * gl_Vertexを使うと、視線ベクトルでテクスチャを
切り替えられてしまって、やりたいことと違って、
(gl_Vertex - 視点)ベクトルを使うと、板の両サイドでこのベクトルの
向きが違うので、うまくテクスチャマップされないんです。
そもそもvertex-shaderでできないことなんですかね?
231デフォルトの名無しさん:2007/11/08(木) 11:43:08
far-planeは関係ないです。すみません。
球の生成にglutの補助関数を使っているので、各頂点毎にテクスチャ座標を指定出来ないので、自動生成に頼るつもりが、それが出来ていないのだと思います。
うまくラッピング出来る生成方は無いでしょうか。
232デフォルトの名無しさん:2007/11/08(木) 11:51:23
>>230
文章から動きがイメージできないが…

>(gl_Vertex - 視点)ベクトルを使うと、板の両サイドでこのベクトルの向きが違うので

両サイドってのは板の両端って意味でおk?
テクスチャを切り替える基準は頂点の位置じゃなくて板の位置なわけか?
頂点の位置じゃない板の位置っていうのは何だろう。 中心点かなにかか。 それを与える必要があるんじゃないか。
233226:2007/11/08(木) 12:10:38
はい、板の両端ってことです。
やっぱり中心点かなにか必要ですよね。了解しました。
なんとかがんばってみます。
234デフォルトの名無しさん:2007/11/08(木) 12:21:28
>>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でシェーダを使ってますが、
デバックとかできないんですか?
236デフォルトの名無しさん:2007/11/08(木) 18:42:18
>231
空っぽく見せるのに球にする必要はない。skyboxでぐぐれ
237デフォルトの名無しさん:2007/11/09(金) 00:16:02
>>235
知りたい変数を1.0~0.0の範囲に収まるように調整してからフラグメントの色に出力する方法が一番いいと思うよ
238デフォルトの名無しさん:2007/11/09(金) 03:17:39
>>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の間で指定しても同じような気がしますが,
ここの値を任意に大きくしたり小さくする意味はなにかあるのでしょうか?
239デフォルトの名無しさん:2007/11/09(金) 11:13:37
>>238
そういう理解でよい

結局は同じだけど、-1〜1 と 0〜640 では扱いやすさが異なるだろう
場合に応じて使いやすい座標系を設定すればよい
240デフォルトの名無しさん:2007/11/09(金) 11:18:15
>>235
シェーダってGLSLでいいんだよな?
WindowsならgDEBuggerの30日体験版が使えると思う
いざ買おうとするとイスラエルにfaxする必要があるんだが
あとはglslDevilってのがWindowsとLinuxなんかで使えてフリーだ
使ったことは無いがスクリーンショットを見る限り便利そう
MacならOpenGL Profilerが標準で付いてる

Cgだとデバッグ方法は分からん
FX Composerとかでやるしか無いんじゃないかな
241235: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でし。
なんとかなりました。
ありがとうございました。
244デフォルトの名無しさん:2007/11/09(金) 21:57:08
>>242
他にはシェーダで自前でAAかけるくらいしかないね
つか今時MSAA対応してないグラボってもしかしてIntel?
そうであればシェーダでやってもまともな速度で動くとは思えんよ
245デフォルトの名無しさん:2007/11/09(金) 23:24:38
モデリングソフトで作ったファイルを読み込むライブラリで
何か代表的なものあったら教えてください。
Blenderでエクスポートできるやつ希望。
246デフォルトの名無しさん:2007/11/09(金) 23:57:10
>>245
その質問 いつか見た
247デフォルトの名無しさん:2007/11/10(土) 01:06:22
>>245
COLLADA DOM
248デフォルトの名無しさん:2007/11/10(土) 15:41:45
lib3dsなんかどうよ
249デフォルトの名無しさん:2007/11/12(月) 02:00:06
openglで2Dの木の描画に必要なのは線の描画と再帰処理だけど
3Dの場合はどうすればいいんだ?
250デフォルトの名無しさん:2007/11/12(月) 02:47:59
座標変換を勉強するよろし
251デフォルトの名無しさん:2007/11/12(月) 09:18:14
>>249
3Dの場合も線の描画と再帰処理だと思うけど?
252デフォルトの名無しさん:2007/11/12(月) 11:45:20
半透明の板同士の交差ってどうやったらちゃんと描画される?
交差というか貫通した感じで交わっている場合、半分はブレンドされるが半分はやってくれない
描画順入れ替えてもこればかりは解決できないす…
253デフォルトの名無しさん:2007/11/12(月) 11:52:29
>>252
あまり詳しくないので、答えるのもあれなんだが
複数重なった半透明処理をH/Wでちゃんとやってくれるボードのほうが珍しいというか
高額なやつじゃないとやってくれないんじゃなかったっけ?

ソフトウェアモードだとちゃんとできたりしない?
254デフォルトの名無しさん:2007/11/12(月) 18:25:16
はじめて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
一体何が原因なのでしょうか?
255デフォルトの名無しさん:2007/11/12(月) 20:28:47
>>252
交差してるところでポリゴンを割り、一番奥から順に描画するしかない。
256デフォルトの名無しさん:2007/11/12(月) 21:38:22
>>252
基本的には、交差させないのが一番。
交差するならCPUで計算してポリゴン割る。
分割せずに半透明ポリゴンを順序非依存で正しく描画する方法といったら、
 1. Depth Peeling
 2. シェーダで半透明情報をバッファ上に蓄積、最後に合成
の二通りかな。
1.はdepth complexityに応じてnパスレンダリングをおこなう必要がある。
2.は事前に決めた枚数(バッファの深さと精度のトレードオフ)より沢山は重ねられない。

まぁどっちにしても非常に負荷の大きい処理なわけで、半透明処理は鬼門ですわね。

実装が簡単なのは1.だけど、今後2.のアプローチが流行りそうかもしれないので
チャレンジしてみてください是非!
257デフォルトの名無しさん:2007/11/12(月) 22:40:09
半透明ポリゴンが交差せざるを得ない状況が思いつかなかったので
懸命に頭ひねってみたんだが

白スク水着せたおにゃのこが家庭用プールで遊んでる構図しか浮かばなかった
258252:2007/11/13(火) 03:56:59
なんにしてもややこしそう…ですね
色々試してみます
259デフォルトの名無しさん:2007/11/13(火) 04:45:04
>>257
どの部位が交差するんだよ?
260デフォルトの名無しさん:2007/11/13(火) 09:48:02
>>259
濡れた白スクと水面じゃねーの?

>>256
この2の方法てAバッファとか言うんだっけ?
これって遅延シェーディングと似たようなもんだと理解してるんだけど
それだとAAって自前でかけないとならないよな
それともAAかけて描画した結果を蓄積しちゃっていいのか?
ただの興味だけなんだが誰か分かる人がいたら頼む
261デフォルトの名無しさん:2007/11/13(火) 11:54:17
>>244
GeForce FX 7600です。
調べるとMSAAに対応しているみたいですね。
赤本のサンプルソース(multisamp.c)なのですが動かないです。
加えたのは
#include <GL/glew.h>
だけです。
何か足りないのでしょうか?
262261:2007/11/13(火) 14:52:50
ちょっとだけ自己解決しました。
ビデオカードのコントロールパネルのアンチエイリアシング設定を
アプリケーションによるコントロール → 2xMS
にしてやると動きました。

しかしアプリ任せのMSAAをやるには
なにかピクセルバッファのようなものが必要なのでしょうね。
263デフォルトの名無しさん:2007/11/13(火) 16:49:56
Windows XP + GeForce 7900 GS で、glutではなくwglMakeCurrent使って
コントロールに描画しているが、242と同じくマルチサンプリングアンチエイリアスできない。
同じようにbufとsbufに0が返ってくる。

PIXELFORMATDESCRIPTOR にはマルチサンプリング関係の設定はないみたいだし。
>>242 はglutで描画してるの?
264254:2007/11/13(火) 18:37:16
やはり場違いなようなのでC#のスレ行ってきます。
スレ汚しすいませんでした。
265デフォルトの名無しさん:2007/11/13(火) 18:46:16
>>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で指定するとできるはず
266デフォルトの名無しさん:2007/11/13(火) 19:05:49
すいません、超初心者ですorz

glutDisplayFunc( DisplayTri );
glutDisplayFunc( DisplayTri2 );
glutMainLoop();

例えばこういう場合、glutMainLoopによって上2行の関数がどちらともループしてしまいます。
1行目glutDisplayFunc( DisplayTri )を初めの1回だけ実行し、その後2行目のglutDisplayFunc( DisplayTri2 )をループで実行し続けるにはどうしたらいいでしょうか?
267デフォルトの名無しさん:2007/11/13(火) 20:08:48
glutDisplayFunc って 2 回目呼んだら上書きされるのでは?
だから DisplayTri1 を最初の 1 回しか実行してほしくないなら↓のようにすればいいはず

void DisplayTri2(void)
{
  /* なにか素敵なものを描画 */
}
void DisplayTri1(void)
{
  /* なにか楽しいものを描画 */
  glutDisplayFunc(DisplayTri2);
}
int main(....)
{
  ...
  glutDisplayFunc(DisplayTri1);
  glutMainLoop();
}

その前に glutMainLoop をそもそも誤解してるような気もするが。
268デフォルトの名無しさん:2007/11/13(火) 21:34:01
FBOについて質問があります。
FBOを作成し空のテクスチャを割り当て、ディプス、ステンシルバッファは割り当てないとします。
そして、FBOへ書き込み先を変更し描画を行った場合、深度値やステンシル値はデフォルトのバッファに書き込まれるのでしょうか?
それとも何処にも書き込まれないのでしょうか?
もちろん、glEnableでディプス、ステンシルをONにした状態です。
分かる方宜しくお願いします。
269デフォルトの名無しさん:2007/11/14(水) 00:54:12
>>263
glutです。

>>265
わざわざソースを見ていただいてありがとうございます。
おそらく私の問題も結局は>>263の人と同じだとおもうので
GLUTの中を調べながらもう少しやってみます。
270デフォルトの名無しさん:2007/11/14(水) 06:54:28
>>268
どこにも書き込まれないのが正しいと思う
そのFBOをBindした状態ではDepthBitsとStencilBitsが0になってるはずだ
271デフォルトの名無しさん:2007/11/15(木) 01:41:08
glslでマトリックスとベクトル型のかけ算にmulを使うと
warning C7506: OpenGL does not define the global function mul
と出ますが、ちゃんと動作しちゃいます。
これは、どういう事なのでしょうか?
グラボによっては動作しないのでしょうか?
OSはXP,グラボGeForceです。
272デフォルトの名無しさん:2007/11/15(木) 05:54:42
>>271
その警告の通りGLSLではmulなんて関数は無くて、普通に*演算子で計算できるよ
しかしGeForceだとGL_EXT_Cg_shaderというGLSLでCgの命令も使える拡張がある
これのおかげでmulが警告ありながらも使えて、たぶんfloat4なんかも使えるはずだ
動きはするけどRadeon積んだマシンに持っていくと途端に動かなくなるから
ちょっと迷惑な拡張なんだよな

とりあえず警告潰すようにしていけばGL_EXT_Cg_shader頼りになることも無いんじゃないかな
273デフォルトの名無しさん:2007/11/15(木) 11:33:42
ベンダによって、GLSLコンパイラがエラーに寛容だったりするから困るよね。
ATIの方がわりと厳しいんだっけ?
274デフォルトの名無しさん:2007/11/15(木) 12:40:19
Radeonで昔試したら時はGLSLのコンパイルエラーメッセージが3DlabsのGLSLValidateと全く同じだったな
多分GLSL Frontendとか使ってたんじゃないかと思う
今は別物になってるのか手を入れて使ってるのかは良く知らないけど。
GeForceで開発してRadeonに持っていく時にはGLSLValidateによくお世話になった
275デフォルトの名無しさん:2007/11/15(木) 18:40:07
ウインドウの色(背景部分?)を上半分が白、下半分が黒って
できますか?教えてください。
276デフォルトの名無しさん:2007/11/15(木) 18:54:29
上半分を白で、下半分を黒で、四角形を描けばいいだけ
277271:2007/11/15(木) 20:02:19
>>272
レスありがとうございます。
本当に迷惑な拡張ですね・・・。
以後、気を付けたいとおもいます。
278275:2007/11/15(木) 22:06:37
>>276
ありがとうございます。初歩的なことですいません。
glClearColor(0.3, 0.3, 1.0, 0.0);
をいじってできるかと思いました。
279デフォルトの名無しさん:2007/11/16(金) 00:09:03
いじってたらできるのは子供だけ
280デフォルトの名無しさん:2007/11/16(金) 00:56:17
子供ってすげーーーーーーー
281デフォルトの名無しさん:2007/11/16(金) 15:47:11
glMultiTexCoordの使い方がよくわかりません。
どうやってTEXCOORD0〜7に座標を指定していくのでしょうか
282デフォルトの名無しさん:2007/11/16(金) 16:11:21
>>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. 
283デフォルトの名無しさん:2007/11/16(金) 17:18:09
>>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セマンティックが、数字としてどこを指しているのか確認したくて質問しました。
284デフォルトの名無しさん:2007/11/16(金) 21:47:09
それはMultiTexCoordというよりCgの質問じゃないか
それもCgのマニュアル見れば書いてあるわけだが、
TEXCOORD0-TEXCOORD7
Input texture coordinates (texcoord0-texcoord7)
through MultiTexCoord command
だそうだ
285デフォルトの名無しさん:2007/11/17(土) 03:00:44
ウォークスルーのプログラムで、ウィンドウいっぱいに表示されるくらい、ポリゴンに近づくと処理が重くなります。
GL_QUADSで描いたごく単純な長方形でも重くなるので、なにが原因なのかよくわかりません。
286263:2007/11/17(土) 10:40:52
>>265
おかげさまでマルチサンプリングアンチエイリアスできました。

>>269
ここが参考になりました。
http://mrya.cocolog-nifty.com/caffis_diary/2006/05/fsaa.html
287デフォルトの名無しさん:2007/11/17(土) 11:53:43
>>285
ソフトウェアレンダリングになってるってことはない?
288デフォルトの名無しさん:2007/11/17(土) 12:19:16
>>284
すみません、ということは>>283は合ってるのでしょうか?

それだと、MultiTexCoordは常に0〜1の範囲の座標をCgに渡して
それ以外の値をTexCoord0〜1はもてない、ということになりますよね
289デフォルトの名無しさん:2007/11/17(土) 12:27:51
>>288
なんで?
100でも-20でも好きな座標を渡せばいいじゃん
元々glTexCoordに渡すテクスチャ座標は0〜1に制限されてはいないんだし
290デフォルトの名無しさん:2007/11/17(土) 12:36:08
なるほど
テクスチャの有無云々じゃなくて、座標を優先すればいいわけですか。

ようやくわかってきました。ありがd
291デフォルトの名無しさん:2007/11/17(土) 15:07:03
>>287
確認できませんでした。。
ソフトウェアレンダリングというものは、プログラムの内部で決定するのでしょうか?
例えばOpenGLの初期化の際に、ソフトウェアレンダリングを指定するみたいな…
あるいはドライバの設定で変更するものなのでしょうか?
292デフォルトの名無しさん:2007/11/17(土) 15:14:00
>>291
とりあえず↓をOpenGLの初期化後にやってみそ
printf("%s\n", glGetString(GL_VENDOR));
printf("%s\n", glGetString(GL_RENDERER));
printf("%s\n", glGetString(GL_VERSION));
293291:2007/11/17(土) 15:32:22
>>292
NVIDIA Corporation
GeForce 6200/AGP/SSE2
2.0.3

こんな感じになりました
294291:2007/11/17(土) 15:47:46
検索したところGL_RENDERERがGDIになってるとソフトウェアレンダリングってことらしいですね(Windowsでは)
ってことはおそらく自分の環境はソフトウェアレンダリングではなく、他に原因があるってことでしょうね
もう少し調べてみます
295デフォルトの名無しさん:2007/11/17(土) 16:17:38
GeForceだと
glEnable(GL_POLYGON_SMOOTH)やらglEnable(GL_LINE_SMOOTH)は
遅くなるかもね
296291:2007/11/17(土) 19:01:50
>>295
Enableしないようにしてみたところ、見違えるほど速く動くようになりました
ほんとうにありがとうございます
297デフォルトの名無しさん:2007/11/22(木) 14:17:06
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…}みたいに確保したら動かないのでしょうか?
298デフォルトの名無しさん:2007/11/22(木) 14:21:44
>みたいなのではダメなのでしょうか。

別にだめなことはない

>1次元で 3Dtex[]={r,g,b r,g,b r,g,b…}みたいに確保したら動かないのでしょうか?

それでも動く
どの方法を取るにしても、256×256×256 のテクスチャを扱うつもりならそれだけのメモリは要るから(48MBくらいか?)、結局同じ
どれでも好きなやり方でどうぞ
299デフォルトの名無しさん:2007/11/22(木) 14:28:40
1次元だと、ボクセルの座標がよくわからないのですが

4 4 4の3次元テクスチャだと、1項目が0 0 0 最後が4 4 4だとなんとなくわかるのですが
2項目はボクセルのどこに当たるのでしょう

下の○にrgbが入ってるとして、それを1次元で○だけ確保したら
○×○○×
3Dtex[]={○ ○ ○}と格納されますが、rgb情報はあってもxyz情報が消えませんか?
そこら辺が1次元で確保するときよくわからなくて
300デフォルトの名無しさん:2007/11/22(木) 14:36:16
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個分必要
301300:2007/11/22(木) 14:37:53
あぁ悪い、それ z y x の順だ
2番目は 0 0 1 ・・・ z=0, y=0, x=1 ってことね
302デフォルトの名無しさん:2007/11/22(木) 14:40:08
つまり1次元で確保するときも
×の領域分作らないとダメってことですね。

ありがとうございました。それなら3次元で確保したほうがプログラムでアクセスしやすい(^^;
303デフォルトの名無しさん:2007/11/23(金) 06:04:38
>>302
構造体の場合、隙間に気をつけてな。
304デフォルトの名無しさん:2007/11/24(土) 15:21:17
隙間?
305デフォルトの名無しさん:2007/11/24(土) 15:36:39
padding
306デフォルトの名無しさん:2007/11/25(日) 01:02:04
OpenGLをCygwinに入れたいのですが、
わかりやすい手順が書いてあるWEBページないですか?



307デフォルトの名無しさん:2007/11/25(日) 01:05:20
cygwinのsetup.exe起動して、パッケージの選択画面でgraphics/openglにチェック入れるだけ
308デフォルトの名無しさん:2007/11/25(日) 03:58:11
cygwinにGLUTのライブラリを追加しようとしてもできません。。

ttp://www.xmission.com/~nate/glut.htmlのサイトからglut-3.7.6-bin.zipをDLして
glut32.dllを\WINDOWS\system32に入れ、glut32.libを..\cygwin\lib\mingwに入れ
glut.hを..\cygwin\usr\include\mingwに追加してもコンパイル時に

GL/glut.h: No such file or directoryと出てしまいます。

初心者でググってもよくわからなかったのでどなたかレスお願いします。
質問の仕方がおかしかったらすいません。
309デフォルトの名無しさん:2007/11/25(日) 03:59:28
>>307
ファイル作ったんですが、コンパイルが通らなくて、設定がおかしいのかな?
と思ってて、探してるんですが。

bashにglut32のコマンドが無いってでるんですよ。
助けて〜
310デフォルトの名無しさん:2007/11/25(日) 04:26:07
mingw 使うんならコンパイル時に -mno-cygwin オプションを付けてる?
311デフォルトの名無しさん:2007/11/25(日) 04:55:54
cygwinはそのあたりのことを解決できない奴が使うもんじゃないと思うぞ。
素直にVS入れたらどうよ。
312デフォルトの名無しさん:2007/11/25(日) 10:22:45
>>308
なんでfreeglutじゃだめなん?
313デフォルトの名無しさん:2007/11/25(日) 10:54:56
>>308
とりあえずglut.hを
..\cygwin\usr\include\mingw\GLに移してみては
314デフォルトの名無しさん:2007/11/25(日) 14:45:02
みなさんレスありがとうございます。

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'
みたいなエラーが大量に表示されてしまうんですけど…いいのでしょうか!?
315デフォルトの名無しさん:2007/11/25(日) 14:56:15
調べてみますというか、cygwinで使うならsetup.exeからfreeglut選ぶだけなんだが
316デフォルトの名無しさん:2007/11/25(日) 15:43:15
>>314
もう面倒くさいから自分で入れるの諦めてsetup.exeに任せちまえよ
317デフォルトの名無しさん:2007/11/25(日) 15:44:22
入れてから、どうすればいいのかわかりません
318デフォルトの名無しさん:2007/11/25(日) 15:53:06
>>315,>>31さんレスありがとうございます。

そうですね、もうsetup.exeでインストールし直したほうが早そうですね;
それではインストールしてきます。
319318:2007/11/25(日) 15:53:55
間違えました>>315,>>316さんです。
320デフォルトの名無しさん:2007/11/25(日) 20:08:06
makefileの作り方教えてください
321デフォルトの名無しさん:2007/11/25(日) 20:19:05
>>320
スレ違い
322デフォルトの名無しさん:2007/11/25(日) 20:33:20
openGLのmakefileの作り方教えてください
323デフォルトの名無しさん:2007/11/25(日) 20:45:23
OPENGLで、コンパイルすると
makeは、なんですか?って聞かれるんです。
324デフォルトの名無しさん:2007/11/25(日) 21:03:40
どういう手順でコンパイルしたら誰に訊かれるんだよ
325デフォルトの名無しさん:2007/11/25(日) 22:26:37
OPENGLで右クリックをしたら〜したいというとき
どういう風にしたらいいのですか?

床井先生のところで左クリックはあったのですが、右クリックが見当たらず
助けてください(;;
326デフォルトの名無しさん:2007/11/25(日) 22:36:10
すいません、解決しました。

見ていたサンプルにmouse_down[3]というのがあって
それで判別してるようでした。
327デフォルトの名無しさん:2007/11/25(日) 23:22:45
gluPerspectiveを使うと座標が-1~1になります。
これを透視投影でglOrthoみたいに-10~10等にすることってできますか?
328デフォルトの名無しさん:2007/11/25(日) 23:25:32
単に拡大縮小すれば?
glScaled(0.1, 0.1, 1); とか
329デフォルトの名無しさん:2007/11/26(月) 08:14:58
まてまて、glOrtho使ってもスクリーン座標系は-1〜+1の範囲だろ
なんにせよ拡大縮小すればいいだろうけど
330デフォルトの名無しさん:2007/11/26(月) 12:10:00
glFrustum 使えばいいのでは。
そういう意味ではない?
331デフォルトの名無しさん:2007/11/26(月) 21:34:10
マウスを使って視点の移動(カメラを動かすみたいに)はどのように実装したらいいでしょうか?
マウスの方向とは逆向きになることは3Dソフトを使っていてなんとなくわかるのですが。
視点といえばgluLookAtですが、どう使ったらいいかいまいちわかりません。
解説しているサイトはありますか?
332デフォルトの名無しさん:2007/11/26(月) 23:35:33
床井先生のところのクォータニオン使ったやつか、
polarviewで検索すると色々出てくるやつあたりが簡単だね。
333331:2007/11/27(火) 00:07:31
>>332
有り難うございます。
いろいろと検索してみます。
334デフォルトの名無しさん:2007/11/27(火) 11:25:40
質問です。やり方ありましたらご指南ください。

今、2D平面上で、クリックした位置に色を落とすペイントみたいなことを
OPENGLでやっているのですが(下図左)、これを3次元空間内のポリゴンに
マウスでペンツールを動かして、絵を描いていきたいのです(下図右)

ttp://up2.viploader.net/upphp/src/vlphp097567.png

こういったことをする際にどうすればいいのか
参考になるものなどもありましたら教えてください
335デフォルトの名無しさん:2007/11/27(火) 11:37:09
336デフォルトの名無しさん:2007/11/27(火) 12:37:37
>>334
それで使い良いのが出来れば製品として売れるくらい、色々と難しい問題なんだよなぁ。
とりあえず簡単(ベタ)な実装としては、視点とマウスを通過するレイと、ポリゴンとの交差を
計算して、あとは適当にごにょごにょと。
「交差判定」あたりでぐぐってみたらどうでしょう。
337デフォルトの名無しさん:2007/11/27(火) 12:48:36
クリック点=スクリーン座標点として
レイを放って、バウンディングボックスとの交差判定して
それとポリゴンとの交点を求めれたとして



すげぇ難しそうだ
338デフォルトの名無しさん:2007/11/27(火) 13:51:03
昔nvidiaに3Dペイントのデモがあった気がするからそれが参考になるかも

関係ないけど任天堂はwiiリモコンでポリゴンに落書きするようなソフト出してくんないかな
339デフォルトの名無しさん:2007/11/27(火) 14:46:40
とりあえず俺の脳内シミュレーションでは単一マテリアル単位でならハードウェアアクセラレーション付きで出来た
340デフォルトの名無しさん:2007/11/27(火) 14:53:27
と思ったけどポリゴンが重なってると隠れてるポリゴンのテクスチャも編集されてしまって俺涙目www
341デフォルトの名無しさん:2007/11/27(火) 15:11:13
その脳内ソースをフルでうpってくだしあ><
342デフォルトの名無しさん:2007/11/27(火) 16:01:58
>>337
交点を求めたら、それをトライアングルの重心座標に変換、
それをさらにテクスチャ座標に変換だな。これで点は打てる。
334みたいに、投影面に平行でなくポリゴンに平行、かつ視点の向きに非依存な
パターンであれば、あとはテクスチャにスタンプを繰り返すだけ。
もし、投影面に平行なパターンを、投影面に平行でないポリゴン(テクスチャ)に
スタンプしたいなら、話は一気に難しくなる。(というより面倒臭くなる)

>>338
それいいね。あったら欲しい。
3Dモデラも、任天堂が作るとえらい分かり易いインターフェースになるんだよな。
64DDのポリゴンスタジオで感動した。
343デフォルトの名無しさん:2007/11/27(火) 16:57:37
あくまで脳内シミュだから間違ってても文句言わないように


・描画に使うテクスチャをfbo等レンダリング可能なテクスチャ(以下rtt)にコピーする
・rttをレンダーターゲットに設定
・頂点シェーダ出力のポジションにuvを、texcoordとか適当なやつにスクリーン座標を入れる
・ピクセルシェーダでtexcoordで持ってきた座標とマウスの座標を適当に比較して線の色を出力
・rttをテクスチャとして使いモデルを描画
・ 超 完 成 !

まあぶっちゃけポリゴンの重なりで破綻するだろとかテクスチャの張り方制限あるだろとかテクスチャ空間で比較すんなと
突っ込み所満載過ぎてこの方法でモデリング補助ツールとか作るのは無理。あくまで遊び用
344デフォルトの名無しさん:2007/11/27(火) 18:22:28
ZBrushを買え
それかデカールでぐぐれ
345デフォルトの名無しさん:2007/11/27(火) 18:28:12
zbrushの3Dペイントってテクスチャにも描けるの?
346デフォルトの名無しさん:2007/11/27(火) 18:32:46
>>343
テクスチャ空間で比較するのは目から鱗
難しくないし面白そうだね
347デフォルトの名無しさん:2007/11/28(水) 00:23:21
あくまで脳内シミュだから間違ってても文句言わないように


・レンダリングするモデルの各頂点に以下のデータを設定
・頂点座標, uv座標, テクスチャID(適当に0.0~1.0にエンコする)
・頂点シェーダ出力のポジションに普通に変換済み頂点座標を、texcoordとか適当なやつにuvとテクスチャIDを入れる
・フラグメントシェーダでRGにuv, B(テクスチャIDの数に応じてAにも)にテクスチャIDを入れる
・今レンダリングしたカラーバッファをメインメモリへ送ってマウスの位置に対応するフラグメントの値をゲッツ!!
・BとかRGの値を見て、対応するテクスチャのピクセルに魂を刻む。
・次はモデルを普通にレンダー。
・ 超 完 成 !

補足するとテクスチャIDってのは複数テクスチャを扱うときに必要なんで、一枚テクスチャならIDいらいないし
ID値をfloatに変換すんなとかOpenGLスレなのにフラグメントシェーダのことをピクセルシェーダと呼ぶなとか云々。
348デフォルトの名無しさん:2007/11/28(水) 01:07:54
なんか僕も>>334みたいなの作ってみたくなってきたw
これ頭の体操には丁度イイ感じの題材かも〜
349デフォルトの名無しさん:2007/11/28(水) 01:17:17
>>343
あらかじめデプスだけレンダリングしておけば、ポリゴンの重なりは処理できるんジャマイカ?
(シャドウマップみたいな感じで…)
350デフォルトの名無しさん:2007/11/28(水) 01:28:35
改訂版2

・深度バッファ付レンダラブルテクスチャを作成
・オリジナルテクスチャをそれにコピー
・レンダーターゲットに設定
・深度バッファのみれんだりんg
・深度比較をequalに
・頂点シェ(中略)
・copyteximage2dでオリジナルテクスチャを更新
・レンダーターゲットを戻す
・ 超 完 成 !


>347
nvidiaもglのドキュメントでピクセルシェーダとかジオメトリシェーダとか言ってるから問題無し
351デフォルトの名無しさん:2007/11/28(水) 01:30:46
どうでもいいけど2と3は逆のがよかたな
352デフォルトの名無しさん:2007/11/28(水) 02:11:04
後のマリオペイント2である。
353デフォルトの名無しさん:2007/11/29(木) 02:16:36
エラー 1 fatal error LNK1104: ファイル 'winmm.lib' を開くことができません。 test
glutいれてVC++2005つかったらこんなエラー出てきたんですけどさっぱりなんで
どなたか解決法教えてくれませんか
354デフォルトの名無しさん:2007/11/29(木) 03:49:54
>>353
ExpressだったらWin32SDKを入れる必要がある
355デフォルトの名無しさん:2007/11/29(木) 23:43:54
質問です
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ということですか?
356デフォルトの名無しさん:2007/11/29(木) 23:48:24
>このときimageに入ってるのは0〜255の値ですよね。 

そのときimageに入れる値は、glTexImage2D に渡す type 引数の値によって意味が決まる。
たぶん GL_UNSIGNED_BYTE を指定してるんだろうが、その場合に限り 0〜255 だ。
何をどう指定された場合でもシェーダでは統一して 0〜1 で扱う。
357デフォルトの名無しさん:2007/11/29(木) 23:54:52
なるほどGL_UNSIGNED_BYTEをいつも使っていました。

ということは image[i][j][0] を printfなんかした場合は
0〜255が出てくるのですね。ありがとうございました。謎が一つ解けました。


あと、もう一つ質問なのですが
テクスチャアニメのようなことをしたくて。
imageに格納したRGB値をヒントに時間刻みでテクスチャをアニメさせたいのです
シェーダー側ではシェーダーを使えばいいと思うのですが

CPU側で計算
テクスチャのRGB値更新
再びglteximageということは出来るのでしょうか?

というのも、やりたいのが2Dテクスチャじゃなくて、3Dテクスチャで
3DテクスチャをGPU側で扱うのがひどく大変なので。

3DテクスチャをCPU側で更新
glteximage3dでGPU側のテクスチャ更新
アニメーション。ということは可能でしょうか
358デフォルトの名無しさん:2007/11/30(金) 00:24:39
シェーダとは関係ない気がするけど
glTexImage?D でテクスチャを更新するのはもちろん可能
だけど更新の場合は glTexSubImage?D の方が軽いかもしんない
まぁ使い分けるのが面倒かったらどっちでも
359デフォルトの名無しさん:2007/11/30(金) 08:47:14
ありがとうございます
今から研究室行って試してみます。

今週中に完成させるぞー。。。安定剤を飲む生活はもういやだ
360デフォルトの名無しさん:2007/11/30(金) 17:36:51
今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
361デフォルトの名無しさん:2007/11/30(金) 17:39:07
PlatformSDKのincludeにGLフォルダがあるはず
362デフォルトの名無しさん:2007/11/30(金) 18:15:10
>>361
小文字ですがglがありました!
やってみます〜。多分これだと思うので・・
ありがとうございました
363デフォルトの名無しさん:2007/11/30(金) 18:55:45
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 ? "しています" : "していません");

原因がまったくわからず、行き詰まっています。よろしくお願いします
364デフォルトの名無しさん:2007/11/30(金) 18:58:47
っ 常駐状態なんか気にしない
365デフォルトの名無しさん:2007/11/30(金) 19:03:27
GPU上でテクスチャを計算用に使うため
常駐できてないとアウトなのです…

昨日ためしに組んだときは表示も常駐もできてたのに
なぜか…今日は
しかも昨日のソースが消えてしまい…鬱すぎです
366デフォルトの名無しさん:2007/11/30(金) 19:46:34
>>363ですが
PFNGLMULTITEXCOORD3FARBPROC glMultiTexCoord3fARB =
(PFNGLMULTITEXCOORD3FARBPROC)wglGetProcAddress("glMultiTexCoord3fARB");

を使っていて、これが原因でした。
これをコメントアウトして、glutCreateWindowより前でテクスチャの設定をすると常駐され表示されました…
ただ、これだとGPUでTEXCOORDが認識されず、扱えません…

解決策などありますでしょうか
367デフォルトの名無しさん:2007/11/30(金) 21:34:04
>>366
常駐状態は気にしなくていいんだって
常駐してなくても必要あれば勝手にVRAMに入るから
なので最初の状態が正解
368デフォルトの名無しさん:2007/11/30(金) 21:37:01
あ、あとどうしても常駐させたいんだったら
glPrioritizeTexturesなんてのもある
使って意味あるかどうかは知らないが
369デフォルトの名無しさん:2007/11/30(金) 21:43:37
長方形の板2枚で一枚にはテクスチャマップ、
もう一枚にはただ色づけしたものを描画しているのですが、
テクスチャマップした板に色づけした板の色が混ざって
描画されるのはなぜですか?
はじめに描画されるときはうまくいくのですが、視点を変えたりなど
再描画すると上記の現象が起こってしまいます。
370デフォルトの名無しさん:2007/11/30(金) 21:50:42
テクスチャを使い終わったあと GL_TEXTURE_2D を glDisable していない
色を使い終わったあと白に戻してない

明示的に戻さない限り、設定したものは以後ずーっと有効
371デフォルトの名無しさん:2007/11/30(金) 21:51:04
テクスチャマップを色づけより先に描画していて、
テクスチャマップの方にはglMaterialを指定してない。

と予想。
372デフォルトの名無しさん:2007/11/30(金) 21:51:38
先を越された orz
373デフォルトの名無しさん:2007/11/30(金) 21:56:12
>>369
デフォルトではテクスチャ貼っても頂点色と混ぜられる
色を指定したポリゴンを描いた後にテクスチャ貼ったポリゴンを色指定せずに描くから前のポリゴンの色が適用されてるんだ
テクスチャ貼る方は色を白に設定しておくか、glTexEnviでGL_TEXTURE_ENV_MODEをGL_DECALかGL_REPLACEにするといい
374デフォルトの名無しさん:2007/11/30(金) 21:56:59
なんという重複
このスレどんだけ人いるんだよ
375デフォルトの名無しさん:2007/12/01(土) 11:22:06
お前ら本当にいい奴らだなw
376デフォルトの名無しさん:2007/12/01(土) 16:19:35
原点にglutSolidSphereで太陽、周りに地球と月を設置して公転のアニメーションを作りました。
GL_POSITIONを使って原点から全方向に向かって光を出しています。
この場合、原点から光を出しているので太陽が薄っぺらくなってしまいます。
原点から光を出しつつ、太陽も立体的に見せるにはどうしたらいいでしょうか?
377デフォルトの名無しさん:2007/12/01(土) 16:27:57
太陽を描くときだけだけ別の場所から光を当てる
378デフォルトの名無しさん:2007/12/01(土) 18:36:20
太陽にそれっぽいテクスチャを貼りつける
379デフォルトの名無しさん:2007/12/01(土) 20:18:59
破線の直線を引く場合に、patternで指定するbit列の0, 1の色をそれぞれ任意で指定したいと思っています。
ですが、どう設定したらよいのか分かりません。どなたか力を貸していただけないでしょうか?

glLineStipple_color(GLubyte *color0, GLubyte *color1, GLint factor, GLushort pattern)
{
~~~~~~~~~
}
380デフォルトの名無しさん:2007/12/01(土) 20:24:56
glLineStipple_color
なんて関数はじめて見た。ぐぐっても出てこないが本当にあるの?
381デフォルトの名無しさん:2007/12/01(土) 20:25:56
>>379
テクスチャを使う
382デフォルトの名無しさん:2007/12/01(土) 20:26:27
color0, pattern を設定して描画
color1, pattern^0xFFFF を設定して描画
383380:2007/12/01(土) 20:29:42
微妙に空気読めなかった orz
384デフォルトの名無しさん:2007/12/01(土) 20:33:09
あ、0と1が反対だった

glEnable(GL_LINE_STIPPLE);
glColor4ubv(color0);
glLineStipple(factor,pattern^0xFFFF);
線の描画
glColor4ubv(color1);
glLineStipple(factor,pattern);
線の描画

描画を2回呼ばないといけないので、>>379のような関数の形では無理
385デフォルトの名無しさん:2007/12/01(土) 21:31:53
>>384さん
ありがとうございます。できました。
386369:2007/12/02(日) 03:32:32
遅れまして、たくさんの回答ありがとうございます。
387デフォルトの名無しさん:2007/12/02(日) 16:46:26
NURBSで円を描画しても、
だんだん縮小していくとカクカクになっちゃうんですが、
これはこういうもんなんですか?
388デフォルトの名無しさん:2007/12/02(日) 17:38:32
そりゃ、液晶がツブツブだもん
389デフォルトの名無しさん:2007/12/02(日) 18:19:53
うーん…、ドットの影響以上のものがある気がするんですが。
縦横の幅が大体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);
}
390デフォルトの名無しさん:2007/12/03(月) 21:44:05
使ったことないけれど gluNurbsProperty で調整できるんじゃないだろうか
391デフォルトの名無しさん:2007/12/04(火) 01:02:04
マウスで画面をクリックして
ポリゴン上に描写されている、テクスチャにアクセスするのってどうやればいいでしょうか

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次元位置が出せても
その後で詰ってしまいました

すみません、どういう関数使うかも検討つかず
お願いします。。。・゚・(ノω;)・゚・
392デフォルトの名無しさん:2007/12/04(火) 01:04:17
すみません、足りてませんでした

欲しいのはポリゴン上に描写されている、1Pixelのテクスチャ座標の位置です。

クリック点から、ポリゴン上までラインを引いて
そこにあるテクスチャの色を赤くする、ということをしたいのです。

393デフォルトの名無しさん:2007/12/04(火) 02:04:05
がい視感(なぜか変換できない)を感じた
394デフォルトの名無しさん:2007/12/04(火) 02:09:49
>>392
そこまで行けば、あと一息な気がしますが。
テクスチャ座標と大きさ、テクスチャ張ってるポリゴンの座標値から求められません?
ポリゴンが複雑なのかな?

少し前に関連したレスがあったような希ガス。
395デフォルトの名無しさん:2007/12/04(火) 02:16:14
関連したレス探してみます。

ポリゴンの点から、どうやってテクスチャ座標にするのか
そこがまったくわからなくて

あと、ポリゴンの中でテクスチャが繰り返しで動いてたりしたらどうするのかとか…
考えすぎて気持ち悪くなってきました
396デフォルトの名無しさん:2007/12/04(火) 02:25:39
>>395
テクスチャをいろいろ加工したいんだったら、繰り返しは考えない方がいいと思うぞ。
俺も気持ちが悪くなったw
397デフォルトの名無しさん:2007/12/05(水) 01:09:38
>>391
上〜の方でも同じ話してるけど・・・
これはOpenGLの問題ではないし、どういう関数を使うとかいう問題でもないよ。
単純に幾何の問題。

まず交点だけじゃなく、どのトライアングルと交差したのかを求めないといけない。
それが求まったら、交点のトライアングルにおける重心座標に変換する。
(barycentric coordinate でぐぐれば何か出てくるかも)
重心座標まで出れば、あとは自ずと解決するでしょう。
398デフォルトの名無しさん:2007/12/05(水) 23:03:34
アンチエイリアスにつついての質問なんですが、

glEnable(GL_POLYGON_SMOOTH)

としてアンチエイリアスを有効にした後、

glDisable(GL_POLYGON_SMOOTH)

としてもなぜかアンチエイリアスが無効になりません。
他に特別なことはしていない(四角を書いてテクスチャを張るのみ。
glHintやglBlendFuncも未使用)ので何が原因だかさっぱりです orz
これって一回有効にすると無効にならないのでしょうか?
399デフォルトの名無しさん:2007/12/05(水) 23:15:02
>>398
んなわきゃーない
disableすれば無効になるよ
400デフォルトの名無しさん:2007/12/05(水) 23:21:15
>>399
ですよね。でも出てくる絵を見るとどう考えてもアンチエイリアスが…
glDisable(GL_POLYGON_SMOOTH)ってglFlushの後でも別に問題はありませんよね?
401デフォルトの名無しさん:2007/12/05(水) 23:45:55
もちろん問題ないよ
それ以降に描画するポリゴンのPOLYGON_SMOOTHが無効になる


・・・まさか、
glEnable/glDisableするだけで、描画済みの絵のアンチエイリアシングが
有効になったり無効になったりするだなんて、思ってないよね?????????
402389:2007/12/06(木) 00:06:32
>>390
できましたー!
ありがとうございますっっっ。
403デフォルトの名無しさん:2007/12/06(木) 00:08:39
>>401
本来無効になってくれるものが無効にならないとしたらこっちが
なにか変な事してるとしか考えられませんよね… うーん orz

ちなみに、glEnable()、glDisable()するたびに描画し直してる(VS上で
動いてるのを確認済み)のでそれはないです >描画済みの絵
404デフォルトの名無しさん:2007/12/06(木) 00:14:41
>>403
追記:glClear(GL_COLOR_BUFFER_BIT)もちゃんとやってます
405デフォルトの名無しさん:2007/12/06(木) 00:14:50
>398
テクスチャのバイリニアフィルタとアンチエイリアスは違うよ
406デフォルトの名無しさん:2007/12/06(木) 00:16:45
そうなるとよく分かんないな
ちなみにglFlushの後でglDisable(GL_POLYGON_SMOOTH)するのってなんで??

あとはソースあれば話はやいんだけど
407デフォルトの名無しさん:2007/12/06(木) 00:29:43
>>405
アンチエイリアスを掛けたいのは四角形のポリゴンの方で、テクスチャ
ではないです。

>>406
glDisable()するのは複数回連続で描画するのですが、描画のたびに
条件が変わる(アンチエイリアスを掛ける・掛けない、ライトの位置の変更等)ので、
全てにアンチエイリアスを掛けるのならばglDisable()しなくても良いのですが、
そういうわけにも行かないので…
408デフォルトの名無しさん:2007/12/06(木) 00:36:50
いや、そーじゃなくて・・・
ポリゴンのアンチエイリアシングをenable/disableしたいなら、
そのポリゴンを描画する直前にglEnable/glDisableすればいいのに
なんでglFlushの後でやるのかなと
409デフォルトの名無しさん:2007/12/06(木) 00:49:10
>>408
描画の流れとして

設定

描画

設定

描画



という感じなのですが、ライトや回転・平行移動等がglBeginの前にあるので
そこでglEnable()、glDisable()するようにしているのですが、二回目以降アンチエイリアス
を掛けない場合はglFlush()の後にglDisable()することになるので、これがだめなのかなーとか
思ったのですがそうではないみたいですし…
410デフォルトの名無しさん:2007/12/06(木) 00:50:46
コレは諦めてドライバーのバグという事に
411デフォルトの名無しさん:2007/12/06(木) 01:01:12
>>410
マジっすか orz
412デフォルトの名無しさん:2007/12/06(木) 03:08:01
そういうことは十分にありえるのでは・・
413デフォルトの名無しさん:2007/12/06(木) 04:13:45
FSAAの有効無効の設定はデバイス初期化時以外では出来ないよ
これはDirect3Dも同じ
414デフォルトの名無しさん:2007/12/06(木) 09:13:15
glutKeyboardFuncとglutDisplayFuncで変数を共有したかったらグローバル変数使うしかないんですか?
415デフォルトの名無しさん:2007/12/06(木) 12:17:15
しかないな
416デフォルトの名無しさん:2007/12/06(木) 19:32:53
main関数で変数作って
参照渡し・参照渡しでダメかな?
417デフォルトの名無しさん:2007/12/06(木) 21:08:42
>>416
そもそもdisplayfuncに引数が無いから
418414:2007/12/07(金) 10:40:17
ありがとうございました
419デフォルトの名無しさん:2007/12/07(金) 14:19:52
glclipplaneで物体の断面表示させてるのですが
断面用planeの輪郭線描こうと思って色をつけたら(glcolor3f(1.0,0.0,0.0))
全部の物体が赤くなりました


助けてください!
420デフォルトの名無しさん:2007/12/07(金) 14:26:24
輪郭線を描き終わったら、元の色 (白) に戻す。
421デフォルトの名無しさん:2007/12/07(金) 14:54:00
おおおおおおおおおおおおおおおお!!!!
できました!!!!ありがとうございます!!!

なんでこんなこと知ってるんですか!!!
422デフォルトの名無しさん:2007/12/07(金) 15:14:54
一度設定した内容は、もう一度変えるまでずっと有効になるってことくらい、覚えとけ
423デフォルトの名無しさん:2007/12/07(金) 15:28:25
心に刻んでおきます!!!
424デフォルトの名無しさん:2007/12/07(金) 19:34:21
>>419-423
この流れワロタ
50くらい上のレス読めよw
425デフォルトの名無しさん:2007/12/08(土) 00:08:15
ちょうど断面繋がりで
ttp://up2.viploader.net/upphp/src/vlphp102691.png

ボリュームレンダリングで床井先生のところの断面処理をやろうとして
立方体の中に、球体が入っていて中がくりぬかれている様子を描きたいのですが
断面表示させたときに○がくり抜きされません。

クロスポリゴンにテクスチャマップさせてVRさせてるのですが
そのせいなのかとも…
426デフォルトの名無しさん:2007/12/08(土) 00:34:25
ステンシルバッファがどう更新されててどういう状態になってるかを確認するといいんじゃないかな
427デフォルトの名無しさん:2007/12/08(土) 00:44:03
ステンシルバッファを使うのが初めてで
どういう感じにやっていくのですか?
428デフォルトの名無しさん:2007/12/08(土) 00:52:43
glReadPixelsのGL_STENCIL_INDEXで現在のステンシルバッファの中身を取得できる
そもそもステンシルバッファがどういう働きをするのか理解してる?
429デフォルトの名無しさん:2007/12/08(土) 00:58:18
>>428
ありがとうございます。試してみます。
大まかに、こういうものというのは文字で読んだのですが
いまいちイメージが出来ていません。
FBOとかもよくわかっておらずです
430デフォルトの名無しさん:2007/12/08(土) 15:50:04
>>425ですが
色々試していたのですが、どうも上手くいきません

glReadPixels(0.0, 0.0, width , height , GL_STENCIL_INDEX , GL_UNSIGNED_BYTE , bits);
glDrawPixels(width , height , GL_LUMINANCE , GL_UNSIGNED_BYTE , bits);
で、ステンシルの状況を見たのですが、まったくマスクがされてない感じです。
ポリゴンを積み重ねるせいでうまくいっていないのかもしれません

丸い形状のマスクを作って、そこに描画しない=くり貫くということをしたいのですが
もう少しヒントいただけませんか
431デフォルトの名無しさん:2007/12/08(土) 18:14:41
マスクを描いた時の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);
//ここでマスクされる方を描画
適当だけどこんな感じでいいと思う
432デフォルトの名無しさん:2007/12/09(日) 13:09:15
>>430
床井先生のコードではどういう風にステンシルバッファが動いてるのか、を確認して、比較してみればいいと思う
433デフォルトの名無しさん:2007/12/09(日) 14:38:41
ttp://up2.viploader.net/upphp/src/vlphp103585.png
ttp://ccfa.info/cgi-bin/up/src/up11672.txt

レスありがとうございます。
なんとか近いところまで行きました

ただ、あと少しというところで
球面が裏側からも見える
断面の球体が塗りつぶされている
という状況です

下はソースのマスク部分です。
見ていただけますとほんと助かります。
434デフォルトの名無しさん:2007/12/10(月) 04:43:47
vipろだマジやめて
vipがうざいとかそういうんじゃなくて、とにかくYAMETE
435デフォルトの名無しさん:2007/12/10(月) 12:11:50
>433
>ただ、あと少しというところで
>球面が裏側からも見える
まさか半透明で描画してないでしょうね?
436デフォルトの名無しさん:2007/12/10(月) 19:00:08
>>434
理由がよくわかりませんが、すみません。

>>435
そう思い、解除したのですが
>断面の球体が塗りつぶされている
こちらが改善されて、球面は見えたままでした。

マスクを見てみると、常に○が描画されるようになっていて
モノに隠れたときに、消えるようにしないとダメみたいです

437デフォルトの名無しさん:2007/12/11(火) 22:24:54
テクスチャについてよくわかんなくなったので質問させてください
スクリーンセーバーの製作途中です
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の順で格納していけばいいだけでしょうか?
438デフォルトの名無しさん:2007/12/11(火) 23:56:01
GLintで、RGBを順番に格納して
glteximage2dで貼り付けたらいいと思うよ!!!

opengl テクスチャで検索して出てくるところを参考に
439デフォルトの名無しさん:2007/12/13(木) 18:57:05
>>433ですが未だに出来ていません
ttp://www.vippers.org/img/uho1518.png

○をボックスの右の方にずらしてくり貫かれると思ってやっているのですが
まったく…

○そのものをマスクにすると、くり貫かれるのではなく、その中が描画されません。
どなたか、助言いただけませんか。周りにやってるのがまったくいなくて八方ふさがりです
440デフォルトの名無しさん:2007/12/13(木) 19:58:54
>>439
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20060623
のキャッピングのプログラム
http://www.wakayama-u.ac.jp/~tokoi/opengl/cap.c
にある
/* 図形が「閉じた立体」(かつ glCullFace() を使わない)な
ら、画素のステンシルバッファへの書き込み回数は偶数回に
なる。ところが、クリップされて物体に穴が開いてしまうと、
その部分(そこからは裏側の面が見える)に対する書き込み
回数は奇数回になる。したがって、ステンシルバッファの書
き込みが行われる度にステンシルバッファのビットを反転す
れば、奇数回書き込みが行われた部分、すなわち穴の部分の
画素のステンシルバッファだけ値がセットされることになる。*/
読んだ?
441デフォルトの名無しさん:2007/12/13(木) 20:03:09
はい、それを元にいじくっています

ポリゴンを積み重ねている関係で、おかしくなるのと
右の方の丸が、立方体の外・中の状態で片方が見えるという状況になります。

やりたいのは任意形状のクリッピングなので、マスクで全部潰れてしまうとまずいので…
442デフォルトの名無しさん:2007/12/13(木) 20:22:08
vertex-shaderにおけるgl_Vertexってどの座標系での値ですか?
443デフォルトの名無しさん:2007/12/13(木) 20:31:28
>>441
ちゃんと閉じた物体になってる?
偶数回描画された部分をステンシルでマスクするんだよ?
なんか根本的なところが違う気がするんだが。

何をしようとしているかもう少しわかりやすく書いてくれると、
良い助言ができるかも知れません。
444デフォルトの名無しさん:2007/12/13(木) 20:35:25
>>442
glVertex3fとかで渡した値そのまんま
座標系で言うならたいていはモデル座標系だね
445デフォルトの名無しさん:2007/12/13(木) 20:47:47
任意形状のクリッピングをしようとしています。

ttp://kotaro.naist.jp/~meg/research/LiveVolume/
ここのティーポットのようなことです。

直方体が積み重なって、立体をあらわしているので閉じてはいません。
そこに○で削り取るといったことがしたいのです。


≡≡
≡≡

こう積み重なったポリゴンを○で削り取るイメージです
446デフォルトの名無しさん:2007/12/13(木) 20:53:00
円なのか球なのかはっきり汁
447デフォルトの名無しさん:2007/12/13(木) 20:56:21
球です。glutSolidSphereで囲まれた領域をクリッピングしたいんです
448デフォルトの名無しさん:2007/12/13(木) 21:39:38
>>447
ステンシルでふたをするのとは、話がぜんぜん違う。
積み重なったポリゴンをどうやって描画してるの?
まさか、立方体をひたすら描いてる?
その場合、球体でクリッピングなんてそんな簡単な話じゃないぞ。
449デフォルトの名無しさん:2007/12/13(木) 21:48:39
立方体というか
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で出来たので出来るものだと思ってやっていたのです
450デフォルトの名無しさん:2007/12/13(木) 21:56:57
>>449
それを球で削り取るの?
無理。
発想を変えたまえ。
451デフォルトの名無しさん:2007/12/13(木) 22:07:11
ムリですか…
glclipplaneの構造はどこかで見れるでしょうか
452デフォルトの名無しさん:2007/12/15(土) 19:49:50
(削りとられた部分)
デプステストを遠方優先にし、デプスバッファを手前側で初期化
カラーバッファの書き込みを禁止(デプスバッファだけを有効)にして球を描画
カラーバッファの書き込みを許可、デプスバッファの書き込みを禁止
ポリゴンを描画

(削り残し)
デプステストを手前優先にし、デプスバッファを遠方側で初期化(一般的な設定)
カラーバッファの書き込みを禁止(デプスバッファだけを有効)にして球を描画
カラーバッファの書き込みを許可
ポリゴンを描画

で、どうかな?
453デフォルトの名無しさん:2007/12/16(日) 18:02:19
シェーダでフラグメントが球の範囲に入っていたらdiscard
なんて考えた俺はシェーダ脳
454デフォルトの名無しさん:2007/12/24(月) 16:06:56
OPENGLで
たくさんある物体から、マウスで1個クリックして
マウスの動く方向にピッキングして動かす

ということをしたいのですが
参考になるソースとか教えてくあさい
455デフォルトの名無しさん:2007/12/24(月) 16:22:16
OpenGLで射影変換をセットするときにglFrustumを使いますが、
射影変換の設定の時にニアクリップとファークリップを設定したくないのですが(どこに
ポリゴンがあってもZ軸でクリッピングしたくない)、どのようにしたら出来るでしょうか?
glFrustumではどちらも自然数でなくてはだめみたいですし…
456デフォルトの名無しさん:2007/12/24(月) 20:36:14
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);
}
457デフォルトの名無しさん:2007/12/24(月) 20:37:48
>>456
キーボードを押したときにティーポットが回転するプログラムを書いたんです
が、キーを押しても回転しません。理由を教えてください。
458デフォルトの名無しさん:2007/12/24(月) 20:43:49
>>519-520
マルチはよしんさい
459デフォルトの名無しさん:2007/12/25(火) 01:17:25
>>458
それは向こうのスレのレス番だ。

>>454
glRenderMode(GL_SELECT)
gluPickMatrix
このへんでぐぐれ。

>>455
near と far を設定しなかったら透視投影にならないだろ。
460デフォルトの名無しさん:2007/12/25(火) 03:12:02
>>459
射影変換行列そのものにはnear/farなんてパラメータは出てこないのだから、
透視投影にはなるだろう。
461デフォルトの名無しさん:2007/12/25(火) 03:43:59
>>455
near/farを設定しないで描画することはできないよ。
(正確にはちょっと違うっていうかまぁ>>460さんの言う通りなんだけど
多分>>455さんにとってはどうでもいい細かい話だろうし、行列をどう解釈するか
という問題でもあるので、near/farは必要と思っていても間違いではないでしょう。)

どうしてもクリッピングしたくないなら、レイトレでもやるしかないんじゃないかなぁ。
462デフォルトの名無しさん:2007/12/25(火) 14:34:13
ニアクリップしないとカメラ側の鏡像が出ちゃわないかね?
463デフォルトの名無しさん:2007/12/25(火) 22:36:43
Linux用のOpenGLの関数のmanってどこかにありますか?
464デフォルトの名無しさん:2007/12/26(水) 22:06:21
Linuxのman形式がよく知らないので間違ってるかもしれないが
ftp://ftp.sgi.com/opengl/doc/
ここにあるのがそうかもしれない

でも古いからHTMLで良ければこっちを見た方が良い
http://www.opengl.org/sdk/docs/man/
465デフォルトの名無しさん:2007/12/27(木) 00:11:27
テクスチャのサンプリングで

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の位置でサンプリングしてくれますか
466デフォルトの名無しさん:2007/12/27(木) 12:39:23
GL_TEXTURE_GEN_MODEがGL_OBJECT_LINEARだったら、モデルビュー行列をいじっても
生成されるテクスチャ座標は変わりませんよ。(→GL_EYE_LINEARとかじゃないと)
それよりテクスチャ行列いじった方が早いのでは?(→glMatrixMode & GL_TEXTURE)
467デフォルトの名無しさん:2007/12/29(土) 16:53:28
大きい方がドデカヘドロン
変な方がヘンデカヘドロン
468デフォルトの名無しさん:2007/12/29(土) 19:31:47
mingwのgccでglut3.7を使う方法はありませんか?
469デフォルトの名無しさん:2007/12/29(土) 23:23:31
すんません glTexSubImage2D で2の累乗でない矩形を転送したいのですが歪んでしまいます

ttp://uproda11.2ch-library.com/src/1155021.jpg.shtml

32x32矩形と34x34矩形を転送した結果、ピクセル配列はコンソールに書いてみて正常
512x512 のアルファテクスチャを板ポリに貼り付けてます

転送先のテクスチャフォーマットは glTexSubImage2D 同様 ALPHA/UBYTE
SubImage2Dでも2の累乗以外の矩形転送はドライバ依存ですか?(GF7600GTです)
470デフォルトの名無しさん:2007/12/29(土) 23:25:02
>>469
画像のテキスト間違ってしまった・・・下は34x34のglTexSubImage2Dの結果です
471デフォルトの名無しさん:2007/12/30(日) 00:17:09
Not Foundって言われてしまうんだが…
見れないのでよくわからないが
GL_TEXTURE_MAG_FILTERとかGL_TEXTURE_MIN_FILTERが
GL_LINEARになってるとちょっと端がぼけたりするよ
全然違ってたらすまん
472デフォルトの名無しさん:2007/12/30(日) 02:23:20
>>469
glTexSubImage2Dに渡した引数を見せてくれないとわからんがな。
まぁ32x32で渡してしまっただけな気がするが。

1,1  1,2  1,3 ・・・ 1,32
1,33 1,34 2,1 ・・・ 2,30

見た感じこんなじゃね?傾きが1/2っぽいし1行で2列ずれるのと符合する。
473デフォルトの名無しさん:2007/12/30(日) 02:24:07
うん
俺もよくそれやるよl。
474デフォルトの名無しさん:2007/12/31(月) 17:55:55
質問させて頂きます。
@FBOテクスチャに適当に描画。
A上のレンダリングテクスチャに、上のレンダリングテクスチャを別のオブジェクトに貼って描画。
としう事をしたいのですが、Aを行う際、@で作ったテクスチャを別のテクスチャにコピーする必要があると思います。
その、テクスチャを別のテクスチャにコピーをしたいのですがどのようにすればいいのでしょうか?
できれば、高速な方法が良いです。宜しくお願いします。
475474:2007/12/31(月) 18:39:12
glCopyTexSubImage2Dでできました。すいません。
476デフォルトの名無しさん:2007/12/31(月) 19:47:07
>>469
glPixelStorei()のGL_UNPACK_ALIGNMENTを確認
477デフォルトの名無しさん:2008/01/01(火) 20:49:53
ttp://adult.xxx-file.com/CGI/upload/src/up0216.txt

質問です
マウスで物体をドラッグして動かしたいのですが
とりあえずマウスの移動量で物体を動かそうと思って組んでるのですが

この状態だと常に移動開始点が0になってしまいます。
物体の現在地点から動かすためにはどうすればいいのでしょうか

それと、視点を回転したときに
どうやってマウスの動きと物体をあわせればいいかを、お願いします。

マウスドラッグ・移動関係の参考になるところがまったくなくて…
478デフォルトの名無しさん:2008/01/02(水) 13:04:12
>>477
物体の位置を覚えておく変数を追加したらいいんじゃね。

static int xPos;

void drug(int x, int y)
{
//以下を追加
xPos += dst_x;
}
void display(void)
{
//以下に変更
glTranslatedxPos, , );
}

y,zも同様に。
479デフォルトの名無しさん:2008/01/02(水) 14:39:04
うーん、、上手くいかなかったです

移動量がマウス座標だと200とか400なので
それを随時加算していくと、びゅーんと吹っ飛んでしまいます

0.001とかを掛けて移動しても、移動量が大きくなると吹っ飛んでしまって
なんでマウスドラッグで移動はサンプルどこにもないのだろう
480デフォルトの名無しさん:2008/01/02(水) 20:33:45
随時加算だと、等比級数的に増えてかない?

そういうときは、
マウスの移動した差分を加算するか、
最初の座標と最初のマウス座標を記録しておいて、その時との差分と最初の座標をを加算するの
481デフォルトの名無しさん:2008/01/02(水) 23:45:11
それをやりたいのですが

始めのポイントを記憶
マウスがUPの時に移動分を算出 translateすると
ドラッグ中のが表示されなくて。
482デフォルトの名無しさん:2008/01/03(木) 01:14:51
そもそもglutIdleFuncの使い方がおかしい。ドラッグ中はidleじゃないから最描写されないのは当たり前。
アニメーションさせるわけじゃないからこのプログラムの場合glutIdleFuncは使わなくていい。
ドラッグ中は必ず画面を最描写するんだからそこからglutPostRedisplayを呼べばいい。
state == GLUT_UPのときも同様。
483デフォルトの名無しさん:2008/01/03(木) 11:01:08
ドラッグ中も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なのかは自分で好きなように計算すればいい
484デフォルトの名無しさん:2008/01/03(木) 13:35:21
>>482-483
ありがとうございます。ほんとにありがとうございます。
自分の頭の悪さに泣けてきました
ほんとありがとうございます
485デフォルトの名無しさん:2008/01/03(木) 16:44:00
質問です

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( );

このようにして面を書きたかったのですが
描画されてほしい面が描画されず、片面しか描画されません
(回転させると裏側は光を反射してました)
両面描いたり、反対側を描画するといった設定にはできないのでしょうか
486デフォルトの名無しさん:2008/01/03(木) 17:19:45
GLfloat sphereColor[] = { 1.0, 1.0, 1.0, 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, sphereColor);
487デフォルトの名無しさん:2008/01/03(木) 20:44:19
>>486
ありがとうございます
教えてもらった情報ではできませんでしたが座標を変えてたらできました
どうやらxyz座標軸の認識を間違えていたみたいです
すいません
488デフォルトの名無しさん:2008/01/04(金) 15:55:00
あとポリゴンには表と裏があるよ

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
}
あとに表示される立方体の回転速度が速くなってしまいます。
490デフォルトの名無しさん:2008/01/09(水) 03:43:29
glPushMatrix();
glRotate*()
glBegin();
glVertex*();
glEnd();
glPopMatrix();

こんなかんじ
491デフォルトの名無しさん:2008/01/09(水) 04:32:56
492デフォルトの名無しさん:2008/01/09(水) 06:02:08
>>490
できました。
だけど、最初の一つが動かなくなったorz
なんでだ
493デフォルトの名無しさん:2008/01/09(水) 22:19:20
ビルボードを作るために逆行列を求める関数を実装しようとしているのですが、
なにか参考になりそうなものってありますか?
今のところなにも思いつかないので

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]));


とやって余因子を求めつつ、求めたところで行列式を出して判別・逆行列の計算
をしようと思ってるのですが、なんかもっと早くなりそうな気が…
494デフォルトの名無しさん:2008/01/09(水) 22:20:39
double element[4][4];→×
double elements[4][4]→○
でした orz
495デフォルトの名無しさん:2008/01/09(水) 22:52:10
どこかで拾ったものが手元にある。
床井さんのところにあったような記憶が・・・
496デフォルトの名無しさん:2008/01/10(木) 00:21:05
D3DXMatrixInverseを使(ry
497デフォルトの名無しさん:2008/01/10(木) 01:27:23
498デフォルトの名無しさん:2008/01/10(木) 01:51:23
>>495
床井さんのところでは、逆行列は使わないで逆変換を出して掛ける方がいいとの
事でしたが、gluLookAtによる視点の移動って逆行列じゃなくても逆変換できる
んですかね?出来るならこの方が早くなりそうですが…

>>496
それは最終手段に取っておきますw
499デフォルトの名無しさん:2008/01/10(木) 03:35:34
500デフォルトの名無しさん:2008/01/10(木) 07:24:30
>>498
gluLookAtはglTranslateとglRotateをやってるだけだから逆変換できるのでは。
回転成分(3x3)の転置行列に逆移動(-[12,13,14])を掛ければ求まる
501デフォルトの名無しさん:2008/01/10(木) 16:03:16
>>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
502500: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()すれば確認できるはず。

503デフォルトの名無しさん:2008/01/10(木) 20:00:08
>>501
上手くいきました!
…が、誤差の関係で完全には単位行列にならず、1.00000000002や
0.00000000000125といった値になるものもあるのですが、これは閾値を決めて
自分で削っていくしかないですかね?
504デフォルトの名無しさん:2008/01/10(木) 20:00:43
>>503
>>501→×
>>502→○

orz
505デフォルトの名無しさん:2008/01/10(木) 20:18:39
完全な単位行列ってそんなに価値あるものなのか
その程度の微小な誤差が結果にそれほど影響を与えるとは思えないが
本当に必要なことならまぁ何か考えるのもいいけれど
506デフォルトの名無しさん:2008/01/10(木) 20:35:11
>>503
実数値は、=で比較しちゃいかんよ。と言ってみる。
507デフォルトの名無しさん:2008/01/10(木) 21:48:56
>>505
なんだか、位置を調整しても消えたり出てきたりとちらちらしてるのが気になったので、
この微少な差でニアクリップやファークリップの外に出てるのかなと。
508500:2008/01/10(木) 21:52:41
プログラミングやってれば誤差とは長い付き合いになるからいろいろ実験してみ
丸めてみてまだちらちらするなら誤差のせいだし、そうじゃなきゃ別のとこに問題がある
ビルボードだったらその程度の誤差は問題にならないと思うけどね
509デフォルトの名無しさん:2008/01/10(木) 23:29:35
>>508
丸めてみたところ、小数点以下5桁目から削ればほとんどちらつかなくなりました。
長々とお付き合いいただきありがとうございました。
510デフォルトの名無しさん:2008/01/14(月) 10:56:26
Win32 SDKでプログラムしてるんですが
子ウィンドウ内でGlutに描画させる事はできますか?
511デフォルトの名無しさん:2008/01/14(月) 11:37:01
>>510
MSDNライブラリにサンプルコードがついてたよ。MFCだけどOPENGLのAPI呼んでるだけだったし。
512デフォルトの名無しさん:2008/01/14(月) 11:50:00
>>510
glutで描画ってのは具体的にどのglutの関数?
glutDisplayFuncとかが使えるかって意味ならまず無理じゃね
513デフォルトの名無しさん:2008/01/15(火) 10:14:40
枠だけの立方体を、各頂点を線分でつないで作成し、glRotateですこしづつ回して表示しています。
このとき立方体の、本来見えない部分というんでしょうか、奥にある辺を
普通の線ではなくて、点線にするなり、色を薄くするなりして表示させたいのですが
どうすればいいでしょうか?
514デフォルトの名無しさん:2008/01/15(火) 11:13:21
複雑な図形なら別の手法をとるかもしれんけど、立方体なら、
奥の辺=共有する面が2枚とも裏を向いてる=視線ベクトルとの内積が負
とかでいいんじゃね。
自分で計算すんのめんどかったらglPolygonModeでLINEにしといてglCullFaceを変えてポリゴンを2回描けばいい
515デフォルトの名無しさん:2008/01/22(火) 12:23:25
テクスチャのMAXサイズを超えるテクスチャがあるとき、
そのままだとshaderに渡して処理することはできないので、
あらかじめテクスチャ座標をuvとも半分とかに指定して、
MAXサイズ以内におさえて、shaderに渡すことはできますか?
そもそもこういう考え方はダメなんでしょうか。
516デフォルトの名無しさん:2008/01/22(火) 12:32:17
カーマックはメガテクスチャという考え方を導入したな
どういう風に実装しているかは分からんが
517デフォルトの名無しさん:2008/01/22(火) 16:43:03
uv座標を半分にしてもテクスチャのサイズは変わらんのでは?
518515:2008/01/22(火) 18:27:15
了解しました。ありがとうございます。
519デフォルトの名無しさん:2008/01/22(火) 21:19:54
ttp://www-ui.is.s.u-tokyo.ac.jp/~takeo/teddy/teddy-j/teddy.html
これをOPENGLで作りたいです!

どうすればいいですか!
ペンを画面上で描くこと
そこから三次元座標にすること
そのペンと物体との交点の出し方
全部わかりません!おしえてくだしあ!
520デフォルトの名無しさん:2008/01/22(火) 22:09:10
画面上で線を描くこと自体はOpenGLじゃなくてもできるので
他の方法で出来るならそれでやればいいと思う。
http://www-ui.is.s.u-tokyo.ac.jp/~takeo/papers/siggraph99.pdf
それ以降はこれちゃんと読めばある程度書いてあるよ
読んでもわからない部分があったら改めて質問してくれ
答えられるようなら誰かが答えてくれるかもしれない
521デフォルトの名無しさん:2008/01/23(水) 14:45:56
ありがとうございます!保存しました!英語は一応読めます!
でも、こういう論文が概念ばかり書かれていて
実装の細部になると、一切書かれていないのでわからないです!

ペンを画面上で描くところは出来ました!
ttp://www.vipper.org/vip722020.jpg

画面とマウス座標を
glOrtho(-0.5, (GLdouble)w - 0.5, (GLdouble)h - 0.5, -0.5, -1.0, 1.0);
で一致させてるので、3次元空間でどうすればいいのかわかりません><

522デフォルトの名無しさん:2008/01/23(水) 15:14:06
>>521
なぜその絵なんだw
523デフォルトの名無しさん:2008/01/23(水) 16:46:44
Javaだから逆コンパイルすれ
524デフォルトの名無しさん:2008/01/23(水) 21:02:33
>>521
べつに3次元空間でも同じでいいんじゃね?
Z=0のXY平面に描いたならそれでも立派な3次元だ

次は論文読んでその図形をまず三角ポリゴンにしてみるといい
Figure 13のfの状態にするんだ
525デフォルトの名無しさん:2008/01/23(水) 21:02:49
逆コンパイルできません><

>>521ですが、
glOrtho(-0.5, (GLdouble)w - 0.5, (GLdouble)h - 0.5, -0.5, -1.0, 1.0);
で画面を固定させると、点が保持されてるのに

画面の中で物体を回転させたりすると、点が全部消えます!
この点が3次元空間に掛かれていたら、全部回転すると思ったのですが
回転しません>< 助けてください!

ためしに、glunprojectで3次元空間に直接点を打ったのですが
1個打って、次のを打ったら消えます

わけわかりません(;;
526デフォルトの名無しさん:2008/01/23(水) 21:06:37
どういう状態だかよくわからんが、
描画する時は今まで描いた点も全部描き直さなきゃならんのは分かってるか?
527デフォルトの名無しさん:2008/01/23(水) 21:18:07
>>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次元の中で点が動いてくれると思ったのに!
528デフォルトの名無しさん:2008/01/23(水) 21:19:19
>描画する時は今まで描いた点も全部描き直さなきゃならんのは分かってるか?
初耳でした!
529デフォルトの名無しさん:2008/01/23(水) 22:56:26
vine4.1なんですが、インストールができません。lib/glutでmakeしても
分離記号が欠けています。中止
と出ます。どうしたらいいですか?
530デフォルトの名無しさん:2008/01/24(木) 12:30:57
OpenGLの関数ってハンドルみたいのが無いんですけど、wglMakeCurrentで選択したコンテキストは、そのスレッド内だけで有効ですか?
531デフォルトの名無しさん:2008/01/24(木) 13:28:37
>>530
そうです

http://msdn2.microsoft.com/en-us/library/ms537558(VS.85).aspx
>The wglMakeCurrent function makes a specified OpenGL rendering context
>the calling thread's current rendering context.
532デフォルトの名無しさん:2008/01/24(木) 15:07:36
>>529
vineは知らんけどソースからじゃなくて普通にパッケージから入れたらどうよ
533デフォルトの名無しさん:2008/01/25(金) 17:13:11
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で指定した領域を正射影っていうのは
どうやればできるのでしょう?
534デフォルトの名無しさん:2008/01/25(金) 22:14:25
glMatexiMode(GL_PROJECTION);
glOrtho(〜);
glMatrixMode(GL_MODELVIEW);
gluLookAt(〜);
こうしたいっていう意味か?
535デフォルトの名無しさん:2008/01/29(火) 12:47:45
立方体の表面に色をつけて、くるくる回したりしています。
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}; //光源の位置の設定
のようにしたのですが、光にも色をつけないといけないのでしょうか?
536デフォルトの名無しさん:2008/01/29(火) 17:40:19
>>535
普通は光は白にしといて、glMaterialで色をつける。
537デフォルトの名無しさん:2008/01/29(火) 20:34:02
ライト使うなら頂点ごとに法線が必要。glNormal*()
538535です:2008/01/29(火) 23:18:04
>>537さん
それはすでにやってます。
陰はついてるんですが、色が光の色になってしまうんです

>>536さん
glMaterialって、glMaterialColorとはまた違うんでしょうか?
glBeginの直前においても、変化がないですorz
539デフォルトの名無しさん:2008/01/30(水) 01:55:47
>>536
glMaterialColor なんてあったんだ。知らなかった。
素直にglMaterialでやってみてくれ。
540デフォルトの名無しさん:2008/01/30(水) 01:59:48
>>535
の間違いだった orz

glMaterialColor て赤本にもないし、ぐぐっても出てこない。どこから持ってきたんだ?
541デフォルトの名無しさん:2008/01/30(水) 09:59:16
glcolormaterial
542デフォルトの名無しさん:2008/02/10(日) 16:07:17
すいません、glDrawPixelsで質問があります。
真っ白のイメージを描画しているのに、なぜか黄色で表示されます。しかも半透明で
背景が透けてしまいます。
どんな原因が考えられますでしょうか…OTL
543542:2008/02/10(日) 18:42:48
glDisable( GL_BLEND );
で半透明になるのは解決しましたが、黄色になる問題が残ったままです。
何か色に関係あるパラメータって何でしょうか?
glColorを試してみたのですが、結果は変わりませんでした。
544デフォルトの名無しさん:2008/02/10(日) 19:34:47
RGBの順序が間違ってるとか
545デフォルトの名無しさん:2008/02/10(日) 19:45:06
>>544
自分も最初それを疑いましたが、それなら0xffffffffで緑色(よく見たら緑色でした)
になるのはおかしいです…。
546デフォルトの名無しさん:2008/02/10(日) 20:22:53
glColorMaskとか
547デフォルトの名無しさん:2008/02/10(日) 20:25:53
どこかで GL_GREEN_BIAS とか
548542:2008/02/10(日) 20:28:20
自己解決しました。
直前に張ったテクスチャの色に引っ張られるのを発見したので、
glDisable( TEXTURE_2D );
を挿入したところ、上手くいきました。

ところでTexture関連のパラメータがglDrawPixelsに影響を及ぼすという挙動というのは、
意図されたものなのでしょうか?界隈では常識だったりしますか?
549デフォルトの名無しさん:2008/02/10(日) 20:42:43
初めて知った。
glDrawPixels 使うくらいならテクスチャで描画しちゃうからな。同時に使うことがない。
550デフォルトの名無しさん:2008/02/10(日) 21:26:08
ドライバの実装が適当ってだけじゃね?
551デフォルトの名無しさん:2008/02/10(日) 23:41:57
OpenGLのアーキテクチャを見る限りでは、DrawPixelsでテクスチャが適用されるのは
正しい挙動っぽいね。 → http://www.opengl.org/documentation/specs/version1.1/state.pdf
ていうか自分も、こんなん気にしたことないや。気をつけるようにしておこう。
テクスチャをEnableにしっぱなしって、気づかないこと多いよネ・・・。
552デフォルトの名無しさん:2008/02/11(月) 00:15:14
テクスチャやらアルファブレンドやらいらんからBltBlt並に高速にしろよ

と5年位前に思ったけどもうどうでもいいや
553デフォルトの名無しさん:2008/02/11(月) 00:16:09
>>551
ありがとうございます。確認しました。他にもDrawPixels使う上でDisableにしたほうがいい
パラメータがあるようですね。
554デフォルトの名無しさん:2008/02/11(月) 02:02:45
ポリゴン描画するパラメータ全部影響あるよ。シェーダーとかもね。
555デフォルトの名無しさん:2008/02/11(月) 04:17:40
glBindTexture(GL_TEXTURE_2D, 0);でもいいのでは
556デフォルトの名無しさん:2008/02/11(月) 23:30:38
それじゃ0番のテクスチャが適用されるじゃないか。
この問題は俺もこのあいだそれで嵌まったんだが、
RadeonX1600のMacOS10.5.1ではテクスチャが無視されて、
GF8600GTのWindowsXPマシンでは変に影響するし、
めちゃくちゃ重くなるしでまさかテクスチャが影響するとは思わなかったぜ。
DrawPixelsではいったいどんな座標のテクスチャがサンプリングされるのか
さっぱりわからないし、無視してくれればいいのに。
ちゃんとDisableしとけば問題ないんだけどな。
557デフォルトの名無しさん:2008/02/12(火) 00:01:55
逆に考えるとglDrawPixelsでテクスチャの内容をアウトプット出来るんだな
って意味ないか
558デフォルトの名無しさん:2008/02/12(火) 00:56:34
0番テクスチャ=テクスチャなしと思ってた
559デフォルトの名無しさん:2008/02/12(火) 09:55:33
0番テクスチャ = OpenGL 1.0のテクスチャ
560デフォルトの名無しさん:2008/02/14(木) 00:17:08
for(cycle=1;cycle<=100;cycle++){
glutMainLoop();
}

というふうなプログラムを作ったんだけど、glutMainLoop()の中でexit(0);を実行してループを抜け出すと、
プログラム自体が終了してしまう(for文関係なしに終了する)。
exit(0)だからダメなのか不明。もしかしたらexit(0)以外に何か抜け出す方法ってある?
561デフォルトの名無しさん:2008/02/14(木) 00:28:19
exit(0)はプログラムを終了する関数。終了するのが正常動作
glutMainLoop()は制御をglutに任す関数。抜け出す方法は無いし、その必要も無い。
100回描画するなら、カウントはdisplayFiunc()の中で数えるなどして、glutMainLoopからは抜けないで処理する
562初心者:2008/02/14(木) 10:30:44
距離画像のような、被写体の距離値を輝度(0から255)として持った500*500の画像があります。
これを使って、OpenGLで各距離値に対応した場所に四角の平面を作るといった事がしたいのですが、どのようなプログラミングをくめばいいでしょうか。
まだ、ほとんどOpenGLを使ったことがないので、よく分かりません。
質問が分かりにくいかもしれませんが、何かヒントをいただけるとうれしいです。
よろしくお願いします。
563デフォルトの名無しさん:2008/02/14(木) 12:35:27
その500x500の元画像は例えば、

253 110 200 90 255 ...

というのが記録してあるということでOK?

で、253なら例えば視点から 253 の距離だけ離れた場所に1つの平面を描き、
110なら例えば視点から 110 の距離だけ離れた場所に1つの平面を描き……、
というのを 500x500 枚描くということでOK?
564初心者:2008/02/14(木) 13:01:35
>>563

その通りです!
よろしくお願いします!
565デフォルトの名無しさん:2008/02/14(木) 16:48:15
>>562
どこの課題?
画像ファイルから画素値を得るところまでは自分でできるの?
566デフォルトの名無しさん:2008/02/14(木) 19:25:46
ttp://www.xfy.com/jp/manual/dev/developer/1.5/spec/image/chart/type_3d.gif

早い話こういうのやりたいんでしょ?
三角1個かけるようになれば簡単だと思うので
まずは三角1個かいてるサンプルを探してくるのが先かと。
567デフォルトの名無しさん:2008/02/14(木) 21:41:24
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
そうなんです。こんな感じのが作れるとうれしいんですが。
三角形を書くのは出来るのですが、距離画像を読み込んで、それぞれの点をどのように読み込み、指定していけばいいかで悩んでいます。
よろしくお願いします。
570デフォルトの名無しさん:2008/02/14(木) 23:27:37
>>568
すみません。dllフォルダのOpenCV用のdll(4つあります)をsystem32にコピーすると動くと思います。
571デフォルトの名無しさん:2008/02/14(木) 23:54:26
3角形が書けるなら、画像を読み込んでその点に応じてポリゴンを書けばいいじゃない
画像の読み込みができないの?なにに悩んでるの?
572デフォルトの名無しさん:2008/02/15(金) 02:14:44
超初心者丸出しな質問です
OpenGLをそこそこ使えるようになれば、ドラえもんを立体表示させてグリグリ動かしたりもできるようになるんでしょうか?
あと赤本ってみなさん読んでるんですか?
573デフォルトの名無しさん:2008/02/15(金) 03:07:15
OpenGLをそこそこ使えるようになっても、ドラえもんのモデリングを行う造形センスがなければ難しい。
それにそれを公開するならコピーライツ関連をクリアする交渉能力も必要だな。
574デフォルトの名無しさん:2008/02/15(金) 07:50:38
>>569
画像フォーマットぐらい書かないと、おまえの大好きな
そのまま提出できる「答え」は、書いてもらえないよ。
575デフォルトの名無しさん:2008/02/15(金) 09:55:40
>>574
BMPだとうれしいです。よろしくお願いします。
576デフォルトの名無しさん:2008/02/15(金) 11:08:40
このへんにBMPファイルの読み込み方法が載っているよ!
http://support.microsoft.com/kb/403863/ja
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_DIB.html

あとスレ違いだよ!
577デフォルトの名無しさん:2008/02/15(金) 15:22:56
>>569
そこまでやってるなら、

・座標系と座標軸を画面に表示してみる
・拡張して「地面」を定義して描画してみる
・地面から一定距離にある三角形を1つ表示してみる
・複数にチャレンジ

でいいんじゃないかな
BMPから読み込むのはその後の話。

578デフォルトの名無しさん:2008/02/15(金) 17:05:09
>>572
OpenGL で何ができるかもよくわからない段階での質問だよね、たぶん。

可能か不可能かで言えば、可能。
ただ、OpenGL自体は平面を描くような単純な機能しかない。

ので、ドラえもんみたいな複雑な造型を描くには普通は OpenGL 単体ではやらない。
まず Shade とかメタセコイアとかで物体を作っておいて、
それを、ちょうど>>567氏がやってるようにローダを使って、
OpenGLの空間上にその物体を表示、という感じでやる。

表示できればグリグリも動かせる。ただ、腕だけをグリグリ動かすとかは、
また工夫が必要。
579デフォルトの名無しさん:2008/02/15(金) 21:34:00
>>578
へーぇ
自分のパソの画面で自由自在に動かせたら素敵だなぁと思う
580デフォルトの名無しさん:2008/02/16(土) 10:57:10
>561
やっぱりそうかー
for文分解してLoopの中に突っ込んだらいけた。
どうもありがとう
581デフォルトの名無しさん:2008/02/16(土) 21:59:01
突然すいません。
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
582デフォルトの名無しさん:2008/02/16(土) 22:39:59
bindTextureが抜けてない?
583デフォルトの名無しさん:2008/02/16(土) 22:49:14
>>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.
こんなエラーが出てきました。
584デフォルトの名無しさん:2008/02/16(土) 23:03:22
non_power_of_twoに対応してる?
300*300なら512*512に直してもう一度実験してみたらどうでしょう?
585デフォルトの名無しさん:2008/02/16(土) 23:19:19
>>584
ペイントで512*512に直してやってみましたが、同じエラーで止まってしまいました。
586デフォルトの名無しさん:2008/02/16(土) 23:33:09
デバッガで追跡するしかないですね。
surがNULLになっていないか、sur->clip_rect.w,sur->clip_rect.hが300,300になっているか全部疑ってみるべき。


587デフォルトの名無しさん:2008/02/17(日) 00:00:21
>>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にしたため、この数値になっています。
588デフォルトの名無しさん:2008/02/17(日) 00:05:45
半透明物体が混じる場合の描画について質問なんですが、
今普通の方法って

1、不透明ポリゴンを全部描く
 ↓
2、半透明ポリゴンを奥行きでソート
 ↓
3、Zバッファを参照しながら半透明ポリゴンを描く

のような手順なんでしょうか?
(半透明プリミティブ同士が重ならないなら、2は省略できるかな)
589デフォルトの名無しさん:2008/02/17(日) 00:13:53
>>587
そのgluEndPolygonはどの関数から呼ばれてるの?落ちているのはgluBuild2DMipmaps()なの?
あとglGetError()とかでなんか出てたりしないかをチェックしてみるとか
590587:2008/02/17(日) 00:42:47
>>589
gluEndPolygonは自分は呼んでないので、わからないです。(gluBuild2DMipmapsかな?)
また、gluBuild2DMipmapsの前後をprintfでくくったら、処理前の方だけ出力されたのでgluBuild2DMipmapsがおちているんだと思います。
591デフォルトの名無しさん:2008/02/17(日) 01:10:15
>>588
今っていうかZバッファ法を使うなら昔からそうだと思うけど。
半透明ポリゴンが交差してるとちょっと面倒だけどね。
592588:2008/02/17(日) 01:11:24
>>591
どもです。やっぱりそれしかないか。
593デフォルトの名無しさん:2008/02/17(日) 01:16:12
>>590
gdbならbtでバックトレースが出るよ
test.bmpが24bitカラーじゃないと上手くいかないと思うけどそこは大丈夫?
594587:2008/02/17(日) 01:22:12
>>593
test.bmpを24bitカラーに変更したらうごきました。
ありがとうございました。
595デフォルトの名無しさん:2008/02/17(日) 10:07:35
おめ。
こういうのはエラーメッセージだけからじゃわからなくて
キツイやね。
596デフォルトの名無しさん:2008/02/17(日) 20:35:44
VistaにしてGLinfo使ったらOpenGLのバージョンが2.1.0から2.1.2に
ファンクションが数個増えてるけど
http://dee.cz/sw/index.html
このベンチマークのスコアが7割くらいに減ったYO?
597デフォルトの名無しさん:2008/02/18(月) 13:00:15
Vistaではドライバの作りが変わったから
ドライバのOpenGLの最適化がまだ進んでないのかもね
いちおうVistaではちょっとオーバーヘッドはあるものの
パフォーマンスの低下はそれほど無いという話にはなってたはず
598デフォルトの名無しさん:2008/02/19(火) 13:41:35
ベンダーのドライバ入れなかったら、Vistaはクソみたいな重さだったぞ。
オラたまげたぞ
599デフォルトの名無しさん:2008/02/19(火) 14:51:22
それ多分XPや2kでも同じだよ
600デフォルトの名無しさん:2008/02/20(水) 01:29:13
gluiを使ったアイドル中のアニメーションでわからないことがあるので教えてください。
描画用のメインウィンドウでアニメーション中に、gluiで作ったサブウィンドウの上にマウスポインタを移動させると
メインウィンドウのアニメーションが止まってしまいます。
ウィンドウサイズを変更するとアニメーションが動き出しますが、
サブウィンドウの上にマウスポインタを移動させてもアニメーションを止めない方法はないでしょうか。
また、ウィンドウをリサイズせずにアニメーションを再開させる方法はないでしょうか。
なにとぞよろしくお願いします。
601600:2008/02/20(水) 01:54:34
アイドルコールバックで再描画させる前に
glutSetWindows()関数を呼ぶことで問題が解決しました。
下のアドレスにあるリファレンスの2.5項6に書いてありました。
http://ktm11.eng.shizuoka.ac.jp/glui/glui.html

どうもありがとうございました。
602デフォルトの名無しさん:2008/02/21(木) 04:51:36
>>567
も、もう一度ソーソを
後学のために
頼みます
しかしOpenCV使っているのね....
603デフォルトの名無しさん:2008/02/21(木) 21:31:54
>>602

吉祥 20M 2yoshi4303.zip

shaderとマウスセレクトの実験でちょっとコードが汚くなってます。
OpenCVはtexture読込みの部分でしか使ってないので、誰か読込み関数作ってくれれば外せるんですけどねー。
604デフォルトの名無しさん:2008/02/22(金) 03:25:30
>>603
有り難うございます。
捕獲しました。
605デフォルトの名無しさん:2008/02/22(金) 12:07:01
アルファチャンネルを持ったTIFFを矩形ポリゴンに貼り付けて、
アルファの形に切り抜いたオブジェクトを複数作りました。
手前から奥に描画していくと、手前のオブジェクトの透明部分が透けてくれません。
どうやったらちゃんと透けて見えるようになるでしょうか。(描画順が逆だと透けます。)
606デフォルトの名無しさん:2008/02/22(金) 12:11:46
>>605
デプスバッファがどうやってポリゴンの前後関係を処理してるのか調べてみるといいよ
607デフォルトの名無しさん:2008/02/22(金) 15:31:05
>>605
「透ける」てのが、半透明を使わないただの穴でいいなら
glAlphaFunc()を設定して、glEnable(GL_ALPHA_TEST)すればいいよ。
この方法だと穴のふちが汚いから半透明を使いたい、というのなら
もうそれは半透明ポリゴンと同じ問題になるので、ソートして奥から描くしかないかな。
608605:2008/02/23(土) 06:19:00
できました!ありがとうございます。確かに縁が汚くなりましたが、大方満足です。
できれば透明部分がマウスクリックを無視できればいいのですが、それはできないみたいで、
自力で実装してみます。
609デフォルトの名無しさん:2008/02/25(月) 08:35:22
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では画面表示の設定しかしてないので、リサイズしても立方体は回転しないのが正しいような気がするのですが...
610デフォルトの名無しさん:2008/02/25(月) 08:44:55
displayfuncで描画しないようにしてみ
リサイズした後描画しなかったらどうなるか分かるから
611デフォルトの名無しさん:2008/02/25(月) 09:12:18
DisplayFuncはPostRedisplayコール以外にもウインドウの移動をした場合など
画面を再描画する必要がある場合は必ず呼ばれる

つまりDisplayFuncでは描画以外の処理は入れないのがセオリー
612デフォルトの名無しさん:2008/02/25(月) 15:09:15
お返事有り難うございます。
>>610
>displayfuncで描画しないようにしてみ
リサイズする前に表示さえされませんでした。
>>611
>画面を再描画する必要がある場合は必ず呼ばれる
つまり、この再描画には画面のリサイズが含まれると考えてよいのでしょうか?
つまり、リサイズすると
glutReshapeFunc
の後に
displayfunc
が呼ばれて、再描画していると考えてよいのでしょうか?
613デフォルトの名無しさん:2008/02/25(月) 15:18:29
描画しなかったらこんな感じになる
http://www.vipper.org/vip749291.png
614デフォルトの名無しさん:2008/02/25(月) 15:39:54
>>612
そういうことになる
ちなみに、いつdisplayfuncが呼ばれるかは、すべてウィンドウシステム(≒OS)の判断による
OSが、そのウィンドウの再描画が必要だと思ったら、呼ばれる
例えば、GLUTのウィンドウの上に他のアプリケーションのウィンドウをかぶせて移動させると、
OSによっては再描画が必要になるので呼ばれるが、
OSによっては再描画が必要にならないので呼ばれない
自分でglutPostRedisplay()を呼べばdisplayfuncが呼ばれるのは確実だが、
それ以外にいつdisplayfuncが呼ばれるかはわからないという前提でプログラムを書く方がいい
615デフォルトの名無しさん:2008/02/25(月) 19:44:24
http://www.asahi-net.or.jp/~yw3t-trns/opengl/samples/texbmp/index.htm
からソースをお借りしてBMPを読み込むプログラムを書いているのですが、複数の画像を読み込むにはどうすればいいですか?
616デフォルトの名無しさん:2008/02/25(月) 20:16:32
まずコードが何をしているか理解することから始めろ
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って読めないんでしょうか?
619デフォルトの名無しさん:2008/02/26(火) 05:36:16
OpenGLじゃ読めないな

読み込めてるんならファイル形式は理解してるんだろ?
RGBデータが格納されてるところを参照すればいいだけじゃん
620デフォルトの名無しさん:2008/02/26(火) 09:16:04
そもそもOpenGLにファイルを読み込む機能なんて無いしな
読めてるということは自分でファイルを読み込んでるはずだ
621デフォルトの名無しさん:2008/02/26(火) 09:50:41
もうさ、
GLbitmap glLoadBitmapFile(const char *filename);
とかの関数をでっちあげて
>>2くらいにソース貼っておけばよくね?
622デフォルトの名無しさん:2008/02/26(火) 12:18:26
>>621期待して待ってるぞよ。
623デフォルトの名無しさん:2008/02/26(火) 12:19:26
BMPネタは一人がしつこく貼っているだけだろ。気にするな。
624デフォルトの名無しさん:2008/02/26(火) 23:19:16
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;
}

でいいんでね(?_?)
625デフォルトの名無しさん:2008/02/26(火) 23:48:13
ちょwそれでちゃんと読めるbmpファイルは一個も無いと思うんだがww
626デフォルトの名無しさん:2008/02/26(火) 23:58:07
ヘッダとか全く読んでないしな……。
ほんとにビットマップか。
627デフォルトの名無しさん:2008/02/27(水) 00:07:51
GLUとかGLUTに無いのかな?
JavaだとTextureクラスがあるからえらい楽なんだが。
628デフォルトの名無しさん:2008/02/27(水) 00:37:29
libpngとかopenEXRとかDevILとかを使いたまえ(`・Д・´)
629デフォルトの名無しさん:2008/02/27(水) 01:10:26
image_width = image_height = (int)sqrt(sz/3);
おもしろいw
630デフォルトの名無しさん:2008/02/27(水) 03:48:46
glfwにならあるんだけどな。TGAだけど
631デフォルトの名無しさん:2008/02/27(水) 08:20:37
そこでSDLですよ。glut使うより使いやすいと思うからみんな試せばいい。
632デフォルトの名無しさん:2008/02/27(水) 12:35:32
こんな感じでいいんでない?

#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ファイルでは表示確認しますた。
633デフォルトの名無しさん:2008/02/27(水) 13:26:51
glfw好きなんだけどあまり流行ってないよね・・・
SDLも良いらしいけど、サウンド機能とかイラネって人にはオヌヌヌ
634デフォルトの名無しさん:2008/02/27(水) 23:43:16
glfw調べてみたがいいな
SDLよりコンパクトでライセンスも楽だわ
なによりWindowsでリサイズしてもコンテキストが作り直されなくて済むのが良い
サウンドはOpenAL使ってるしこっちに乗り換えようかな
635デフォルトの名無しさん:2008/02/28(木) 10:35:25
display(void){}の中で、普通の割り算をしたいんですが、なぜか値がでません。
0になってしまいます。理由を教えてください!
636デフォルトの名無しさん:2008/02/28(木) 11:26:12
デバッグしてみた?
637デフォルトの名無しさん:2008/02/28(木) 11:26:22
なぞなぞかよw
ぜんぶintなんじゃね
638デフォルトの名無しさん:2008/02/28(木) 11:34:47
>>637
可能性くらいは思い当たりそうなところが凶悪だよな。
639デフォルトの名無しさん:2008/02/28(木) 11:56:00
デバッグしてみたのですがよく分かりません。
p=1/1024;という計算をしたいだけなのですが・・・。
-1.07374e+008という答えになってしまいます。
pはGLfloatで宣言してます。
640デフォルトの名無しさん:2008/02/28(木) 12:41:56
1/1024はfloatか?
641デフォルトの名無しさん:2008/02/28(木) 15:07:32
>>639
INT型の1と1024を計算しちゃったみたいだね
p = 1.0f / 1024.0f;←って感じにすればちゃんとした値が出るよ
642デフォルトの名無しさん:2008/02/28(木) 15:15:27
>>641
ありがとうございます!
ちゃんと計算できました!
643デフォルトの名無しさん:2008/02/28(木) 18:06:10
>>637
当たりw
644デフォルトの名無しさん:2008/02/28(木) 18:07:10
GL以前の問題だったな
645デフォルトの名無しさん:2008/02/28(木) 20:15:32
質問です。
shd形式のファイルを読み込むOpenGLのライブラリは無いでしょうか?
646デフォルトの名無しさん:2008/02/28(木) 20:24:16
>>645
たぶん無い。
Shadeから他の形式に書き出して読み込んだ方がいいと思うよ。
647デフォルトの名無しさん:2008/02/28(木) 20:28:25
>>646
どういう形式が読み込めるのでしょうか?
648デフォルトの名無しさん:2008/02/28(木) 20:31:08
どっちかっていうと3Dエンジンの役割だな>モデル読み込み
OpenGL対応の3Dエンジン探してみれば?
649デフォルトの名無しさん:2008/02/28(木) 21:17:09
>>648
そうなんですか。
友達がshadeを勉強していて、自分はOpenGLを勉強しているので、
友達がモデリングしたデータをOpenGLで読み込んでグルグルまわしてみたいと思ったんですが....
何か良い方法は無いですかね?
650デフォルトの名無しさん:2008/02/28(木) 22:13:43
そーゆーのはOpenGLの範疇じゃないから
651デフォルトの名無しさん:2008/02/28(木) 23:33:27
OpenGLは規格であって、ライブラリではない。
君が使っているのはOpenGLの規格に沿うように開発されたライブラリだ。
652デフォルトの名無しさん:2008/02/28(木) 23:52:22
上の画像を読みたいとかもそうだが、そもそもOpenGLがなんなのかわかってないのが多いな。
653デフォルトの名無しさん:2008/02/28(木) 23:54:43
>>652
初心者には、その辺の切り分けとか理由とかが分かりにくいんじゃないかな。
うまく簡単に説明できるといいんだけど・・・。
654デフォルトの名無しさん:2008/02/29(金) 00:14:05
DirectXと比較されやすいから同じようなものだと思われやすいんだろうな
655デフォルトの名無しさん:2008/02/29(金) 01:05:49
GLはあくまで3次元を表示するだけ?
656デフォルトの名無しさん:2008/02/29(金) 01:35:09
GPU用アセンブリ言語みたいなもん
657デフォルトの名無しさん:2008/02/29(金) 10:53:50
Direct3Dだって、3Dを表示するだけでしょ
D3DXとか便利なものが付いてるだけで
誰かOGLX開発しない?
658デフォルトの名無しさん:2008/03/01(土) 16:26:50
>>656
その説明、感動的に気に入った。

…が、新人にそれで説明しようとすると
十中Hack「アセンブリ言語って何ですか?」と言われそう……。
659デフォルトの名無しさん:2008/03/01(土) 16:33:15
OpenGL3時代のGLUTはD3DXみたいになるんじゃないかと妄想しているが
肝心のGL3が出ないしな…
660デフォルトの名無しさん:2008/03/01(土) 17:34:03
このまま3.0は飛ばしで今夏予定の4.0までお預けなんですかね
661デフォルトの名無しさん:2008/03/01(土) 21:09:29
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デフォルトの名無しさん:2008/03/01(土) 21:12:39
>>661
>>4次元配列
正解
>>RGBA
正解
>>AAAAA
可能
663デフォルトの名無しさん:2008/03/01(土) 21:30:07
>>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などに変えるのでしょうか?
664デフォルトの名無しさん:2008/03/01(土) 22:01:34
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();
672デフォルトの名無しさん:2008/03/02(日) 11:45:33
おまえ

テキストにしてうpろだにうpしなよ
673リライト:2008/03/02(日) 12:00:24
失礼しました。
テキストにしたのでアップします。
http://sund1.sakura.ne.jp/uploader/source/up19768.txt
これを次のようにするにはどうしたらいいでしょうか??
足の付け根を原点にして,太ももと足の付け根の角度と太ももの長さから膝の位置ベクトルを求め、
次に膝の位置を原点にして,膝の角度とすねの長さから足先の位置ベクトルを求め、
この2つを足して,足の付け根(=胴体)から足先の位置を求める。
足先の位置を原点にした時の胴体の位置はその逆ベクトルにする。
674デフォルトの名無しさん:2008/03/02(日) 12:37:02
glRotated やglTranslated はただの行列演算。
元の位置座標に掛けていけば、おのずと位置は求まるし、
ベクトルも求まる。
プロジェクションは考慮しなくていいみたいだから、
そんなに難しくないと思うが。

ただ、PI を3.14はどうかと。
675リライト:2008/03/02(日) 12:42:36
デフォルトの名無しさん>
それがわからないんです…。
もっと具体的にどこをどう変えたらいいのか教えていただけないでしょうか?
676デフォルトの名無しさん:2008/03/02(日) 13:16:21
具体的な行列は赤本とか
http://www.is.oit.ac.jp/~whashimo/server/~whashimo/Article/OpenGL/Chapter3/index.html
を参考にするといいよ。
677リライト:2008/03/02(日) 14:09:06
デフォルトの名無しさん>
参考ページを見てみたのですが、
これをどう活用すればいいのかわかりません。
具体的にプログラムのどこをどう変えればいいのか
教えていただけないでしょうか??
678デフォルトの名無しさん:2008/03/02(日) 14:15:28
最悪だな
679デフォルトの名無しさん:2008/03/02(日) 14:17:48
宿題っぽいな〜w
680デフォルトの名無しさん:2008/03/02(日) 14:32:29
適切なアドバイスをしていると思うんだがな。
そもそもプログラムを書き換える話ではないと思うが。
681リライト:2008/03/02(日) 15:43:13
プログラムに疎くて、ここで聞いています。
どうか教えてもらえないでしょうか?
682デフォルトの名無しさん:2008/03/02(日) 16:33:20
プログラムに疎くてまともに動くプログラムを作れるはずがない
基礎から勉強しなおせ
683デフォルトの名無しさん:2008/03/02(日) 16:43:38
数学ができるなら、プログラムの基礎が有れば普通にできるだろうな。
684デフォルトの名無しさん:2008/03/02(日) 16:44:35
はい落第
685デフォルトの名無しさん:2008/03/02(日) 17:14:15
床井さんのところのサンプル
http://www.wakayama-u.ac.jp/~tokoi/opengl/ex-e.html
とほとんど同じじゃねーか。
和歌山大の課題ですか?
686デフォルトの名無しさん:2008/03/02(日) 18:20:38
glRotateやglTranlateは基本的な座標変換だからそれを理解せずにOpenGLを使うのは難しいと思うよ。
入門書を読んだほうがいいよん。
687リライト:2008/03/02(日) 18:28:29
もともとのサンプルプログラムは和大の床井先生のところからお借りしています。
それを足の付け根を原点にして,太ももと足の付け根の角度と太ももの長さから膝の位置ベクトルを求め、
次に膝の位置を原点にして,膝の角度とすねの長さから足先の位置ベクトルを求め、
この2つを足して,足の付け根(=胴体)から足先の位置を求める。
足先の位置を原点にした時の胴体の位置はその逆ベクトルにする。
このようにしたいのですが、どうすればいいのかわからないのです。
688デフォルトの名無しさん:2008/03/02(日) 18:36:38
宿題スレが助けてくれるかもしれないけど、OpenGLもできるやつとなるとまずいないなw
留年しな〜。
689デフォルトの名無しさん:2008/03/02(日) 19:09:16
このしつこさが、ちゃんと勉強する方向へ向いていれば・・・
>>687
とりあえず位置ベクトルは理解できているのか?
690リライト:2008/03/02(日) 19:24:46
689さん>
位置ベクトルの理解はあまりできていません…。
691デフォルトの名無しさん:2008/03/02(日) 19:38:22
>>690
九九はできまちゅか?
692デフォルトの名無しさん:2008/03/02(日) 20:06:34
>>690
さすがにそれはきついな。
どうりで話が噛み合わないわけだ。

位置ベクトルと行列による一次変換を理解してからじゃないと、
その課題はクリアできないよ。

ひょっとしてまだ高校生かな?
693デフォルトの名無しさん:2008/03/02(日) 20:32:45
「太ももの長さから膝の位置ベクトル」を専ブラNGワードに入れた
694デフォルトの名無しさん:2008/03/02(日) 20:40:58
胴体と足先でMODELVIEWをglGetして、かたっぽ逆行列にしてから掛けた行列で(0,0,0,1)を変換すればなんか求まんじゃね
695リライト:2008/03/02(日) 21:52:08
692さん>
どうかプログラムのどこをどのように
変えればいいのか教えていただけないでしょうか?

694さん>
イマイチ理解できないのですが…。
プログラムを提示して教えていただけないでしょうか?
696デフォルトの名無しさん:2008/03/02(日) 22:06:12
さすがに釣りじゃないかと思えてきた。

>>695
だ か ら、
とりあえず位置ベクトルを求めなさいって。
プログラムを変える話ではない。
697デフォルトの名無しさん:2008/03/02(日) 22:13:53
お前ら優しすぎw
こいつ理解する気なんか無いんだって。コードが欲しいだけ。
スルーでおk。延々ageてるし。
698デフォルトの名無しさん:2008/03/02(日) 23:15:46
答えが欲しいなら黙って待つか宿題スレへ
699デフォルトの名無しさん:2008/03/02(日) 23:41:05
待っててもたぶん無駄だから宿題スレに行っとけ
700デフォルトの名無しさん:2008/03/03(月) 00:21:01
位置ベクトルや行列の掛け算もわからないのか。
もし大学生だったら、日本オワタ\(^o^)/
701デフォルトの名無しさん:2008/03/03(月) 05:18:21
分布の端っこにいる人間というのもいるわけで
日本を終らせるにはサンプル数が少ない
702デフォルトの名無しさん:2008/03/03(月) 09:55:37
つか教えてじゃなくて
答えください、が正解だよな

703デフォルトの名無しさん:2008/03/03(月) 13:06:40
超初心者とか超低レベルとかって以前の問題だな、ここまでくると・・・。

あのさ、リライトさん。
このスレで教える人ってのは、教えることで相手が成長できると思うから、教えるんだよ。
その喜びがあればこそ、無償で、貴重な時間を費やしても、助けてあげたくなるんだよ。
せっかくいくつかの回答や学習の方針が出てきてるのに、それに対する返答が「分かりません答え教えてください」ばっかりじゃ、
ボット並の知性とみなされても仕方ないよ。
人に何かを聞きたいなら、まずその姿勢から改めないとダメだよ。
教えても無駄だと分かりきってる相手に対して時間を使ってくれる人なんていないよ。
704リライト:2008/03/03(月) 13:24:24
私の場合、自分でプログラムを組もうとするとわからなくなるんです。
他の人の作ったプログラムを見て説明してもらって初めて理解できるんです。
だから自分じゃ何もできないのが現実です…。
みなさん不快な思いをさせてすいませんでした…。
705デフォルトの名無しさん:2008/03/03(月) 13:46:15
>>704
何か人の作ったプログラムを説明してもらって一度理解したら、
それと同じプログラムを今度は何も見ずに白紙の状態からちゃんと書けるか?
706デフォルトの名無しさん:2008/03/03(月) 14:25:30
ネタ無いからって無理に引っ張らなくていいんだよ
そこはスルーしていいんだよ
707デフォルトの名無しさん:2008/03/03(月) 19:34:06
すみません
vector<GLubyte> texture;

こんな使い方出来ないでしょうか
要は、可変(不定)のテクスチャを読み込むのにvector型の
動的配列を使いたく
708デフォルトの名無しさん:2008/03/03(月) 19:50:31
>>707
やってみて、どうだったの
709デフォルトの名無しさん:2008/03/03(月) 19:54:44
すみません、解決したようです。
&texture[0]
を入れたら読み込んでくれました

ただ、別のところでダメっぽい状況になってしまって…
前途多難です
710デフォルトの名無しさん:2008/03/03(月) 21:39:41
>>707ですが、別のことで質問させてください。

textureが
○●●○○
○○○○●
●●●○○

○○●○●

●=値なし ○=値有り

という感じで並んでいて、GL_LUMINANCEで値有りの部分だけを輝度テクスチャとして描こうとしています。
vectorを使っていたのは○が不定のためです。
●の部分が穴が空いたような効果を狙っています。

texture[○の数]={αααα…αα};
で確保したテクスチャを

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, TEXWIDTH, TEXHEIGHT, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE, &texture[0]);

で貼り付けたらひどい画像になりました。(ノイズのようなもの)
どうやったら意図した通りになるでしょうか…
711デフォルトの名無しさん:2008/03/03(月) 22:11:59
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)・・・
というふうにはならない、と分かりそうなもんだと思うんだけど・・・。

もしよければ、その辺の思考過程を教えてもらえると嬉しいな。
712デフォルトの名無しさん:2008/03/03(月) 22:12:26
>>710
texture[○の数+●の数]={α00ααα…α0α};
とかにすべきなんじゃないの?

いまいち意図がわからないが。
713デフォルトの名無しさん:2008/03/03(月) 22:15:45
glTexImage2Dの立場に立って考えれば、全部○だけのデータよこしたってどこに●はさめばいいかわかんないじゃん
TextureサイズはTEXWIDTH x TEXHEIGHTにして穴はαで指定。使ったことないがGL_LUMINANCE_ALPHAってのがあるっぽい
穴の向こうになんかあるなら>>607の話題を参照
714デフォルトの名無しさん:2008/03/08(土) 07:51:26
座標変換はCPU側でやるのとGPU側でやるのとでは、どちらが速いでしょうか
715デフォルトの名無しさん:2008/03/08(土) 11:54:39
CPUとGPUのスペックの関係もあるしどちらが速いとは一概に言えないが、
本当に座標変換だけならちゃんと最適化すればCPUでも十分速いだろう
一方GPUで計算させるのは、その間CPUは別なことできるのがメリット
変換した座標をそのまま描画するならGPUの方がいいけど、
そうでなくCPUで再処理したいなら転送などのオーバーヘッドがある分GPUは不利

計算したい座標の数や用途を考えて、良さそうな方を選んでください
716デフォルトの名無しさん:2008/03/08(土) 12:10:22
GPUの方が速いに決まってる

と書こうとした俺は715の丁寧なレスに感動した
717デフォルトの名無しさん:2008/03/08(土) 16:00:09
ありがとうございます
両方とも作ってみます
718デフォルトの名無しさん:2008/03/08(土) 21:19:00
>>617
返事が遅くなってすみません。同じところに上げておきました。
2yoshi4468.zip
719デフォルトの名無しさん:2008/03/09(日) 15:14:14
GLUTで作ったプログラムを配布する場合のライセンスってのは自分で決めても良いのですか?
720デフォルトの名無しさん:2008/03/09(日) 17:13:59
いいよ
721デフォルトの名無しさん:2008/03/09(日) 18:50:00
Win32APIを使い、C++でプログラムを組んでいます。(DirectXも使っています。)

//質問
PCゲームなど、セーブ、ロード画面に演出の一つとして使われている
現在のウィンドウ画面を小さくして表示しているサムネイル画面?
について質問です。
やり方がわかりません。そういうAPIが用意されているのでしょうか?
教えてください。
722デフォルトの名無しさん:2008/03/09(日) 19:39:11
なんでリファレンスとか読まないの?
723デフォルトの名無しさん:2008/03/09(日) 19:51:12
スレタイも読めないようではリファレンスも読まんだろう
724デフォルトの名無しさん:2008/03/09(日) 19:51:19
glReadPixels
725デフォルトの名無しさん:2008/03/09(日) 20:06:27
glReadPixels使うならできればPBOがいいな。
MRTでシェーダから縮小かけてFBOに書き込むのも手か。
726デフォルトの名無しさん:2008/03/09(日) 20:32:17
俺だったら、glCopyTexImageでtextureにコピー→bindして描画、かな。
ほとんどの環境で動くし。
727デフォルトの名無しさん:2008/03/09(日) 20:46:34
サムネイルならセーブデータと一緒にファイル保存しないといけないんだろうからglReadPixelsでいいんじゃね
つか>>721がDirectX3D使ってるなら関係ない話か
728デフォルトの名無しさん:2008/03/11(火) 16:44:32
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 ); で下地に描く
で描くと、レイヤー内で描かれた画像はより薄く表示されてしまいます。
これを薄くならないように、まるで直接下地に描いたような結果にしたいのですが、どのようにすれば良いのでしょうか?
729デフォルトの名無しさん:2008/03/11(火) 17:03:45
>>728
どうしたいのか正確にわからないので、なんともいえないが、

>>(2) FBO を glBlend(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); で下地に描く
をglBlend(GL_ONE, GL_ONE_MINUS_SRC_ALPHA ) にすれば期待した結果になるのでは?
730デフォルトの名無しさん:2008/03/11(火) 18:28:49
>>729
すいません、まだ頭の中で整理が出来ていないのですが。
その通りにすれば、ズバり私の期待した結果を得ることができました。
実はこのことで何ヶ月も悩んでました。本当にありがとうございました (TT
731デフォルトの名無しさん:2008/03/13(木) 11:41:28
http://wisdom.sakura.ne.jp/system/opengl/gl23.html
ここのコードをVC++2005EEでコンパイルして実行したのですが
白い四角形が回転するだけになってしまいます。
どうしたらよいでしょうか。

732デフォルトの名無しさん:2008/03/13(木) 12:37:31
つglGetError
733デフォルトの名無しさん:2008/03/13(木) 18:20:45
テクスチャを
GLubyte **texture;として取って値を入れて渡すとき
glTexImage2Dの最後の引数はどういれたらいいのでしょうか

&texture textureでもエラーが出てしまいます
734デフォルトの名無しさん:2008/03/13(木) 18:35:09
?
ようはポインタのポインタの先にちゃんとデータがあるなら
*texture でいいんじゃない?
735デフォルトの名無しさん:2008/03/13(木) 18:37:13
ですよね
なのにエラーが出てTexImageのところで動作が止まる、というエラーを吐き出すだけで

なんでじゃあぁああぁ
736デフォルトの名無しさん:2008/03/13(木) 18:38:33
*textureだが・・・とんでもない使い方をしようとしている気がする
ポインタについて勉強しなおしたほうがいい
737デフォルトの名無しさん:2008/03/13(木) 18:52:12
&textureじゃまずいだろう
738デフォルトの名無しさん:2008/03/13(木) 20:33:48
GLubyte bits[TEXSIZE][TEXSIZE][3];

GLubyte* bits = new GLubyte[TEXSIZE * TEXSIZE * 3];
と同じ。トリプルポインタじゃない。
739738:2008/03/13(木) 20:37:04
>>733

書いてて思ったんだが、なぜ

>>GLubyte **texture;

なんだ?カラーではなくモノクロ?
glTexImage2Dの他の引数間違ってない?

740デフォルトの名無しさん:2008/03/13(木) 23:01:50
>>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
}
741デフォルトの名無しさん:2008/03/13(木) 23:43:03
エスパーだが、もしかしたら画像読み込みライブラリ( libjpeg とか libjpeg )
を使おうとしてるんじゃないかな。
あれは画像を一行一行スキャンして読み込むから、一行の先頭へのポインタを配列で管理すると
必然的に void ** みたいになる。
でもその場合、画像全体は連続したメモリ空間に存在しないから、glTexImage2D に直接
渡したらエラーになるよ。
742デフォルトの名無しさん:2008/03/14(金) 07:04:05
auxWireSphereで作成した球に、テクスチャマッピングで画像を貼り付けたいんですが
どうすればいいのかわかりませんをorz(==
世界地図を貼り付けて地球儀にしようと思ったのに
743デフォルトの名無しさん:2008/03/14(金) 09:41:51
自分で球を描画するしかないと思う。

あ、テクスチャ自走生成を用いればできるかもしれん。
744デフォルトの名無しさん:2008/03/14(金) 10:47:45
Wireじゃ地球儀にならないよ
auxなつかしす。たしかglSphere使ってんだっけ。
static GLUquadricObj *quadratic=gluNewQuadric();
gluQuadricNormals(quadratic, GLU_SMOOTH);
gluQuadricTexture(quadratic, GL_TRUE);
gluSphere(quadratic,r,s,t);
ならこんな感じか
745デフォルトの名無しさん:2008/03/14(金) 11:14:22
はぁ?なめてるのか?
746デフォルトの名無しさん:2008/03/14(金) 11:17:23
>>744
なんで球体なのに、quadなのー?よ
747デフォルトの名無しさん:2008/03/14(金) 11:54:27
745=746?
何で検索すらしないの?
748デフォルトの名無しさん:2008/03/14(金) 12:19:46
そういえば、なんでQuadricなんだろうと思ってた。
どうやらこういうことらしい。
http://en.wikipedia.org/wiki/Quadric
749デフォルトの名無しさん:2008/03/19(水) 16:44:16
 チョイト質問させて頂きます。
Windows環境でOpenGLを利用しているのですが、OpenGL2.1対応の参考書を参考に学習を進めているうちに、
利用しているDLLが、OpenGL1.1までしか対応していない事に気が付きました。

 そこで、http://www.opengl/org/でSDKを探したところ、OpenGL1.1のDLLしか見当たりませんでした。
OpenGL2.1に対応しているDLLというのは、一体どこで手に入れる事ができるのでしょうか。
750デフォルトの名無しさん:2008/03/19(水) 17:44:13
グラフィックボードがOpenGL2.1に対応してないと無理
対応してるならドライバ入れれば動く
751デフォルトの名無しさん:2008/03/19(水) 18:36:51
>>750
 回答ありがとうございます(*´∀`*)
私が利用しているパソコンはオンボードですので、現在の状況から考えてOpenGL2.1を利用する事は不可能な様ですね。
ですので、近いうちにコンピュータを買換えるとします。

では、失礼させて頂きます。
752デフォルトの名無しさん:2008/03/19(水) 20:30:14
最近のオンボは割りと性能がいいのもあるからとりあえずドライバを更新してみるんだ
753デフォルトの名無しさん:2008/03/19(水) 21:33:58
>>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);
を指定して描くと、上側のポリゴンの地の色とブレンドされてしまい、
下のテクスチャが透けて見えるようになりません。
ポリゴンに張ってあるビットマップのアルファを触ると、それに応じた透明度になるのですが
何故か対象は下側のテクスチャ画像ではなく、テクスチャが貼り付けられている地のポリゴンが
透けて見えます。

どなたか、解決の糸口でも良いので、お願いします。
アホな質問ですいません。




アホな質問ですいません
755デフォルトの名無しさん:2008/03/26(水) 22:34:55
「GL_DEPTH_TEST 透明度」でぐぐれ
756デフォルトの名無しさん:2008/03/27(木) 03:39:56
たぶん
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がマズイとあのような結果になるとは、思いも由りませんでした。

や。本当に有り難う。
758デフォルトの名無しさん:2008/03/31(月) 01:08:21
OPENGLを使う関係の業種ってどこ?
759デフォルトの名無しさん:2008/03/31(月) 04:44:41
医者
760デフォルトの名無しさん:2008/03/31(月) 10:40:21
すいません。10分前にopenglの勉強を始めたのですが、
環境を整えてVC++でウィンドウを表示するプログラムを実行させたのですが、
なぜかウィンドウと一緒にコマンドプロンプトのウィンドウも表示されます
コマンドプロンプトのウィンドウの方は表示されないようにするにはどうしたらいいですか
761デフォルトの名無しさん:2008/03/31(月) 12:35:12
exit(0);
762デフォルトの名無しさん:2008/03/31(月) 12:46:12
glut console でググる
763デフォルトの名無しさん:2008/03/31(月) 13:03:16
glutって「ぐるっと」でいいの?
764デフォルトの名無しさん:2008/03/31(月) 14:02:20
サンクス
765デフォルトの名無しさん:2008/03/31(月) 23:19:31
何故コンソールを表示させないようにするだい?
デバック用のメッセージを表示させたりとかできて便利なのに・・・
なぜ!?
766デフォルトの名無しさん:2008/03/31(月) 23:24:21
無様じゃん
767デフォルトの名無しさん:2008/04/01(火) 00:04:34
glTexImage2dで浮動小数のバッファを作るときのパラメータ教えてください
赤のみ32bitと、RGBA各色32bitの
768デフォルトの名無しさん:2008/04/01(火) 00:45:42
だってあいつ
「続行するには何かキーを押してください...」
とか言ってくるしキモイじゃん
769デフォルトの名無しさん:2008/04/01(火) 01:28:49
コンソール画面って違和感あるよな。
770デフォルトの名無しさん:2008/04/01(火) 01:31:13
FreeConsole();
しとけばいいんじゃね?
771デフォルトの名無しさん:2008/04/01(火) 01:35:56
ネットとかで配布するときはコンソール使うと動かない場合があるから注意するんだぞ
772デフォルトの名無しさん:2008/04/01(火) 20:47:01
>>760
GLUTを使わずにOpenGLを使う。
773デフォルトの名無しさん:2008/04/01(火) 22:19:49
>>767
GL_ARB_texture_float拡張が使えるかチェックする必要がある
RGBAはGL_RGBA32F_ARB、
Rのみは無いのでGL_LUMINANCE32F_ARB辺りでどうぞ
774デフォルトの名無しさん:2008/04/02(水) 00:29:59
Blenderというソフトではコンソール画面が表示されます。
そして俺の環境ではPythonがインストールされてないよと警告がでます。
コンソール画面って便利でカッコイイじゃん。
775デフォルトの名無しさん:2008/04/02(水) 00:48:07
DOS思い出してしょぼく感じる
776デフォルトの名無しさん:2008/04/02(水) 00:49:35
メッセージ表示のUI作成が面倒な時の手抜き策だけどな。
777デフォルトの名無しさん:2008/04/02(水) 19:07:57
コンソールがかっこいいって意見は初めて聞いたなw
ま、開発中はなにかと便利だよね。
778デフォルトの名無しさん:2008/04/03(木) 20:45:10
ぐるっと、クリエイト・ウィドウ!(未亡人)
779デフォルトの名無しさん:2008/04/10(木) 04:38:14
>>774
あるよ。
以上。
はい次の方。
780デフォルトの名無しさん:2008/04/10(木) 05:36:58
ダサッ
781デフォルトの名無しさん:2008/04/11(金) 19:41:48
GLUTで終了時に動的に確保したものを解放したいのですが
何か方法はありますでしょうか
782デフォルトの名無しさん:2008/04/11(金) 19:43:17
解放すればいい
783デフォルトの名無しさん:2008/04/11(金) 20:11:29
>>781
http://opengl.jp/oglfaq/glut.htm の 3.070 とかどうだろうか。
784デフォルトの名無しさん:2008/04/11(金) 23:59:33
>783
GLUTのラッパークラスを作る場合に、
glutMainLoopはどうするのでしょうか?
785デフォルトの名無しさん:2008/04/13(日) 10:26:59
どうするのでしょうか、とは?
もうちょっと詳しくたのむ。
786デフォルトの名無しさん:2008/04/14(月) 05:32:32
VRAM容量を検出する方法を探しています。AGPメモリ等を除いた、
ビデオカードのメモリ容量です。どなたかいい方法ご存知でしたら
ご教授ください。よろしくお願いします。
787デフォルトの名無しさん:2008/04/17(木) 15:35:31
OpenGLではワールド座標を行列変換して最終的にスクリーン座標までたどり着いたとき、一行四列の行列に格納されてる情報ってスクリーン上のx,yとあと二つは何が入ってるんですか?
ワールド座標の時点ではx,y,zと最後の要素としてダミーの0が入ってると思うんですけど、同じように0が二つ入ってるんでしょうか?
ご教授願います
788デフォルトの名無しさん:2008/04/17(木) 16:04:03
x,y,z,w
ワールド座標のwは通常1のはず (glVertex3fとかでxyzだけ指定してる場合、w=1)
変換行列をかけた後のwはx,y,zを割るのに使う (ので、0ではない)
zはデプステストに使う
789デフォルトの名無しさん:2008/04/17(木) 16:19:53
>>787
変換の仕組みについては、赤本の第3章の頭数ページ(カメラの説明)に詳しく書いてあるから一度読んでみ
790デフォルトの名無しさん:2008/04/17(木) 22:53:11
glut.hの中の、球やトーラスのような図形描画の関数が
どういう風に書かれているのか知りたいのですが、
どうすれば見れるのでしょうか?

「C:\cygwin\usr\include\mingw\GL」の中に
"glut.h"は見つけたのですが(これしか入ってない)
中を見ても関数宣言だけで、具体的なアルゴリズムなどの
中身はかかれてませんでした。

どうかお願いします。
見方を教えてください。
791デフォルトの名無しさん:2008/04/17(木) 22:58:19
792デフォルトの名無しさん:2008/04/17(木) 23:28:42
>>791
ありがとうございます。しかし
この中の「GLUT 3.7 Source Code Download for Win32」 を落として
中身を見たのですが、同じく関数の宣言しか見当たりません。
すいませんが、どのファイルに載っているとか分かりますでしょうか?
793デフォルトの名無しさん:2008/04/18(金) 00:02:44
すいません、見つかりました。
794デフォルトの名無しさん:2008/04/18(金) 00:14:01
>>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の行列を掛け続ける限りでは起こらないと思うんですが…
っと赤本を嫁とのアドバイスが多いのでそいつでそこらへんお勉強します
796デフォルトの名無しさん:2008/04/18(金) 05:34:21
794じゃないが、同次座標系について勉強しろ。クリップ座標系のx,y,z要素をwで割るのが透視除算(perspective division)で、これ以降は(x,y,z)を使う。
797デフォルトの名無しさん:2008/04/18(金) 12:55:28
>795
描画パイプラインの最初から最後まで、4x4行列による変換を続けるわけじゃないからね。(行列が出てくるのは投影変換まで)
透視除算では、クリップ座標(x, y, z, w)、正規化デバイス座標(X, Y, Z)とすると
X = x / w, Y = y / w, Z = z / w とゆー変換がおこなわれるよ。
ちなみにビューポート変換も行列じゃなくて、要素ごとの定数倍&定数加算。

なんでこんな除算が必要なのかは・・・いちど、OpenGLを頭の中から捨てて、3次元座標を画面に投影するプログラムを考えてみればいいと思う。
どこかしらで必ず除算する部分が出てくるからー。
798デフォルトの名無しさん:2008/04/26(土) 22:35:21
画像ファイル読み込んでglutSolidSphereで描いた球体に貼り付けようと思
っています。
しかし読み込んだものの、上手く球体に貼り付ける方法がわかりません。
GL_OBJECT_LINEARで貼り付けると変になってしまうし、GL_SPHERE_MAPだと
回転しても(環境マッピングなんで当然)画像が回転してくれません。
どうすれば上手く画像を球体に貼り付けられますか?
799デフォルトの名無しさん:2008/04/26(土) 23:11:55
こちらのサイトを拝見したのですが、視点に対してz軸方向の回転はいいんですが、他の
方向に回転するとおかしくなるんで、どうにかしたいんです。

ttp://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20050107
800デフォルトの名無しさん:2008/04/27(日) 00:01:34
>>798
テクスチャ座標も回転させろ。
もしくはglutSolidSphere使うのあきらめろ。
801デフォルトの名無しさん:2008/04/27(日) 00:15:13
ふつうにテクスチャを貼りたいなら、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
802デフォルトの名無しさん:2008/04/27(日) 00:16:30
>>800
返答有難うございます。
勿論、glMatrixMode(GL_TEXTURE)で回転させてみたんですが、z軸方向の回転以外は
変に引き延ばされてしまいます。
GL_TEXTURE_2Dを使ってるのがまずいんでしょうか・・・
803デフォルトの名無しさん:2008/04/27(日) 00:19:35
>>801
おお、そうなんですか。
試してみます。情報有難うございます。
804デフォルトの名無しさん:2008/04/27(日) 01:30:27
gluSphereで描いてみたのですが、uv座標の自動生成やっぱり結果は同じでした。
やはり一つ一つuv座標を計算しないといけないんですね。
uv座標を緯度方向と経度方向の分割数でばらばらにするのはわかるんです。
しかし、肝心のポリゴンの方の座標がわかりません。
どうすればいんでしょうか?
805デフォルトの名無しさん:2008/04/27(日) 01:50:35
変わらないってことはないと思うが。
glEnable(GL_TEXTURE_GEN_X);
が有効になったまんまなんじゃないの?
gluQuadricTextureでuvを指定したのなら、自動生成はOFFにしないとだめ

sin/cos/行列を勉強すればいいと思うよ>球の座標
806デフォルトの名無しさん:2008/04/27(日) 03:10:54
あきらめて球描画を実装した方が早くないか?
807デフォルトの名無しさん:2008/04/27(日) 10:21:14
一からポリゴンで作ってみることにしましたorz
808デフォルトの名無しさん:2008/04/30(水) 02:03:55
ウィンドウの右上の×ボタンで終了処理をしたいんだけど、どうやったらでき
るんですかね?
普通に押してもウィンドウが消えるだけで終了処理ができません。
毎回タスクマネージャで消す羽目に。
ウィンドウが表示されている内にキーボードやマウスで終了処理をさせる以外
に手はないんですか?
809デフォルトの名無しさん:2008/04/30(水) 08:02:20
タスクマネージャってとこみるとWindows?
ならWM_CLOSEメッセージを処理すればいいんじゃね。
それともglutを使ってって話?環境書かなきゃわかんねって
810デフォルトの名無しさん:2008/04/30(水) 12:16:58
すみません。
自分はWindowsXP SP2なんですがOSに依存しない処理にしたいんです。
glut上で片付けようと思ったんですが、それらしき方法がわからなかったので。
811デフォルトの名無しさん:2008/04/30(水) 12:53:10
atexit()使えばいいんじゃないだろうか

812デフォルトの名無しさん:2008/04/30(水) 13:54:50
最初atexitを使ってみたんですが、×ボタンでウィンドウが消えると何も起こらな
いので、結局タスクマネージャのお世話になってしまいます。
もしかして、コンパイル時にオプションで -mno-cygwin -mwindows としてるのが
マズいんでしょうか?
813デフォルトの名無しさん:2008/04/30(水) 14:47:49
cygwinか..使ったことないからわからないけど、異常終了になっちゃうのかも。
glutInitをglutInit_ATEXIT_HACK(glut.hにある)にしてみるとか
つか×で終了しないようにすればいい
814デフォルトの名無しさん:2008/04/30(水) 19:05:28
昔その症状になったことがあるな
その時はopengl.orgあたりから拾ってきたglut32.dllに入れ替えたらちゃんと終了するようになった
Windowsに標準でついてるglut32.dllとmingwの相性が悪いんだと思う
815デフォルトの名無しさん:2008/04/30(水) 22:53:14
glut32.dllはちゃんと拾ってきたものにしたんですけどねぇ...
>>813 ついつい癖で×ボタン押しちゃうんで、何とかしたいんです。
glutInit_ATEXIT_HACKですか、初めて聞きました。
ちょっと調べてみます。
816デフォルトの名無しさん:2008/05/02(金) 23:18:13
簡単なフライトシミュレーターを作ろうと思ったのですが、思うように視点を動かす
ことができません。
下のソースを元に大まかに作ったのですが、自機の移動方法や視点の移動方法がわか
らないので、ご教授お願いします。

ttp://userpages.umbc.edu/~squire/s06-437/download/pilot.c
817デフォルトの名無しさん:2008/05/02(金) 23:35:33
「思うように動かせない」って言われても・・・>>816さんがどう思ってるのか分からねーですよ。

自機&視点の、位置&姿勢を、計算する部分はもうできてるの?
それすらできてないなら、それはOpenGLとは関係ない、幾何学やプログラミングの問題
(あるいは航空力学の問題w)なので、このスレで聞いても意味が無いかと。

もしそれらの情報がすでに計算できてるなら、その先はOpenGLの問題なので
もっと詳しいコトが分かればお手伝いできるかもですよ。
あと、そのpilot.cを元に、大まかにどう作ったのかも分からないな。
早い話がソース晒せw
818デフォルトの名無しさん:2008/05/03(土) 12:47:58
そのpilot.cで視点の移動はできるように見えるんだが、
それ以上に何かしたいってことだよな?
それが何かを言ってくれると答えられるかもしれない
819デフォルトの名無しさん:2008/05/03(土) 16:07:19
キーボードのxXyYzZrRpPhHで動かすんだよ
820デフォルトの名無しさん:2008/05/04(日) 03:33:48
GLUTで動的に生成するクラスに変更を加えると終了時にエラーが出ます
しかし、オブジェクトファイルを消してリビルドするとエラーは出ません
何が原因なのでしょうか
821デフォルトの名無しさん:2008/05/04(日) 04:57:46
芸術的質問だな。しばらく鑑賞してしまった
822デフォルトの名無しさん:2008/05/04(日) 17:55:50
>818 確かに視点は動かせるんですが、細かい機体の動かし方をどう連動させ
ればいいのかわからないんです。
マウスの動きに合わせて斜めに移動したりしたいんですが・・・
823デフォルトの名無しさん:2008/05/05(月) 00:46:27
どなたか820に答えて頂けませんか
824デフォルトの名無しさん:2008/05/05(月) 01:26:13
>>820
偶然じゃね?リビルド実行を10回くらいすればはっきりすると思う。
825デフォルトの名無しさん:2008/05/05(月) 01:44:52
コンパイルやビルドの設定を見直してみるといいかも
あとはプロジェクトを作り直してみるとか
826デフォルトの名無しさん:2008/05/05(月) 02:31:07
>>820
動的に生成、終了時にエラーってことは実行時の話?リビルドすると直るってことはコンパイル時の話?
この質問で原因がわかったら超能力者だろ。せめてそのエラーってのが何かくらい書けと
827デフォルトの名無しさん:2008/05/05(月) 05:29:34
820ですが、オブジェクトファイルの更新がされていなかったと予想しています
エラーは不明なハンドルがどうたらということです
デストラクタの部分で出ました
828デフォルトの名無しさん:2008/05/05(月) 06:32:49
リビルドしてオブジェクトファイルを更新したらエラーが消えたのなら、それで問題解決だろ


829デフォルトの名無しさん:2008/05/05(月) 09:22:49
もう
GLUTを使うのをやめてglfwを使うようにしないかい?
GLUTより機能が多いしプログラミングしやすいし。
欠点はGLUTほど日本語のドキュメントが充実してないって事ぐらいかな。

未だにGLUT使うのは(`・д・´)ヤメタマエ
830デフォルトの名無しさん:2008/05/05(月) 10:15:08
好きなの使えばいい。個人的にはglfwは複数ウィンドウが使えないからダメかな
831デフォルトの名無しさん:2008/05/05(月) 21:17:34
glfwは英語でもドキュメント充実してないぞ
832デフォルトの名無しさん:2008/05/06(火) 03:46:22
複数ウィンドウ使えなくて良ければSDLもいいよ
833デフォルトの名無しさん:2008/05/06(火) 10:57:49
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!
834デフォルトの名無しさん:2008/05/06(火) 11:01:22
$ sdl-config --version

なんと出る?
835デフォルトの名無しさん:2008/05/06(火) 11:40:05
$ 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が続く)
836デフォルトの名無しさん:2008/05/06(火) 12:06:06
今気づいたがスレ違いじゃんか
837デフォルトの名無しさん:2008/05/08(木) 16:16:03
LinuxでOpenGLのバージョンを知りたい場合、glxinfoで見れるそうですが、↓のようになりました。

OpenGL version string: 1.2 (2.0.3)

どっちがバージョンの番号なんでしょうか?
838デフォルトの名無しさん:2008/05/08(木) 16:42:03
質問です
同時座標変換のための関数glTranslate, glRotateを用いて

glRotate(...);
glTranslate(...);
glBegin(...);
...
glEnd();

という順に記述した場合、行列の掛け順は内部的には
Rotate * Translate * 座標
ということになるんですよね?
839デフォルトの名無しさん:2008/05/08(木) 16:48:26
>>837
1.2

>>838
そう
840839:2008/05/08(木) 16:55:01
ありがとうございます!
841sage: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();
}
842デフォルトの名無しさん:2008/05/08(木) 21:32:43
それに続けて5角形とか6角形とか書けばいいだけ
843837:2008/05/08(木) 21:34:30
>>839
ありがとうございます。
すると、()内の数字は何を表してるんでしょうか・・・?
844デフォルトの名無しさん:2008/05/08(木) 21:38:02
WinXPとGeForceFX5200でGLUTやってるのですが、
テクスチャが出ません。(glTexImage2DでGL_RGB指定)
Fedora8とGeforce3でも同様でした。
Geforceの場合、何か必要な手順があるのでしょうか?
845sage: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();
}

846デフォルトの名無しさん:2008/05/08(木) 22:10:06
glBegin〜glEndの説明をもう百度よく読んだほうがいいと思うな
847デフォルトの名無しさん:2008/05/08(木) 22:32:42
くだすれだし
>>844
GeForce以外だとうまく動くの?単にglEnable(GL_TEXTURE_2D)してないだけだったり。
>>845
それは途中で色が赤に変わる7角形。4角形と3角形なら2回glBegin-glEndを使う

848844:2008/05/08(木) 22:50:31
>>847
ここのOpenGLのツールで見ても、テクスチャが化けてしまってます
(FX5200だと2.1対応と出るが、1.1〜2.1まで全て化けてる)
ドライバも最新だし、どうしようもない。。。
http://www.forest.impress.co.jp/lib/sys/hardcust/vdodsply/openglexview.html
849sage:2008/05/08(木) 23:01:16
>>847
できました!
ありがとうございました!
850デフォルトの名無しさん:2008/05/09(金) 15:37:31
>>848
opengl32.dll や glu32.dll
が壊れてるんじゃないか?
851837:2008/05/09(金) 22:25:02
自己解決レスを

>()内の数字は何を表してるんでしょうか・・・?
ドライバのバージョンのようです。
teraterm越しにglxinfoを使ったため、1.2となったようです。
ローカルでやると↓になりました。端末に合わせて変わるんでしょうかね。

OpenGL version string: 2.1.2 NVIDIA 169.07
852デフォルトの名無しさん:2008/05/10(土) 16:58:46
>>844 GL_RGBA指定じゃだめか?
こんな感じで↓
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
ウチもGeForceだが無問題。
853デフォルトの名無しさん:2008/05/10(土) 16:59:14
>>844 GL_RGBA指定じゃだめか?
こんな感じで↓
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
ウチもGeForceだが無問題。
854デフォルトの名無しさん:2008/05/10(土) 17:06:09
>844
ツールでも化けるってのはよくわからんが、
ttp://homepage2.nifty.com/tooshy/document/opengl.html
この辺も一応参考に。俺の環境だととりあえず
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
は指定してやらないとテクスチャが貼られない(別にGL_LINEARじゃなくてもいいが)。
855デフォルトの名無しさん:2008/05/11(日) 04:02:40
>844
そのテクスチャのサイズを記せ
856デフォルトの名無しさん:2008/05/11(日) 23:51:51
クォータニオンの勉強をしています。
クォータニオンを使ってマウスで回転させるソースはたくさんあって、ソースを書いたらプログラムは自分で作れました。
しかし、キーボードからの入力でクォータニオンを使って回転操作をさせるソースが見あたりません。
キーボードからだと難しいのでしょうか?
857デフォルトの名無しさん:2008/05/11(日) 23:59:03
マウス入力をキーボード入力に書き換えればいいんじゃね
てかクオータニオンとOpenGLは関係ないよね
858デフォルトの名無しさん:2008/05/12(月) 00:21:05
ピッキングに関して質問です。

OpenGLを使用したやり方だと、セレクションモードから
ヒットレコードを見てポリゴンを判別できているのですが、

ウィンドウ座標から、ワールド座標に変換して
頂点を判別する方法を教えて頂きたいです。
何か、サンプルコードのあるところがあれば、教えて下さい。
859844:2008/05/12(月) 00:25:46
どうやってもダメでした、いろんなサンプルを試したのですが。
(もう一台持ってるGeForce3のLinuxPCは正しく出るんだが。。)
ASUS P5S800+GeForceFX5500はOpenGLのテクスチャは出ない、と思って諦めます。
ただ、なぜかCgやGLSLのテクスチャのサンプルは正しく動作するので
このPCではシェーダの勉強を進めますw
860デフォルトの名無しさん:2008/05/12(月) 00:48:06
>>858
gluUnProject?
861デフォルトの名無しさん:2008/05/12(月) 23:07:26
>>860
あ、いえ、gluUnProjectではなく
数学的な行列計算の場合に、
ウィンドウ座標からどのように頂点を判別しているのかが知りたいのです。

できれば、数式でなくコードで書くと、
どうなるのかが分かると有難いです。
862デフォルトの名無しさん:2008/05/12(月) 23:25:15
ワールド座標→モデルビュー変換→射影変換→ビューポート変換→ウィンドウ座標
なので、ウィンドウ座標からワールド座標を求めるならこの逆をやればいい
863デフォルトの名無しさん:2008/05/13(火) 23:16:38
ダミーウインドウを使用したバックバッファを作って使用しているのですが、OpenGLのレンダリング
範囲はディスプレイ解像度に依存するのでしょうか?
ウインドウサイズを2048x2048としても1032x756といった中途半端なサイズ(使用している
ディスプレイはXGA)の範囲にしか書き出してくれないので困っています。
もっとも、このサイズもおかしいので解像度に依存しているかどうかも怪しいですが…
オフスクリーンでこういった巨大なイメージをレンダリングするにはどうしたらいいのでしょうか?
864デフォルトの名無しさん:2008/05/13(火) 23:18:30
FBO
865デフォルトの名無しさん:2008/05/13(火) 23:52:39
>>864
早っw
やっぱりFBOですか…
拡張はあまり使いたくなかったのですが、どうがんばってもバックバッファでは
無理っぽいので使うことにします。
ありがとうございました。
866デフォルトの名無しさん:2008/05/14(水) 02:00:21
>>862
>ワールド座標→モデルビュー変換→射影変換→ビューポート変換→ウィンドウ座標

(´・ω・`)俺、質問者じゃないけど、このへんよくわからない……

ウインドウのマウスクリック相対座標を取得して、相対化して
例えばプロジェクションモードやモデルビューモードにしてGLGETとかで変換行列をえて、
逆行列を作ってかければおk?

ビューポート変換行列はどうやってとるの?
たしかに、モデルビューとプロジェクションでは足らん気がする。行列の値みる限り。

携帯だから日本語がふじゆうになるスマン
867デフォルトの名無しさん:2008/05/14(水) 06:03:51
>>866
ビューポートもglGetIntegervしてくればいい。
それらを自分でかけてもいいが、変換してくれるのがgluUnProject()

# 変換先はワールド座標ではなくオブジェクト座標
868デフォルトの名無しさん:2008/05/14(水) 11:26:31
>>867
d

ビューポートもゲット出来るのか、それに使える関数もあるんだね
調べてみるね(^ω^)ノシ

(;^ω^).。oO(すでに逆行列求める関数とか、その他色々手作りしちゃったんだよな……おれアホだわ)
869デフォルトの名無しさん:2008/05/14(水) 14:59:28
ポリゴンで光源を置くとある角度になると白く光ってしまうんですが。
ちゃんとGL_NORMALIZEを有効にしてるのにおかしいと思ったら、どうやらglScalef
が原因みたいなんです。
ある大きさ以上にglScalefでポリゴンを縮小すると過度に白く光ります。
どうしたら普通にシェーディングできますか?
ポリゴンを大きくするしか手だてはないんでしょうか?
870デフォルトの名無しさん:2008/05/14(水) 17:12:29
つ glEnable(GL_AUTO_NORMAL);
871デフォルトの名無しさん:2008/05/14(水) 17:13:52
ごめん間違えた
つ glEnable(GL_NORMALIZE);

と思ったらすでに有効にしているのか・・・
872865:2008/05/14(水) 17:41:13
すいません、昨日に引き続き質問させてください。
OpenGLの拡張機能を使用するにはwglGetProcAddressで関数を取得すると思うのですが、
ビデオカードが2.0対応しているのに関数へのポインタが取得できないのはなぜでしょう?
一応OpenGL Extension Viewerにてサポートが確認されている関数(glGenRenderbuffersEXTなど)
を取得しようとしてみましたが、nullしか帰ってきませんでした。それどころか、glMaterialfといった
1.0から使用できる関数へのポインタまでもが帰ってきません。
何が原因なのでしょうか…
使用しているビデオカードはGeForce 7600 GSです。
873デフォルトの名無しさん:2008/05/14(水) 17:49:30
>>872
WGLは、GLコンテキストが存在しないとwglGetProcAddressがNULLで返る仕様になっているので、
コンテキストを生成してから取得すればOKかと。
874デフォルトの名無しさん:2008/05/14(水) 18:11:45
>>873
うまく取得できました。
が、今度はGL_INVALID_OPERATIONが… orz
なんか設定してないものがあるんでしょうか?
875デフォルトの名無しさん:2008/05/14(水) 18:23:10
ごめんなさい、関数を取得した後すぐにカレントコンテキストをnullにしてしまったことが
原因でした。カレントを外さずにそのままやるとうまくいきました。
ありがとうございました。
876デフォルトの名無しさん:2008/05/14(水) 21:40:00
>>869
スケールによって点光源との角度が変わってスペキュラで白く光るとかじゃないの?
ポリゴンの大きさで照明処理ができないなどということはない
877デフォルトの名無しさん:2008/05/15(木) 00:45:13
>>869 それが一度はSPECULARが原因とを疑って色々弄ったんですが・・・
やっぱりglScalefである一定以上縮小した時に現象が発生します。
878デフォルトの名無しさん:2008/05/15(木) 01:33:35
>>877
ミップマップが適用されちゃってるってコトはない?
なんにしても、状況が再現する最小のコード片があればいいんだけど・・・。
879デフォルトの名無しさん:2008/05/15(木) 14:15:48
すいません。OpenGLに渡す行列データの仕様についてなのですが、
glLoadMatrixなどに渡す配列は行優先(と言っていいのか判らないのですが)で
Direct3DのD3DMATRIXとメモリ上の並びは同じで合ってるでしょうか?
つまり配列[12][13][14]にそれぞれ平行移動量XYZが入る形という意味で。

同じであれば、OpenGL=列優先、Direct3D=行優先で違うという話をよく見るのですが、
メモリ上の配列が違うという意味ではなく、ドキュメント表記が違うだけで
内部メモリの順序はOpenGLもDirect3Dもどちらも同じと考えて良いですか?
880デフォルトの名無しさん:2008/05/15(木) 15:44:58
DirectX使ってないので同じかどうかわからないが、
GLfloat nMat[16];
glGetFloatv(GL_MODELVIEW_MATRIX, nMat);
などとすると、メモリ上の位置はわかる。
881デフォルトの名無しさん:2008/05/15(木) 23:13:05
>>879
[12][13][14]には平行移動成分が入るます。
それを、
列ベクトルの左に掛ける行列の4列目と見るか、
行ベクトルの右に掛ける行列の4行目と見るか、
は解釈の違いに過ぎないので、どちらであるとも言えまする。

まぁ、OpenGLではベクトルを列ベクトルで表記することが多いので、
Matrixの読み出し/格納は列優先でおこなわれると覚えたほうが分かりやすい鴨。
882デフォルトの名無しさん:2008/05/15(木) 23:35:06
OpenGLではcolumn major
Direct3Dではrow major
OpenGLでは行列の後ろからベクトルを掛ける
Direct3Dでは行列の前からベクトルを掛ける
ってことは・・・?!
883デフォルトの名無しさん:2008/05/16(金) 01:50:30
>>880-882
どうもありがとうございました。
自前で行列計算してワールド変換に使用していて、D3DからGLに持っていくときに
多くのサイトで行列は転置する必要があると書いてあったのですが、
その通りやってもどうも正常に動作しないのでおかしいと思っていたところです。
884デフォルトの名無しさん:2008/05/16(金) 03:37:58
結局、ドキュメントが行列xベクトルかベクトルx行列となっているかが違ってて根本的には同じだよ。
大抵の3Dとか数学とか物理だと行列xベクトルの書き方のほうが多いので
Direct3D使うときも行列xベクトル+column majorでやってました。

あんまりスレとは関係ないけど、みんな自前で行列やベクトル計算のクラスや関数を用意してない?
そろそろ3D用の標準となるそういうライブラリが出てこないかな・・・。
探せばいいのがあるのかもしれないが。
885デフォルトの名無しさん:2008/05/16(金) 16:47:59
ゲームで壁に銃で撃つと弾痕のテクスチャが壁に貼られます。何発も撃つと幾重にも
貼られますが、あれはどういう手法でインタラクティブに表示しているのですか?

壁テクスチャ用のUV座標とは別に弾痕用のUV座標があると思うのですが、そもそもUVの位置が
未定だからどうやって決めているのかなと思って。
あと幾重にも弾痕が重なるってことはUVCoordもたくさんあるのですかね?

概念だけでも教えていただければ助かります。
886デフォルトの名無しさん:2008/05/16(金) 19:55:01
実際にどうやってるのかは色々あると思うが、その方法なら、UV座標は1つでできる。
描くときのUVを変えればよい。テクスチャ行列( glMatrixMode(GL_TEXTURE) )について調べてみる
887デフォルトの名無しさん:2008/05/16(金) 22:05:23
自分なら、弾痕用のポリゴン1個作って、ブレンドモードで重ね書きする。
888885:2008/05/16(金) 22:15:51
>>886>>887
ありがとうございます。DirectXで解説しているサイトがいくつかありました。
それによると投影テクスチャでやるっぽいです。

けどいろいろやり方があるらしいですね。お二方の方法も勉強してみます。
889elite vipper:2008/05/16(金) 23:45:30
>>887
大抵のゲームでは弾痕用のポリゴンを壁に貼り付けるらしい。
こういうのをデカール(decale)っていうらしい。
普通に壁面にポリゴンを張って弾痕を前に表示されるようにするには
Zバッファをオフにしてz値でソートして順番に表示するか
ある程度壁から離した場所に弾痕用ポリゴンを置かなくちゃならない。
そうしないとZバッファ法の誤差でノイズみたいのがでるからね。

3Dグラフィックス数学の本には
Zバッファの精度を考慮してどれだけ浮かすか(深度値オフセット)を計算する方法が書いてあるよ
890デフォルトの名無しさん:2008/05/19(月) 20:58:50
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,・・・)
したとき、グラフィックメモリにはheight*width*3bitだけ
使われるという解釈で良いですか?
891デフォルトの名無しさん:2008/05/19(月) 21:33:22
いいえ
892デフォルトの名無しさん:2008/05/19(月) 21:41:30
幅*高さ*3ビットじゃなくて3バイトだな
正確にどれだけ使われるかは分からないが、普通大体そのくらいではある
893デフォルトの名無しさん:2008/05/19(月) 22:32:10
例えば640x480のRGBテクスチャを作ろうと思ったら内部では1024x512x4で作られてると思っておけば問題ない
894890:2008/05/19(月) 22:39:22
てことは、ビットマップと同じ感じで作られるということでよい?
895デフォルトの名無しさん:2008/05/19(月) 23:23:30
ていうか、まあ、ビットマップだよね。
896890:2008/05/19(月) 23:55:28
ありがとうございました。
897デフォルトの名無しさん:2008/05/20(火) 00:32:14
テクスチャも上下逆なんだっけ?
898デフォルトの名無しさん:2008/05/20(火) 02:16:09
ボトムアップでもトップダウンでも選択できる。
ウィンドウズビットマップも選択できるけどな。
899デフォルトの名無しさん:2008/05/22(木) 20:42:32
ソフトシャドウのサンプルってどこかにありませんか。
できればCgであるとありがたいです。GLSLでもよいですけど。

くっきりした影のサンプルについては、以下を見ました。
ttp://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20060601
900デフォルトの名無しさん:2008/05/22(木) 21:26:21
901デフォルトの名無しさん:2008/05/22(木) 21:38:00
すまんSDK落とすならSDK 9.5落としてくれ
SDK10には新しいサンプルしか入ってないのな
902デフォルトの名無しさん:2008/05/22(木) 22:14:50
トゥーンやってたけど
それで境界決めるのを細かくやればソフトシャドウになりそうな…ならないな
903899:2008/05/22(木) 22:37:23
>>900-902
ありがとうございます
904デフォルトの名無しさん:2008/05/23(金) 01:00:39
テクスチャ描画がうまく行かないのですが、
もしかしてglBeginとglEndの間にglBindTextureを呼び出すのってまずいですか?
905デフォルトの名無しさん:2008/05/23(金) 01:34:58
まずいです
906デフォルトの名無しさん:2008/05/23(金) 01:38:24
追加で。ココを見るよろし →ttp://www.ugrad.cs.ubc.ca/~cs314/opengl/glBegin.html
glBegin〜glEndの間に呼べるGLコマンドは極めて限られておりまする。
907デフォルトの名無しさん:2008/05/24(土) 03:36:22
GL_DEPTH_COMPONENTなテクスチャをそのままGL_LUMINANCEとして
テクスチャマップすることって出来ないんでしょうか。

やりたいことはこの画像のように
ttp://alb.hp.infoseek.co.jp/img/shadow_map_001.png
ttp://alb.hp.infoseek.co.jp/opengl_shadow_map.htmlより
左上にdepth textureの内容を表示することです。

GL_LUMINANCEなテクスチャにCPU経由でglGetTexImage,glTexImageか、
framebufferに一度描写して、又はFBOにattachしてglCopyTexImageするしかありませんか?
908デフォルトの名無しさん:2008/05/24(土) 11:53:55
そのリンク先に書いてあるじゃないか
glTexParameteri( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE );
をやっておけばLuminaceテクスチャとして扱われるよ
909デフォルトの名無しさん:2008/05/24(土) 12:03:51
>>908
やって出来なかったから書き込みました。説明不足すみません。

そんでもって自己解決。
GL_TEXTURE_COMPARE_MODEをGL_NONEにしてからじゃないとダメなんですね。
910887:2008/05/27(火) 02:21:19
>>889
亀レスですが(レスった直後に事故って入院してたw)ありがとうございます!
ちょっと頭吹っ飛びましたが改めて勉強してみます。
911デフォルトの名無しさん:2008/05/27(火) 08:54:44
事故で頭が吹っ飛んだのかと思ったw
912デフォルトの名無しさん:2008/05/27(火) 13:54:29
退院できてよかたねw
913デフォルトの名無しさん:2008/05/30(金) 06:32:29
一枚のポリゴンが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);
914デフォルトの名無しさん:2008/05/30(金) 07:36:07
点光源はw(position[3])を1に
距離による減衰までやりたいならGL_CONSTANT_ATTENUATIONとかで調べる
915デフォルトの名無しさん:2008/05/30(金) 20:28:16
3Dゲームとかに出てくるまばいゆい光の演出はなんて用語で言うんですか?
916デフォルトの名無しさん:2008/05/30(金) 21:29:37
間倍 唯(13)
917デフォルトの名無しさん:2008/05/30(金) 23:10:30
加算アルファ
918デフォルトの名無しさん:2008/05/30(金) 23:18:17
グレア
919デフォルトの名無しさん:2008/05/30(金) 23:59:25
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 );
}
921デフォルトの名無しさん:2008/05/31(土) 00:55:51
>>920
KEY_FもKEY_Bも両方マイナスになってるように見えるが
922920:2008/05/31(土) 01:04:56
すみません。
いろいろ試していてFを元に戻すのを忘れていました。
Fが+です。
923デフォルトの名無しさん:2008/05/31(土) 01:17:48
F押してもB押してもd_distが-0.5になってるやん
924デフォルトの名無しさん:2008/05/31(土) 01:18:58
デバッガを使うなり要所にprintfを入れるなりして、
FやBを押すとd_distやdistがどう変化するか出力してみなよ

勘でだけど、+0.5でもダメなら、KEY_Fが'f'になってないとかあたりか
925デフォルトの名無しさん:2008/05/31(土) 01:19:29
リロード忘れてたorz

Fが+なら逆向きに動くんでないの?
あとはfmodの使い方の問題かな。
926デフォルトの名無しさん:2008/05/31(土) 11:08:13
>>915
レンズフレアじゃないか?
927デフォルトの名無しさん:2008/05/31(土) 11:13:53
>>919
ジオメトリシェーダ使ってないのでよくわからないが、
Cg なのか GLSL なのかによって、動くかどうか
変わってくるんじゃないかな>RADEON HD 2600 XT

ATIならGLSLの方がいいのかな?
928デフォルトの名無しさん:2008/05/31(土) 12:10:03
>>919
OpenGLからジオメトリシェーダを使うのは現状WindowsとRadeonの組み合わせでは無理
ドライバが対応してないから、MacかGeForce使え
IrrlichtはOpenGL2.0対応みたいだから2.1対応させるのは簡単そう
2.0と2.1の違いってあまり無いんだがなんで2.1対応させる必要があるんだ?
ドライバが対応さえしていればジオメトリシェーダ対応させるのはそれほど大変でもない
しかしOpenGLの知識が無いとかなり難しいと思うぞ
929デフォルトの名無しさん:2008/05/31(土) 12:14:15
あ、すまん、新しいドライバ使えばRadeonでもジオメトリシェーダいけるかもしれん
俺はRadeonHD持ってないので確実なことはわからないが、
なるべく新しいドライバ入れてGL_EXT_geometry_shader4拡張があるかどうか調べてくれ
あれば使える
930デフォルトの名無しさん:2008/05/31(土) 14:46:03
寺西さんだっけ?
そんな名前の性格悪いおっさんが、txtにそういう情報表示させるツールがあったな

なんかGLのメーリスが検索に当たるたび
なんでこんな性格わりーんだろーと思う
931デフォルトの名無しさん:2008/05/31(土) 20:18:54
>>930
リヌクスのコミュも似たようなもんだよ。
2chで言っても始まらんが、あの手のヲタは
『知ってるが、お前の態度が気に入らない』を素でやってるタイプがほとんど。
932デフォルトの名無しさん:2008/05/31(土) 20:40:02
金もらってるんじゃないんだから気に入らない相手に親切にしてやる義務も無いだろ
回答者はお前らのカーチャンでも先生でもないんだぞ
933デフォルトの名無しさん:2008/05/31(土) 21:50:21
今OpenGLの情報調べるならOpenGL Extensions Viewerが良くね?
934デフォルトの名無しさん:2008/05/31(土) 23:37:52
ttp://wisdom.sakura.ne.jp/system/opengl/gl6.html
このページに載ってある一番下のサンプルプログラムを
cygwinでコンパイルしたんですけど描画結果が点線の三角形ではなく
普通の直線の三角形になってしまいました

glEnable(GL_LINE_STIPPLE);
glLineStipple(1 , 0xF0F0);

この2行を反映させるのってどうすればいいですか?
他にも点線が描画されるような簡単なものも書いてみたけどやはり結果は普通の直線でした
935デフォルトの名無しさん:2008/05/31(土) 23:55:21
MacならRadeon全般で使えるっぽい?
ソフトエミュになるかもだけど
936デフォルトの名無しさん:2008/06/01(日) 12:04:02
そこのページは嘘が多い
あるいはドライバのバグ
937デフォルトの名無しさん:2008/06/01(日) 12:26:55
>>934
VS2005 + Geforce8800GT
の環境ならうまくいったぞ。
そちらのグラボは何?
938デフォルトの名無しさん:2008/06/01(日) 14:36:13
>>937
仕様表を見たら
VIA/S3 Graphic社製 UniChrome Pro (VIA社製K8N800 チップセットに内臓)
となっていました
939sage: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色を格納しています。

もしエラーの起きる原因をお知りであれば、ご教授お願いします。
940sage:2008/06/01(日) 15:30:52
sage間違えた
941デフォルトの名無しさん:2008/06/01(日) 15:31:42
ふははwすんません
942デフォルトの名無しさん:2008/06/01(日) 15:53:07
groundの定義が見れないとなんとも。
(i+j)&1 ってのはi+jが偶数か奇数かで0,1を選択してんの?
(自分は臆病なんで(i+j+60)%2ってやるかな。)

デバッガが使えないとしても、ground[0]やground[1]に固定してエラーが出ないか調べたり、
ねんのため(i+j)&1が幾つになるか表示させてみたりすれば

943デフォルトの名無しさん:2008/06/01(日) 16:07:49
>>942

はい、偶数奇数を選択しています。
そして赤と白のチェック柄を出すために使用しています。

上記のソースは床の描画で、
その床を囲むように、床と同じような処理で壁も描画しています。
壊れたような表示はされますが、アクセス違反は発生しません。

エラーが起きる瞬間は
j=24
i=7で
0x02b6cad3でハンドルされていない例外が発生しました:
0xC0000005:場所0x02b43e88に書き込み中にアクセス違反が発生しました。

となります。
944デフォルトの名無しさん:2008/06/01(日) 16:15:52
壊れたような描画の画像です。

http://www.vipper.org/vip833417.jpg.html
945デフォルトの名無しさん:2008/06/01(日) 16:36:18
942だが
ソースの一部だけじゃわからないので、推理だがw
iとjがint型ではなくfloatとかで宣言されてんじゃね。

他にエラーの原因があるかもしれんからglGetErrorとかもみたらいいと思うよ
946デフォルトの名無しさん:2008/06/01(日) 17:04:01
↑違いますね。すんません。
ちなみに>>939のコードそのままでやってみたら表示した
GLfloat ground[2][4] = { {1,1,1,1},{1,0,0,1}};
な感じで。原因は他の場所かも
947デフォルトの名無しさん:2008/06/01(日) 18:06:15
>>946
わざわざありがとうございます。

glGetErrorも試してみたのですが常に0が返ってきました。
原因を探しているのですが、検討がつきません。

友達のPCで試したところ通常通り描画できました。
また他の友達のPCで試したところ、描画は944のようになりましたが
エラーは出ませんでした。
948デフォルトの名無しさん:2008/06/01(日) 18:21:02
試しに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();
}
・・・
949デフォルトの名無しさん:2008/06/01(日) 18:42:18
解決できました!!
ありがとうございます。
データを送りすぎていたみたいですね。

極端に重たくなってしまったので、これから改良していこうと思います。
本当にありがとうございました。
950デフォルトの名無しさん:2008/06/01(日) 18:49:59
>>949
改良には頂点配列を使うといいぞ。
951デフォルトの名無しさん:2008/06/01(日) 18:57:19
>>950
さっそく赤本見てみます!
952919: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のはずです。
953919:2008/06/01(日) 22:34:11
|ι´Д`|っ < 8.5でも だめぽ
954デフォルトの名無しさん:2008/06/01(日) 22:38:16
そもそも2.0 ATI-1.5.24とは?
955デフォルトの名無しさん:2008/06/02(月) 01:08:17
>>952
じゃあダメだな、諦めるしかない
ttp://irrlicht.sourceforge.net/features.html
ここにOpenGL2.0って書いてあるから2.0対応はしてると思ったんだが
最低1.5でも動くってならそうかもしれん

Extensions ViewerのDatabaseで見付けたからあるのかと思ったが、
どうもMacのVM内で動かした奴みたいだな
956デフォルトの名無しさん:2008/06/02(月) 06:20:59
最近OpenGLを使い始めたんですが、市販のゲームでもよくあるサンプルみたいにコマごとにポリゴンを描画しまくって画面作ってるんですか?
957デフォルトの名無しさん:2008/06/02(月) 10:42:05
そーだよ
958919:2008/06/03(火) 23:03:08
>>955
そうなんですか・・・動かないんですか。
ttp://irrlicht.sourceforge.net/features.html
確かに2.0と書いてありますね。でもExampleのソースコード中では1.5と表示されていました。

ところで、Linuxでもジオメトリシェーダーの対応状況は同じですか?
959デフォルトの名無しさん:2008/06/05(木) 21:45:48
GDIのEllipse,Arc,LineTo等を使って、2Dのペン幅付きラインやポリゴン(抜き、凹、Arc含)を
大量に描画するプログラムを作っています。

描画の高速化を検討しているのですが・・・・
OpenGLを使うならば、円弧を線分に分割、幅付きラインの外形抽出、テセレーション等の前処理が必要なのでしょうか?
そうであれば、描画以前の処理に時間が掛かりすぎてしまいます。

OpenGLでなくても良いですので、何か良い方法やツールを御存知の方がいれば
教えていただけないでしょうか?

よろしくお願い致します。



960デフォルトの名無しさん:2008/06/05(木) 23:10:02
なにでやるにしろ線分に分割とかその辺の処理はCPUでやってるよ
隠蔽されてるか自分でやる必要があるかの違いくらいだ
その程度の処理がボトルネックになるんだったら何で描画しても速度変わらないぞ

.NETが使えればWPFなんかどうだろう
GDI+もいいが遅いと聞く
cairoでglitzバックエンド使えばOpenGLで描画してくれる
あとは自分でビットマップをレンダリングしてそのままコピーでもいいんじゃないだろうか
961959:2008/06/05(木) 23:42:32
>>960
ありがとうございます。

> その程度の処理がボトルネックになるんだったら何で描画しても速度変わらないぞ

ペン幅付きポリラインも面も何千何万とあるので、どうやら「その程度」で済みそうにないです・・・・

> cairoでglitzバックエンド使えばOpenGLで描画してくれる

まずはこれを検討してみます。
962デフォルトの名無しさん:2008/06/05(木) 23:50:26
すべての図形が毎回変わるわけでなければ、線分に分割した円弧とか
幅付きラインの外形とかは一度だけ計算して保存しとけばいいんじゃないか
メモリ食うけど
963デフォルトの名無しさん:2008/06/05(木) 23:54:21
>>961
いや、960さんが言ってるのはそーゆーことじゃなくて、円弧の分割だとかは結局GDI内部で
CPUを使ってやってるだろうから、APIにやらせようが、APIに渡す前に自前で計算しようが、
速度は変わらないよってことでしょ。
(一般化しなくて良い分、自前でやる方が速くできるかもね)

ちなみにテセレーションはgluTessほにゃらら関数を使うと便利。
964デフォルトの名無しさん:2008/06/06(金) 00:07:58
線分分割はCPUでやるけど、各頂点をどこに置くかはVertex shaderで計算させるようにすれば高速化するかも。
geometry shader使えばテセレーションもGPUで計算できて高速化できるんじゃなかろうか。

とりあえずVertex shader、Geometry shaderについて調べてみたら
965デフォルトの名無しさん:2008/06/06(金) 03:43:25
メタセコイアで作ったモデルをOpenGL使ったプログラムで表示するのってどんな方法があるんでしょうか?
966デフォルトの名無しさん:2008/06/06(金) 07:21:40
いろいろな方法があるなあ。
967デフォルトの名無しさん:2008/06/06(金) 19:14:57
俺は工学ナビさんのところのを使ってるー
968デフォルトの名無しさん:2008/06/07(土) 03:43:19
工学ナビさんの試したんですが、サンプルは動くものの自分で使うとなぜか表示できない現象が。
空間の設定が悪いのかと思っていろいろ試してます。
969デフォルトの名無しさん:2008/06/08(日) 02:33:34
開発環境はwindowsXP cygwinで行っています。
http://pitecan.com/info/winglut.htmlを参考にしました

現在、C言語による画像処理演習という本を参考にサンプルプログラムを
コンパイルしていたのですが行き詰ってしまいました。
http://www.shoko-do.co.jp/download.html#ISBN978-4-7856-3150-5

bmpを画面に表示するプログラム(cpictbmp.c)なのですが、サンプルのbmpでなく
自前のbmpをロードさせようとすると表示されませんでした。どのようなことが原因
なのでしょうか?

他にもプログラム実行時に出るウィンドウを消してもコマンドラインの入力が効かない
状態なので毎回Ctrl-cで終了しています。
お分かりになる方どうかご教授お願いします。
970デフォルトの名無しさん:2008/06/08(日) 06:33:22
OpenGLではなくて3D一般の質問ですいません。聞くところが
わからなかったもので…

二つのベクトルの角度は内積で求まると思いますが、出る結果は
cosなので、右回転か左回転かを知ることができません。
回転方向を知る方法はありますでしょうか?
971デフォルトの名無しさん:2008/06/08(日) 08:21:15
右回転、下から見れば左回転
右か左を語るってことは、二つのベクトルと同一平面に無いなにか別のベクトルがあるはず。例えばZ軸とか法線とか
二つのベクトルの外積と、その基準になるベクトルの内積の符号で判断できると思う
972デフォルトの名無しさん:2008/06/08(日) 10:12:16
>>971
なるほど!
本当に助かりました、ありがとうございます。
973969:2008/06/08(日) 21:04:58
bmpについては自己解決しました。
256色でないときちんと表示できないものだったのに
違うフォーマットのものを読み込んでいました。

ただ毎回Ctrl-cで終了せざるを得ない状況は続いています。
974デフォルトの名無しさん:2008/06/18(水) 15:17:17
スポーツのアニメーション作ろうかと考えているのですが、
OpenGLとFLASHのどちらが向いているのでしょうか?
975デフォルトの名無しさん:2008/06/18(水) 20:54:25
条件が少なすぎるが、たぶんどっちもゼロから勉強すんでしょ?
FLASHとこたえとく。
976デフォルトの名無しさん:2008/06/18(水) 21:29:20
FLASHとOpenGLって直接比較するようなものか?
まずはどちらがどんなものなのか、もっと詳しく調べることをおすすめする。
977デフォルトの名無しさん:2008/06/18(水) 21:39:52
Papervision3DやらAway3Dやらと比較してるんじゃないの?
3DじゃないならOpenGLと比較する意味ないからな。

現在進行形で使ってる身から言うと、3D目的でFlashはやめといたほうがいい。
貧弱な環境で試行錯誤しながらコーディングするっていう楽しさはあるけど、
どうしてもブラウザ上で実行しないといけない案件だとか、特殊な状況じゃな
いならOpenGLがいいよ。
978デフォルトの名無しさん:2008/06/18(水) 21:52:59
flashは手を出したこと無いがGLでやるなら3年はかかるだろうし
それまでにflashの環境が良くなるんじゃないか?
979デフォルトの名無しさん:2008/06/18(水) 23:46:28
>>974です。
現在、3Dプログラミングの制作+研究をやろうかと考えており
一応1年間プログラミングの勉強を経験してきたので
OpenGLをやってみたいという思いがあったのですが
手軽だからという理由でFLASHを勧められたことで迷い、質問させていただきました。

ですが、やはり完成度の高い作品を作りたいので、元々の希望通り
OpenGLをやることにします。
アホみたいな質問に応えていただきありがとうございました。
980デフォルトの名無しさん:2008/06/19(木) 00:30:56
どうしてもブラウザ上でやりたきゃ、ActiveX使えばいい。
俺はIE嫌いだけど。
981デフォルトの名無しさん:2008/06/19(木) 01:17:45
OpenGLの勉強を1はじめて一週間で紙飛行機を飛ばせれるようになったよ
982デフォルトの名無しさん:2008/06/19(木) 05:27:41
>>978
Astroの話?だったら期待はずれだよ。テクスチャ付き三角形を表示
できるようになるだけ。
速度はだいぶ改善されるが、それでもハードウェアをフルに生かせる
OpenGLと比べられない。

それと、Flashの3Dの手軽さはOpenGL+3Dエンジンの手軽さのそれと一緒。
プログラミング経験たった一年じゃ、モデル表示するだけで数ヶ月は必要
だろうから、何かしらの3Dエンジンを使うことをオススメしとく。

Silverlightもそうなんだけど、なんで普通の3Dサポートしないかな。
絶対需要あるのに。
983デフォルトの名無しさん:2008/06/19(木) 19:49:52
> プログラミング経験たった一年じゃ、モデル表示するだけで数ヶ月は必要
プログラミングなんて入門からOpenGLのアニメまで半年で出来るのが普通
http://ciee.t.u-tokyo.ac.jp/MimaSearch/SyllabusInfo?recId=120770
984デフォルトの名無しさん:2008/06/19(木) 20:39:57
1.5時間/週 x 20回くらい? 半年で30時間とか効率わるそうだ

そのサイトおもしろいね。関連する授業の図が凝ってる
985デフォルトの名無しさん:2008/06/19(木) 21:08:52
>>983
一応偏差値60後半程度の国立の情報系だけど、授業でやるのって基本的に教科書
なぞる程度だから、それだけで応用できるかって言ったらまた別問題だよ。

それと1〜2年次でプログラミングの基礎やると思うから、半年ってのは言いすぎ。
986デフォルトの名無しさん
東工大か?