Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Temas - killgates

#1
Hola,

Estudio Opengl y programación y cuando tengo dudas no tengo a nadie a quien preguntar, y en los foros no hay actividad..

Se que hay páginas en inglés pero yo no lo hablo..

Me podeis recomendar alguna página y foro de habla hispana?
#2
Hola,

Ya se leer un fichero obj que contiene coordenadas de vértices.. y más adelante los índices de vértice para dibujar con gldrawelements().
Utilizo shaders cómo método de render.. y voy pasando los atributos de vértice a las variables "in" del shader..

Mi problema es al dibujar el objeto 3d con gldrawelements().. ya que utilizo los índices de vértice.. pero no los índices de textura ni de normales.. me refiero a que en el fichero tengo: f 1/1/1 2/2/2 3/3/3f     1/2/3 1/2/3 1/2/3f  ....

Yo pensaba que sólo con cargar los 'v' y 'vt' y'vn'.. y dibujar utilizando el gldrawelements() usando los índices de vértices ('v's) ya era suficiente..
Pero imagino que algo no he entendido porqué también hay índices de 'vt' y 'vn'..

Cómo puedo utilizar estos índices también?
Gracias!
#3
Programación gráfica / Ayuda con texturas Por favor
20 de Febrero de 2016, 04:38:37 PM
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..

^_^' ^_^'


#4
Programación gráfica / no veo las texturas
06 de Febrero de 2016, 05:27:58 PM
Hola de nuevo  :D
Sigo teniendo problemas con las texturas, la pantalla se queda en negro pero responde a los eventos. Si sustituyo las texturas por un color uniforme se ve el objeto 3d.
Mejor pongo el código..:

Éste es el código que carga el fichero de texturas en memoria y luego crea el objeto de textura y vuelca los datos en él..:

    void elemento::CrearTexturas(char FicheroToConvertText[], struct TexturaCabezera *tgaFile){
    //!******* ESTO CREA EL OBJETO DE LA CLASE QUE EXTRAE DATOS DE LA IMAGEN DE TEXTURA **********
       // TargaImage textura; 
        FILE *filePtr;
        unsigned char ucharBad;
        short int sintBad;

        filePtr = fopen(FicheroToConvertText, "rb");
        if (filePtr == NULL)
        {
        exit(1);
        }
        //fseek(filePtr, 0, SEEK_SET);
        std::cout << "\nel fichero de textura a leer es..: " << FicheroToConvertText;
        std::cout << "\nPulse una tecla.." ; getchar();

    // Read the two first bytes we don't need.     Estos dos bits no los necesito..
    fread(&ucharBad, sizeof(unsigned char), 1, filePtr);
    fread(&ucharBad, sizeof(unsigned char), 1, filePtr);
        // Which type of image gets stored in imageTypeCode.

    fread(&tgaFile->imageTypeCode, sizeof(unsigned char), 1, filePtr);   //!Esto lee el tipo de imagen que es la textura
/*
                if (tgaFile->imageTypeCode != 2 && tgaFile->imageTypeCode != 3)
                {
                    fclose(filePtr);
                    return;
                }      //!Sale de la función creartexturas si el tipo de textura está comprimido. ver pagina 178 del libro
*/
    // Read 13 bytes of data we don't need.       Lo mismo de antes .. no los necesito
    fread(&sintBad, sizeof(short int), 1, filePtr);
    fread(&sintBad, sizeof(short int), 1, filePtr);
    fread(&ucharBad, sizeof(unsigned char), 1, filePtr);
    fread(&sintBad, sizeof(short int), 1, filePtr);
    fread(&sintBad, sizeof(short int), 1, filePtr);

        // Read the image's width and height.
        fread(&tgaFile->imageWidth, sizeof(short int), 1, filePtr);
        fread(&tgaFile->imageHeight, sizeof(short int), 1, filePtr);
        // Read the bit depth.
        fread(&tgaFile->bitCount, sizeof(unsigned char), 1, filePtr);

    // Read one byte of data we don't need.
    fread(&ucharBad, sizeof(unsigned char), 1, filePtr);

        long imageSize;
        int colorMode; // Color mode -> 3 = BGR, 4 = BGRA.
        colorMode = tgaFile->bitCount / 8;
        imageSize = tgaFile->imageWidth * tgaFile->imageHeight * colorMode;

        //!esto da dimensión al arreglo imagedata
        tgaFile->imageData = (unsigned char*)malloc(sizeof(unsigned char)*imageSize);
        fread(tgaFile->imageData, sizeof(unsigned char), imageSize, filePtr);

       //!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..: " << tgaFile->imageWidth;
        std::cout << "\nLongitud del height..: " << tgaFile->imageHeight;
        printf("\nbitCount..: %d", tgaFile->bitCount);

                        std::cout << "\nAhora se van a mostrar los 20 primeros datos de los datos de imagen..:\n" ;
                        for (int counter = 0; counter < 25; counter++){
                            printf("%d ", tgaFile->imageData[counter]);
                        }
                        getchar();

        fclose(filePtr);


        GLuint firstTexture;
        glGenTextures(1, &firstTexture);



        glBindTexture(GL_TEXTURE_2D, firstTexture);


        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, tgaFile->imageWidth, tgaFile->imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, tgaFile->imageData);
                    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
                    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);



Y esto en el main, que carga los atributos de vértice y dibuja..:

    objeto3d1.CrearTexturas(ficheroText, &tgaFile);        glActiveTexture(GL_TEXTURE0);
