トップページ⇒tech
981コメント284KB

OpenGLスレ Part17

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2011/11/15(火) 18:45:31.83
クロスプラットフォームの3D API OpenGLに関する話題を扱うスレッド。
現在のバージョンは4.1
http://www.opengl.org/

== OpenGLと一緒に使われるツール&ライブラリ ==
苦労したくなかったらとりあえず入れとけ。
・glx:    XからOpenGLを使うためのライブラリ。普通は直接は使わず意識する事はない
・glut:   クロスプラットフォームなツールキット。でもさすがに古くさい
・glew:   これを入れないと拡張機能が使えないor使いにくい
・glxgears: 歯車が回るベンチマーク。-infoでOpenGLのバージョンが見られる。OpenGLの動作確認はこれで
・glxinfo:  自分の使っているカードのOpenGLの機能が全てリストアップされる。
・OpenTK  C#からOpenGLを簡単に使えるようになる。VC#の強力なIntellisenseとあわせてサクサク開発可能。

== 必読書 ==
・OpenGLプログラミングガイド 原著第5版 (通称赤本)
・OpenGL(R) Reference Manual (通称青本)
・OpenGL Shading Language (通称だいだい本)
・OpenGL(R) SuperBible: Comprehensive Tutorial and Reference
・OpenGL ES 2.0 プログラミングガイド
・GLUTによるOpenGL入門
・GLUTによるOpenGL入門2 テクスチャマッピング
あると便利。
・ゲームプログラミングのための3Dグラフィックス数学

== チュートリアルサイト ==
床井研究室: http://marina.sys.wakayama-u.ac.jp/~tokoi/oglarticles.html
OpenGL de プログラミング: http://wiki.livedoor.jp/mikk_ni3_92/
NeHe:    http://nehe.gamedev.net/

== 前スレ ==
OpenGLスレ Part16
http://hibari.2ch.net/test/read.cgi/tech/1309182662/
0931営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 14:34:40.62
なんかえらい難しいですね。
これ考えた人バカですか?
0932営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 15:05:58.37
オフスクリーンレンダリングでテクスチャの一部から先の一部へコピーする方法ありますか?
それを解説してあるいいHPないでしょうか?
0933営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 21:15:28.32
先の一部って何だ?コピー先の事か?
glTexCoord2でコピー元の座標を指定して後は普通にコピー先テクスチャに
オフスクリーンレンダリングすればいいだけだろ
0934営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 23:06:20.52
>>930
ありがとです
そうなんですか はふぅ・・
0935営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 10:00:55.97
>>933
できるんですね。わかりました調べてみます。
0936営利利用に関するLR審議中@詳細は自治スレへ2012/04/05(木) 14:58:57.80
>>931
えらく難しいと思ってる自分は賢いのかいw
0937営利利用に関するLR審議中@詳細は自治スレへ2012/04/05(木) 18:22:39.10
>>836でマルチスレッドでのレンダリングを質問した物なのですが、
生成したスレッドの最初に eglCreateContext の第3引数に
共有したいContextを入れてeglMakeCurrentしたのです。
これがGoogleのangleprojectではちゃんとレンダリングされたのですが、
QualcommのAdreno SDKやARMのOpenGL ES Emulatorでは上手くいきませんでした。
そもそもangleprojectで確認してたのが悪かったのですが、
レンダリング出来るようにするにはどうしたらいいでしょうか。
0938営利利用に関するLR審議中@詳細は自治スレへ2012/04/05(木) 22:36:32.47
>>937
一般的にはその方法で問題ないはず。
実装毎に上手くいかない場合にどうすればいいかはメーカに聞くしかないんじゃないかな。
あとエミュレータは細かいところまで実装されてない場合があるのであまり信用せずに実機で確認してくれ。
0939営利利用に関するLR審議中@詳細は自治スレへ2012/04/06(金) 23:38:01.10
おお、Open GLスレを発見。
「実例で学ぶゲーム3D数学」
OPEN GLで卒論制作するつもりで、数学的なところを
勉強したいんですけど、上の本わかりやすいですか?
結構数学苦手なので、困ってるんですけど…
何か他にもよさげな本があれば紹介お願いします。
0940営利利用に関するLR審議中@詳細は自治スレへ2012/04/06(金) 23:59:05.09
そこそこわかりやすかったと記憶している。
0941営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 07:48:45.04
授業でやってた頃はなんに使うのかわからなかったけど
高校〜大学の数学物理力学等の教科書は結構役に立った
0942営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 10:10:57.15
ここで質問スべきかどうか迷ったけど幾つかアドバイスくだしあ
Windows Vista 32bit、ATI Radeon HD 4850でGLSL のビット演算はできた
同じPCでWindows 7 64bitをデュアルブートしてドライバを確認するとHD 4800になっていて
ビット演算がサポートされていない模様
(シェーダのコンパイルは通るが入力に関係なく0が返ってきている)
ラデオンのHDバージョンがオペレーティングシステムによって変わって見えるものなの?
GLSLで確実にビット演算をさせる方法はある?
ちなみに後者は#extension GL_EXT_gpu_shader4 : enableも試してみたが駄目
0943営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 11:11:03.87
ドライバ更新してないんじゃないの?
0944営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 13:15:04.48
一応更新したつもりだったがあやふやだったからそうなのかも
PC触れるようになったら確認してみます
0945営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 15:14:05.08
>>940
>>941

