Logo

¡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 - anais

#1
Programación gráfica / Re:Error al compilar objeto de shader
28 de Febrero de 2023, 05:48:55 PM
Cita de: killgates en 12 de Diciembre de 2015, 05:21:13 PMHola,

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

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" con la ruleta aleatoria .

    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 a 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


Buenas compi

Me paso lo mismo hace mucho, en todo momento tienes  que inicializar la ventana al crearlar con opengl.