Hi,
I am trying to make a 2D game engine using OpenGL ES 2.0 (iOS for now). I've written Application layer in Objective C and a separate self contained RendererGLES20 in C++. No GL specific call is made outside the renderer. It is working perfectly.
But I have some design issues when using shaders. Each shader has its own unique attributes and uniforms that need to be set just before the main draw call (glDrawArrays in this case). For instance, in order to draw some geometry I would do:
Display All
As you can see this code is extremely rigid. If I were to use another shader, say ripple effect, i would be needing to pass extra uniforms, vertex attribs etc. In other words I would have to change the RendererGLES20 render source code just to incorporate the new shader.
Is there any way to make the shader object totally generic? Like What if I just want to change the shader object and not worry about game source re-compiling? Any way to make the renderer agnostic of uniforms and attributes etc?. Even though we need to pass data to uniforms, what is the best place to do that? Model class? Is the model class aware of shader specific uniforms and attributes?
Following shows Actor class:
Model controller class:
Shader class just contains the shader object, compiling and linking sub-routines etc.
In Game Logic class I am actually rendering the object:
Please note that even though Actor extends ISceneNode, I haven't started implementing SceneGraph yet. I will do that as soon as I resolve this issue.
Any ideas how to improve this? Related design patterns etc?
Thank you in advance!
I am trying to make a 2D game engine using OpenGL ES 2.0 (iOS for now). I've written Application layer in Objective C and a separate self contained RendererGLES20 in C++. No GL specific call is made outside the renderer. It is working perfectly.
But I have some design issues when using shaders. Each shader has its own unique attributes and uniforms that need to be set just before the main draw call (glDrawArrays in this case). For instance, in order to draw some geometry I would do:
Source Code
- void RendererGLES20::render(Model * model)
- {
- // Set a bunch of uniforms
- glUniformMatrix4fv(.......);
- // Enable specific attributes, can be many
- glEnableVertexAttribArray(......);
- // Set a bunch of vertex attribute pointers:
- glVertexAttribPointer(positionSlot, 2, GL_FLOAT, GL_FALSE, stride, m->pCoords);
- // Now actually Draw the geometry
- glDrawArrays(GL_TRIANGLES, 0, m->vertexCount);
- // After drawing, disable any vertex attributes:
- glDisableVertexAttribArray(.......);
- }
As you can see this code is extremely rigid. If I were to use another shader, say ripple effect, i would be needing to pass extra uniforms, vertex attribs etc. In other words I would have to change the RendererGLES20 render source code just to incorporate the new shader.
Is there any way to make the shader object totally generic? Like What if I just want to change the shader object and not worry about game source re-compiling? Any way to make the renderer agnostic of uniforms and attributes etc?. Even though we need to pass data to uniforms, what is the best place to do that? Model class? Is the model class aware of shader specific uniforms and attributes?
Following shows Actor class:
Model controller class:
Shader class just contains the shader object, compiling and linking sub-routines etc.
In Game Logic class I am actually rendering the object:
Please note that even though Actor extends ISceneNode, I haven't started implementing SceneGraph yet. I will do that as soon as I resolve this issue.
Any ideas how to improve this? Related design patterns etc?
Thank you in advance!