Итак, я слежу за сериалом на 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);
}
Я ценю, что это все очень долго, но если вы что-нибудь знаете, пожалуйста, помогите мне!