Квадрат не отображается в OpenGLJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Квадрат не отображается в OpenGL

Сообщение Anonymous »

Я пытаюсь запрограммировать простую игру на Java, используя lwjgl и OpenGL, но не могу отобразить квадрат в окне. Может ли кто-нибудь помочь?
Функция рендеринга в классе рендеринга называется Evert Frame, а функция инициализации в классе рендеринга вызывается только один раз в начале.
Сообщение об ошибке
ERROR: Vertex shader compilation failed.
ERROR: 0:1: '#version' : bad profile name; use es, core, or compatibility
ERROR: 0:1: '#version' : bad tokens following profile -- expected newline
ERROR: 0:1: '' : compilation terminated
ERROR: 3 compilation errors. No code generated.

ERROR: Fragment shader compilation failed.
ERROR: 0:1: '#version' : bad profile name; use es, core, or compatibility
ERROR: 0:1: '#version' : bad tokens following profile -- expected newline
ERROR: 0:1: '' : compilation terminated
ERROR: 3 compilation errors. No code generated.

ERROR: Linking of shaders failed.

Класс рендеринга
import java.nio.FloatBuffer;
import java.nio.IntBuffer;

import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.glBindVertexArray;
import static org.lwjgl.opengl.GL30.glGenVertexArrays;

public class Render {
private Shader shader;

private float[] vertexArray = {
0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f
};

private int[] elementArray = {
2, 1, 0,
0, 1, 3
};

private int vaoID, vboID, eboID;

public Render() {
this.shader = new Shader("defaultVertexShader.glsl", "defaultFragmentShader.glsl", "src/main/resources/render/shaders/");
}

public void init() {
shader.compile();
shader.link();

vaoID = glGenVertexArrays();
glBindVertexArray(vaoID);

FloatBuffer vertexBuffer = BufferUtils.createFloatBuffer(vertexArray.length);
vertexBuffer.put(vertexArray).flip();

vboID = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, vertexBuffer, vboID);

IntBuffer elementBuffer = BufferUtils.createIntBuffer(elementArray.length);
elementBuffer.put(elementArray).flip();

eboID = glGenBuffers();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementBuffer, eboID);

glVertexAttribPointer(0, 3, GL_FLOAT, false, 12, 0);
glEnableVertexAttribArray(0);
}

public void render() {
shader.use();
glBindVertexArray(vaoID);
glEnableVertexAttribArray(0);

glDrawElements(GL_TRIANGLES, elementArray.length, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);
glBindVertexArray(0);
shader.detach();
}
}

Класс шейдера
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

import static org.lwjgl.opengl.GL11.GL_FALSE;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL20.glUseProgram;

public class Shader {
private String vertexShaderSrc;
private String fragmentShaderSrc;

private int vertexID, fragmentID, shaderProgram;

public Shader(String vertexShader, String fragmentShader, String root) {
this.vertexShaderSrc = getShader(vertexShader, root);
this.fragmentShaderSrc = getShader(fragmentShader, root);
}

public void compile() {
vertexID = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexID, vertexShaderSrc);
glCompileShader(vertexID);
int success = glGetShaderi(vertexID, GL_COMPILE_STATUS);
if (success == GL_FALSE) {
int len = glGetShaderi(vertexID, GL_INFO_LOG_LENGTH);
System.out.println("ERROR: Vertex shader compilation failed.");
System.out.println(glGetShaderInfoLog(vertexID, len));
}

fragmentID = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentID, fragmentShaderSrc);
glCompileShader(fragmentID);
success = glGetShaderi(fragmentID, GL_COMPILE_STATUS);
if (success == GL_FALSE) {
int len = glGetShaderi(fragmentID, GL_INFO_LOG_LENGTH);
System.out.println("ERROR: Fragment shader compilation failed.");
System.out.println(glGetShaderInfoLog(fragmentID, len));
}
}

public void link() {
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexID);
glAttachShader(shaderProgram, fragmentID);
glLinkProgram(shaderProgram);
int success = glGetProgrami(shaderProgram, GL_LINK_STATUS);
if (success == GL_FALSE) {
int len = glGetProgrami(shaderProgram, GL_INFO_LOG_LENGTH);
System.out.println("ERROR: Linking of shaders failed.");
System.out.println(glGetProgramInfoLog(shaderProgram, len));
}
}

public void use() {
glUseProgram(shaderProgram);
}

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

private String getShader(String shaderName, String root) {
String data = "";
File shaderFile = new File(root + shaderName);

try (Scanner reader = new Scanner(shaderFile)) {
while (reader.hasNextLine()) {
data += reader.nextLine();
}
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}

return data;
}
}

Вершинный шейдер
#version 330 core

layout (location=0) in vec3 pos;

void main() {
gl_Position = vec4(pos, 1.0f);
}

Фрагментный шейдер
#version 330 core

out vec4 color;

void main() {
color = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}

Окно
import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.opengl.GL;

import static org.lwjgl.glfw.Callbacks.glfwFreeCallbacks;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.system.MemoryUtil.NULL;

public class Window {
private static Window instance;

private int width, height;
private String title;
private long window;

private Window(int width, int height, String title) {
this.width = width;
this.height = height;
this.title = title;
}

public static Window get(int width, int height, String title) {
if (instance == null) instance = new Window(width, height, title);

return instance;
}

public void init() {
GLFWErrorCallback.createPrint(System.err).set();

if (!glfwInit()) throw new IllegalStateException("Unable to initialize GLFW");

glfwDefaultWindowHints();
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE);

window = glfwCreateWindow(width, height, title, NULL, NULL);
if (window == NULL) throw new RuntimeException("Failed to create the GLFW window");

glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glfwShowWindow(window);

GL.createCapabilities();
}

public void destroy() {
glfwFreeCallbacks(window);
glfwDestroyWindow(window);

glfwTerminate();
glfwSetErrorCallback(null).free();
}

public long getWindow() {
return window;
}
}

Игровой цикл
Методы ввода, обновления, рендеринга и очистки вызываются в цикле while каждый кадр.
import static org.lwjgl.glfw.GLFW.glfwPollEvents;
import static org.lwjgl.glfw.GLFW.glfwSwapBuffers;
import static org.lwjgl.opengl.GL11.*;

public class GameLoop implements IGameLogic {
private static GameLoop instance;

private GameLoop() {

}

public static GameLoop get() {
if (instance == null) instance = new GameLoop();

return instance;
}

@Override
public void input() {
glfwPollEvents();
}

@Override
public void update(Scene scene, double deltaTime) {
scene.update();
}

@Override
public void render(Scene scene, Render render) {
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
render.render(scene);
}

@Override
public void cleanup(Window window) {
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window.getWindow());
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... -in-opengl
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»