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

Mensajes - killgates

#16
Programación gráfica / Re:Error al compilar objeto de shader
18 de Diciembre de 2015, 04:22:40 PM
Hola amigos!

Buf.. Perdonad por ser tan novato todavía. La solución era crear crear la ventana e iniciar opengl.  8o

Lo estaba intentando directamente. Y tenía la parte del código que crea la ventana y el contexto de Opengl desactivado.  :..

Lo que no entiendo es por qué los shaders necesitan todo esto sólo para compilar..  Oo

#17
Programación gráfica / Re:Error al compilar objeto de shader
15 de Diciembre de 2015, 06:26:22 PM
Hola,

Tengo una función dentro de la clase que pone a NULL todo el arreglo fuenteshader[] y fuenteshaderfragment[], que es lo que contiene el código del vertex y fragment shader. La llamo antes de rellenar los arreglos.

La verdad, no se que estoy haciendo mal. He repasado las funciones que leen los ficheros que contienen los shader y había el error que se comía el "#" del principio, y ya lo he arreglado. Pero sigue sin funcionar..

Gracias
#18
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,

#19
Programación gráfica / Re:Error al compilar objeto de shader
12 de Diciembre de 2015, 05:21:13 PM
Hola,

Perdón. Ahora pongo la función que lee un fichero del disco (el shader) y lo guarda en un arreglo unidimensional normal, para luego pasarlo al objeto de shader.

Antes pongo la función que abre ficheros.. :      (lo estoy haciendo todo separado en funciones dentro de una clase "glsl")


    void glsl::OpenFiles(){
        if ((fichero=fopen(nombreFicheroShader, "r"))==NULL){
            std::cout << "no se ha podido abrir el fichero: " << nombreFicheroShader <<  ".. Pulse una tecla para salir\n";
            getchar();
            exit(1);
        }
        //else std::cout << "\nFichero Abierto con exito!";
        if ((fichero2=fopen(nombreFicheroFragmentShader, "r"))==NULL){
            std::cout << "no se ha podido abrir el fichero: " << nombreFicheroFragmentShader <<  ".. Pulse una tecla para salir\n";
            getchar();
            exit(1);
        }
    }


Y ahora, la función que lee los ficheros y los guarda en dos arreglos: "fuenteshader" y "fuenteshaderfragment"


    void glsl::leeFichero(){
        char caracter;
        int x = 0, y = 0;
        if ((fichero == NULL)||(fichero2 == NULL)){
            std::cout << "\nAlgun fichero no esta abierto!";
            return;
        }
        fseek(fichero, 0, SEEK_SET);  //!Hasta aquí abro el fichero y me coloco al principio
        //!Y leo todo el fichero y lo guardo en el arreglo fuenteShader de una dimensión
        do {
            caracter = getc(fichero);
            if (caracter == EOF){
                std::cout << "No hay nada en el fichero de shaders!, es decir, está en blanco!";
                return;
            }
        } while ((caracter == ' ')||(caracter == 13));
        for (int contador = 0; caracter != EOF; contador++){
            caracter = getc(fichero);
            fuenteShader[contador] = caracter;
        }
        //!******** Y hag lo mismo con el fichero de fragment shader ..:

                fseek(fichero2, 0, SEEK_SET);  //!Hasta aquí abro el fichero y me coloco al principio
        //!Y leo todo el fichero y lo guardo en el arreglo nombreFicheroFragmentShader[] de una dimensión
        do {
            caracter = getc(fichero2);
            if (caracter == EOF){
                std::cout << "No hay nada en el fichero de fragment shaders!, es decir, está en blanco!";
                return;
            }
        } while ((caracter == ' ')||(caracter == 13));
        for (int contador = 0; caracter != EOF; contador++){
            caracter = getc(fichero2);
            fuenteFragmentShader[contador] = caracter;
        }
        //!**** aquí acabo de leer los dos ficheros.. **
    }


Veo que tú generás el código de los shaders desde el programa. Yo los tomo de ficheros.
Si hago un "puts(fuenteshader);" me aparece el código del fichero shader leído.
Que es éste:


#version 130

uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;

in vec3 a_Vertex;
in vec3 a_Color;
out vec4 color;

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



