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();