片段着色器无法编译
Fragment shader won't compile
我正在尝试使用本教程中的着色器:
https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/discard.php
我将源代码复制到两个文件中,但都无法编译。
这是我的代码:
shaderProgram = glCreateProgram();
vertexShader = glCreateShader(GL_VERTEX_SHADER);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
StringBuilder vertexShaderSource = new StringBuilder();
StringBuilder fragmentShaderSource = new StringBuilder();
try{
BufferedReader reader = new BufferedReader(new FileReader("src/shader.vert"));
String line;
line = reader.readLine();
while(line != null){
line = reader.readLine();
if(line != null){
vertexShaderSource.append(line).append('\n');
}
}
reader.close();
} catch (IOException e) {
System.err.println("Vertex no load.");
Display.destroy();
System.exit(1);
}
try{
BufferedReader reader = new BufferedReader(new FileReader("src/shader.frag"));
String line;
line = reader.readLine();
while(line != null){
line = reader.readLine();
if(line != null){
fragmentShaderSource.append(line).append('\n');
}
}
reader.close();
} catch (IOException e) {
System.err.println("Frag no load.");
Display.destroy();
System.exit(1);
}
System.out.println(fragmentShaderSource);
glShaderSource(vertexShader, vertexShaderSource);
glCompileShader(vertexShader);
if(glGetShader(vertexShader, GL_COMPILE_STATUS) == GL_FALSE){
System.err.println("Vertex no compile");
}
glShaderSource(fragmentShader, fragmentShaderSource);
glCompileShader(fragmentShader);
if(glGetShader(fragmentShader, GL_COMPILE_STATUS) == GL_FALSE){
System.err.println("frag no compile");
}
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glValidateProgram(shaderProgram);
我以前使用过着色器,所以它不是设置(据我所知),但是当我复制和粘贴时,两个文件都无法再编译。
是不是我的设置有问题?
编辑 >>>
我似乎无法导入 glGetShaderiv
我正在使用 LWJGL 并从那里导入所有内容。我可能缺少 JAR 文件吗?
编辑 >>>
相关问题:
您读取的源文件不正确。
line = reader.readLine();
while(line != null){
line = reader.readLine();
if(line != null){
fragmentShaderSource.append(line).append('\n');
}
}
在这里,您首先阅读文件的第一行。如果它不为空,则继续读取行并将它们附加到缓冲区。但是,您实际上并没有在循环外的 readLine()
语句之后附加该行,这意味着它被丢弃并且着色器编译器得到一个缺少第一行的源文件。因此它不知道 varying vec2 vTexCoord;
或 sampler2D myTexture;
,稍后在代码中使用它们时会引发编译器错误。
有几种方法可以解决此问题:
line = reader.readLine();
if (line != null) {
fragmentShaderSource.append(line).append('\n');
}
while (line != null) {
// ...
}
while (true) {
line = reader.readLine();
if (line == null) {
break;
}
fragmentShaderSource.append(line).append('\n');
}
while ((line = reader.readLine()) != null) {
fragmentShaderSource.append(line).append('\n');
}
使用哪一个取决于您的喜好。 1 包含冗余代码,这几乎不是最佳解决方案。 2是常用的读取任意文件的方式;虽然 3 更短,但有些人不喜欢在循环控制语句中分配变量。
我正在尝试使用本教程中的着色器: https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/discard.php
我将源代码复制到两个文件中,但都无法编译。
这是我的代码:
shaderProgram = glCreateProgram();
vertexShader = glCreateShader(GL_VERTEX_SHADER);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
StringBuilder vertexShaderSource = new StringBuilder();
StringBuilder fragmentShaderSource = new StringBuilder();
try{
BufferedReader reader = new BufferedReader(new FileReader("src/shader.vert"));
String line;
line = reader.readLine();
while(line != null){
line = reader.readLine();
if(line != null){
vertexShaderSource.append(line).append('\n');
}
}
reader.close();
} catch (IOException e) {
System.err.println("Vertex no load.");
Display.destroy();
System.exit(1);
}
try{
BufferedReader reader = new BufferedReader(new FileReader("src/shader.frag"));
String line;
line = reader.readLine();
while(line != null){
line = reader.readLine();
if(line != null){
fragmentShaderSource.append(line).append('\n');
}
}
reader.close();
} catch (IOException e) {
System.err.println("Frag no load.");
Display.destroy();
System.exit(1);
}
System.out.println(fragmentShaderSource);
glShaderSource(vertexShader, vertexShaderSource);
glCompileShader(vertexShader);
if(glGetShader(vertexShader, GL_COMPILE_STATUS) == GL_FALSE){
System.err.println("Vertex no compile");
}
glShaderSource(fragmentShader, fragmentShaderSource);
glCompileShader(fragmentShader);
if(glGetShader(fragmentShader, GL_COMPILE_STATUS) == GL_FALSE){
System.err.println("frag no compile");
}
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glValidateProgram(shaderProgram);
我以前使用过着色器,所以它不是设置(据我所知),但是当我复制和粘贴时,两个文件都无法再编译。
是不是我的设置有问题?
编辑 >>>
我似乎无法导入 glGetShaderiv
我正在使用 LWJGL 并从那里导入所有内容。我可能缺少 JAR 文件吗?
编辑 >>>
相关问题:
您读取的源文件不正确。
line = reader.readLine();
while(line != null){
line = reader.readLine();
if(line != null){
fragmentShaderSource.append(line).append('\n');
}
}
在这里,您首先阅读文件的第一行。如果它不为空,则继续读取行并将它们附加到缓冲区。但是,您实际上并没有在循环外的 readLine()
语句之后附加该行,这意味着它被丢弃并且着色器编译器得到一个缺少第一行的源文件。因此它不知道 varying vec2 vTexCoord;
或 sampler2D myTexture;
,稍后在代码中使用它们时会引发编译器错误。
有几种方法可以解决此问题:
line = reader.readLine(); if (line != null) { fragmentShaderSource.append(line).append('\n'); } while (line != null) { // ... }
while (true) { line = reader.readLine(); if (line == null) { break; } fragmentShaderSource.append(line).append('\n'); }
while ((line = reader.readLine()) != null) { fragmentShaderSource.append(line).append('\n'); }
使用哪一个取决于您的喜好。 1 包含冗余代码,这几乎不是最佳解决方案。 2是常用的读取任意文件的方式;虽然 3 更短,但有些人不喜欢在循环控制语句中分配变量。