Frage gl Textur Sampler immer vec4 (0., 0., 0., 1.) auf iOS (aber ist auf OSX / Android)


Ich habe Code, der nur einige erfundene Daten in eine Textur hochlädt:

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

und Code, der nur von dieser Textur in meinen Shadern abtastet:

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"
}

Auf OSX und Android ist diese Textur in meinem Shader lesbar (über einen Sampler2D - nichts Besonderes) - es funktioniert. Unter iOS kehren alle Samples von diesem Sampler2D zurück vec4(0.,0.,0.,1.), unabhängig von den eingegebenen Daten.

(Beachten Sie, dass wenn ich mich ändere GL_ALPHA zu GL_RGBA, füge die Textur an einen Framebuffer an und rufe dann an glReadPixels nach glTexImage2D ich machen bekomme die genauen Daten zurück, die ich eingegeben habe, unabhängig von der Plattform, und die Funktionalität (oder die fehlende Funktionalität von iOS) bleibt gleich. Der Wechsel zu GL_RGBA war nur notwendig, um es an einen Framebuffer, der für glReadPixels, was mir nur zu Debugging-Zwecken wichtig ist. tl; dr: Ich bin ziemlich sicher, dass die Daten auf allen Plattformen korrekt in die Textur hochgeladen werden.)

Andere Information:

gl_sim_texture_active_n ist 6, und gl_sim_texture_buff_id ist 14 (beide legitim und ohne Fehler erhalten). Berufung glGetError() oder glCheckFramebufferStatus(GL_FRAMEBUFFER) vor oder nach beiden Rückgabe sauber. glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS) gibt 8 zurück (das gleiche wie auf meinem Test-Android-Gerät.

Ich habe nur einen totalen Verlust, warum das auf OSX / Android und nicht auf iOS funktionieren würde. Irgendeine Richtung re: wo von hier zu gehen wäre hilfreich!


5
2017-09-21 15:11


Ursprung


Antworten:


Gah, ich habe es gefunden!

GL_REPEAT unterstützt keine POT-Texturen! (GLSL texture2D () gibt immer zurück (0, 0, 0, 1)) Fest!


2
2017-09-25 19:26