I am tired of binding multiple textures I have something weird when I have 2 textures or more, it's over each other
This problem happens when using GPU: NVIDIA GeForce RTX 3070 Laptop GPU/PCIe/SSE2
and openGL Version 4.6 like this:
but when using GPU: AMD Radeon(TM) Graphics it pretty good Like this
main.cpp
shaderProgram.bind();
const int NUMBER_OF_TEXTURE = textures.size();
auto sample = new int[NUMBER_OF_TEXTURE];
for (int i = 0; i < NUMBER_OF_TEXTURE; i++)
sample[i] = i;
shaderProgram.setUniform1iv("u_Textuers", NUMBER_OF_TEXTURE, sample);
delete[] sample;
while (!glfwWindowShouldClose(window))
{
processInput(window);
Renderer::clear();
shaderProgram.bind();
for (int i = 0; i < NUMBER_OF_TEXTURE; i++)
{
textures[i].Bind(i);
}
render.draw(shaderProgram);
GLCall(glBindTexture(GL_TEXTURE_2D, 0))
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glfwSwapBuffers(window);
glfwPollEvents();
}
Texture.cpp
Texture::Texture(const FxrDataStructures::Image& image)
:m_RendererID(0), m_LocalBuffer(nullptr),
m_Width(0), m_Height(0), m_BPP(0)
{
GLCall(glCreateTextures(GL_TEXTURE_2D, 1, &m_RendererID));
GLCall(glBindTexture(GL_TEXTURE_2D, m_RendererID));
// set the texture wrapping/filtering options (on the currently bound texture object)
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR))
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR))
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE))
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE))
m_Width = image.getWidth();
m_Height = image.getHeight();
m_BPP = image.getBitDepth();
cv::Mat mat = image.img;
cv::flip(mat, mat, 0);
m_LocalBuffer = mat.ptr();
if (m_LocalBuffer)
{
GLCall(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_LocalBuffer))
//GLCall(glGenerateMipmap(GL_TEXTURE_2D))
}
else
{
LOG_DEBUG("Failed to load texture ");
}
GLCall(glBindTexture(GL_TEXTURE_2D, 0))
}
void Texture::Bind(unsigned int slot) const
{
GLCall(glBindTextureUnit(slot, m_RendererID))
}
fragment shader
in float IndexMaterial;
uniform sampler2D u_Textuers[32];
void main()
{
float diff;
const int index = int(IndexMaterial);
FragColor = vec4(texture(u_Textuers[index], TexCoord));
}