簡體   English   中英

opengl着色器始終無法編譯

[英]opengl shaders always fail to compile

着色器的編譯狀態始終為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

檢查我的着色器是否正確編譯時,我使用的是glGetProgrami而不是glGetShaderi。 我沒有意識到后一種方法,並認為兩者都使用了前一種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM