Skip to main content
Add code samples
Source Link

EDIT: Adding code samples. Implementation of the layer class I am using:

RStaticLayer::RStaticLayer(RShaderComponent& shader) : m_Renderer(new RGuerrillaRendererComponent()), m_Shader(shader) { m_Shader.enableShader(); m_Shader.setUniformMat4("proj_matrix", (const RML::Matrix4) RML::Matrix4::orthographic(0.0f, 16.0f, 0.0f, 9.0f, -1.0f, 1.0f)); m_Shader.disableShader(); } RStaticLayer::~RStaticLayer() { delete m_Renderer; } RLayer & RStaticLayer::addGroup(std::string name, Group & group) { m_Groups[name] = &group; return *this; } void RStaticLayer::draw() { m_Shader.enableShader(); m_Renderer->begin(); for(auto group = m_Groups.begin(); group != m_Groups.end(); group++) { for(auto renderable = group->second->renderables.begin(); renderable != group->second->renderables.end(); ++renderable) { m_Renderer->submit(*renderable); } } m_Renderer->end(); m_Renderer->flush(); m_Shader.disableShader(); } void RStaticLayer::removeGroup(std::string name) { m_Groups.erase(name); } 

What the m_Renderer.submit(), begin(), end() and flush() do:

void RGuerrillaRendererComponent::begin() { GLCall(glBindBuffer(GL_ARRAY_BUFFER, m_VBO)); GLCall(m_Buffer = (VertexData *) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY)); m_IndexCount = 0; } void RGuerrillaRendererComponent::submit(const RRenderableObject * renderable) { const RML::Vector3D & position = renderable->getPosition(); const RML::Vector2D & size = renderable->getSize(); const RML::Vector4D & color = renderable->getColor(); m_Buffer->vertex = position; m_Buffer->color = color; m_Buffer++; m_Buffer->vertex = RML::Vector3D(position.x, position.y + size.y, position.z); m_Buffer->color = color; m_Buffer++; m_Buffer->vertex = RML::Vector3D(position.x + size.x, position.y + size.y, position.z); m_Buffer->color = color; m_Buffer++; m_Buffer->vertex = RML::Vector3D(position.x + size.x, position.y, position.z); m_Buffer->color = color; m_Buffer++; m_IndexCount += 6; } void RGuerrillaRendererComponent::end() { GLCall(glUnmapBuffer(GL_ARRAY_BUFFER)); GLCall(glBindBuffer(GL_ARRAY_BUFFER, m_VBO)); } void RGuerrillaRendererComponent::flush() { GLCall(glBindVertexArray(m_VAO)); m_IBO->bindIndexBuffer(); GLCall(glDrawElements(GL_TRIANGLES, m_IndexCount, GL_UNSIGNED_SHORT, NULL)); m_IBO->unbindIndexBuffer(); GLCall(glBindVertexArray(0)); m_IndexCount = 0; } 

What my shader enable/disable functions look like:

