jvcleave / ofxImGui

Use ImGui in openFrameworks
300 stars 123 forks source link

Drawing ofFbo's texture as ImGui::Image(); #124

Closed findux closed 6 months ago

findux commented 6 months ago

Hi. I'm trying to draw an ofFbo object that I use to create 3D drawings in a separate Imgui window, but I'm having some problems. If I drictly pass the ofFob texture to ImGui::Image function, ImGui drawing font map image instead of ofFbo texture. There is no way to load ofFbo textore or ofFbo to ofxImGui::Gui . Could you help me please to draw ofFbo texture as ImGui::Image()? or Is there another method you can recommend? Of version-> of_v20240308_vs_release (nightly build) Not works image Works image

Daandelange commented 6 months ago

Hi, on osx I'm having no issue using the "should be" code.

if(ImGui::Begin("ofFboTexture")){
    ImVec2 size = {fbo.getWidth(), fbo.getHeight()};
    ImGui::Image(GetImTextureID(fbo), size);
}
ImGui::End();

This said, I suspect your fbo being allocated before (edit: AFTER) gui.setup() : the texture ID of your FBO is probably conflicting with the ImGui font atlas texture (supposedly texture 1), overwriting the id of your fbo.

findux commented 6 months ago

Hi Daandelange. I also asked this question in the openframeworks forum (under the "ofxImGui Docking feature implementation" topic answered by cmendoza). Inside the setup() function, first of all, Running the function ofDisableArbTex(); solved my problem. ofDisableArbTex(); Although I don't know exactly what it does, I am slowly learning.

Daandelange commented 6 months ago

Ok, great :)
Link to the topic for the reference.

To explain the ofxImGui part of this issue : there is an (unrelated) bug when the FBO/texture is allocated after gui.setup() is called in your ofApp::setup() code. Solve it by ensuring the FBO or texture is allocated before calling gui.setup(). To fix this permanently, oF and ImGui texture allocation behaviours should be reviewed, then define a way of handling such cases in ofxImGui.

As to the issue you were running into : when you used GetImTextureID, there should have been a console message warning you that the GetImTextureID was called with a wrong texture format ;) (and that is the primary reason for that function to be implemented)
Nb: ofxImGui has got quite a few runtime warnings that warn in case of wrong usage, I'd recommend to check them from time to time.

Lastly, ofDisableArbTex tells oF to use GL_TEXTURE_2D instead of the default GL_TEXTURE_RECTANGLE_ARB, which affects how textures are handled on the GPU. More info here. For basic usage you won't notice any differences, but if you manipulate them with fragment shaders, you'll have to take that change into account. Also, it can affect multi-platform compatibility, if running on gles-only GPUs (rpi/smartphones) for example.