gl_PointCoord在Mac上不可用?

时间:2011-10-22 13:22:50

标签: ios opengl glsl opengl-es-2.0

我想为点精灵制作一个着色器 - 到目前为止,它已经在iOS上工作了。但不是在Mac OS X上。 我的顶点着色器:

attribute vec4 position;
attribute vec4 color;
attribute vec2 texcoord;

varying vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix;
uniform float pointSize;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;
    colorVarying = color;
    gl_PointSize = pointSize;
}

My Fragment着色器:

varying lowp vec4 colorVarying;
uniform lowp float textureFlag;
uniform sampler2D texture;

void main()
{
    gl_FragColor = textureFlag * texture2D(texture, gl_PointCoord) * colorVarying + 
    (1.0 - textureFlag) * colorVarying;

}

由于“gl_PointCoord”,片段着色器无法在mac上编译。在Mac上,我在着色器中添加了一个“#define lowp”作为预处理器。

如果我在着色器顶部添加“#version 120 \ n”,它在Mac上编译正常,但没有显示任何内容(但是在iOS上,如果我使用#version标记,则无效在着色器之上 - 也许,因为版本1.2会错过“lowp”)。

那么,原因是什么呢?我的Mac说,它使用GLSL 1.2(我认为增加了gl_PointCoord)。 有什么想法吗?!?

2 个答案:

答案 0 :(得分:3)

假设顶部没有#version指令的GLSL着色器为1.10。这可能永远不会是你真正想要的,所以总是使用#version指令。

桌面OpenGL和OpenGL ES不是一回事。尝试通过桌面GL实现提供ES着色器并不能保证正常工作。所以你必须相应地修改着色器。

答案 1 :(得分:3)

有点线程的死灵,但我在移植一些GLES20代码时面临同样的问题。

gl_PointCoord manual明确指出版本1.10支持gl_PointCoord,但GLSL 1.10规范甚至没有提到该函数。

此外,§1.2 of the 1.20 spec明确指出已添加gl_PointCoord支持。

所以是的,看起来这个glsl手册错了,gl_PointCoord支持从版本1.2开始。

令人不安的是,有些显示器驱动程序会愉快地编译并运行带有#version 110的GLSL着色器并调用gl_PointCoord,而其他人(最近的NVidia)将调整一个不错的error C7532: global variable gl_PointCoord requires "#version 120" or later