Jump to content

Textura: imagem de fundo


Go to solution Solved by thoga31,

Recommended Posts

Fernando Couto

Olá. Quero colocar uma imagem de fundo num programa que estou a fazer, para isto criei uma textura. No entanto estou a ter os seguintes problemas: a textura está a aparecer com uns tons azulados, já tentei mudar os vértices que correspondem às cores mas só fica pior. E outro problema: não estou a conseguir com que ocupe a janela toda: caso coloque o 3ºvértice (z) a -1 fica a ocupar a janela toda mas fica à frente dos outros objetos, o que não é suposto, aliás a partir de -5 fica à frente dos mesmos, só -6 ou valores inferiores fazem com que não se sobreponha em relação aos objetos (tornando a imagem mais pequena).

float vertices[] = {
 -1.0f,   -1.0f,   -6.0f,     0.0f,    0.0f,    0.00f,    0.0f,   1.0f,   0.0f,
 1.0f,    -1.0f,   -6.0f,     1.0f,    0.0f,    0.00f,    0.0f,   1.0f,   0.0f,
 1.0f,     1.0f,   -6.0f,     1.0f,    1.0f,    0.00f,    0.0f,   1.0f,   0.0f,
 1.0f,     1.0f,   -6.0f,     1.0f,    1.0f,    0.00f,    0.0f,   1.0f,   0.0f,
 -1.0f,    1.0f,   -6.0f,     0.0f,    1.0f,    0.00f,    0.0f,   1.0f,   0.0f,
 -1.0f,   -1.0f,   -6.0f,     0.0f,    0.0f,    0.00f,    0.0f,   1.0f,   0.0f};

Estive a pesquisar sobre a transparência duma textura, e supostamente teria que usar a função que já está declarada no código:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

No while do main:

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, texture1);
        ourShader.use();
        glm::mat4 model = glm::mat4(1.0f);
        glm::mat4 view = glm::mat4(1.0f);
        glm::mat4 projection = glm::mat4(1.0f);

        projection = glm::perspective(glm::radians(45.0f), (float) SCR_WIDTH / (float) SCR_HEIGHT, 0.1f, 100.0f);
        unsigned int modelLoc = glGetUniformLocation(ourShader.ID, "model");
        unsigned int viewLoc = glGetUniformLocation(ourShader.ID, "view");
        
        glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
        glUniformMatrix4fv(viewLoc, 1, GL_FALSE, &view[0][0]);

        ourShader.setMat4("projection", projection);
        

        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 6);

Finalmente para se ter uma ideia do que está a acontecer:

imagem que não consigo pôr aqui

Link to post
Share on other sites
  • Solution
thoga31

Pelo estilo do código, estou a supor que estás a utilizar o Learn OpenGL para te guiares. Confirma-me se isto for verdade, pois ir-me-á facilitar a orientação a fim de eu não me afastar muito do teu source material.

Mostra-me como estás a carregar a imagem a fim de gerar a textura.

De qualquer das formas, com base no que mostraste, estás a gerar uma perspectiva 3D para a imagem. Dica: o OpenGL suporta várias perspectivas e diferentes shaders para fins específicos.
Portanto, em vez de usar um glm::perspective para projecção, recomendaria fortemente usares o glm::ortho. É uma projecção muito mais prática e simples para 2D.
Neste caso, a tua projecção seria:

glm::ortho(-1.0f, 1.0f, height / width, height / width)   // supondo que height < width

Ao usar estes valores, estás a adaptar a projecção proporcionalmente com dimensão da tua janela, além de estares a usar um sistema de coordenadas que vai de -1.0 a 1.0 em ambos os eixos horizontal e vertical, o que pode ser prático uma vez que te abstrai das reais dimensões da janela.

Cumprimentos.

Edited by thoga31
  • Vote 1

Knowledge is free!

Link to post
Share on other sites
Fernando Couto

Muito obrigado mesmo pela tua resposta!

Fiz essa mudança para glm::ortho, estive a manipular e já consegui tanto redimensionar a imagem para a tela cheia não se sobrepondo a nenhum objeto, assim como tirei a cor azulada .

 

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.