【问题标题】:openGL GLSL "void" parse error on vertex shader顶点着色器上的openGL GLSL“void”解析错误
【发布时间】:2013-10-18 14:31:19
【问题描述】:

所以我在 3D 游戏引擎上关注“theBennyBox”的 Youtube 系列,大约在第 9/10 集时,我出了点问题。

我得到了错误

顶点着色器编译失败,出现以下错误: 错误:0:5:错误(#132)语法错误:“void”解析错误 错误:错误(#273)1 编译错误。没有生成代码

这是我所有的东西:

我的资源加载器(读取文件)

package com.base.engine;

import java.io.BufferedReader;
import java.io.FileReader;

public class ResourceLoader {
    public static String loadShader(String fileName) {
        StringBuilder shaderSource = new StringBuilder();
        BufferedReader shaderReader = null;

        try {
            shaderReader = new BufferedReader(new FileReader("./res/shaders/" + fileName));
            String line;
            while ((line = shaderReader.readLine()) != null) {
                shaderSource.append(line).append("\n");
            }

            shaderReader.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }

        return shaderSource.toString();
    }
}

我的着色器类:

package com.base.engine;

import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL32.*;

public class Shader {
    private int program;

    public Shader() {
        program = glCreateProgram();

        if (program == 0) {
            System.err.println("Shader Creation failed: could not find valid memory location in constructor");
            System.exit(1);
        }
    }

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

    public void addVertexShader(String text) {
        addProgram(text, GL_VERTEX_SHADER);
    }

    public void addGeometryShader(String text) {
        addProgram(text, GL_GEOMETRY_SHADER);
    }

    public void addFragmentShader(String text) {
        addProgram(text, GL_FRAGMENT_SHADER);
    }

    public void compileShader() {
        glLinkProgram(program);

        if (glGetProgrami(program, GL_LINK_STATUS) == 0) {
            System.err.println(glGetShaderInfoLog(program, 1024));
            System.exit(1);
        }

        glValidateProgram(program);
        if(glGetProgrami(program, GL_VALIDATE_STATUS) == 0){
            System.err.println(glGetShaderInfoLog(program, 1024));
            System.exit(1);
        }
    }

    private void addProgram(String text, int type) {
        int shader = glCreateShader(type);

        if (shader == 0) {
            System.err.println("Shader Creation failed: could not find valid memory location when adding shader");
            System.exit(1);
        }

        glShaderSource(shader, text);
        glCompileShader(shader);

        if (glGetShaderi(shader, GL_COMPILE_STATUS) == 0) {
            System.err.println(glGetShaderInfoLog(shader, 1024));
            System.exit(1);
        }

        glAttachShader(program, shader);
    }
}

我将着色器初始化为单个多边形的游戏类:

package com.base.engine;

import org.lwjgl.input.Keyboard;

public class Game {
    private Mesh mesh;
    private Shader shader;

    public Game() {
        mesh = new Mesh();
        shader = new Shader();

        Vertex[] data = new Vertex[] {new Vertex(new Vector3f(-1, -1, 0)),
                                      new Vertex(new Vector3f(0, 1, 0)),
                                      new Vertex(new Vector3f(1, -1, 0))};
        mesh.addVertices(data);
        shader.addVertexShader(ResourceLoader.loadShader("basicVertex.vs"));
        shader.addFragmentShader(ResourceLoader.loadShader("basicFragment.fs"));

    }

    public void input() {
        if (Input.getKeyDown(Keyboard.KEY_UP)) {
            System.out.println("We've just pressed up");
        }
        if (Input.getKeyUp(Keyboard.KEY_UP)) {
            System.out.println("We've just released up");
        }

        if (Input.getMouseDown(1)) {
            System.out.println("We've just pressed right-mouse at "
                    + Input.getMousePosition().toString());
        }
        if (Input.getMouseUp(1)) {
            System.out.println("We've just released right-mouse");
        }
    }

    public void update() {

    }

    public void render() {
        shader.bind();
        mesh.draw();
    }
}

和我的着色器:(顶点着色器出现错误,但如果我注释掉顶点着色器,片段看起来什么都不做。)

顶点:(第 5 行,void main(),显然是麻烦制造者)

#version 330

layout (location = 0) in vec3 position

void main()
{
    gl_Position = vec4(0.25 * position, 1.0);
}

片段:

#version 330

out vec3 fragColour;

void main()
{
    fragColour = vec4(0.0, 1.0, 1.0, 1.0);
}

我很感激这一切都很长,但如果你知道任何事情,请帮助我!

【问题讨论】:

    标签: java opengl glsl vertex-shader


    【解决方案1】:

    除非是转录代码的拼写错误,否则您的顶点着色器中缺少分号。第 3 行是:

    layout (location = 0) in vec3 position

    应该是

    layout (location = 0) in vec3 position;

    关于

    但如果我注释掉顶点着色器,片段看起来就像什么都不做

    每个着色器程序都至少需要一个顶点着色器和片段/像素着色器。如果没有顶点着色器(当您将其注释掉时),则不会传递任何顶点,这意味着不会生成图元,因此不会使用片段着色器填充图元。

    【讨论】:

    • 谢谢,这很有意义,如果它仍然继续(可能不会),请回帖。还有,对不起。我总是在不检查分号之类的小问题的情况下得出结论。
    • 不用担心。它发生在我们最好的人身上!
    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多