Hello, I want to show a small transparent texture B over a large texture A.
I want only the texture A for VAO[0]
and only texture B for VAO[1]
but openGL don’t understand that and mix texture A with texture B over the vao[0] and over the vao[1] too.
Here is my shader.fp :
#version 150 core
// Entrée
in vec2 coordTexture;
// Uniform
uniform sampler2D texBackground; // my textureA
uniform sampler2D texMenu; // my texture B
// Sortie
out vec4 outColor;
void main()
{
vec4 colBackground = texture(texBackground, coordTexture);
vec4 colMenu = texture(texMenu, coordTexture) * vec4(1.0, 1.0, 1.0, 0.5);
outColor = mix(colBackground, colMenu, 0.5);
}
Here is my load textures :
loadTexture(0) for texture A and loadTexture(1) for texture B
void GameRender::loadTexture(int const &IdTexture) {
// generate texture names
VTexture.push_back(0);
glGenTextures(1, &VTexture.back());
GLenum err;
while((err = glGetError()) != GL_NO_ERROR) {
std::cerr << "(gameRender.cpp) OpenGL generate textures, error : " << err << std::endl;
return -1;
}
// utilisation des textures
if(!IdTexture)
glActiveTexture(GL_TEXTURE0);
else
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, VTexture.back());
// specify a two-dimensional texture image
if(PVImage_)
glTexImage2D(GL_TEXTURE_2D, 0, 3, PVImage_.data()->back().size().width, PVImage_.data()->back().size().height, 0, GL_RGB, GL_UNSIGNED_BYTE, it->data);
// set textures parameters
// GL_NEAREST : Returns the value of the texture element that is nearest (in Manhattan distance) to the specified texture coordinates.
// GL_TEXTURE_MAG_FILTER : The texture magnification function is used whenever the level-of-detail function used when sampling from the
// texture determines that the texture should be magified.
// GL_TEXTURE_MIN_FILTER : The texture minifying function is used whenever the level-of-detail function used when sampling from the texture
// determines that the texture should be minified.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
And now my paint, I’m working with QT :
void GameRender::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef (0.0, 0.0, -5.0);
GLint uniformId = glGetUniformLocation(programID, "resolution");
// activation du shader
glUseProgram(getProgramID());
glUniform2i(uniformId, width_, height_);
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, VTexture.front());
glUniform1i(glGetUniformLocation(programID, "texBackground"), 0);
// dessine les objets au format triangles
vao[0].bind();
glDrawArrays(GL_TRIANGLES, 0, 6);
vao[0].release();
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, VTexture.back());
glUniform1i(glGetUniformLocation(programID, "texMenu"), 1);
vao[1].bind();
glDrawArrays(GL_TRIANGLES, 0, 6);
vao[1].release();
// lance le shader
glUseProgram(0);
}
Thank you, sorry for my bad english