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