2016-12-13 10 views
1

したがって、私は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 

私は無駄に両方のケースでは、シェーダ内texelFetchtextureコール(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(再び、何ミップマップ)を選択しなかったためglTexSubImage1Dxoffset 0でバッファを埋めるのに今

GL_RGBtypeとしてフォーマットとGLfloatとしては。最後に、実際のデータ。

C++コードについていくつかのこと:私が正しくGL_NEARESTにフィルタを設定する(ようのせいではありません)、私はsaderに均一な場所/接続が(glUniform1iglGetUniformLocation経由)が正しいと言うでしょう。だからここ

は私の質問に来る:

  • まずと明らかに、これはテクスチャを経由してライト情報を渡して、意味をなすのでしょうか?シェイダーはlights[n]のようなものを大変に行うことはできません。nはコンパイル時に知っておく必要があるので、テクスチャは自然にトリックする方法として気になります。
  • 第2に、私の前提では、データのサイズが原因かもしれないということですか?私はテクスチャの完全性について読んだことがありますが、正直言って、それはやや簡潔でした。 1テクセルのサイズは間違いなく魚のような香りです。
  • 第3に、何か間違っていますか?特に、internalFormatformatおよびtype
  • 第四に、一般的な考え方はどれですか?lcにはゼロが埋め込まれていますか?

ありがとう!!

EDIT:複数回渡したり、シェーダーに渡されるライトの数にハード制限を定義したくない(nを一定にする)。私はOpenGL 4.2のいくつかの機能についても読んでいますが、どちらも興味がありません。私はちょうど手元のツールで学ぶことを試みています(しかしそれは100%保証されています。将来的に私はこれらのトピックについて質問して戻ってくるでしょう)

答えて

0

さて、 https://stackoverflow.com/users/1774414/raistmaj

に関係なく部品点数のため、1、widthの両方glTexStorageglTexSubImage、アレイ内の要素の数であるが判明した。

また、glActiveTextureは(当たり前!)glBindTexture前に呼び出されなければならない

+0

あなたはまたglActiveTeを悪用していますテクスチャIDを持つxture。 OpenGLはエラーを生成し、その呼び出しを無視します。 – datenwolf

+0

あなたは悪用を意味しますか?合計のために? AFAIKはかなり標準的な方法ですが、実行時まで 'lightID'の値が不明な場合は、どのテクスチャユニットを有効にするかをどのように知るでしょうか? –

+1

あなたが間違っているのは、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

関連する問題