私のプログラムをGLfloatから頂点位置のGLshortに変換しようとしていますが、これをシェーダでどのように表現するのか分かりません。シェーダでvec3データ型を使用していましたが、vec3は3つの浮動小数点数を表します。今私は3つの短編を表現する必要があります。限り、私はOpenGLはショートパンツのベクトルを持っていないと言うことができるので、私はこの場合何をすべきでしょうか?頂点にGLfloatの代わりにGLshortを使用する
6
A
答えて
16
シェーダでこれをどのように表現するのか分かりません。
これは、この情報がシェーダーには存在しないためです。
glVertexAttribPointer
が提供するすべての値は、(彼らはまだ浮いていない場合)は浮動小数点GLSL値にに変換されます。この変換は本質的に自由です。だから、vec4
属性タイプでこれらglVertexAttribPointer
定義のいずれかを使用することができます。
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, ...);
glVertexAttribPointer(0, 4, GL_UNSIGNED_SHORT, GL_TRUE, ...);
glVertexAttribPointer(0, 4, GL_SHORT, GL_TRUE, ...);
glVertexAttribPointer(0, 4, GL_SHORT, GL_FALSE, ...);
これらのすべてが自動的にvec4
に変換されます。あなたのシェーダは、短絡、バイト、整数、浮動小数点などが入力されているかどうかを知る必要はありません。
最初のものはそのまま使用されます。 2番目のコードでは、符号なしの短い範囲[0、65535]を[0.0、1.0]浮動小数点範囲に変換します。 3番目の記号は、符号付き短距離[-32768,32767]を[-1.0,1.0]の範囲(though the conversion is a bit odd and differs for certain OpenGL versions, so as to allow the integer 0 to map to the floating point 0.0)に変換します。 4つ目は[-32768、32767]から[-32768.0、32767.0]に浮動小数点範囲として変換します。
属性に使用するGLSLタイプは、glVertexAttribIPointer
またはglVertexAttribLPointer
(どちらもOpenGL ES 2.0で使用できません)を使用する場合にのみ変更されます。
要するに、属性には常にfloat型のGLSL型を使用する必要があります。 OpenGLが変換を行います。
関連する問題
- 1. AJAX:XMLHttpRequestの代わりにjQueryの.ajax()を使用する利点?
- 2. epoll_create()の代わりにepoll_create1()を使用する利点
- 3. ページスタイリング:浮動小数点を使用する代わりに
- 4. 小数点の代わりに小数点のカンマを使用する変数
- 5. リンクの代わりにボタンを使用する利点はありますか?
- 6. 小数点の代わりにコンマを使用して小数点を表示
- 7. getterの代わりにivar変数を使用する利点について
- 8. トーストを使用する代わりに
- 9. xmlを使用する代わりにオブジェクトをシリアル化する利点
- 10. 頂点の頂点を頂点で4.2で検証する
- 11. プレーンストリングの代わりにObjectIdを使用する利点は何ですか?
- 12. 直接のインテントの代わりにバンドルを使用する利点
- 13. pxにマイナスを使用する代わりに使用する
- 14. //使用する代わりに、プロトコル://
- 15. 代わりに使用するフォント
- 16. Bash:exit $ 1の代わりにexit $ {1:0}を使用する利点
- 17. Guiceの代わりにCDI/WeldでJAX-RS 2.0を使用する利点?
- 18. CSSプロパティテーブルの代わりに浮動小数点数を使用する理由
- 19. Railsの代わりにsend_fileの代替ファイルを使用する
- 20. 矢印の代わりに点を使用してカルーセルスライダーを作る方法
- 21. Submitの代わりにButtonを使用
- 22. サテライトアセンブリの代わりにリソースファイルを使用
- 23. ptの代わりにemを使用
- 24. expand.gridの代わりにouterを使用
- 25. JqGrid:editurlの代わりに$ .ajax()を使用
- 26. 再利用頂点シェーダに
- 27. CDIで使用する代替Webフレームワーク(JSFの代わりに)
- 28. NotImplementedError:モジュールCrypto.Signature.pkcs1_15を代わりに使用
- 29. 頂点シェーダ対頂点
- 30. Eclipse用のリポジトリを使用する代わりに
回答を読んだ後、私は次のような印象を受けました:http://stackoverflow.com/a/1316494/256062およびhttp://stackoverflow.com/a/5721102/256062 – Xavier
@Xavier:あなたはポイントを逃した。頂点データのサイズは、GLSL属性変数ではなく、 'glVertexAttribPointer'によって定義されます。シェーダ内のより小さなコンポーネントを表現する必要はありません。ハードウェアは小さなコンポーネントからより大きなコンポーネントに変換します*。 –
@ nicol-bolas符号付きデータ型の場合、変換された範囲は( 'short'の場合)' [-32768,32767] 'であり、' [-32767,32767] 'ではないと確信していますか?この[記事](http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3)は、オレンジブックからとられているように、教え方が異なっているようです。それは、変換は署名された型の分割に過ぎないと言います。その場合、短い値 '-32768'は浮動小数点GLSL値' -32768/32767 = -1.000305185..'に変換されます。私は、仕様が正しいかどうかをどこで見つけることができません。 – wil