立方体无法正确渲染

时间:2017-09-24 10:54:20

标签: java opengl 3d lwjgl

所以我使用LWJGL3并试图渲染一个立方体,但是我有两个问题:

  • 正交相机太近了,我尝试增加/减少参数中的值,但没有达到我想要的效果,最终显示大量并排堆叠的立方体,因此需要缩小,< / LI>
  • 立方体在2D中渲染,我希望它最初看起来是2D但是我会使用键来旋转相机,这样你也可以获得3D视图。

这是我到目前为止的代码:

package io.ryankshah;

import io.ryankshah.util.Constants;
import org.lwjgl.*;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.*;
import java.nio.*;
import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;

public class Window
{
    // Create a keycallback to check for key actions
    private static GLFWKeyCallback keyCallback = new GLFWKeyCallback()
    {
        @Override
        public void invoke(long window, int key, int scancode, int action, int mods) {
            // If ESC is pressed, close the window
            if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
                glfwSetWindowShouldClose(window, true);
        }
    };

    private static long window;

    private static void init() {
        glfwSetErrorCallback(Constants.ERROR_CALLBACK);

        // Initialize GLFW
        if(!glfwInit()) throw new IllegalStateException("Failed to initialize GLFW");

        // Create window
        window = glfwCreateWindow(Constants.WINDOW_WIDTH, Constants.WINDOW_HEIGHT,
                Constants.WINDOW_TITLE, 0, 0);
        if(window == 0) {
            glfwTerminate();
            throw new RuntimeException("Failed to create the GLFW window");
        }

        // Center the window
        GLFWVidMode vm = glfwGetVideoMode(glfwGetPrimaryMonitor());
        glfwSetWindowPos(window, (vm.width() - Constants.WINDOW_WIDTH) / 2,
                (vm.height() - Constants.WINDOW_HEIGHT) / 2);

        // Create OpenGL context
        glfwMakeContextCurrent(window);
        GL.createCapabilities();

        // Enbale vsync
        glfwSwapInterval(1);

        // Set key callback
        glfwSetKeyCallback(window, keyCallback);
    }

    private static void render() {
        /* Declare buffers for using inside the loop */
        IntBuffer width = MemoryUtil.memAllocInt(1);
        IntBuffer height = MemoryUtil.memAllocInt(1);

        /* Loop until window gets closed */
        while (!glfwWindowShouldClose(window)) {
            float ratio;

            /* Get width and height to calcualte the ratio */
            glfwGetFramebufferSize(window, width, height);
            ratio = width.get() / (float) height.get();

            /* Rewind buffers for next get */
            width.rewind();
            height.rewind();

            /* Set viewport and clear screen */
            glViewport(0, 0, width.get(), height.get());
            glClear(GL_COLOR_BUFFER_BIT);

            /* Set ortographic projection */
            float zoom = 50.0f;
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glOrtho(-ratio, ratio, -1f, 1f, 1f, -1f);
            glMatrixMode(GL_MODELVIEW);

            /* Rotate matrix */
            glLoadIdentity();
            glRotatef((float) glfwGetTime() * 50f, 0f, 0f, 1f);

            GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT);
            GL11.glEnable(GL11.GL_DEPTH_TEST);
            GL11.glColor3f(1, 0, 0);
            GL11.glBegin(GL11.GL_QUADS);
            GL11.glColor3f(0.0f,1.0f,0.0f);          // Set The Color To Green
            GL11.glVertex3f( 1.0f, 1.0f,-1.0f);          // Top Right Of The Quad (Top)
            GL11.glVertex3f(-1.0f, 1.0f,-1.0f);          // Top Left Of The Quad (Top)
            GL11.glVertex3f(-1.0f, 1.0f, 1.0f);          // Bottom Left Of The Quad (Top)
            GL11.glVertex3f( 1.0f, 1.0f, 1.0f);          // Bottom Right Of The Quad (Top)
            GL11.glColor3f(1.0f,0.5f,0.0f);          // Set The Color To Orange
            GL11.glVertex3f( 1.0f,-1.0f, 1.0f);          // Top Right Of The Quad (Bottom)
            GL11.glVertex3f(-1.0f,-1.0f, 1.0f);          // Top Left Of The Quad (Bottom)
            GL11.glVertex3f(-1.0f,-1.0f,-1.0f);          // Bottom Left Of The Quad (Bottom)
            GL11.glVertex3f( 1.0f,-1.0f,-1.0f);          // Bottom Right Of The Quad (Bottom)
            GL11.glColor3f(1.0f,0.0f,0.0f);          // Set The Color To Red
            GL11.glVertex3f( 1.0f, 1.0f, 1.0f);          // Top Right Of The Quad (Front)
            GL11.glVertex3f(-1.0f, 1.0f, 1.0f);          // Top Left Of The Quad (Front)
            GL11.glVertex3f(-1.0f,-1.0f, 1.0f);          // Bottom Left Of The Quad (Front)
            GL11.glVertex3f( 1.0f,-1.0f, 1.0f);          // Bottom Right Of The Quad (Front)
            GL11.glColor3f(1.0f,1.0f,0.0f);          // Set The Color To Yellow
            GL11.glVertex3f( 1.0f,-1.0f,-1.0f);          // Bottom Left Of The Quad (Back)
            GL11.glVertex3f(-1.0f,-1.0f,-1.0f);          // Bottom Right Of The Quad (Back)
            GL11.glVertex3f(-1.0f, 1.0f,-1.0f);          // Top Right Of The Quad (Back)
            GL11.glVertex3f( 1.0f, 1.0f,-1.0f);          // Top Left Of The Quad (Back)
            GL11.glColor3f(0.0f,0.0f,1.0f);          // Set The Color To Blue
            GL11.glVertex3f(-1.0f, 1.0f, 1.0f);          // Top Right Of The Quad (Left)
            GL11.glVertex3f(-1.0f, 1.0f,-1.0f);          // Top Left Of The Quad (Left)
            GL11.glVertex3f(-1.0f,-1.0f,-1.0f);          // Bottom Left Of The Quad (Left)
            GL11.glVertex3f(-1.0f,-1.0f, 1.0f);          // Bottom Right Of The Quad (Left)
            GL11.glColor3f(1.0f,0.0f,1.0f);          // Set The Color To Violet
            GL11.glVertex3f( 1.0f, 1.0f,-1.0f);          // Top Right Of The Quad (Right)
            GL11.glVertex3f( 1.0f, 1.0f, 1.0f);          // Top Left Of The Quad (Right)
            GL11.glVertex3f( 1.0f,-1.0f, 1.0f);          // Bottom Left Of The Quad (Right)
            GL11.glVertex3f( 1.0f,-1.0f,-1.0f);          // Bottom Right Of The Quad (Right)
            GL11.glEnd();
            GL11.glLoadIdentity();

            /* Swap buffers and poll Events */
            glfwSwapBuffers(window);
            glfwPollEvents();

            /* Flip buffers for next loop */
            width.flip();
            height.flip();
        }

        MemoryUtil.memFree(width);
        MemoryUtil.memFree(height);
    }

    private static void loop() {
        render();
    }

    public static void main(String[] args) {
        init();
        loop();

        glfwDestroyWindow(window);
        keyCallback.free();

        glfwTerminate();
        Constants.ERROR_CALLBACK.free();
    }
}

此外,如果有人指出我构建程序的方式或任何不必要的调用,那么对于我应该如何构建我的lwjgl程序有一些了解锅炉板的知识会很棒。

0 个答案:

没有答案