gl_PointCoord недоступен на Mac? - PullRequest
1 голос
/ 22 октября 2011

Я хочу сделать шейдер для точечных спрайтов - пока что все работает на 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;
}

Мой фрагментный шейдер:

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;

}

Фрагментный шейдер не компилируется на Mac из-за "gl_PointCoord".На Mac я добавил «#define lowp» в качестве препроцессора в шейдер.

Если я добавлю «#version 120 \ n» поверх шейдера, он отлично компилируется на Mac, но неничего не показывать (однако на iOS это не сработает, если я использую тег #version поверх шейдера - возможно, потому что версия 1.2 пропустит "lowp").

Итак, в чем может быть причина?Мой Mac говорит, что он использует GLSL 1.2 (я думаю, что был добавлен gl_PointCoord).Есть идеи?!?

Ответы [ 2 ]

3 голосов
/ 15 сентября 2015

Немного о потоке некромантии, но я столкнулся с той же проблемой при портировании некоторого кода GLES20.

В руководстве gl_PointCoord четко указано, что gl_PointCoord поддерживается в версии 1.10, но в спецификации GLSL 1.10 эта функция даже не упоминается.

Кроме того, §1.2 спецификации 1,20 четко указывает, что была добавлена ​​поддержка gl_PointCoord.

Так что да, похоже, что руководство по glsl неверно, и поддержка gl_PointCoord начинается с версии 1.2.

Беспокойство вызывает то, что некоторые драйверы дисплея с радостью скомпилируют и запустят шейдер GLSL с #version 110 и вызовом gl_PointCoord, в то время как другие (недавняя NVidia) будут выдавать error C7532: global variable gl_PointCoord requires "#version 120" or later.

3 голосов
/ 22 октября 2011

Шейдер GLSL, у которого нет директивы #version вверху, предполагается равным 1.10.Это, вероятно, никогда не то, что вам действительно нужно, поэтому всегда использует директиву #version.

Desktop OpenGL и OpenGL ES - не одно и то же.Попытка передать ES-шейдер через реализацию GL на рабочем столе не гарантируется.Поэтому вы должны соответствующим образом изменить шейдер.

...