2011-07-22 118 views
5

我正在用OpenGL编写自己的着色器,而且我难以理解为什么这个着色器不能编译。其他人可以看看吗?为什么GLSL Vertex Shader不能编译?

我传递什么作为一个顶点是在这种格式2个漂浮(如分离字节):

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 

这是我的着色器:

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); 
} 

如果您需要更多信息,我很乐意遵守。

+0

请复制粘贴错误信息。 – tibur

+0

如何收到错误信息?当我调用glGetProgramInfoLog时,我得到一个,但这只是“在调用glLinkProgram()之前没有成功编译顶点着色器,链接失败。” – Azzi777

+3

@ Azzi777:有glGetShaderInfoLog,它在glCompileShader失败时起作用。您应该_ALLways_检查着色器对象和程序对象的编译状态。 –

回答

10

您需要在之前声明UnpackValues您称之为。 GLSL就像C和C++一样;名称必须先声明才能使用。


BTW:你想做些什么将无法​​工作。花车是漂浮物;除非你使用GLSL 4.00(并且由于你继续使用旧的术语,比如“变化”,我猜不是),你不能从浮点数中提取数据。事实上,右移运算符只是为整数定义的;试图在浮动上使用它会失败,并出现编译器错误。

GLSL不是C或C++(讽刺)。

如果您想打包数据,请使用OpenGL为您打包。发送包含标准化的无符号字节的两个vec4属性:

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

你的顶点着色器将需要两个vec4值作为输入。由于您没有使用glVertexAttrib I指针,OpenGL知道您传递的值将被解释为浮点数。

+0

感谢您的帮助,着色器现在编译。不过,我在使用glGetVertexAttribute时遇到了一些问题。你能解释一下我应该调用什么顺序,glGenBuffer,glBindBuffer(我应该调用glSetData?),还有什么我需要调用实际将顶点数据传送给着色器?在此先感谢 – Azzi777

+0

@ Azzi777:您引用的许多函数('glGetVertexAttribute','glSetData')不存在。看起来你的原始问题已被回答。如果您有关于如何发送顶点数据的问题,您应该将其作为一个新问题提出。 –