openGL GLSL void грешка при анализиране на вертекс шейдър

Така че следя поредицата в Youtube на "theBennyBox" на 3D двигатели за игри и около епизод 9/10 нещо се обърка за мен.

получавам грешката

Vertex shader не успя да компилира със следните грешки: ГРЕШКА: 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();
    }
}

моят клас Shader:

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

и моите шейдъри: (грешката се показва за върховия шейдър, но ако коментирам върховия шейдър, фрагментът изглежда така, сякаш не прави нищо.)

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