2016-04-08 20 views
0

テクスチャにも一定のフォーマット制限がありますか?OpenGLテクスチャ形式の制限

私はTGAファイルをロードすると、次のフラグメントシェーダでそれらを描いています:

varying vec2  v_texCoord; 
uniform sampler2D s_texture; 
uniform vec4  vColor4; 

void main() 
{ 
    vec4 tmpColor = texture2D(s_texture, v_texCoord); 

    tmpColor.r = vColor4.r; 
    tmpColor.g = vColor4.g; 
    tmpColor.b = vColor4.b; 

    gl_FragColor = tmpColor; 
} 

私は16×16の画像がOKに表示することを見つけます。 64x16の表示はOKです。 72x16,80x16、および96x16は機能しません。

必要に応じて、TGAファイルなどの詳細情報を提供します。

+2

OpenGLまたはOpenGL ESを使用していますか?以前はテクスチャには両方の次元で2の累乗になる必要があるという制約がありました。しかし、この制限は、バージョン2.0の後にOpenGLから削除されました。 OpenGL ESとWebGLでは、その制限が存在する可能性があります(実装が制限を削除する拡張機能をサポートしていない場合)。 – radical7

+0

@ radical7私はOpenGL ES2.0を使用しています。それはあなたが言っていることを意味するだろう。 64x16の後は128x16と256x16などでなければならないでしょうか? – SparkyNZ

+0

2 4 8 16 32 64 128 256 512 1024のように2^nにするだけです。それは明らかです。 – Sung

答えて

0

72,80および96は、2の累乗ではありません。この要件はOpenGL ESのデータフォーマットとほとんど関係ありません。この要件は、現代のデスクトップGLでも実際に普及しており、使用されるデータフォーマットに依存する可能性があります。

(デスクトップ)OpenGL 2.0以上の圧縮されていないテクスチャデータは、2のべき乗尺度ではありません。

しかし、圧縮テクスチャデータは4の倍数であるブロックサイズを必要とし続けます。ピクセル転送関数はイメージの各行に対して4バイトのデータ整列を引き続き引き継ぎます。浮動小数点テクスチャは、 2つ、というように。

GL用に設計された多くのイメージライブラリは、実際には2の累乗で材料を再スケーリングします。これは上記の問題のすべてを解決することができます。次元の問題を修正するのに最も適切な方法ではない(それは非常に無駄かもしれません)が、一般的な次元の問題にも普遍的に適用できます。

+0

はい、使用しているテクスチャはすべて圧縮されています。 – SparkyNZ

+0

"OpenGL 2.0以降の非圧縮テクスチャデータは、2の累乗以外の次元を持つことができます。*"いいえ、デスクトップOpenGL 2.0以降の***すべての***テクスチャは、Power-圧縮されているかどうかにかかわらず、2次元。部分ブロックはOpenGL仕様では禁止されていないため、ブロックサイズはテクスチャのサイズとは関係ありません。この仕様では、サイズがブロックサイズで割り切れないテクスチャに対してブロック圧縮フォーマットがどのように機能するかが明確になっています。したがって、あなたの答えはOpenGLにのみ適用されます。 –

+0

そのコメントは完全に混乱しており、確かに間違っています。単純な例としてDXTnテクスチャは、非ブロック整列ディメンションのデータストアを割り当てると 'GL_INVALID_OPERATION'を生成します。他の圧縮形式には、それぞれの拡張仕様で説明した独自の規則があります。もちろんOpenGLにしか当てはまりませんが、私は、議論中のAPIに関連する私の回答を保つようにしています。 Vulkan、Direct3D、または他のAPIについて議論したい場合は、私のゲストになれますが、質問にどのような価値が追加されるのか分かりません。 –

関連する問題