0

私は openGL を使用しており、シーンをテクスチャにレンダリングし、そのテクスチャを保存して、フラグメント シェーダに渡して別のものをレンダリングするために使用できるようにします。

glGenTexture() を使用してテクスチャを作成し、それをフレーム バッファーにアタッチしてから、glBindFrameBuffer() でフレーム バッファーをレンダリングしました。次に、フレームバッファを 0 に戻して画面にレンダリングし直しましたが、スタックしてしまいました。

私のフラグメント シェーダーには、テクスチャを格納するために使用したい均一なサンプラー 2D 'myTexture' があります。どうすればこれを行うことができますか?

オンラインで見つけた .jpg/png 画像の場合、次のコードを使用しました。

glUseProgram(Shader->GetProgramID());
GLint ID = glGetUniformLocation(
              Shader->GetProgramID(), "Map");
glUniform1i(ID, 0);
glActiveTexture(GL_TEXTURE0);
MapImage->Bind();
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

ただし、このコードは、作成した glTexture では機能しません。特に、同じ方法で myTexture->Bind() を呼び出すことはできません。

4

2 に答える 2

1

シェーダーに本当に「a 」がある場合、 「マップ」uniform sampler 2D 'myTexture'の均一な場所を取得するのはなぜですか? 「myTexture」の統一された場所を取得する必要があります。結局のところ、それはサンプラーの名前です。

于 2013-02-04T22:58:38.747 に答える
0

glGenTexture() を使用してテクスチャを作成し、フレーム バッファにアタッチしました。

言い換えれば、あなたはこれをしました:

glActiveTexture(GL_TEXTURE0);
GLuint myTexture;
glGenTextures(1, &myTexture);
glBindTexture(GL_TEXTURE_2D, myTexture);

// very important and often missed by newbies:
// A framebuffer attachment must be initialized but not bound
// when using the framebuffer, so it must be unbound after
// initializing
glTexImage2D(…, NULL);
glBindTexture(GL_TEXTURE_2D, 0);

glBindFramebuffer(…);
glFramebufferTexture2D(…, myTexture, …);

さて、myTexture はテクスチャの名前ハンドルです。やらなければいけないことは何?FBO のバインドを解除して、添付されたテクスチャをイメージ ソースとして使用できるようにします。

glBindFrameuffer(…, 0);

glActiveTexture(GL_TEXTURE0 + n);
glBindTexture(GL_TEXTURE_2D, myTexture);

glUseProgram(…);
glUniformi(texture_sampler_location, n);
于 2013-02-04T22:58:31.223 に答える