gpt4 book ai didi

java - 片段着色器无法编译

转载 作者:行者123 更新时间:2023-12-01 22:12:43 26 4
gpt4 key购买 nike

我正在尝试让本教程中的着色器正常工作: 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 文件吗?

编辑>>>

相关问题:

I get error "Exception in thread "main" org.lwjgl.opengl.OpenGLException: Invalid operation (1282)", what it is?, how I can fix it?

最佳答案

您错误地读取了源文件。

line = reader.readLine();

while(line != null){
line = reader.readLine();

if(line != null){
fragmentShaderSource.append(line).append('\n');
}
}

在这里,您首先读取文件的第一行。如果它不为空,则继续读取行并将它们附加到缓冲区。但是,您实际上并没有在循环外部的 readLine() 语句之后附加该行,这意味着它会被丢弃,并且着色器编译器会得到一个缺少第一行的源文件。因此,它不知道改变 vec2 vTexCoord;sampler2D myTexture;,在代码中稍后使用它们时会引发编译器错误。

有几种方法可以解决这个问题:

  1. line = reader.readLine();
    if (line != null) {
    fragmentShaderSource.append(line).append('\n');
    }

    while (line != null) {
    // ...
    }
  2. while (true) {
    line = reader.readLine();

    if (line == null) {
    break;
    }

    fragmentShaderSource.append(line).append('\n');
    }
  3. while ((line = reader.readLine()) != null) {
    fragmentShaderSource.append(line).append('\n');
    }

使用哪一种取决于您的喜好。 1 包含冗余代码,这几乎从来都不是最好的解决方案。 2是一种常用的读取任意文件的方式;虽然 3 更短,但有些人不喜欢在循环控制语句中分配变量。

关于java - 片段着色器无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31576766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com