Y luego vendría el otro..:


#version 130

in vec4 color;
out vec4 outColor;

void main(void) {
outColor = color;
}



Esto está sacado de un libro que he comprado.
Gracias
#20
Programación gráfica / Re:Error al compilar objeto de shader
11 de Diciembre de 2015, 04:30:47 PM
Hola,

En fuenteshader está el código sin compilar de los shaders. Que se cargan en la memora de la gpu.

Y esto no lo acabo de entender (lo he sacado de un libro):

    const GLchar* tmp = static_cast<const GLchar*>(fuenteShader);
    glShaderSource(objetoShader1, 1, &tmp, NULL);

Lo que interpreto es que creo una variable puntero de tipo GLchar llamada "tmp". (const no lo utilizo nunca)
Y le asigno la dirección del arreglo fuenteshader (que es donde está el código). Lo de "static_cast<const GLchar*>( )" tampoco lo entiendo muy bien. Si me lo podeis explicarj, gracias. Lo he sacado de un libro.

Y también por qué no puedo hacer:

glShaderSource(objetoShader1, 1, &fuenteshader, NULL);


No puede estar ahí el error?
Gracias a todos
#21
Programación gráfica / Re:Error al compilar objeto de shader
10 de Diciembre de 2015, 09:18:34 PM
Hola,

Ya creo el objeto de shader con glcreateshader() al principio de la función glsl::compila()

Me parece que eso lo hago bien
#22
Programación gráfica / Re:Error al compilar objeto de shader
10 de Diciembre de 2015, 05:16:22 PM
Hola,

La función glgetshaderinfolog(); también me aparece en el libro. Aunque no entiendo su funcionamiento muy bien (soy un poco novato todavía).
Mejor pongo el código completo que tengo puesto en la etapa de compilación... :


    char fuenteShader[500];
    char fuenteFragmentShader[500];
    GLuint objetoShader1;
    GLuint objetoShader2;
    GLuint programaShader;

void glsl::compila(){
        objetoShader1 = glCreateShader(GL_VERTEX_SHADER);        //!Esto crea los objetos de shader (2) y el objeto de programa
        objetoShader2 = glCreateShader(GL_FRAGMENT_SHADER);
        programaShader = glCreateProgram();

    //!--------------- Primer objeto ---------------
        //!Aquí guardo en los objetos el codigo
    const GLchar* tmp = static_cast<const GLchar*>(fuenteShader);
    glShaderSource(objetoShader1, 1, &tmp, NULL);

        //!Y aquí compilo..
    glCompileShader(objetoShader1);
    GLint result;
    glGetShaderiv(objetoShader1, GL_COMPILE_STATUS, &result);
    if (result == 1)
        std::cout << "\nEl vertex shader se compiló con éxito";
    else {

        //!**********************
        GLchar log[1024];
        GLsizei logLen;
        glGetShaderInfoLog(objetoShader1, sizeof(GLchar)*1024, &logLen, log);
        std::cout << "El vertex shader no se ha compilado con exito!" << std::endl;
        std::cout << "ShaderInfoLog: " << log << std::endl;
        //!****************************************************
    }
    //!---------------- segundo objeto --------------
    const GLchar* tmp2 = static_cast<const GLchar*>(fuenteFragmentShader);
    glShaderSource(objetoShader2, 1, (const GLchar**)&tmp2, NULL);
        //!Y aquí compilo..
    glCompileShader(objetoShader2);
    glGetShaderiv(objetoShader2, GL_COMPILE_STATUS, &result);
    if (result == 1)
        std::cout << "\nEl fragment shader se compiló con éxito";
    else {

        //!********************** sacado de un foro de internet
        GLchar log[1024];
        GLsizei logLen;
        glGetShaderInfoLog(objetoShader1, sizeof(GLchar)*1024, &logLen, log);
        std::cout << "El fragment shader no se ha compilado con exito!" << std::endl;
        std::cout << "ShaderInfoLog: " << log << std::endl;
        //!****************************************************
    }
    //! Esto añade los shaders ya compilados al objeto de programa
    glAttachShader(programaShader, objetoShader1);
    glAttachShader(programaShader, objetoShader2);
    //! Y esto vincula el programa
    glLinkProgram(programaShader);
    //! Y esto comprueba la vinculación
    glGetProgramiv(programaShader, GL_LINK_STATUS, &result);
    if (result == GL_TRUE){
        std::cout << "\nEl programa de shaders se ha vinculado con exito!";
    }
    else std::cout << "\nEl programa de shader no se ha vinculado con exito!";
    glGetProgramiv(programaShader, GL_ATTACHED_SHADERS, &result);
    std::cout << "\nSe han aduntado " << result << " numeros de shader al programa";
    }