939です。
レスありがとうです。関係している本買います。
0946営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 17:29:18.94
数学関係は、手取り足取り掛け算から教えてくれるぐらいの物を、わかりやすいと思う人もいれば、
そんな馬鹿冗長な物ウザいだけだと、公式と証明羅列して、そこに補足入るくらいがシンプルでわかりやすい、って人もいるので
「何がわかりやすいか」 なんて、自分で読んでみないで他人に感想聞いた所で、正解なんてわからない
いや普通の話。
09479422012/04/08(日) 14:52:29.80
942だけど、ビット演算は普通に動いていて、全く別の所で躓いていました、失礼失礼・・・
0948営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 19:30:03.68
そうだと思ってました
0949営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 04:34:03.11
>>938
お答えくださり、ありがとうございます。
なるほど、間違ってはいないはずですか。
まずはエミュでGL環境を整えてから実機で試そうとしてたので、
実際に実機で確認出来るようになったらまた色々と探ってみます。
0950営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 12:44:27.70
GLSLで二つの3Dモデルに対して別々のシェーダーを適用したいのですが、
別々のシェーダーと言っても一部共通する部分があります

イメージとしてはこんな感じです(フラグメントシェーダー)
モデルX : 計算a + 計算b
モデルY : 計算a’ + 計算b

計算bはどちらのシェーダーにも共通する計算なのですが、
この様な場合でも二つのシェーダーのソースのどちらにも
同じ計算bを書く必要があるのでしょうか
0951営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 20:02:00.33
YES
0952営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 21:19:43.29
ということは、VRAM上に全く同じ命令データが
複数置かれることも普通にあり得るということですか

非常に無駄な感じがしますが、仕方ないのですね

これは仕方ないとして、せめてシェーダーのソースコード上では、
このようなコピペを回避する手段は何か無いのでしょうか
機能毎にモジュールに分けておいたソースをロードしてコンパイルし、
リンカがそれをひとつのシェーダーにリンクするとか
0953営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 21:54:27.31
コーディングルールをがちがちに決めておいて文字列操作で何とかすれば良いんじゃね
0954営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 21:56:11.95
NO
0955営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 22:44:57.45
>>954
私の >>952 へのレスですよね

VRAM上に全く同じ命令データが複数置かれることはないという意味でしょうか

それとも、コピペを回避する手段は無いといういみでしょうか

あるいは両方でしょうか
0956営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 00:18:15.31
OpenGL3以前のGLSLではCPUでの関数呼び出しみたいな事ができないので
関数は全部展開されていた。
OpenGL4だと関数呼び出しができるらしいけど詳しくは知らん
0957営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 00:24:45.26
Direct3Dは9の頃、静的リンカあったけど、最適化阻害する割にメリットがコード分割できるってだけだったから、全く使われず10であっさり消えたな。
11で動的リンカっぽい機能ついたけど使われてんだろか…。
マァ同じ命令データが複数置かれるといっても、画像に比べたら無いに等しいし、パフォーマンスへの影響の方がでかい。

とりあえずOpenGLでコード分割するには、#includeを自前で実装して、コンパイル前に展開するしかない。
異種バージョン間とか考えるとかなりめんどくさそうだが、
単純に文字列展開するだけで済ますならそんな難しいもんでもないよ。
0958営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 00:26:16.65
コピペを回避するには、基本的には自分でGLSLのコードを弄って
共通に使われる関数を複数のGLSLのコードに自動的に配置するような処理が必要になる。

そこでオススメなのがboost::waveだ!
waveはC言語で使われるプリプロッサを実装したものだが
waveに付属の以下のサンプルはGLSLのコードを処理できるようになっている。
wave\samples\custom_directives
このサンプルコードを使えばヘッダファイルに共通処理を書いて
#include "common.glsl"
みたいな事がGLSLでできるようになる。

ちょっと話は変わるが、最近Revisionという大きなデモパーティが開催された。
http://revision-party.net/
ここで作品をダウンロード可能
http://pouet.net/party.php?which=1550&when=2012
ここのスレのみんなはメガデモに興味ないかい?
0959営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 00:35:48.28
今でもAMIGAのデモやってるんだな。
0960営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 02:30:55.14
>>958
横からだけど、boost::wave とかノーマークだった。
これいい。素敵。ありがとう
0961営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 07:20:20.95
みなさん、ありがとうございます

自分のマシンで使える OpenGL が 3.1 までなので、
GLSL の機能だけでコピペを回避するのは諦めざるを得ませんね

>>958
すいません、質問には関係ないと思って開発言語は伏せていました
Haskell でプログラムしてます

プログラムソース内で(所謂シェーダーツリーみたいに)
グラフでシェーダーを組み立てられる仕組みを作って、
それでコピペを回避する方向でがんばってみます
0962営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 14:29:21.76
そんぐらいコピペしろよ
0963営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 16:50:26.92
cppとかLLでも簡単にできない?
0964営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 18:56:56.63
>>962
コピペ自体は簡単にできますが、コピペ元を変更した場合、
全てのコピペ先を同様に変更しなければならず、
その時に変更漏れしてしまう可能性があります

