GLSL バージョン 120 を使用して記述されたシェーダーを OpenGl ES 2.0 に変換しようとしていますが、このシェーダーを正しくマップする方法に問題がありました。
元のシェーダーでは texture2DRect を使用していますが、これは OpenGL ES ではサポートされていません (少なくとも、対象のハードウェアではサポートされていません)。
シェーダーには 2 つのテクスチャがあります。1 つはクワッドにマップされたテクスチャで、もう 1 つは単純にテクセルを乗算するために使用する一種のルックアップです。ルックアップは 128x128 ビットマップです。
元のシェーダーは次のようになります。
float xx = mod(gl_FragCoord.x, 5.0);
float yy = mod(gl_FragCoord.y, 15.0);
vec4 color = texture2DRect(tex0, coord0);
vec4 lookup1 = texture2DRect(tex1, vec2(xx, yy));
gl_FragColor = color * lookup1;
私はそれを次のように変更しました:
float xx = mod(gl_FragCoord.x, 5.0) * (1.0/textsize.x);
float yy = mod(gl_FragCoord.y, 15.0) * (1.0/textsize.y);
vec4 color = texture2D(tex0, coord0);
vec4 lookup1 = texture2D(tex1, vec2(xx, yy));
gl_FragColor = color * lookup1;
textsize は、ルックアップ テクスチャ サイズ (128x128) を含む vec2 です。ルックアップで 50,127 としましょう。テクセルの正確な値が必要です。これは (50/128, 127/128) であるべきだと想像しました。ただし、これは期待どおりに機能していません。ここで何が欠けていますか?
追加情報:
テクスチャ パラメータ:
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE)
テクスチャ宣言:
uniform samplerExternalOES tex0;
uniform sampler2D tex1;
更新 2013.03.13:
私は今、次の機能を実装しました:
vec4 texelFetch(sampler2D texsampler, vec2 coord) {
vec2 mult=(2.0*coord + 1.0)/(2.0* texWidth); // 128.0
vec4 texel = texture2D(texsampler,mult);
return texel;
}
コードを次のように変更しました。
float xx = mod(gl_FragCoord.x, 5.0);
float yy = mod(gl_FragCoord.y, 15.0);
vec4 lookup1 = texelFetch(tex1, vec2(xx, yy));
それでも、うまくいかないようです。