los arreglos "fuenteshader" y "fuentefragmentShader" contienen el código de los shaders. En una sóla cadena.
Los leo a través de getc(fichero).

Gracias

#23
Programación gráfica / Re:Error al compilar objeto de shader
09 de Diciembre de 2015, 04:38:33 PM
Hola,
He añadido lo que me has puesto en el else y ha quedado así:

    else {
        //!**********************
        GLchar log[1024];
        GLsizei logLen;
        glGetShaderInfoLog(objetoShader1, sizeof(GLchar)*1024, &logLen, log);
        std::cout << "El shader no se ha compilado con exito!" << std::endl;
        std::cout << "ShaderInfoLog: " << log << std::endl;
        //!****************************************************
    }


Me sigue devolviendo lo mismo. Seguido de "ShaderInfoLog" y en blanco.

Gracias
#24
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.
#25
Programación gráfica / Re:error vertex array en opengl
18 de Noviembre de 2015, 06:12:18 PM
UUUUUUUUUUUUUUUUUUUUUUUUUhoooooooooooooooooooooooo que pasa amiiiiiigoooooooooooooo !!!!
Solucionado!!!

Resulta que los índices de vértices "en el fichero obj" comienzan por 1 y en el arreglo el primer vértice está en la posición "vértice[0]" 0.
Con lo que al leer los índices en el fichero, al guardarlos en el arreglo, le debemos restar  1.
Queda de esta forma: (Es última parte del código que guarda los índices)

            if (registra == 1){
                        switch (y) {
                        case 0: submodelo[IndiceModelo].IndicesVertice[x]= numero-1; break;    //Nótese aquí que resto 1
                        case 1: submodelo[IndiceModelo].IndicesTextura[x]= numero; break;
                        case 2: submodelo[IndiceModelo].IndicesNormal[x]= numero; break;
                        }
                        y++;
                        if (y>2) y=0;
            }


Gracias,  >.< >.<
#26
Programación gráfica / Re:error vertex array en opengl
18 de Noviembre de 2015, 04:46:29 PM
Hola,

Estoy comenzando a programar con opengl aunque ya llevo tiempo estudiando en mis ratos libres.
El método que tu utilizas es el buffer object "creo que se llama así ahora no recuerdo" que utiliza la memoria de la tarjeta de video.
El modo que estoy intentando utilizar es el de los "vertex array" utilizando la memoria del sistema.
El render que hago es el siguiente:    "esto está en main"

        glLoadIdentity();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(3, GL_FLOAT, 0, objeto3d1.submodelo[0].vertice);
        glColor4f(1.0f, 2.0f, 0.0f, 5.0f);  //Al azar ahora no importa.. no hay texturas
        glTranslatef(0,0, -10);
        glDrawElements(GL_TRIANGLES, objeto3d1.submodelo[0].NumeroIndices, GL_UNSIGNED_INT, objeto3d1.submodelo
[0].IndicesVertice);
      VentanaOpenGL.ActualizarBuffer();          //Esto actualiza el buffer en la clase que controla la ventana de opengl en windows


Y lo que hago es crear una clase que contenga todo lo concerniente a un objeto3d: vértices, texturas y normales, índices etc... extraido de un fichero obj.  los arreglos que contienen toda la información son punteros, así que se pueden eliminar o poner a NULL en cualquier momento, liberando así la memora del sistema.

Mi intención es hacer que salga bien el render para luego continuar con donde estás tú y practicar con shaders

Pero estoy atascadísimo, no se lo que estoy haciendo mal


Nota que al utilizar gldrawelements() estoy dibujando el objeto utilizando un índice de vértices con lo que me ahorro llamadas que haría con gldraw();

Gracias

#27
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.