したがって、私は1Dテクスチャで苦労しています。私が達成しようとしているのは、3 float値をフラグメントシェーダにuniform
として渡すことです。それらは光の色を表し、同じシェーダをn
ライトに再利用しようとするもので、そのすべての情報(色と位置)がテクスチャに格納されています。今のところ、私は物事をテストするために単一の光の色だけを渡そうとしています。だから私はこれを持ってフラグメントシェーダで:opengl 1Dテクスチャ:任意の浮動小数点値で塗りつぶし
uniform sampler1D lightColor;
...
vec3 lc = vec3(texelFetch(lightColor, 0, 0)); // all zeroes
vec3 lc = vec3(texture(lightColor, 0, 0)); // same
私は無駄に両方のケースでは、シェーダ内texelFetch
とtexture
コール(1または他のいずれか)との両方のそれを達成しようとしました。
vec3 lc = vec3(0.0f, 0.0f, 0.8f);
、私は(lc
でゼロ以外の値です)期待される結果を得るので、私は、少なくともシェーダで、そのポジティブだ:私はこのようなシェーダで値をハードコーディングしている場合ことに注意してください問題がtexelFetch
またはtexture
の呼び出しのいずれかにある可能性があります。次のように戻るC++土地で
lightManager
の初期化時に一度だけ実行)は、次のとおりです(確かに間違っているが)ここに行く
GLfloat lightValues[] = { 0.8f, 0.8f, 0.8f };
GLuint lightID; // member, not a local variable.
glGenTextures(1, &lightID);
glBindTexture(GL_TEXTURE_1D, lightID);
glActiveTexture(GL_TEXTURE0 + lightID);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexStorage1D(GL_TEXTURE_1D, 1, GL_RGB32F, 1);
glTexSubImage1D(GL_TEXTURE_1D, 0, 0, 3 * sizeof(GLfloat), GL_RGB, GL_FLOAT, lightValues);
glUniform1i(glGetUniformLocation(shader->program, "light"), lightID);
何も非常に凝りました。 glTexStorage1D
については、levels
(MipMapsなし)とGL_RGB32F
()(私は3つの浮動小数点を渡そうとしています)のために1を選択しました。 width
は1であるため、値は1です。それは割り当てを処理する必要があります。 GLfloat
のサイズ三度幅のために、私はlevel
0(再び、何ミップマップ)を選択しなかったためglTexSubImage1D
、xoffset
0でバッファを埋めるのに今
、GL_RGB
type
としてフォーマットとGLfloat
としては。最後に、実際のデータ。
C++コードについていくつかのこと:私が正しくGL_NEAREST
にフィルタを設定する(ようのせいではありません)、私はsaderに均一な場所/接続が(glUniform1i
とglGetUniformLocation
経由)が正しいと言うでしょう。だからここ
は私の質問に来る:
- まずと明らかに、これはテクスチャを経由してライト情報を渡して、意味をなすのでしょうか?シェイダーは
lights[n]
のようなものを大変に行うことはできません。n
はコンパイル時に知っておく必要があるので、テクスチャは自然にトリックする方法として気になります。 - 第2に、私の前提では、データのサイズが原因かもしれないということですか?私はテクスチャの完全性について読んだことがありますが、正直言って、それはやや簡潔でした。 1テクセルのサイズは間違いなく魚のような香りです。
- 第3に、何か間違っていますか?特に、
internalFormat
、format
およびtype
? - 第四に、一般的な考え方はどれですか?
lc
にはゼロが埋め込まれていますか?
ありがとう!!
EDIT:複数回渡したり、シェーダーに渡されるライトの数にハード制限を定義したくない(n
を一定にする)。私はOpenGL 4.2のいくつかの機能についても読んでいますが、どちらも興味がありません。私はちょうど手元のツールで学ぶことを試みています(しかしそれは100%保証されています。将来的に私はこれらのトピックについて質問して戻ってくるでしょう)
あなたはまたglActiveTeを悪用していますテクスチャIDを持つxture。 OpenGLはエラーを生成し、その呼び出しを無視します。 – datenwolf
あなたは悪用を意味しますか?合計のために? AFAIKはかなり標準的な方法ですが、実行時まで 'lightID'の値が不明な場合は、どのテクスチャユニットを有効にするかをどのように知るでしょうか? –
あなたが間違っているのは、GL_TEXTURE_0に*テクスチャ名*を追加したことです。 *それはどのように行くのですか?*いくつかのテクスチャユニットがあります(0〜N、Nは 'glGetInteger(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS) 'で問い合わせることができるフィギュアです)、' glActiveTexture(GL_TEXTURE_0 + i)'を呼び出すのは有効です。 glGenTexturesで生成し、glBindTextureでバインドするのは、いわゆるテクスチャ名*であり、範囲1〜2^32-1のすべてをテクスチャ名として使用することができます。 – datenwolf