我想为点精灵制作一个着色器 - 到目前为止,它已经在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)。 有什么想法吗?!?
答案 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
。