Question

I program an addon/addin for another program. This also allows me render stuff for the other program which uses OpenGL. So the problem I have now is that I don't know what program the caller to my render function has already bound if any. I tried to solve the problem with a pipeline. The code I use is this (remember I program in java but your answers don't have to be, I can look up java-equivalents to C/C++-OpenGL functions myself).

int currProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); // Get old program
if (currProgram != 0) { // If there was any
    GL41.glUseProgramStages(pipeline, GL41.GL_ALL_SHADER_BITS,
            currProgram); // Bind it to my pipeline
    GL41.glUseProgramStages(pipeline, GL41.GL_VERTEX_SHADER_BIT,
            geometryProgram); // Bind my vertexShader to the pipeline
    GL20.glUseProgram(0);
    GL41.glBindProgramPipeline(pipeline); // Bind the pipeline
} else { // If there wasn't
    GL20.glUseProgram(geometryProgram); // Use my program
}
//RENDERCODE
GL41.glBindProgramPipeline(0); // Unbind pipeline
GL20.glUseProgram(currProgram); // rebind old program

I got two question which bother me right now. First of all like I implicitly said I don't know if the prebound program changes from one call to another. This leads me to the question:

How do I unbind stages in the pipeline? do I just call

GL41.glUseProgramStages(pipeline, GL41.GL_ALL_SHADER_BITS,
            0);

?

Secondly it seems more or less unefficient to bind my own vertex shader everytime I render. I introduced this because I thought there could be more than one vertexShaders bound at a time. If this is not the case I could use GL41.GL_ALL_SHADER_BITS^GL41.GL_VERTEX_SHADER_BIT to bind and unbind the other shaders and keep my shader bound to the pipeline. So question number two:

Can there be more than one vertexShaders bound to a pipeline at once? And how do I rework my code to be efficient?

Was it helpful?

Solution

No just bind the one you need for the specific object. Then bind another for the next object. To "unbind" just bind zero like you did.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top