Я пытаюсь запрограммировать простую игру на 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
Квадрат не отображается в OpenGL ⇐ JAVA
Программисты JAVA общаются здесь
1761386698
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());
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79783378/square-not-rendered-in-opengl[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия