フラグメントシェーダーからFBOのカラーバッファーへの書き込みに問題があります。アイデアは、このテクスチャに描画してから、このテクスチャをクワッドに描画することです。つまり、FBOを削除するとシーンが表示されるため、デフォルトのウィンドウバッファに描画するときにシェーダーが機能します。そして、クワッドのテクスチャリングも機能します。インポートしたテクスチャで試してみました。私が得ているのは黒い画面だけです。何がうまくいかなかったのでしょうか?:(
FBOを作成するためのコード:
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glGenRenderbuffers(1, &depthbuff); //Add a depth renderbuffer for depth testing
glBindRenderbuffer(GL_RENDERBUFFER, depthbuff);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbuff);
//Add the buffer to be drawn to and the buffer for the picking information
glGenTextures(1, &drawbuff);
glBindTexture(GL_TEXTURE_2D, drawbuff);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, drawbuff, 0);
glGenTextures(1, &pickingbuff);
glBindTexture(GL_TEXTURE_2D, pickingbuff);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, pickingbuff, 0);
レンダリングのコード:
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, buffers);
shader->bind(); //If the three lines above are removed, it draws correctly to the window
drawStuff();
クワッドのコード:
quadshader->bind();
glEnable(GL_TEXTURE_2D);
int drawTexID = quadshader->uniformLocation("drawTex");
glActiveTexture(GL_TEXTURE0);
//glBindTexture(GL_TEXTURE_2D, anotherTexture); //This works. A texture imported from a TGA
glBindTexture(GL_TEXTURE_2D, drawbuff);
glUniform1i(drawTexID, 0);
drawQuad();
そして最後に、フラグシェーダー、すべてを単色に描画するように設定しました。
void main(void) {
gl_FragData[0] = vec4(1.0, 1.0, 0.0, 1.0);
gl_FragData[1] = vec4(0.0, 1.0, 1.0, 1.0);
}
編集:それが何か助けになるなら、すべてがQtGLWidgetにあります。