OpenGL 2.0 専用スレ
OpenGL 2.0 専用スレ。
ここでは、OpenGL の猛者のみが生き残る――― >560
sage の使い方も覚えてね。
glTexImage2D 関数で RGB 設定でテクスチャデータを送ってるから、
テクスチャのアルファは、1.0 その設定では、
glEnable( GL_ALPHA_TEST );
の意味がない。
GL_ALPHA_TEST は、glAlphaFunc関数で、描画しないアルファ値を
設定できるが、ポリゴン全体が同じ値のアルファ値では意味がない。
GL_BLEND は、glBlendFunc関数で背景と色を重ねる設定ができる
ので、目的にあわせて設定を変える必要がある。
glTexEnvの設定は、ポリゴンとテクスチャの色を重ねる設定で、
そのままでも良い。
一番の問題は、テクスチャデータにアルファ値が無いことだよ。(^^;
次は、OpenGLスレ Part10 へ質問してください。
>>560
GL2.0 でやろうとしているなら、TexEnvが FragmentShader なのは当然として、
AlphaTest の機能は FragmentShader 内で discard してもできるし、
もちろん AlphaTest を使ってもできる。
OpenGL-ES 2.0 だと AlphaTest 無いから、前者で実現するしかないけど。 使える実装があればいいものだと思う。
それはOpenGL界隈全体に言えるけど。
てか誰かオープンソースでEGLの実装してくれ。 ARB_fragment_programって何も明示しないと最低でも24bit浮動小数点精度を要求される
これって標準で、D3DでいうところのPixelShader2.0ができるということでわ?????
D3DだとPS2.0からはFixedPoint精度シェーダを使用できないが
OpenGLだと明示すればhalfもFixedも使用できる点がゴイスー マルチスレッドOpenGLってアップルも実装しているらしいけど実際に速いの? いやー実際参った
Fixed point を
修正された点
と直訳されたときは!!!!!
だから直訳組は嫌いなんだ!!!! 直訳っつぅかなんつーか・・・
そのひとは固定小数点というものを知らないんだろうね。
Java のリファレンスなんかにもひどい訳語があるよ
ttp://java.sun.com/javase/ja/6/docs/ja/api/javax/sound/midi/Instrument.html
>計測を使用して音を出すには
意味わかんね
スレ違いすまそ fixを修正って意味で使ってんのはコンピュータ分野の一部分だけなんだよね
>>572
手元の英英辞典では1番目の語義に
mend or correct something: to repair, mend, or correct something
って出てきたんですけど・・・ >>573
572が言いたかったのは、「コンピュータ分野の一部分」じゃなくて
「コンピュータ分野では一部分」って意味なんじゃなかろうか
でも個人的な感覚では、「修正」の意味の方が頻度高い気もするけど
ていうか fixed point くらい(この分野の)常識として訳して欲しいよね
floating point は一体どう訳したんだろう?
> Fixed point を
> 修正された点
ワラタ
そんなの、海外サイトをふだんから見ない俺でもわかるのにw
RapidMind やってみた、
GPGPUやるんだったら
Cg GLSLよりかなり組みやすいけど
速度的にどうなのかはまだ分からん
やってる人いる? 当方Cgでシェーダーを組んでいるのですが、まだ手をつけたばかりで
シェーダーの初歩的なことを伺いたくて…他スレがあまりに過疎っているので
こちらで質問させてください。答えて頂けたら本当に助かります。
TEXCOORDについてなのですが
テクスチャ座標を指す、というのはわかったのですが
テクスチャ0や2などの番号がついたときにどこを指すのかわからなくて
float4 uv0 : TEXCOORD0;
float4 uv1 : TEXCOORD1;
float4 uv2 : TEXCOORD2
uniform sampler3D data // volume
uniform sampler2D back_buffer, // backface
uniform sampler1D TransferFunction, // transferfunc
この場合uv0〜uv2はどのsamplerを参照するのでしょうか?
Cgチュートリアルを見ていて、明示的にどれとどれが対応するのか、などが描いていなくて…
よろしくお願いします。 どれとどれを対応させてもいいし、テクスチャなんか参照せずに他の用途に使ってもいい
組み合わせは自由
すべては作るシェーダ次第 すみません、もう少しわかりやすくお願いします…
対応させてもいい、とありますがどのように対応させるのでしょうか
たとえば上記のように宣言して
float2 texc = ((uv2.xy / uv2.w) + 1) / 2;
とした場合、このtexcに何が入っているのかわからなくなってしまって。
言い忘れていましたがこれはフラグメントシェーダーで
vertexシェーダーの方では
float4 position : POSITION;
float4 color : COLOR;
float4 texCoord : TEXCOORD0;
をアウトプットしています。 それは単に
((uv2.xy / uv2.w) + 1) / 2
の計算結果が入ってるだけで、どのテクスチャも読んでない
Cgあんまり詳しくないけどサンプル眺めてみた限り、テクスチャを読み込んでる部分では tex2D とかの関数を呼んでると思う 元にしたソースを見ていましたら
vertexシェーダー から fragmentシェーダーへ値を>>589の値を送っているというのがわかりました。
float2 texc = ((uv2.xy / uv2.w) + 1) / 2; には vertexから送られてきたuv2の2Dテクスチャ座標が入っていました。
確認なのですが、vertexで抜けてきたものをフラグメントでは扱う、ということですよね。
なんとかまとまってきました。
ただ、それでもvertexシェーダーで、uniformもしていないのにtexcoord0とかが呼ばれたときに
それが何を指しているのかがわからない…
すみません…混乱しすぎて。睡魔も着てしまってわけがわからなくなっています。
セマンテックが何を表しているのか、図で説明してくれてるものがあればいいのですが。
OSITIONもCOLORも、画面の何を指しているのかわからないままサンプルいじくってるので… CgUsersManualちゃんと読めば書いてある
プロファイルにもよるが、OpenGLならarbvp1/arbfp1かvp40/fp40辺りだろうから
Appendix B Language Profilesのarbvp1とarbfp1のBindingsの項を読んでみ openglの疑問はwww.opengl.orgに行ってspecification等をちゃんと読めばほとんど解決するだろう。
まずはレンダリングパイプラインを理解することが大切だと思うよ。
cg のループ回数(もしくは行数)についてなのですが。
fragment shader (CG_PROFILE_ARBFP1): GeForce7900GS で
void main(out float4 color : COLOR){
float i;
float4 totalCol = 0;
for(i = 0; i < 200; i++){
totalCol += 0.001;
}
color = totalCol;
}
だとちゃんと動くのですが、ループの回数を200から300に増やすと、
CG_COMPILER_ERROR
になるのです。なにか制限とかってあるのでしょうか? タブが消えてしまった orz
void main(out float4 color : COLOR){
float i;
float4 totalCol = 0;
for(i = 0; i < 200; i++){
totalCol += 0.001;
}
color = totalCol;
}
こうです。 あれ? スペースも消えた。
Live2ch で書き込んでるせいですかね。 ごめんなさい。 ARBFP1というかARBFragmentProgramは動的ループをサポートしてないから
コンパイル時にループを全部展開されて命令数が足りなくなる
よって動的ループをサポートしてる他のプロファイルを使いましょう ありがとうございます。
やっぱり制限数があるのですね。
他のプロファイルを試してみます。 nvidiaのfragment_programっておかしくね??
これだと、なんか固定機能しか使えないように見えるが
実際PS2.0できるじゃん。
fragment_program2だとPS3.0だし
ここは全員でおかしいと主張すべきだ。 何がおかしいんだか分からんが、それならば
NV_geometry_program4とかNV_fragment_program4とかNV_vertex_program4を
使えばSM4.0相当になるうえにWindowsXPでも動いてしまう
この方がおかしいと思わないか? もっと分かりやすくすべきだ。
固定機能しか使えないのならば、fragment_program_kotei_fanction
とか、すべきだ。
PS2.0なら、fragment_program2
PS3.0なら、fragment_program3
とわかりやすくすべきなのだ。
だから、ARB_fragment_programがPS1.1までとかいう、変な大間違いが出てくるのだ。 Cg 2.0 をインストールし(1.1だった)、CG_PROFILE_FP40 プロファイルを使用したら
動的ループができるようになりました。
ちなみに、CG_PROFILE_FP30では、動的ループは無理でした。
ただ、別の問題が出てきました。
void main(uniform float size, out float4 color : COLOR){
float i;
float4 totalCol = 0;
for(i = 0; i < size; i++){
totalCol += 1;
}
color = totalCol / size;
}
だと、sizeをいくつにしても、色が白になるはずなのですが、
size 250以上になるとだんだん色が薄くなっていきます。ループの中が
250までしか展開できてないようです。 続き
で、以下のようにループ部分を分割し、試しにsize=400にして実行したら、
void main(uniform float size, out float4 color : COLOR){
float i;
float4 totalCol = 0;
for(i = 0; i < size - 200; i++){
totalCol += 1;
}
for(i = 200; i < size; i++){
totalCol += 1;
}
color = totalCol / size;
}
見事に白色になりました。
GeForce8800 だったら、こういうでかいループも処理できるんでしょうか? fp40のループは最大256ループまでだそうだ
GeForce8系で使えるgp4fpなら制限無しだな 正直MAXまでの何かってのはやってはいけないことだな
例えば命令スロットが512なら、
512を目一杯使わねばならない状態になるのはいかんこと。
リアルタイムレンダリングみたいな用途じゃ無いならいいんじゃない
むしろGPGPUやオフラインレンダリングとかなら出来るだけ詰め込んで
GPUに処理を肩代わりさせたいんじゃないのかな 256まででしたか。
とりあえず分割ループでごまかすことにしました。
8800欲しい・・・
ちなみに、GPGPUなプログラムです。 main(out float4 color){
TexColor = tex2D(tex, texcoord);// テクスチャの色
PolColor = Lighting();// ポリゴンの色
color = TexColor * PolColor;
}
Cgのフラグメントシェーダの色々省略したコードなのですが、テクスチャをマッピングしないポリゴンがある場合、
colorが変な色になります。ポリゴン毎にテクスチャの存在の可否を指定する変数を渡して
if(texExist)
color = TexColor * PolColor;
else
color = PolColor;
とすれば意図通りの動作はするのですが、このような処理にするしかないのでしょうか? テクスチャ設定してないのにテクスチャ読めと命令してるんだから変な色になるのは当然だろ
テクスチャ無い時はサンプリングしないって分岐はごく自然な処理だと思うが
他にどうなって欲しいてっんだ? >>612
分岐処理が嫌だったらシェーダ2種類作ったらいいんじゃない? >>615
それが一番楽っぽいな。
余分な負荷は気にしない。 >シェーダ2種類作ったらいいんじゃない?
2種類をCgランタイムでどう呼び出すのかわからない
テクスチャの有り無しでcgBindProgramに渡すプログラムを変えればいいだけだよ >>615
>>618
今は
cgGLBindProgram(); sceneGraph->DrawAll(); cgGLBindProgram(NULL);
こんな感じで全部のオブジェクトを一気に描画してるので,
シェーダ2種類作ってポリゴン毎にバインドするシェーダを切り替えるのは
遅くなっちゃうのかなと思って他にいい方法がないか考えてました。
頭で考えてただけで実際遅くなるかとかの検証はしてなかったのでやってみます。
書いてて思ったんですけど同じマテリアル(テクスチャ)を使う
ポリゴンをグルーピングしていればシェーダ切り替える方法は
使いやすそうですね。
どっちのやり方も参考になりました、ありがとうございます。 描画時にマテリアルでソートするのは高速化の常套手段だね コンパイルすると
Error: 'C:\A\TOOLS\BCC\LIB\GLU32.LIB' contains invalid OMF record, type 0x21 (po
ssibly COFF)
と出ます
IMPLIB glut32.lib glut32.dll
をして、glut32.libを上書きしてるんですがダメです エラーをよく読め・・・ glut32.lib じゃないだろう ttp://www.kumaryu.net/cgi-bin/diary/?date=20080804#p02
S3本気だなー
ATIはいつ本気出すんだー Khronos BOFs
* OpenGL 3.0 Specification Overview
* OpenGL hardware and driver plans - AMD, Intel, NVIDIA
* Developer's perspective on OpenGL 3.0
* The new Khronos OpenCL Working Group and how that affects OpenGL
* and more...
AMDもいつまでも黙ってはいないぞ
どちらかと言えば微妙な拡張よりこっちの方が期待したいし
できればIntelもな… AMDはさっさと拡張の仕様を公開しろ。
ドキュメントがない拡張が何個溜まってると思ってるんだ。 OpenGL3.0情報
ttp://www.opengl.org/news/permalink/the_khronos_group_announced_today_it_has_released_the_opengl_30_specificati/
ttp://www.khronos.org/news/press/releases/khronos_releases_opengl_30_specifications_to_support_latest_generations_of/
opengl.orgのmessage boardでは不満の嵐だな
「散々待たせといて結局これかよ!」みたいな せめて3.0で削除された仕様は書かないでおいてくれると読み易かったんだがな
あとせめてテクスチャ回りを整理してほしかった OpenGLnのmain関数をスレッドで呼び出して使おうと思っているのだが、display()関数のオブジェクトカラーを引数で渡した値で更新したいんだ。
マルチスレッドで値を渡すことはできるのだが、OpenGL側でどうやって、display()関数に値を綿したらいいのかわらかない。
つまり、
プログラム1 --> OpenGLプログラム(スレッドで生成)
▼ ▼
値の更新 色変更
▼ ▼
値の更新 色変更
… …
ってことをしたいんだ。 glRotatef(90,1,0,0);
glutSolidCube(1.0);
このあとに
glTranslatefかglrotatefを適当にいれて
glSolidSphere(1.0,10,10);
より立方体の回転起動に垂直の起動で球が回転するようにするには
どうやればいいですか? glRotatefとglTranslatefを組み合わせてx軸周りの回転移動をy軸周りの回転に
させることはできますか?
glPopMatrix()とglPushMatrix()を使わないで GLSLで色を出力するとき、というか、OpenGLの質問なんですが、
OpenGLでは各色の値の範囲が0〜1ですが、これってGDI上での0〜255の範囲に
リニアに一致する訳じゃないのでしょうか?
256*256のコンテキストを作り、全面ぴったりのポリゴンを張って、フラグメントシェーダーから
gl_FragColor = vec4(gl_TexCoord[0].s, gl_TexCoord[0].s, gl_TexCoord[0].s, gl_TexCoord[0].t);
として色とアルファの増え方を見てみたのですが、どうもジャギっててきれいに0〜255の範囲で
増えてるわけではないみたいなのですが…
コンテキストと同じサイズのGL_NEARESTなテクスチャを張った場合はちゃんと256*256の範囲
全体が張られているのでテクスチャ座標がずれてるわけでもないみたいです。 あだ、ここGL "2.0"スレだった orz
GLスレの方に行ってきます orz
スレ汚しすみませんでした… DirectX ばっかりで OpenGL なんて一生触ることは無いと思ってたが
Linux絡みでJOGLで開発することになった
調べてみたら、OpenGL も色々面白そうだな 名前が違うだけで、実行するハードウェアの中身に対するフォーマットは一緒だからな。 OpenGL Vertex Buffer Objectについての質問があります。
glBufferData()で,頂点データをグラフィックボードのメモリに転送(確保?)した後,
プログラム側の頂点データが更新されたとします。
この更新された頂点データを,グラフィックボードのメモリに転送するわけですが,どのようにすればよいのでしょうか?
いったんglDeleteBuffer()でバッファを消して,新たにバッファを作成し,glBufferData()で転送しなおすのでしょうか?
それとも,既に確保されている領域に上書きするような方法があるのでしょうか?
・glBufferDataでもう一回転送する
・glMapBufferでDMA転送する
・glMapBufferRangeで更新が必要な部分だけDMA転送する
・いっそデータの更新をCPU側でなくTransform Feedbackを使ってGPU側で行う glTexSubImage()でテクスチャの一部を書き換えられるのと同じように、
VBOにも glBufferSubData() があるよ。 書き忘れ。
Buffer全体を書き換えたい、あるいはBufferのサイズを変えたいなら、
わざわざDeleteしなくても、普通に glBufferData() で上書きしてやればいいよ。
これも考え方はテクスチャと同じ。サイズが変わるとパフォーマンスは落ちるでしょうね。 なるほど。色々な手段があるのですね。
ありがとうございました。 例えば、direct x使ったPCゲームで全画面表示に切り替わるけど、
openglでも同じことできる?
シミュレータが作りたいんだけど。 最近は、アフィン変換はつかわずにクォータニオンってのが主流なの? 試しにZ軸によるs度の回転(右手座標系)を計算してみたら
sin(s)*y-2*(x/2-(cos(s)*x)/2)+x,-2*(y/2-(cos(s)*y)/2)+y-sin(s)*x
簡約すると
x' = sin(s)*y+cos(s)*x
y' = cos(s)*y-sin(s)*x
z' = z
となって普通の回転行列の計算と同じになた
普通に軸にそって回転するだけなら
通常の回転行列を使う方が良いのかな 軸まわりの回転ならsin、cosの手計算でもいいと思うが、任意の軸まわり回転をオイラー角でやるとジンバルロックっていう問題が出てくる。
あとクォータニオンを使う一番のメリットは2つの回転位置の補完を球面線形補完による演算で求められることじゃないかと思う。 いまさらopen glとかVRMLとか意味あるの? OpenGLとVRMLを並列で語るとか意味あるの? VRMLは後継が出てたはずだよね、名前忘れたけど
まあ今更OpenGLとかDirect3Dとか言っても意味ないわな
中身ほとんどいっしょだし 流れとはまったく関係ないどころかスレとも関係ないが
PowerVRがなんだかんだでまた注目されつつあるな その PowerVR について質問させて下さい。
iPhone3GS や iPod touch 3G で使われているらしい PowerVR SGX を内蔵し、
Vaio Type P や Dell Inspiron Mini 10/12 等のネットブックで採用されている
intel GMA500 ですが、
カタログスペック上は OpenGL2.0 対応を謳っているものの、Windows XP/Vista 上では
glGetString(GL_VENDER) が Microsoft、
glGetString(GL_RENDERER) が GDI Generic、
glGetString(GL_VERSION) が 1.1.0 を返してきます。
Intel で配布されている開発者向けの 2009/9/13 時点の最新ドライバを入れても同じです。
Vista 32bit 用: ttp://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=17995&lang=jpn
XP 32bit用: ttp://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=17992&lang=jpn
http://software.intel.com/en-us/blogs/2008/10/22/where-can-you-find-a-mid/
こちらの阿鼻叫喚スレのように、GMA500 での Windows 向けドライバによる
OpenGL2.0 サポートは「ない」と言うしかないのでしょうか…。
また、今後のサポート予定について事情をどなたかご存知でしたら教えて頂けると嬉しいです。