Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





dudas sobre aplicar texturas

Iniciado por killgates, 23 de Enero de 2016, 06:55:09 PM

« anterior - próximo »

killgates

Hola,

Estoy utilizando shaders con opengl. El programa va bien. Pero al aplicar texturas el programa no me funciona.

el código que tengo de los shaders es el siguiente..:
vertex:

#version 130

uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;

in vec2 coordenadaTextura;
in vec3 a_Vertex;


out vec2 coordenadaTexturaSalida;

void main(void)
{
coordenadaTexturaSalida = coordenadaTextura;
vec4 pos = modelview_matrix * vec4(a_Vertex, 1.0);
gl_Position = projection_matrix * pos;
}



Y fragment:

#version 130

uniform sampler2D texture0;

in vec2 coordenadaTexturaSalida;
out vec3 outColor;

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


No se si puede estar ahí el error.. O no estoy cargando la textura bien en el programa
El código de las texturas en el programa de opengl es éste:


        TargaImage textura;     //clase que contiene la siguiente función y carga la textura..
        if (!textura.load(FicheroToConvertText)){
            std::cerr << "No se ha podido cargar la imagen de la textura";
            exit(0);
        }
        GLuint firstTexture = 0;
        glGenTextures(1, &firstTexture);
        glBindTexture(GL_TEXTURE_2D, firstTexture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textura.getWidth(), textura.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, textura.getImageData());


Gracias!


Gallo

"el programa no me funciona" es muy amplio, que pasa exactamente? te sale la mesh de color negro?, sale algún error al compilar el shader? no sale nada?

Yo lo que veo ya de entrada es que el outColor sea un vec3, y pondria un vec4 y un 1.0 en el alpha.

Para comprobar que las coordenas de textura están llegando bien, una prueba rápida que puedes hacer es intercambiarlas por la posición:

vec4 pos = modelview_matrix * vec4(coordenadaTextura.xy, 0.0, 1.0);

Si al poner esto la malla se renderiza con la misma forma que deberian tener las UVs en una textura plana, es que están llegando bién.

Recuerda también que para usar la textura tienes que primero activar una texture unit, luego bindear, y luego pasar el valor del texture unit al shader.

glActiveTexture(GL_TEXTURE0);  //texture unit 0
glBindTexture(GL_TEXTURE2D, firstTexture);
//activa el program shader
glUniform1i(glGetUniformLocation(program, "texture0"), 0); //<-- se pasa el unit, no el firstTexture eh! que es un error muy común


killgates

Hola,

Perdón, lo escribí con prisa.
Quiero decir que el programa va bien (muestra el modelo en 3d)(hace el render bien).. si le digo que utilize un color al azar para todos los vértices. Manipulando el fragment shader. Es decir, que los shaders funcionan bien. Los cargo desde un fichero de texto.
El problema viene cuando utilizo en la salida del fragment la función texture(). La cual da error de programa y sale.

Ahora voy paso por paso..:
Estoy investigando las textura targa o "tga". Me podeis decir si está muy popularizada este tipo de texturas?
Estoy intentando leer la cabezera de un fichero tga.. Lo estoy haciendo bien?..:

//! ********************* DATOS DE LA CABEZERA DEL FICHERO DE LA TEXTURA **************
        struct TargaCabezera
        {
            unsigned char idLength;
            unsigned char colorMapType;
            unsigned char imageTypeCode;
            unsigned char colorMapSpec[5];
            unsigned short xOrigin;
            unsigned short yOrigin;
            unsigned short widht;
            unsigned short height;
            unsigned char bpp;
            unsigned char imageDesc;
        };
        TargaCabezera cabezera1;
        caracter = getc(ficheroTextura);
        cabezera1.idLength = caracter;
        getc(ficheroTextura);
        caracter = getc(fichero);
        cabezera1.imageTypeCode = caracter;
        getc(ficheroTextura);

        fscanf(ficheroTextura, "%d", cabezera1.xOrigin);
        fscanf(ficheroTextura, "%d", cabezera1.yOrigin);
        fscanf(ficheroTextura, "%d", cabezera1.widht);
        fscanf(ficheroTextura, "&d", cabezera1.height);

        cabezera1.bpp = getc(ficheroTextura);
        cabezera1.imageDesc = getc(ficheroTextura);


Muchas Gracias por todo


Ray

prueba a rellenar la textura de un color para ver si está dibujando la textura, si sale bien es que es problema de la carga.


killgates

Hola,

Ya lo he hecho y no muestra nada..

        //!esto da dimensión al arreglo imagedata
        tgaFile->imageData = (unsigned char*)malloc(sizeof(unsigned char)*imageSize);
        for (int counter = 0; counter < (imageSize / colorMode) ; counter++){
            tgaFile->imageData[counter] = 1.0;
        }
        //fread(tgaFile->imageData, sizeof(unsigned char), imageSize, filePtr);       Esto lee el fichero de imagen






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.