0

GLSL (LWJGL) でテクスチャを使用して、テクスチャをぼかす単純なフラグメント シェーダを作成する方法について学習していました。最初の試行 (テスト目的) は、元の色の値を取得するだけの非常に単純なシェーダーでした。

uniform sampler2D rectTexture;

void main(){
  vec4 color = texture2D(rectTexture, gl_FragCoord.st);
  gl_FragColor = color;
}

シェーダーは正常にコンパイルされます。コンパイル後、リンクして使用を開始しましたが、これまではすべてが機能しており、エラーは報告されていません。次に、テクスチャの均一変数を設定しようとします。

uniformTextureAddr = ARBShaderObjects.glGetUniformLocationARB(programObject, "rectTexture");
ARBMultitexture.glActiveTextureARB(ARBMultitexture.GL_TEXTURE0_ARB);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
ARBShaderObjects.glUniform1iARB(uniformTextureAddr, 0);

次に、通常の texcoords (両方の次元で 0.0f-1.0f) でクワッドを描画するだけですが、テクスチャが表示されません。テクスチャ自体は問題ではありません。フラグメント シェーダーを使用せずに、最初のクワッドの隣に 2 番目のクワッドを描画すると、期待どおりに表示されます。基本的なアプローチはNeHe: GLSL - An Introductionから取られています。uniformTextureAddrは -1 ではなく、すべてのピクセルを赤くするだけのさらに単純なシェーダーを使用すると、赤いクワッドが得られます。予想通り。したがって、バグは sampler2D ビジネス全体にある必要があります。クワッドが単にフレームから外れているなどの些細なミスも、これによって除外されます。

はい、シェーダーなしで描画した後、再びシェーダーで glUseProgramObject(programObj) を呼び出します。

ちなみに、これは ATI Radeon Catalyst 10.6 ドライバーと LWJGL バージョン 2.4.2 を搭載した Windows XP SP3 で動作しています。

更新:プログラム自体に何か問題があると思います。シェーダーに別の変数を追加すると:

uniform sampler2D secondTexture;
uniform sampler2D rectTexture;

void main(){
  vec4 color = texture2D(rectTexture, gl_FragCoord.st);
  gl_FragColor = color;
}

それを呼び出すglGetUniformLocationARB(programObject, "secondTexture");と、そこにあるはずなのに-1が返されます。ログ情報はまだ言うだけです:

情報ログ: フラグメント シェーダーは、ハードウェアで実行するために正常にコンパイルされました。

更新 2:

実際のテクスチャはバックバッファからコピーされます。小さいビューポートに単純な白い線が描かれ、テクスチャにコピーされます。

GL11.glViewport(0, 0, 256, 256);
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glColor3f(1.0f, 1.0f, 1.0f);
GL11.glBegin(GL11.GL_LINES);
GL11.glVertex3f(0.0f, 0.0f, 0.0f);
GL11.glVertex3f(256.0f, 256.0f, 0.0f);
GL11.glEnd();
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_LUMINANCE, 0, 0, 256, 256, 0);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL11.glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);

しかし、私が言ったように、テクスチャは実際の問題ではないと思います。なぜなら、カスタム シェーダーなしで 2 番目のクワッドで問題なく表示されるからです。また、バインドについて心配する必要はありません。これはプログラム内の唯一のテクスチャであり、最初に 1 回だけバインドされます。

ここに私の描画コードがあります:

ARBShaderObjects.glUseProgramObjectARB(programObject);
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f(0.0f, 0.0f, 0.0f);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex3f(256.0f, 0.0f, 0.0f);
GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f(256.0f, 256.0f, 0.0f);
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f(0.0f, 256.0f, 0.0f);
GL11.glEnd();
ARBShaderObjects.glUseProgramObjectARB(0);
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f(256.0f, 0.0f, 0.0f);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex3f(512.0f, 0.0f, 0.0f);
GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f(512.0f, 256.0f, 0.0f);
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f(256.0f, 256.0f, 0.0f);
GL11.glEnd();
4

3 に答える 3

1

テクスチャ座標を提供していますが、シェーダーで使用していません。代わりに、ウィンドウ座標を提供する gl_FragCoord を使用しています。

texture2D(rectTexture, gl_FragCoord.st)

代わりにgl_MultiTexCoord0.xyを使用する必要があります。

于 2011-02-07T22:58:25.000 に答える
1

GL_TEXTURE_2D を使用して rectTexture を格納しているため、サンプラーは正規化されたテクスチャ座標 (つまり [0.0, 1.0]) を想定します。

したがって、シェーダーを次のように変更する必要があります。

uniform vec2 invTextureSize; // contains [1.0 / w, 1.0 / h];
uniform sampler2D rectTexture;

void main() {
  vec4 color = texture2D( rectTexture, gl_FragCoord.st * invTextureSize.xy );
  gl_FragColor = color;
}

さらに、そのテクスチャ オブジェクトに対して GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、GL_TEXTURE_WRAP_S、および GL_TEXTURE_WRAP_T を適切に設定する必要があります。

そうでない場合、ほとんどの opengl ドライバーは rgba = [0, 0, 0, 0] カラーをシェーダーに提供します。

glTexParameterのリファレンスをご覧ください

次の構成は、ほとんどの GL_TEXTURE_2D オブジェクトで機能します

glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );

お役に立てれば。

于 2013-07-03T08:55:27.853 に答える
0

頂点シェーダーも使用していますか? 一部のカードでは、頂点シェーダーとフラグメント シェーダーの両方を提供する必要があります。

于 2010-06-25T10:43:33.273 に答える