Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ayuda con texturas Por favor

Iniciado por killgates, 20 de Febrero de 2016, 04:38:37 PM

« anterior - próximo »

killgates

Hola,

Sigo atascado con las texturas.. he probado de todo..
Por favor echadme un cable porque no avanzo. Gracias.

El problema que tengo es que no se muestra nada por pantalla al dibujar un modelo con texturas. Se ve todo negro. Pero el programa continua. Los eventos de pantalla funcionan.
Si cambio el color de salida del fragment shader de esta manera:
outColor = texture(texture0, coordenadaTexturaSalida.st);
por..:
outColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
El módelo se ve todo en blanco.. Con lo cual el shader funciona..

Pongo aquí el código que carga las texturas..:

//!ESTO SON LAS TEXTURAS..*******************
    glEnable(GL_TEXTURE_2D);
    glActiveTexture(GL_TEXTURE0);
    TargaImage textura1;
    textura1.load(ficheroText);
                //!Aquí muestro lo que he leido del fichero ..:
                std::cout << "\nEsto es lo que se ha leido de la cabezera del fichero tga..:";
               // std::cout << "\nidLength..: " << tgaFile.idLength;
               // printf("\nimageTypeCode..: %d", tgaFile->imageTypeCode);
                std::cout << "\nLongitud del widht..: " << textura1.getWidth();
                std::cout << "\nLongitud del height..: " << textura1.getHeight();
                printf("\nbitCount..: %d\n", textura1.getBitsPerPixel());
                system("pause");
    GLuint firstTexture;
    glGenTextures(1, &firstTexture);
    glBindTexture(GL_TEXTURE_2D, firstTexture);
    //!PRUEBO A RELLENAR LA TEXTURA CON UN COLOR..:    ************************
        //textura1.texturaDeUnColor();
        //!El error no esta en la carga del archivo de textura..
    //!************************************************************************

    if (((textura1.getBitsPerPixel()) / 3) == 8){
        std::cout << "\nSe trata de una textura RGB";
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, textura1.getWidth(), textura1.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, textura1.getImageData());
    }
    if ((textura1.getBitsPerPixel() / 4) == 8){
        std::cout << "\nSe trata de una textura RGBA";
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, textura1.getWidth(), textura1.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, textura1.getImageData());
    }
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    shader.envioUniformeSamplerText("texture0");       //Esto envía "0" a la variable de tipo sampler2d llamada "texture0"



Y el código del fragment..:

#version 150

uniform sampler2D texture0;

in vec2 coordenadaTexturaSalida;
out vec4 outColor;

void main(void) {
outColor = texture(texture0, coordenadaTexturaSalida.st);
}


Y luego también.. la función que utilizo para dibujar..:

        shader.envioAtributo(objeto3d1.submodelo[0].vertice, "a_Vertex");
        shader.envioAtributoTextura(objeto3d1.submodelo[0].textura, "coordenadaTextura");
     glDrawElements(GL_TRIANGLES, objeto3d1.submodelo[0].NumeroIndices, GL_UNSIGNED_INT, objeto3d1.submodelo[0].IndicesVertice);


No entiendo donde está el error.. Ayuda por favor porque no avanzo..

^_^' ^_^'



Gallo

Te comento algunas cosas para probar, no significa que sean la solución pero puede ayudarte a encontrar el problema:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, firstTexture);
shader.envioUniformeSamplerText("texture0");

Esto si que es verdad que por como lo tienes hecho solo te haría falta hacerlo una vez, pero vuelvelo a hacer antes de cada glDrawElements.

Por otro lado, de que tamaño es la textura? por que depende de cuando sea tu gráfica quizá solo admite tamaños que sean potencias de 2, (8 ,16, 32, 64, 128, 256, 512...) si los lados de tu textura no son de este tamaño prueba con una de 256x256 por ejemplo, he visto que hay una prueba en la que rellenas tu la textura, pero igualmente usas el tamaño original, prueba con una como la que te digo si no es el caso.

Otro debug interesante, intenta escupir las coordenadas de textura como color, a ver que te sale:

outColor = vec4(coordenadaTexturaSalida.x, coordenadaTexturaSalida.y, 0.0, 1.0);

El resultado debería ser algo así, dependiendo de como sean las UVs:


Asegurate que las coordenadas de textura están entre 0.0  y  1.0, mas allá de esos valores dependerá de como hayas configurado los parametros de la textura, por ejemplo:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);


Este hace que se repita la textura. GL_CLAMP_TO_EDGE en lugar de GL_REPEAT haria que no se repitiera y por lo tanto si no valen entre 0.0 y 1.0 podría escupir negro como en tu caso.

killgates

#2
Hola,

Hace unas semanas que no toco opengl.. estuve probando lo que me dijisteis.
Si escupo las coordenadas de textura como colores veo el objeto3d cargado con colorines.
También he bindeado la textura antes del render.
Y las coordenadas de textura van de 0 a 1.
Y también la textura es potencia de 2.

Sigo sin poder ver las texturas.. Y cómo dije antes el shader funciona..

Ayuda porfavor..






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.