Opengl, моя текстура исчезает (стала черной) и glBindTexture не вызывается - PullRequest
0 голосов
/ 17 июня 2020

У меня ужасное поведение с одной из моих текстур в OpenGL.

Текстура правильно отображается в первом кадре, но после нескольких визуализаций она становится черной.

После анализа стек вызовов opengl кажется, что метод "glBindTexture" вызывается в первом кадре, но больше не вызывается, когда текстура становится черной.

Если "glbindtexture" не вызывается, текстура логически черная , но я не понимаю, почему "glbindtexture" не вызывается после некоторого рендеринга.

////////////////
Setup texture :
////////////////

//SET UNPRESSED BUTTON TEXTURE
glBindTexture(GL_TEXTURE_2D, 0);
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);

// Decode image into its raw image data
if (convertImageToRawImage(buttonImage))
{

//if decompression was successful, set the texture parameters

// set the texture wrapping parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

// set the texture magnification/minification parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

// load the image data into the current bound texture buffer
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth, imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 
&image[0]);

}

image.clear();

/////////////////
Draw Texture :
/////////////////

ViewerContext->browser->ButtonShader->use();

setTransformation();

// Bind the VAO
glBindVertexArray(vertexArrayObject);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);

// If the isPressed value is true, then update the state of the button
if (isPressed == true)
{

glUniform1i(ButtonStateUniformLocation, 1);

glBindTexture(GL_TEXTURE_2D, 0);
glActiveTexture(GL_TEXTURE0 + 1);
glBindTexture(GL_TEXTURE_2D, texturePID);
glEnable(GL_TEXTURE_2D);

glUniform1i(ButtonAPressedTextureUniformLocation, 1);

}
else
{

glUniform1i(ButtonStateUniformLocation, 0);

glBindTexture(GL_TEXTURE_2D, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID);
glEnable(GL_TEXTURE_2D);

glUniform1i(ButtonATextureUniformLocation, 0);

}

// Start the rendering process

// 1rst attribute buffer : vertices
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);

// 2nd attribute buffer : UVs
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, UVBufferObject);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);


// Draw call
glDrawArrays(GL_TRIANGLES, 0, buttonVertices.size());

Изображения:

Стек вызовов при отображении текстуры Стек вызовов, когда текстура не отображается Рендеринг

...