OpenGL Superbible第5版最近发布,它记录了OpenGL 3.3。不幸的是,OS X仅支持OpenGL 2.1和GLSL版本1.20。他们为您提供的第一个非平凡的顶点着色器无法使用错误消息进行编译:
ERROR: 0:5: '' : Version number not supported by GL2
ERROR: 0:8: 'in' : syntax error syntax error
着色器如下所示:
// Simple Diffuse lighting Shader
// Vertex Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130
// Incoming per vertex... position and normal
in vec4 vVertex;
in vec3 vNormal;
// Set per batch
uniform vec4 diffuseColor;
uniform vec3 vLightPosition;
uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat3 normalMatrix;
// Color to fragment program
smooth out vec4 vVaryingColor;
void main(void)
{
// Get surface normal in eye coordinates
vec3 vEyeNormal = normalMatrix * vNormal;
// Get vertex position in eye coordinates
vec4 vPosition4 = mvMatrix * vVertex;
vec3 vPosition3 = vPosition4.xyz / vPosition4.w;
// Get vector to light source
vec3 vLightDir = normalize(vLightPosition - vPosition3);
// Dot product gives us diffuse intensity
float diff = max(0.0, dot(vEyeNormal, vLightDir));
// Multiply intensity by diffuse color
vVaryingColor.rgb = diff * diffuseColor.rgb;
vVaryingColor.a = diffuseColor.a;
// Let's not forget to transform the geometry
gl_Position = mvpMatrix * vVertex;
}
答案 0 :(得分:4)
将glsl版本替换为:
#version 120
但在1.2中,关键字输入和输出尚未定义,它是属性和变化。
smooth varying vec4 vVaryingColor;
您可能需要在片段着色器中进行类似的更改
对于vVertex和vNormal,这些是自定义名称,这意味着它们已经绑定在C ++代码中。解决这个问题最简单的方法是将它们重命名为gl_Vertex和gl_Normal
答案 1 :(得分:1)
如果不将#version
更改为匹配120
,您还需要将in
更改为attribute
,将out
更改为varying
。我可能会错过其他的东西,但这就是我现在所能展示的一切。
答案 2 :(得分:0)
2011年更新:从OS X Lion开始,情况已不再如此。 Lion已经增加了对OpenGL 3.2的支持。
不幸的是,我开始相信这是一个傻瓜的差事。本书使用了一个GLTools库(在网站上发布),它以一种与OpenGL 2.1根本不兼容的方式强制传入各种参数。
如果它是一个例子,它可以被重写,但它是一些例子,如果你试图教自己OpenGL,努力将是压倒性的回报。
您有两种选择:
来自website:
如果您仍然对preGLGL 3.x的已弃用功能感兴趣,我们建议您使用第四版,该版本仍处于打印状态,并且非常彻底地涵盖了OpenGL 2.1和固定功能管道。