2

私のフラグメントシェーダーには、次の行があります

gl_FragColor = texture2D(texture, destinationTextureCoordinate) * destinationColor;

textureタイプのユニフォームはどこにありますかsampler2D。私のコードでは、これを常に値「0」に設定しています。

glUniform1i(_uniformTexture, 0);

glUniform1iフラグメントシェーダーのハードコア0への呼び出しをスキップすることは可能ですか?に置き換えtextureてみたところ0、有効なタイプではないと文句を言っていました。

4

2 に答える 2

2

あなたが何を達成しようとしているのか完全にはわかりませんが、ここにいくつかの考えがあります:

sampler2D名前が示すように、2D テクスチャをサンプリングする必要があります。0これは特別な GLSL 変数であるため、コンパイラは、 の最初のパラメーターに渡されたときに有効な型ではないことについて不平を言うのは正しいことですtexture2D

複数のテクスチャを使用していない限り、2 番目のパラメータglUniform1iは常に0(デフォルト) にする必要があります。テクスチャを 1 つだけ使用している場合は、この呼び出しをスキップできますが、そのままにしておくことをお勧めします。

値 0 を渡したいだけなのに、なぜ texture2D を呼び出す必要があるのでしょうか? 確かにあなたはできるgl_FragColor = destinationColor。これにより、 からの頂点シェーダ出力に基づいてフラグメントに色が付けられますgl_Position。テクスチャを使用する予定がない場合 (またはそう思われる場合)、なぜテクスチャを実装しているのかわかりません。

編集: 2 つのテクスチャをフラグメント シェーダーに正しく送信するコード。

//glClear();

// Attach Texture 0
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _texture0);
glUniform1i(_uSampler0, 0);

// Attach Texture 1
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _texture1);
glUniform1i(_uSampler1, 1);

//glDrawArrays();
于 2012-12-24T14:48:07.333 に答える
1

次のようなレイアウトが必要です。

#version 420
//#extension GL_ARB_shading_language_420pack: enable  Use for GLSL versions before 420.

layout(binding=0) uniform sampler2D diffuseTex;

そのようにして、サンプラーユニフォーム 0へのバインディングを取得しています。それがあなたの望みだと思います。ただし、ユニフォームをバインドするときはゼロからの増分値を取得することに注意してください。そのため、何をバインドするかを確認してください。関数を介して均一な変数をバインドするという考えglUniform1i()は、コードの正確性を保証することです。

ソース: http://www.opengl.org/wiki/GLSL_Sampler#Version_4.20_binding

于 2013-09-05T15:14:52.090 に答える