Ich versuche, einige GPGPU-Programmierung auf iOS-Geräten zu tun, aber ich kann keine Ressourcen zum Einrichten der OpenGL ES 3.0-Umgebung finden. Ich verstehe, wie Berechnungen im Fragment-Shader durchgeführt werden, aber ich kann mein Float-Array nicht an eine einheitliche Sampler-Variable an den Fragment-Shader übergeben.Wie Übergeben Float-Array zu Textur in OpenGL ES?
Dies ist, wie ich das FBO einrichten und CPU-Speicher zuteilen:
float** dens = (float**) malloc(W*sizeof(float*));
for (int i = 0; i < W; i++) {
dens[i] = (float *)malloc(H*sizeof(float));
}
// input value
for (int i = 0; i < W; i++) {
for (int j = 0; j < H; j++) {
dens[i][j] = 1.0f;
}
}
GLuint FBO;
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
GLuint dens_gl = load_texture(W, H, GL_RGBA, 0, dens);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
Hier ist mein Code für load_texture ist:
GLuint load_texture(const GLsizei width, const GLsizei height, const GLenum type, int tex_number, const float** data) {
GLuint texture_object_id;
glGenTextures(1, &texture_object_id);
assert(texture_object_id != 0);
glActiveTexture(GL_TEXTURE0 + tex_number);
glBindTexture(GL_TEXTURE_2D, texture_object_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, type, width, height, 0, type, GL_UNSIGNED_BYTE, data);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + tex_number, GL_TEXTURE_2D, texture_object_id, 0);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
NSLog(@"failed to make complete framebuffer objects %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
glBindTexture(GL_TEXTURE_2D, 0);
return texture_object_id;
}
und meine fragmentshader.fsh:
uniform vec2 uResolution;
uniform vec2 aPosition;
uniform sampler2D dens_gl;
void main(void) {
vec2 uv = aPosition.xy/uResolution.xy;
gl_FragColor = texture2D(dens_gl, uv);
}
Es gibt keinen Fehlercode, aber ich sehe nur einen schwarzen Bildschirm und wir erwarten einen weißen Bildschirm, weil ich den Wert auf 1 gesetzt habe im CPU-Speicher. Was habe ich falsch gemacht?
Was versuchen Sie zu tun? Sie zeigen den Setup-Code für einen Framebuffer, aber die Frage scheint zu sein, wie man eine Textur zum Laufen bringt. Diese beiden Dinge haben nichts miteinander zu tun. – BDL
@BDL Ich versuche, die CPU-Float-Array-Daten in meinen Fragment-Shader einzugeben, aber mein Setup funktioniert nicht. Ich habe meinen FBO-Code angezeigt, weil er GL_INCOMPLETE_ATTACHMENT enthält, als ich versuchte, das interne Format in GL_R32F zu ändern, nach GL_RED zu formatieren und nach GL_FLOAT zu schreiben. Die obigen Codes funktionieren ohne Fehler, aber trotzdem bekomme ich einen schwarzen Bildschirm auf meinem iOS-Gerät. –