GLSL着色器在Mac上无法工作

3

我正在尝试在Mac上使用Java创建一个GLSL纹理着色器,但是Mac不支持任何高于#version 120的版本。如何移植这个330着色器:

//this is my Vertex Shader
#version 330

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texCoord;

out vec2 texCoord0;

uniform mat4 transform;

void main()
{
    gl_Position=transform*vec4(position,1.0);
    texCoord0=texCoord;
}

这是我的片段着色器。
#version 330

in vec2 texCoord0;

uniform sampler2D sampler;

out vec4 gl_FragColor;

void main()
{
    gl_FragColor=texture2D(sampler,texCoord0.xy);

}

如何将这些着色器转换为GLSL 120,而不会失去功能?


in -> attribute, out -> varying。删除layout限定词。删除gl_FragColor声明。 - genpfault
4
Mac OSX 支持OpenGL 3.3,您只需要确保正确创建上下文。 - Iggy
请注意,Mac不支持3.1+的兼容模式,这就是为什么尝试获取更高版本的上下文可能会失败的原因。 - Colonel Thirty Two
@Iggy 现代的 OS X(Mavericks 和 Yosemite)支持,但可能不支持旧版本。 - Michael Dorst
texture2D已被弃用,并且在核心配置文件着色器中不存在。这个着色器可能在其他平台上工作,因为编译器会回退到兼容配置文件(通常会有一两个警告),但在OS X上不会工作,除非您将该函数替换为texture。还要删除gl_FragColor的声明,因为您不允许重新声明GLSL内置变量。 - Andon M. Coleman
1个回答

3
你只需要做以下几件事情:
- 删除layout限定符(包括位置赋值)。 - 然后你就需要使用
void glBindAttribLocation(GLuint program,
                           GLuint index,
                           const GLchar *name);

在链接程序之前,对于你的顶点着色器的每个输入(使用索引 0 和 1 表示位置 0 和 1,以及变量的 名称,如果你不理解的话),

_在顶点着色器中,用attribute 替换in,用varying 替换 out

_在片段着色器中,用varying 替换in,但不要声明 gl_FragColor

在您的情况下,在链接程序之前,这是您所拥有的:

//program is your shader program of course...
//Bind vertex shader attributes (ins) instead of using layout
glBindAttribLocation(program, 0, "position");
glBindAttribLocation(program, 1, "texCoord");

//Then the program should be linked (or relinked, it doesn't matter)
glLinkProgram(program);

您的顶点着色器:

#version 120

attribute vec3 position;
attribute vec2 texCoord;

varying vec2 texCoord0;

uniform mat4 transform;

void main()
{
    gl_Position = transform*vec4(position, 1.0);
    texCoord0 = texCoord;
}

而你的片段着色器:

#version 120

varying vec2 texCoord0;

uniform sampler2D sampler;

void main()
{
    gl_FragColor = texture2D(sampler, texCoord0.xy);

}

你能否写出这个是什么样子的(即,需要将什么内容插入到glBindAttribLocation函数中,并且它应该是什么样子)?这是由一个尚不能发表评论的用户在编辑中提出的请求。 - Trudbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接