Ich habe eine Szene, die kein Problem ist, auf dem Bildschirm zu rendern, aber wenn ich versuche, es zu texturieren, wird es ganz schwarz sein. Ich denke, ich vermisse etwas Bühne bei der Vorbereitung der Textur.OpenGL ES 2.0 - Render zu Textur ist alles schwarz
Code:
int[] FBO_main = new int[1];
int[] textureId = new int[1];
int[] renderBufferId = new int[1];
// create framebuffers
GLES20.glGenFramebuffers(FBO_main.length, FBO_main, 0);
// create texture object
GLES20.glGenTextures(1, textureId, 0);
// create render buffer
GLES20.glGenRenderbuffers(1, renderBufferId, 0);
// Bind Frame buffer
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, FBO_main[0]);
// Bind texture
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0]);
int[] buf = new int[800*400];
IntBuffer texBuffer;
texBuffer = ByteBuffer.allocateDirect(buf.length*4).order(ByteOrder.nativeOrder()).asIntBuffer();
// Texture parameters
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0,
GLES20.GL_RGBA, 800, 400, 0,
GLES20.GL_RGBA,
GLES20.GL_UNSIGNED_BYTE, texBuffer);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameterf(
GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(
GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(
GLES20.GL_TEXTURE_2D,
GLES20.GL_GENERATE_MIPMAP_HINT,
GLES20.GL_TRUE); // automatic mipmap
// Bind render buffer and define buffer dimension
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, renderBufferId[0]);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, 800, 400);
// Attach texture FBO color attachment
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, textureId[0], 0);
// Attach render buffer to depth attachment
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, renderBufferId[0]);
// Reset
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, 0);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
// Setup render to texture
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, FBO_main[0]);
GLES20.glViewport(0, 0, 800, 400);
// Draw gamespecific
onDrawGame(timediff, time);
// Draw to buffer
GLES20.glFlush();
// Use buffer as input texture
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0]);
GLES20.glUniform1i(GLES20.glGetUniformLocation(cube.program, "sampler_prev"), 0);
// switch to screen output
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
// Draw gamespecific
onDrawGame(timediff, time);
// Draw
GLES20.glFlush();
Jede Idee von dem, was mir fehlt?
Danke, ich habe die Frage aktualisiert. Immer noch eine ganz schwarze Textur obwohl :( – Plarsen
Ich fühle Ihre opengl's Schmerzen eheh ... versuchen, entfernen texBuffer und übergeben Null GLES20.glTexImage2D (GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 800, 400, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null) Sie sollten den Puffer nicht benötigen –
Danke! Das hat den Trick gemacht – Plarsen