5

人工的なデータをテクスチャにアップロードするだけのコードがあります。

glActiveTexture(GL_TEXTURE0+gl_sim_texture_active_n);
glBindTexture(GL_TEXTURE_2D, gl_sim_texture_buff_id);
for(int i = 0; i < w*h; i++) buff[i] = 0xAB;
glTexImage2D(GL_TEXTURE_2D,0,GL_ALPHA,w,h,0,GL_ALPHA,GL_UNSIGNED_BYTE,buff);

そして、シェーダーでそのテクスチャからサンプリングするだけのコード:

uniform vec2 viewport;
uniform sampler2D sim_texture;
void main()
{
  vec2 tex_uv = vec2(gl_FragCoord.x/(viewport.x-1.),gl_FragCoord.y/(viewport.y-1.));
  gl_FragColor = texture2D(sim_texture,tex_uv).argb; //swizzle is to just put 'a' in a visibly renderable position as "redness"
}

OSX と Android では、このテクスチャは私のシェーダーで読み取ることができます (sampler2D を介して - 派手なものはありません) - 動作します。iOS では、その sampler2D からのサンプルはvec4(0.,0.,0.,1.)、入力されたデータに関係なく を返します。

( に変更GL_ALPHAするGL_RGBAと、テクスチャをフレームバッファにアタッチし、プラットフォームに関係なく、入力した正確なデータが返された後に呼び出しglReadPixels機能glTexImage2D(または iOS での欠如) は同じままであることに注意してください。に必要なフレームバッファにアタッチするためだけに必要でした.これは、デバッグ目的でのみ気にします.tl;dr:データがすべてのプラットフォームでテクスチャに正しくアップロードされていることをかなり確信しています.)GL_RGBAglReadPixels

他の情報:

gl_sim_texture_active_nは 6 で、gl_sim_texture_buff_id14 です (どちらも正当に取得され、エラーなしで取得されます)。glGetError()orglCheckFramebufferStatus(GL_FRAMEBUFFER)の前または後に両方を呼び出すと、クリーンが返されます。glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS)8 を返します (テスト用の Android デバイスと同じです。

これがiOSではなくOSX/Androidで機能する理由がまったくわかりません。ここからどこへ行くべきかについての方向性は役に立ちます!

4

1 に答える 1

2

ガッ見つけた!

GL_REPEAT非 POT テクスチャをサポートしていません! ( GLSL texture2D() は常に (0, 0, 0, 1) を返します) 修正済み!

于 2016-09-25T19:26:37.850 に答える