Я использую LWJGL 3 и пытаюсь сделать 2 треугольника, чтобы сделать прямоугольник. Фон и все остальное работает, но треугольники просто не появляются, и я не могу понять, почему.
Ниже приведена основная игра l oop:
public class MainGameLoop {
public static void main(String[] args) {
// Creates the display window
DisplayManager.createDisplay();
Loader loader = new Loader();
Renderer renderer = new Renderer();
float[] vertices = {
// Left bottom triangle
-0.5f, 0.5f, 0f,
-0.5f, -0.5f, 0f,
0.5f, -0.5f, 0f,
// Right top triangle
0.5f, -0.5f, 0f,
0.5f, 0.5f, 0f,
-0.5f, 0.5f, 0f
};
RawModel model = loader.loadToVAO(vertices);
while (!DisplayManager.isCloseRequested()) {
renderer.prepare();
renderer.render(model);
DisplayManager.updateDisplay();
}
// Once the red X has been pressed
loader.cleanUp();
DisplayManager.closeDisplay();
}
}
Вот displayManager
, loader
, rawModel
и классы рендеринга:
public class DisplayManager {
private static final int WIDTH = 1280;
private static final int HEIGHT = 720;
private static final int FPS = 120;
private static GLFWErrorCallback errorCallback;
private static long windowId;
public static void createDisplay() {
glfwSetErrorCallback(errorCallback = GLFWErrorCallback.createPrint(System.err));
if (!glfwInit()) {
throw new IllegalStateException("GLFW init failed.");
}
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
windowId = glfwCreateWindow(WIDTH, HEIGHT, "LWJGL demo", MemoryUtil.NULL, MemoryUtil.NULL);
if (windowId == MemoryUtil.NULL) {
throw new IllegalStateException("Window failed.");
}
// link GLFW context
glfwMakeContextCurrent(windowId);
GL.createCapabilities();
glfwSwapInterval(1); // passing 1 enables Vsync
glfwShowWindow(windowId);
}
public static void updateDisplay() {
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(windowId); // swaps front and back frame buffers
glfwPollEvents(); // checks mouse and keyboard input
}
public static void closeDisplay() {
// Closes the game window
glfwDestroyWindow(windowId);
glfwTerminate();
}
public static boolean isCloseRequested() {
return (glfwWindowShouldClose(windowId));
}
}
public class Loader {
private List<Integer> vaos = new ArrayList<Integer>();
private List<Integer> vbos = new ArrayList<Integer>();
public RawModel loadToVAO(float[] positions){
int vaoId = createVAO();
storeDataInAttributeList(0, positions);
unbindVAO();
return new RawModel(vaoId, positions.length/3); // divided by three as there are three values to a vertex coordinate (x, y, z)
}
public void cleanUp(){
for(int vao:vaos){
GL30.glDeleteVertexArrays(vao);
}
for(int vbo:vbos){
GL15.glDeleteBuffers(vbo);
}
}
private int createVAO(){
int vaoId = GL30.glGenVertexArrays();
vaos.add(vaoId);
GL30.glBindVertexArray(vaoId);
return vaoId;
}
private void storeDataInAttributeList(int attributeNumber, float[] data){
int vboId = GL15.glGenBuffers();
vbos.add(vboId);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
FloatBuffer buffer = storeDataInFloatBuffer(data);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); // store the data into the vbo
GL20.glVertexAttribPointer(attributeNumber, 3, GL11.GL_FLOAT, false, 0, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); // finished using VBO, so unbind
}
private void unbindVAO(){
GL30.glBindVertexArray(0); // passing 0 unbinds the currently bound VAO
}
private FloatBuffer storeDataInFloatBuffer(float[] data){
FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
buffer.put(data);
buffer.flip(); // changes buffer from being written to to being read from
return buffer;
}
}
public class RawModel {
private int vaoId;
private int vertexCount;
public RawModel(int vaoId, int vertexCount){
this.vaoId = vaoId;
this.vertexCount = vertexCount;
}
public int getVaoId() {
return vaoId;
}
public int getVertexCount() {
return vertexCount;
}
}
public class Renderer {
public void prepare(){
GL11.glClearColor(0, 232, 252, 1);
}
public void render(RawModel model){
GL30.glBindVertexArray(model.getVaoId()); // bind the VAO for the related model
GL20.glEnableVertexAttribArray(0); // activate attribute list for the model's VAO
GL11.glDrawArrays(GL11.GL_TRIANGLE_FAN, 0, model.getVertexCount()); // render
GL20.glDisableVertexAttribArray(0);
GL30.glBindVertexArray(0); //unbind VAO
}
}
В вышеприведенном рендере метод prepare устанавливает цвет фона, и он определенно работает, однако треугольник не появляется. Спасибо за любые исправления, идеи или общие указания.