2011-07-22 18 views
5

Estoy escribiendo mi propio sombreador con OpenGL, y estoy perplejo por qué este sombreador no se compilará. ¿Alguien más podría echarle un vistazo?¿Por qué no compilará este GLSL Vertex Shader?

Lo que estoy pasando como un vértice es de 2 flotadores (separados como bytes) en este formato:

Float 1: 

Byte 1: Position X 
Byte 2: Position Y 
Byte 3: Position Z 
Byte 4: Texture Coordinate X 


Float 2: 

Byte 1: Color R 
Byte 2: Color G 
Byte 3: Color B 
Byte 4: Texture Coordinate Y 

y este es mi shader:

in vec2 Data; 
varying vec3 Color; 
varying vec2 TextureCoords; 

uniform mat4 projection_mat; 
uniform mat4 view_mat; 
uniform mat4 world_mat; 

void main() 
{ 
    vec4 dataPosition = UnpackValues(Data.x); 
    vec4 dataColor = UnpackValues(Data.y); 

    vec4 position = dataPosition * vec4(1.0, 1.0, 1.0, 0.0); 
    Color = dataColor.xyz; 

    TextureCoords = vec2(dataPosition.w, dataColor.w) 

    gl_Position = projection_mat * view_mat * world_mat * position; 
} 

vec4 UnpackValues(float value) 
{ 
    return vec4(value % 255, (value >> 8) % 255, (value >> 16) % 255, value >> 24); 
} 

Si necesitas más información, estaré feliz de cumplir.

+0

Copie y pegue el mensaje de error. – tibur

+0

¿Cómo recibo un mensaje de error? Obtengo uno cuando llamo a glGetProgramInfoLog, pero eso es solo "Vertex shader (s) no se compiló con éxito antes de llamar glLinkProgram(). Link falló". – Azzi777

+3

@ Azzi777: existe glGetShaderInfoLog, que funciona cuando glCompileShader falla. Siempre debe verificar el estado de compilación de los objetos del sombreador y los objetos del programa. –

Respuesta

10

Necesita declarar UnpackValuesantes de lo llama. GLSL es como C y C++; los nombres deben tener una declaración antes de que puedan ser utilizados.


Por cierto: Lo que estamos tratando de hacer no funcionará. Los flotadores son flotadores; a menos que esté trabajando con GLSL 4.00 (y ya que continúa usando términos antiguos como "variable", supongo que no), no puede extraer bits de un flotador. De hecho, el operador de desplazamiento a la derecha solo se define para enteros; intentar usarlo en flotadores fallará con un error de compilación.

GLSL no es C o C++ (irónicamente).

Si desea empacar sus datos, use OpenGL para empacarlo. Enviar vec4 dos atributos que contienen bytes sin signo normalizados:

glVertexAttribPointer(X, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, *); 
glVertexAttribPointer(Y, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, * + 4); 

Su vertex shader tomaría dos vec4 valores como entradas. Como no está utilizando glVertexAttrib I Puntero, OpenGL sabe que está pasando valores que deben interpretarse como flotantes.

+0

Gracias por su ayuda, el sombreador compila ahora. Aunque estoy teniendo problemas con glGetVertexAttribute. ¿Puede explicar en qué orden debo llamar, glGenBuffer, glBindBuffer (debería llamar a glSetData?), Y ¿a qué otra cosa debo llamar para transferir realmente los datos de vértice al sombreador? Gracias de antemano – Azzi777

+0

@ Azzi777: muchas de las funciones que citó ('glGetVertexAttribute',' glSetData') no existen. Parece que tu pregunta original ha sido respondida. Si tiene alguna pregunta sobre cómo enviar datos de vértice, debe preguntar eso como una nueva pregunta. –

Cuestiones relacionadas