//!*****************************************************************************************************
    switch (OpcionMenu) {
    case '2':
        {

        //! Crea la ventana y la inicializa para opengl ******
        OpenGLWindow VentanaOpenGL(hInstance);
        VentanaOpenGL.CrearVentana(1366, 768, 32, 1);
        VentanaOpenGL.IniciaOpenGL();
         objeto3d1.CrearIndices();
        glLoadIdentity();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        //glEnableClientState(GL_VERTEX_ARRAY);

        // *************************************************
        shader.OpenFiles();
        shader.BorrarLeeFichero();
        shader.leeFichero();
        shader.compila();
        shader.activaShader();

        std::cout << "\nAhora se va a pintar el objeto en pantalla" ;
       // getchar();
        int rotacion = 0;
        shader.envioAtributo(objeto3d1.submodelo[0].vertice, "a_Vertex");
        shader.envioAtributoTextura(objeto3d1.submodelo[0].textura, "coordenadaTextura");
         shader.envioUniformeSamplerText("texture0");

        while (1){
        glLoadIdentity();
        rotacion++; if (rotacion > 360) rotacion = 0;
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        //Ahora dibujo..:
        glTranslatef(0,0,-8);
        glPushMatrix();
        glRotatef(rotacion, 0,1,0);
        shader.cargoMatrices();
        glPopMatrix();
       // for (int modelos = 1 ; modelos > 0 ; modelos-- ){

        glDrawElements(GL_TRIANGLES, objeto3d1.submodelo[0].NumeroIndices, GL_UNSIGNED_INT, objeto3d1.submodelo[0].IndicesVertice);
        //shader.desactivarAtributos();
       // }
        //glPopMatrix();
        for (int retard = 0; retard < 1000000; retard++);
        VentanaOpenGL.ActualizarBuffer();
        VentanaOpenGL.processEvents();
        }


Si me ayudais muchas gracias.. Estoy aprendiendo yo sólo OpengGL y no tengo a nadei a quien preguntar..

#5
Programación gráfica / Dudas cómo usar glTexImage2d( )
30 de Enero de 2016, 05:47:26 PM
Hola,

Esto del c++ me está enganchando  :D                8)
Tengo dudas de cómo utilizar la función glTexImage2d( )  .
No entiendo los datos de:
glTexImage2d(gl_texture2d, 0, "internal_format", ancho , alto , 0, "format" , "type", , datos de imagen);

Cómo se yo el tipo de internal format que tiene la textura?
Lo mismo con el format.
Y el type de datos?

Muchas Gracias
#6
Programación gráfica / dudas sobre aplicar texturas
23 de Enero de 2016, 06:55:09 PM
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!

#7
General Programadores / especificación de ficheros
23 de Enero de 2016, 05:14:44 PM
Hola,

Ando buscando información en internet sobre la estructura interna para ficheros targa, la cual necesito para un programa de opengl. Y no encuentro nada concreto.
Mi intención es entender como leer este fichero, para extraer los datos y su indormación de cabezera.

Gracias
#8
Hola,

Eso! . Que no se cómo reescribir atributos de vértice una vez ya los he pasado con glVertexAttribPointer();

Tengo modelos 3d que están divididos en varios submodelos, y cada uno de ellos los tengo en arreglos diferentes.
Mi intención es pasar uno a uno los arreglos y dibujarlos, para luego mostrar en pantalla.
No se si existe otra forma de hacerlo.

Gracias,
#9
Hola,

Estoy estudiando c++ y quiero hacer un programa para windows que controle el nivel de salida de cada canal del audio. Y que quede activo.
Es para crear perfiles y cambiar de uno a otro.
Me podeis indicar donde buscar información?

Gracias,

#10
Programación gráfica / Error al compilar objeto de shader
05 de Diciembre de 2015, 06:43:33 PM
Hola,

Tengo un problema al compilar un objeto de shader. Pues me devuelve FALSE cuando compruebo el estado de la compilación. El código es el siguiente:
         
         //fuenteShader es un arreglo de 1000 índices de tipo char que contiene el fichero de shader todo seguido.
    const GLchar* tmp = static_cast<const GLchar*>(fuenteShader);  //Esta parte la he sacado de un libro de opengl con c++
    glShaderSource(objetoShader1, 1, (const GLchar**)&tmp, NULL);  //Si me la podeis explicar Gracias

    glCompileShader(objetoShader1);
    GLint result;
    glGetShaderiv(objetoShader1, GL_COMPILE_STATUS, &result);
    if (result == GL_TRUE)
        std::cout << "\nEl shader se compiló con éxito";
    else std::cout << "\nEl shader no se ha compilado con exito!";


Siempre me dice que el shader no se ha compilado con éxito.
Gracias.
#11
Programación gráfica / error vertex array en opengl
17 de Noviembre de 2015, 06:49:16 PM
Hola,

Soy nuevo en el foro. Encantado!

Estoy haciendo un programa con opengl que lee un fichero obj, y guarda los vértices e índices de polígono en arreglos. Para luego visualizarlos en pantalla con la función glDrawElements();

El problema que tengo es que si hago un render con el modo inmediato y dibujo un triangulo se ve en pantalla bien..
Pero si cargo los arreglos de vértices y los dibujo aparecen manchurrones en vez del objeto.
Estoy 100% seguro de que los vértices e índices están bien leidos del fichero. Y hago el procedimiento correcto para mostrarlos con glVertexPointer() y glDrawElements();

Llevo semanas releyendo y no encuentro el error
Gracias por vuestras respuestas







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.