Java - 调用方法时找不到符号错误

时间:2018-04-06 20:39:33

标签: java opengl

在程序中我想在另一个名为ShaderProgram的类中调用一个函数createGeometryShader(),如下所示

import graph.ShaderProgram;
ShaderProgram shaderProgram = new ShaderProgram();  
shaderProgram.createVertexShader(new String(Files.readAllBytes(Paths.get("wireframe_vertex.vs"))));  
shaderProgram.createGeometryShader(new String(Files.readAllBytes(Paths.get("wireframe_geometry.gs"))));

在ShaderProgram中,我定义了像这样的函数

public class ShaderProgram {

private final int programId;

private int vertexShaderId;
private int fragmentShaderId;
private int geometryShaderId;

private final Map<String, Integer> uniforms;

public ShaderProgram() throws Exception {
    programId = glCreateProgram();
    if (programId == 0) {
        throw new Exception("Could not create Shader");
    }
    uniforms = new HashMap<>();
}

public void createUniform(String uniformName) throws Exception {
    int uniformLocation = glGetUniformLocation(programId, uniformName);
    if (uniformLocation < 0) {
        throw new Exception("Could not find uniform:" + uniformName);
    }
    uniforms.put(uniformName, uniformLocation);
}

public void createPointLightUniform(String uniformName) throws Exception {
    createUniform(uniformName + ".colour");
    createUniform(uniformName + ".position");
    createUniform(uniformName + ".intensity");
    createUniform(uniformName + ".att.constant");
    createUniform(uniformName + ".att.linear");
    createUniform(uniformName + ".att.exponent");
}

public void createDirectionalLightUniform(String uniformName) throws Exception {
    createUniform(uniformName + ".colour");
    createUniform(uniformName + ".direction");
    createUniform(uniformName + ".intensity");
}

public void createMaterialUniform(String uniformName) throws Exception {
    createUniform(uniformName + ".colour");
    createUniform(uniformName + ".useColour");
    createUniform(uniformName + ".reflectance");
}

public void setUniform(String uniformName, Matrix4f value) {
    try (MemoryStack stack = MemoryStack.stackPush()) {
        // Dump the matrix into a float buffer
        FloatBuffer fb = stack.mallocFloat(16);
        value.get(fb);
        glUniformMatrix4fv(uniforms.get(uniformName), false, fb);
    }
}

public void setUniform(String uniformName, int value) {
    glUniform1i(uniforms.get(uniformName), value);
}

public void setUniform(String uniformName, float value) {
    glUniform1f(uniforms.get(uniformName), value);
}

public void setUniform(String uniformName, Vector3f value) {
    glUniform3f(uniforms.get(uniformName), value.x, value.y, value.z);
}

public void setUniform(String uniformName, PointLight pointLight) {
    setUniform(uniformName + ".colour", pointLight.getColor());
    setUniform(uniformName + ".position", pointLight.getPosition());
    setUniform(uniformName + ".intensity", pointLight.getIntensity());
    PointLight.Attenuation att = pointLight.getAttenuation();
    setUniform(uniformName + ".att.constant", att.getConstant());
    setUniform(uniformName + ".att.linear", att.getLinear());
    setUniform(uniformName + ".att.exponent", att.getExponent());
}

public void setUniform(String uniformName, DirectionalLight dirLight) {
    setUniform(uniformName + ".colour", dirLight.getColor());
    setUniform(uniformName + ".direction", dirLight.getDirection());
    setUniform(uniformName + ".intensity", dirLight.getIntensity());
}

public void setUniform(String uniformName, Material material) {
    setUniform(uniformName + ".colour", material.getColour());
    setUniform(uniformName + ".useColour", material.isTextured() ? 0 : 1);
    setUniform(uniformName + ".reflectance", material.getReflectance());
}

public void createVertexShader(String shaderCode) throws Exception {
    vertexShaderId = createShader(shaderCode, GL_VERTEX_SHADER);
}


public void createGeometryShader(String shaderCode) throws Exception {
    //System.out.println("here");
    geometryShaderId = createShader(shaderCode, GL_GEOMETRY_SHADER);
}

public void createFragmentShader(String shaderCode) throws Exception {
    fragmentShaderId = createShader(shaderCode, GL_FRAGMENT_SHADER);
}



protected int createShader(String shaderCode, int shaderType) throws Exception {
    int shaderId = glCreateShader(shaderType);
    if (shaderId == 0) {
        throw new Exception("Error creating shader. Type: " + shaderType);
    }

    glShaderSource(shaderId, shaderCode);
    glCompileShader(shaderId);

    if (glGetShaderi(shaderId, GL_COMPILE_STATUS) == 0) {
        throw new Exception("Error compiling Shader code: " + glGetShaderInfoLog(shaderId, 1024));
    }

    glAttachShader(programId, shaderId);

    return shaderId;
}

public void link() throws Exception {
    glLinkProgram(programId);
    if (glGetProgrami(programId, GL_LINK_STATUS) == 0) {
        throw new Exception("Error linking Shader code: " + glGetProgramInfoLog(programId, 1024));
    }

    if (vertexShaderId != 0) {
        glDetachShader(programId, vertexShaderId);
    }
    if (fragmentShaderId != 0) {
        glDetachShader(programId, fragmentShaderId);
    }
    if (geometryShaderId != 0) {
        glDetachShader(programId, geometryShaderId);
    }

    glValidateProgram(programId);
    if (glGetProgrami(programId, GL_VALIDATE_STATUS) == 0) {
        System.err.println("Warning validating Shader code: " + glGetProgramInfoLog(programId, 1024));
    }
}

public void bind() {
    glUseProgram(programId);
}

public void unbind() {
    glUseProgram(0);
}

public void cleanup() {
    unbind();
    if (programId != 0) {
        glDeleteProgram(programId);
    }
}

}

但我收到此错误消息。我查看了代码并搜索了半小时的类似问题,但我仍然无法弄清楚原因。它非常奇怪,因为vertexShader编译成功。

/Renderer.java:264: error: cannot find symbol
[javac]         shaderProgram.createGeometryShader(new String(Files.readAllBytes(Paths.get("src/resources/shaders/wireframe_geometry.gs"))));
[javac]                      ^
[javac]   symbol:   method createGeometryShader(String)
[javac]   location: variable shaderProgram of type ShaderProgram

0 个答案:

没有答案