void RShaderComponent::enableShader() const { GLCall(glUseProgram(m_ShaderID)); // m_ShaderID is acquired successfuly. It has been used in another project too. } void RShaderComponent::disableShader() const { GLCall(glUseProgram(0)); } 

Pardon the GLCall() macro. It's just a pre-v4 error checking macro.

EDIT: Adding code samples. Implementation of the layer class I am using:

RStaticLayer::RStaticLayer(RShaderComponent& shader) : m_Renderer(new RGuerrillaRendererComponent()), m_Shader(shader) { m_Shader.enableShader(); m_Shader.setUniformMat4("proj_matrix", (const RML::Matrix4) RML::Matrix4::orthographic(0.0f, 16.0f, 0.0f, 9.0f, -1.0f, 1.0f)); m_Shader.disableShader(); } RStaticLayer::~RStaticLayer() { delete m_Renderer; } RLayer & RStaticLayer::addGroup(std::string name, Group & group) { m_Groups[name] = &group; return *this; } void RStaticLayer::draw() { m_Shader.enableShader(); m_Renderer->begin(); for(auto group = m_Groups.begin(); group != m_Groups.end(); group++) { for(auto renderable = group->second->renderables.begin(); renderable != group->second->renderables.end(); ++renderable) { m_Renderer->submit(*renderable); } } m_Renderer->end(); m_Renderer->flush(); m_Shader.disableShader(); } void RStaticLayer::removeGroup(std::string name) { m_Groups.erase(name); } 

What the m_Renderer.submit(), begin(), end() and flush() do:

void RGuerrillaRendererComponent::begin() { GLCall(glBindBuffer(GL_ARRAY_BUFFER, m_VBO)); GLCall(m_Buffer = (VertexData *) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY)); m_IndexCount = 0; } void RGuerrillaRendererComponent::submit(const RRenderableObject * renderable) { const RML::Vector3D & position = renderable->getPosition(); const RML::Vector2D & size = renderable->getSize(); const RML::Vector4D & color = renderable->getColor(); m_Buffer->vertex = position; m_Buffer->color = color; m_Buffer++; m_Buffer->vertex = RML::Vector3D(position.x, position.y + size.y, position.z); m_Buffer->color = color; m_Buffer++; m_Buffer->vertex = RML::Vector3D(position.x + size.x, position.y + size.y, position.z); m_Buffer->color = color; m_Buffer++; m_Buffer->vertex = RML::Vector3D(position.x + size.x, position.y, position.z); m_Buffer->color = color; m_Buffer++; m_IndexCount += 6; } void RGuerrillaRendererComponent::end() { GLCall(glUnmapBuffer(GL_ARRAY_BUFFER)); GLCall(glBindBuffer(GL_ARRAY_BUFFER, m_VBO)); } void RGuerrillaRendererComponent::flush() { GLCall(glBindVertexArray(m_VAO)); m_IBO->bindIndexBuffer(); GLCall(glDrawElements(GL_TRIANGLES, m_IndexCount, GL_UNSIGNED_SHORT, NULL)); m_IBO->unbindIndexBuffer(); GLCall(glBindVertexArray(0)); m_IndexCount = 0; } 

What my shader enable/disable functions look like:

void RShaderComponent::enableShader() const { GLCall(glUseProgram(m_ShaderID)); // m_ShaderID is acquired successfuly. It has been used in another project too. } void RShaderComponent::disableShader() const { GLCall(glUseProgram(0)); } 

Pardon the GLCall() macro. It's just a pre-v4 error checking macro.

Source Link

Why is OpenGL displaying this specific color as white?

I have a sprite class that is supposed to make a 2D rectangle based on the location, colour and size of the rectangle. I have created a renderer class that uses this sprite class to create buffers and finally render things on the screen.

Currently, I have 2 sprites.

/** * RSprite sprite(x coordinate of the lower left corner of the rectangle, * y coordinate of the lower left corner of the rectangle, * horizontal length of the rectangle, * vertical length of the rectangle, * Vector 4D consisting of 4 floats representing a colour(RGBA)) for the rectangle */ RSprite sprite1(0, 0, 4, 4, Vector4D(0.75f, 0.047f, 0.9f, 1.0f) /* ^Normalised form of (193, 12, 232, 255)rgba */); RSprite sprite2(0.5, 0.5, 0.5, 0.5, Vector4D(0.6f, 0.0f, 1.0f, 1.0f)); /* ^Normalised form of (153, 0, 255, 255)rgba */); 

Now I add these sprites to a group, which is just a structure maintaining a vector array of these sprites.

Group * g = new Group(); g->addRenderable(&sprite2).addRenderable(&sprite1); 

Finally, I add this group to a layer object I had made earlier.

layer0.addGroup("group1", *g); 

Now my problem is the colour specified for sprite1 i.e. (193, 12, 232, 255)rgba is appearing completely white(which is not what I intended it to be). However, the other sprite2 has the colours appearing just fine.

Concludingly, the problem is boiled down to, why is OpenGL not displaying 193, 12, 232, 255rgba incorrectly but at the same time it is correctly displaying 153, 0, 255, 255rgba?