PDA

View Full Version : shader with two textures



killwin2
12-23-2017, 01:24 AM
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 :-)

OceanJeff40
12-31-2017, 08:20 PM
Not sure if you are using the same opengl context that I am, but I just made a video on how to blend textures with color, based on the tutorial here:

http://www.learnopengl.com

Here's a link to the video:

https://www.youtube.com/watch?v=ZTRGC9oG8Qw

Thanks, let me know if this helps, or what you think,

Jeff