openGL GLSL void ошибка синтаксического анализа вершинного шейдера

Итак, я слежу за сериалом на Youtube от theBennyBox о трехмерных игровых движках, и примерно в эпизоде ​​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);
    }
}

мой класс Game, в котором я инициализирую шейдер для одного многоугольника:

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();
    }
}

и мои шейдеры: (ошибка появляется для вершинного шейдера, но если я закомментирую вершинный шейдер, фрагмент выглядит так, как будто он ничего не делает.)

Vertex: (строка 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);
}

Я ценю, что это все очень долго, но если вы что-нибудь знаете, пожалуйста, помогите мне!


person Sam Walls    schedule 18.10.2013    source источник


Ответы (1)


Если это не опечатка при расшифровке кода, в вершинном шейдере отсутствует точка с запятой. Строка № 3:

layout (location = 0) in vec3 position

должно быть

layout (location = 0) in vec3 position;

А что касается

но если я закомментирую вершинный шейдер, фрагмент выглядит так, будто ничего не делает

Каждая программа шейдера требует как минимум вершинного и фрагментного / пиксельного шейдера. Без вершинного шейдера (когда вы его комментируете) никакие вершины не передаются, что означает, что никакие примитивы не генерируются, и, следовательно, нет примитивов для заполнения вашим фрагментным шейдером.

person ssell    schedule 18.10.2013
comment
Спасибо, это имеет смысл, отправьте ответ, если это все еще продолжается (скорее всего, не будет). Также извините. Я все время делаю поспешные выводы, не проверяя такие мелочи, как точки с запятой. - person Sam Walls; 18.10.2013
comment
Не стоит беспокоиться. Это случается с лучшими из нас! - person ssell; 18.10.2013