【问题标题】:opengl shaders always fail to compileopengl 着色器总是无法编译
【发布时间】:2018-01-09 03:27:38
【问题描述】:

着色器编译状态始终为 0,包括零错误。如果我故意破坏着色器,它会正确显示错误甚至无法链接,但是当着色器(我相信)是正确且工作的着色器时,它的编译状态仍然为零,(GL_FALSE)但程序链接正确。当在程序中使用编译失败的着色器时,什么都不会渲染。

用于检查着色器的代码:

private static void checkShader(int handle,String path) {
    int status = glGetProgrami(handle,GL_COMPILE_STATUS);
    boolean compiled = status==GL_TRUE;
    if (compiled) return; // Shader compiled and everything is fine~
    String error = glGetShaderInfoLog(handle);
    System.err.println("==== SHADER FAILED TO COMPILE ====");
    System.err.println(path);
    System.err.println(error);
    System.err.println("==== ======================== ====");
}

用于读取着色器的代码:

private static String getShaderData(String path) throws IOException {
    InputStream inputStream = ShaderManager.class.getResourceAsStream(path);
    if (inputStream == null) throw new BadShaderException("Could not find shader: "+path);
    Scanner scanner = new Scanner(inputStream);
    StringBuilder builder = new StringBuilder();
    while (scanner.hasNextLine())
        builder.append(scanner.nextLine()).append('\n');
    scanner.close();
    return builder.toString();
}

加载顶点着色器(片段和几何着色器相同,但容器类已更改)

public static VertexShader loadVertexShader(String path) {
    String source;
    try {
        source = getShaderData(path);
    } catch (Exception e) {
        throw new BadShaderException("Failed to load data for shader: "+path);
    }
    int handle = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(handle,source);
    glCompileShader(handle);
    checkShader(handle,path);
    return new VertexShader(handle,path);
}

我正在尝试使用的着色器

#version 330 core
layout(location = 0) in vec3 vpm;
uniform mat4 depthMatrix;

void main(){
 gl_Position =  depthMatrix * vec4(vpm,1);
}

还有一个我在搜索要测试的“直通”着色器时发现的着色器

#version 330 core
// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;

// Output data ; will be interpolated for each fragment.
out vec2 UV;

void main(){
    gl_Position =  vec4(vertexPosition_modelspace,1);
    UV = (vertexPosition_modelspace.xy+vec2(1,1))/2.0;
}

我使用的是 lwjgl 3.1.4,

OpenGL 版本为 (4.6.0 NVIDIA 388.13)

OpenGL 供应商是 (NVIDIA Corporation)

OpenGL 渲染器是 (GeForce GTX 1060 6GB/PCIe/SSE2)

编辑: 我使用的是 glGetProgrami 而不是 glGetShaderi

【问题讨论】:

  • 我希望有一种方法可以“观察”某些问题。我有时会使用 LWJGL,我也想看看解决方案是什么。
  • @markspace 您至少可以将其标记为“最喜欢的”(投票按钮下方的星号),以便它出现在您的个人资料中最喜欢的问题下。

标签: java opengl lwjgl


【解决方案1】:

在检查我的着色器是否正确编译时,我使用的是 glGetProgrami 而不是 glGetShaderi。我不知道后一种方法,并认为两者都使用了先验。

【讨论】:

    猜你喜欢
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多