Sign in to follow this  
Pure

OpenGL Program Objects Usage

Recommended Posts

Hello all, I used to code with OpenGL a while back, but never touched shaders. I am trying to get myself up to date with it again and have a few questions regarding program objects. a) Does a PO require both pixel and vertex shaders to be set? b) When you bind a null PO, do you revert to FFP ? c) What is the most optimal way to utilise program objects? I thought I would create a single PO and assign my multiple shaders to it before drawing. I am not sure if this would be best solution so please let me know what you think. Something tells me the assigning and linking when drawing objects that use different shaders hurts performance. Thanks!

Share this post


Link to post
Share on other sites
a) no, you can use both or one of the other and the driver will supply you with the one you dont' create. That said, myself and others have noticed pretty large performance loss when you don't supply both shaders, this could be a driver thing and it might be fixed however it's probably best just to provide both and be done with it

b) yes

c) GLSL PO and shaders should be thought of the same way as textures; setup at the beginning. Compiling and linking a shader is very heavy work, so do it at start up.

Share this post


Link to post
Share on other sites
Thank you for the reply phantom.

With regards to my third question. I understand the compiling of shaders would not be suitable every frame, but what about linking while drawing? I am not sure if this is possible but as an example:


glAttachObjectARB( program_object, vertex_shader0 );
glAttachObjectARB( program_object, fragment_shader1 );
glLinkProgramARB( program_object);

glUseProgramObjectARB( program_object );

// Now render all objects that use vs0 and fs1

glAttachObjectARB( program_object, vertex_shader0 );
glAttachObjectARB( program_object, fragment_shader4 );
glLinkProgramARB( program_object);

glUseProgramObjectARB( program_object );

// Now render all objects that use vs0 and fs4




Could this work and would it be wise to do it like this?

The only other choice ( as I can see ) is having a PO for every shader configuration.

i.e FS0 and VS0 has PO0, FS1 and VS0 has PO1, FS0 and VS1 has PO2, etc...

where FS = fragment shader, VS = vertex shader, PO = program object

Thanks

Share this post


Link to post
Share on other sites
linking is also out as it's a heavy operation.
For starters you'd have to deattach the shaders you weren't going to use (FS in this case) and attach a new one. When linking the driver has to perform various validations and match up slots and assign slots for data; this is all as I say heavy work and doing it mid-frame would kill your frame rate.

So, yes, the best way is to produce your combinations up front

Share this post


Link to post
Share on other sites
As phantom pointed out, neither compiling nor linking shaders in a program should be done in real-time. Also, I'd like to point out that you can reuse your shaders and link them to several programs (and detach/destroy them thereafter). I remember having some problems with (old) ATI cards in the past, but I can't remember if it had anything to do with this. It did have something to do with not following the specs though, so be careful.

Share this post


Link to post
Share on other sites
Quote:
Original post by phantom
a) no, you can use both or one of the other and the driver will supply you with the one you dont' create. That said, myself and others have noticed pretty large performance loss when you don't supply both shaders, this could be a driver thing and it might be fixed however it's probably best just to provide both and be done with it

Interesting, I've not heard about that before. I usually just use a fragment shader and leave the vertex shader as the fixed function.

I'll have to try supplying a simple vertex shader and see if that makes any effect on my framerate (it could explain the surprisingly poor performance I got a while ago).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Partner Spotlight

  • Forum Statistics

    • Total Topics
      627646
    • Total Posts
      2978383
  • Similar Content

    • By xhcao
      Before using void glBindImageTexture(    GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format), does need to make sure that texture is completeness. 
    • By cebugdev
      hi guys, 
      are there any books, link online or any other resources that discusses on how to build special effects such as magic, lightning, etc. in OpenGL? i mean, yeah most of them are using particles but im looking for resources specifically on how to manipulate the particles to look like an effect that can be use for games,. i did fire particle before, and I want to learn how to do the other 'magic' as well.
      Like are there one book or link(cant find in google) that atleast featured how to make different particle effects in OpenGL (or DirectX)? If there is no one stop shop for it, maybe ill just look for some tips on how to make a particle engine that is flexible enough to enable me to design different effects/magic 
      let me know if you guys have recommendations.
      Thank you in advance!
    • By dud3
      How do we rotate the camera around x axis 360 degrees, without having the strange effect as in my video below? 
      Mine behaves exactly the same way spherical coordinates would, I'm using euler angles.
      Tried googling, but couldn't find a proper answer, guessing I don't know what exactly to google for, googled 'rotate 360 around x axis', got no proper answers.
       
      References:
      Code: https://pastebin.com/Hcshj3FQ
      The video shows the difference between blender and my rotation:
       
    • By Defend
      I've had a Google around for this but haven't yet found some solid advice. There is a lot of "it depends", but I'm not sure on what.
      My question is what's a good rule of thumb to follow when it comes to creating/using VBOs & VAOs? As in, when should I use multiple or when should I not? My understanding so far is that if I need a new VBO, then I need a new VAO. So when it comes to rendering multiple objects I can either:
      * make lots of VAO/VBO pairs and flip through them to render different objects, or
      * make one big VBO and jump around its memory to render different objects. 
      I also understand that if I need to render objects with different vertex attributes, then a new VAO is necessary in this case.
      If that "it depends" really is quite variable, what's best for a beginner with OpenGL, assuming that better approaches can be learnt later with better understanding?
       
    • By test opty
      Hello all,
       
      On my Windows 7 x64 machine I wrote the code below on VS 2017 and ran it.
      #include <glad/glad.h>  #include <GLFW/glfw3.h> #include <std_lib_facilities_4.h> using namespace std; void framebuffer_size_callback(GLFWwindow* window , int width, int height) {     glViewport(0, 0, width, height); } //****************************** void processInput(GLFWwindow* window) {     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)         glfwSetWindowShouldClose(window, true); } //********************************* int main() {     glfwInit();     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);     //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);     GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);     if (window == nullptr)     {         cout << "Failed to create GLFW window" << endl;         glfwTerminate();         return -1;     }     glfwMakeContextCurrent(window);     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))     {         cout << "Failed to initialize GLAD" << endl;         return -1;     }     glViewport(0, 0, 600, 480);     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);     glClearColor(0.2f, 0.3f, 0.3f, 1.0f);     glClear(GL_COLOR_BUFFER_BIT);     while (!glfwWindowShouldClose(window))     {         processInput(window);         glfwSwapBuffers(window);         glfwPollEvents();     }     glfwTerminate();     return 0; }  
      The result should be a fixed dark green-blueish color as the end of here. But the color of my window turns from black to green-blueish repeatedly in high speed! I thought it might be a problem with my Graphics card driver but I've updated it and it's: NVIDIA GeForce GTX 750 Ti.
      What is the problem and how to solve it please?
  • Popular Now