2016-08-24 6 views
0

std::int16_t(16ビット整数)の値がGLshortの3072個あります。私はそれらを私のGLSLシェーダに送りたいです。私はBuffer Texturesを読んで、そのアプローチを実装しようとしました。しかし、データがShaderに到着しても、データは元の状態にはなりません。私はまだ特定されていませんが、値がすべて0または最大になっているように見えます。私は間違って何をしていますか?バッファテクスチャを使用してGLSLシェーダに16ビット整数を正しく送る方法

私の初期化コードは、この(関連していないいくつかのものをバー)のようになります。私のレンダリングループの開始時に

// 1: Get the data - array of GLshort: 

GLshort tboData[3072]; 
for (size_t i = 0; i < 3072; ++i) 
{ 
    // cdb.getSprite() returns std::int16_t 
    tboData[i] = (GLshort) cbd.getSprite(i); 
} 

// 2: Make sure the Shader Program is being used: 

sp->use(); // sp is a wrapper class for GL Shader Programs 

// 3: Generate the GL_TEXTURE_BUFFER, bind it and send the data: 

GLuint tbo; 
glGenBuffers(1, &tbo); 
glBindBuffer(GL_TEXTURE_BUFFER, tbo); 
glBufferData(GL_TEXTURE_BUFFER, sizeof(tboData), tboData, GL_STATIC_DRAW); 

// 4: Generate the Buffer Texture, activate and bind it: 

GLuint tboTex; 
glGenTextures(1, &tboTex); 
glActiveTexture(GL_TEXTURE1); // GL_TEXTURE0 is a spritesheet 
glBindTexture(GL_TEXTURE_BUFFER, tboTex); 

// 5: Associate them using `GL_R16` to match the 16 bit integer array: 

glTexBuffer(GL_TEXTURE_BUFFER, GL_R16, tbo); 

// 6: Make the connection within the Shader: 

glUniform1i(sp->getUniformLocation("tbo"), 1); 
glBindBuffer(GL_TEXTURE_BUFFER, 0); 

、私は確かにすべてがバインドされます

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, spriteSheet); 

glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_BUFFER, tboTex); 

レンダリングループでは、TBOのインデックスに使用するユニフォームを設定しました。

glUniform1i(sp->getUniformLocation("tboIndex"), tboIndex); 

バーテックスシェーダの重要な部分:

#version 140 

// other ins, outs, uniforms ... 

uniform int tboIndex; 
uniform isamplerBuffer tbo; 
out float pass_Sprite; // Frag shader crashes when this is int, why? 

void main() 
{ 
    // gl_Position, matrices, etc ... 
    pass_Sprite = texelFetch(tbo, tboIndex).r; 
} 

何かアドバイスは大歓迎です。符号なしnormalized integer形式で

答えて

6

GL_R16

。あなたのバッファサンプラーは、が正規化されていないの整数を必要とします。

correct image formatGL_R16Iとなります。これはintで

FRAGシェーダがクラッシュし、なぜ

おそらくあなたはflat interpolationを使用していなかったので。非浮動小数点値の補間は機能しません。

これはクラッシュしません。それは単にコンパイルに失敗するだけです。 常にシェーダのコンパイルエラーをチェックする必要があります。

+0

まず、あなたは素晴らしいです。第二に、それは今、すべて意味があります!リンクされたwikiページでは、画像フォーマットのテーブル内の "NORM"カラムが、ドライバ/ハードウェアによってサポートされる画像フォーマット*を持っているかどうかを教えてくれると思いました。今、私はそれが*正規化*を意味することを理解しています。また、私は愚かな私のことを完全に見落としてしまいました。また、シェーダの「クラッシュ」についてはあなたが正しいです。それは単なる単純化です。それは、実際にはコンパイルしないだけです。私はフラット補間を調べるつもりですが、あなたがリンクしたページは情報を含んでいません。とにかく、ありがとうございました! – domsson

関連する問題