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")Código [Seleccionar]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 .Código [Seleccionar]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:Código [Seleccionar]#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..:Código [Seleccionar]#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.