そういう事を防ぐのが、いろんなプログラム言語で実現されている
モジュール化機能の役割の一つだと学んできたので、
GLSL には少しショックでした
0965営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 19:17:41.75
HLSLみたく実行時にコンパイルできないのかGLSLは?
0966営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 19:24:21.06
>>965
実行時にコンパイルします
0967営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 20:05:53.39
むしろつい最近まで実行時にコンパイルするしかなかったっていう
後追いのくせに細かいところは結構gdgdだよなぁ
0968デフォルトの名無しさん2012/04/11(水) 22:16:19.78
灼熱のファイヤーダンス
0969デフォルトの名無しさん2012/04/11(水) 22:46:20.16
Haskellとかつまんねー言語捨てろし
0970デフォルトの名無しさん2012/04/11(水) 22:56:47.37
ほしぞらまですべててにいれた♪
0971デフォルトの名無しさん2012/04/12(木) 10:19:41.02
シェーダにプログラムから定数を渡したい時って、uniform変数へ渡すのと、
attribute変数の定数として渡すのと、どう使いわけたらいいんでしょうか。

投影行列みたいなのはuniform変数が使われているサンプルをよく見かける
のですが、頂点ごとの計算に使うような定数は、attribute変数の定数として
渡した方がいいんでしょうか。 今一使い分けがわかりません。よろおねm(_ _)m
0972デフォルトの名無しさん2012/04/12(木) 21:57:12.16
>>261 の質問者とは別人ですが、似たような質問をします

レンダリングコンテキストAがカレントの時に VBO を作り、
頂点データをVRAMに転送します

別のレンダリングコンテキストBがカレントの時に別の VBO を作り、
先ほどと全く同じ頂点データをVRAMに転送します

これで2つの全く同じ頂点データを元にして、
同じ3Dモデルを別々のウィンドウに別々の角度で表示したりできるのですが、
この場合、VRAMには2つの全く同じデータがダブって入ってる事になりますよね

これではあまりに無駄なのですが、
頂点データをVRMA内で共有する方法は無いでしょうか

wglShareLists などはディスプレイリストは共有するけど、
VBO は共有できないような気がするのですが、共有できるのでしょうか

[環境]
OpenGL 3.1
0973デフォルトの名無しさん2012/04/12(木) 22:15:42.70
>>972
「wglShareLists VBO」でググるとできそうな感じだけど、ダメだった?
0974デフォルトの名無しさん2012/04/12(木) 22:29:08.40
>>973
いえ、開発言語がHaskellなのでwglShareListsそのものを試す環境にはないのですが、
Haskellで GTK + OpenGL の組み合わせを提供するライブラリに、
他のレンダリングコンテキストとリソースを共有するレンダリングコンテキストを作る関数があって、
それで試したところ上手くできなかったので、もっと根本的に別のやり方があるのかと思いました

同じようにレンダリングコンテキスト同士のリソースを共有するwglShareListsでできるのでしたら、
Haskellの方でもできると思うので、関数の使い方に問題があるのかもしれません

理屈では可能なのですね、もう少し考えてみます

ありがとうございました
0975デフォルトの名無しさん2012/04/12(木) 23:07:47.23
attributeは頂点ごとのデータ、つまり頂点「属性」。uniformは頂点ごとに変わらない「一様」なデータ。
0976デフォルトの名無しさん2012/04/12(木) 23:37:43.03
>>975
レスありがとうございます。attributeが頂点ごとのデータというのは理解しています。

自分が聞きたかったのは、glVertexAttribPointerではなくて、glVertexAttribで指定する変数の方です。
これは全頂点で同じ値になりますよね。これと、glUniform〜 で指定する変数との使いわけについてです。
説明が紛らわしくてすみません。
0977デフォルトの名無しさん2012/04/12(木) 23:45:58.38
>>976
それはglVertexとglVertexPointerと同じような関係じゃない?
つまり実用的にはglVertexAttribはあまり使わないんじゃ。
まぁ人によると思うが。
0978デフォルトの名無しさん2012/04/12(木) 23:54:27.30
>>977
あそうなんですか。
例えば頂点の色を全部同じにしたい時は、glUniform〜じゃなくて、glVertexAttribで指定する
ものなのかなと思ったりしたんたですが。
そういう場合でも、glUniform〜で渡してやる方が一般的なんですかね。
0979デフォルトの名無しさん2012/04/13(金) 11:27:58.63
ググり方が悪いのかわからなかったので…
glutInitDisplayMode(GLUT_RGBA|GLUT_SINGLE);
のGLUT_SINGLEとは何ですか
0980デフォルトの名無しさん2012/04/13(金) 11:31:34.15
シングルバッファ
つまりダブルバッファを使わないということ
09819792012/04/13(金) 11:48:19.26
なるほど!
ダブルバッファを読んだらよくわかりました
ありがとう
レス数が950を超えています。1000を超えると書き込みができなくなります。