我正在尝试编译GLSL着色器,以便在OpenGL中使用LWJGL。我在macOS Sierra上。
尝试编译着色器时出现以下错误:
ERROR: 0:1: '' : version '400' is not supported
ERROR: 0:1: '' : syntax error: #version
着色器代码适用于Windows,但在macOS上进行测试时,它并不适用。 这是着色器代码:
#version 400 core
in vec3 position;
in vec2 textureCoords;
out vec2 pass_textureCoords;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
void main(void)
{
gl_Position = projectionMatrix * viewMatrix * vec4(position, 1.0);
pass_textureCoords = textureCoords;
}
以下是我如何加载着色器...
private static int loadShader(String file, int type) throws IOException {
StringBuilder shaderSource = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(
ShaderProgram.class.getClassLoader().getResourceAsStream("shaders/" + file))
)) {
String line;
while ((line = reader.readLine()) != null) {
shaderSource.append(line).append('\n');
}
System.out.println(shaderSource.toString());
int shaderID = GL20.glCreateShader(type);
GL20.glShaderSource(shaderID, shaderSource);
GL20.glCompileShader(shaderID);
if (GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
System.out.println(GL20.glGetShaderInfoLog(shaderID, 500));
System.err.println("Error compiling shader " + file);
System.exit(-1);
}
return shaderID;
}
}
print语句返回正确的输出,但它仍然给我错误。
我已经在遍布stackoverflow上搜索了一个解决方案,但是每个人都说他们正在编译它而没有换行符,我有。我很困惑为什么会这样。
答案 0 :(得分:2)
你好,不是这里的java专家,我做了一些使用JOGL的实验,所以也许我不能给你一个正确的方向工作的提示。
MAC新线路问题 How to append a newline to StringBuilder
第二
https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.4.00.pdf
除了注释和空格之外,#version指令必须先出现在着色器中。
这看起来像JOGL中的RAW,你看到需要的换行符是在版本指令之后,其他的是分号作为语句分隔符。
//
// create fragment Shader
int fragShader = gl4.glCreateShader(GL4.GL_FRAGMENT_SHADER);
gl4.glShaderSource(fragShader, 1,
new String[]{"#version 420 \n"
+"out vec4 fragColor;"
+"void main(void) {"
+"fragColor = vec4(0.2, 0.2, 0.5, 1.0);}" }, null);
gl4.glCompileShader(fragShader);
答案 1 :(得分:1)
如果其他答案没有为您解决问题,我怀疑您是否正在使用错误的OpenGL版本创建OpenGL上下文。您需要create a context with the Core Profile - 这也意味着旧版功能和功能不支持,因此,如果您已使用其中任何一项,则需要更换它们更新的等价物。 (核心配置文件不向后兼容。)