当前位置: 首页 > 知识库问答 >
问题:

尝试绘制三角形时,LWJGL闪烁输出

董和风
2023-03-14

我一直在尝试使用LWJGL进入OpenGL,但遇到了一个无法解决的问题。当尝试使用下面的代码绘制三角形时,窗口会正确打开,并开始闪烁一个不一定是预期三角形的形状(有时它会短暂出现,但通常在窗口的一个象限中有矩形)。

我犹豫的部分原因是,通过我在网上阅读各种帖子和文档,OpenGL在最近的记忆中是如何改变的,以使用功能更少而更面向对象的方法(VBOs和GLSL?)用GL4。我的理解正确吗?学习这个新的OpenGL for LWJGL的首选资源是什么?

提前感谢您!

import org.lwjgl.BufferUtils;
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 Main {
  private long windowID;

  private float[] tri = {0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f};

  public static void main(String[] args) {
    new Main().run();
  }

  public void run() { // Useful for making an instance class as opposed to a static main class?
    init();
    loop();

    glfwFreeCallbacks(windowID);
    glfwDestroyWindow(windowID);

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

  public void init() { // Initializes all LWJGL components
    GLFWErrorCallback.createPrint(System.err).set(); // Create error callback route for GL

    if (!glfwInit()) { // Init GLFW
      throw new IllegalStateException("Failed to initialize GLFW!");
    } else {
      System.out.println("GLFW successfully initialized!");
    }

    windowID = glfwCreateWindow(640, 480, "Creating Window", NULL, NULL);

    if (windowID == NULL) { // Verify window creation
      throw new IllegalStateException("Failed to create window!");
    } else {
      System.out.println("Successfully created window!");
    }

    glfwDefaultWindowHints(); // Set window Proporties
    glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
    glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);

    glfwSetKeyCallback(windowID, (window, key, scancode, action, mods) -> { // Key callback for closing the window
      if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE)
        glfwSetWindowShouldClose(window, true);
    });

    try (MemoryStack stack = stackPush()) { // Center the window
      IntBuffer pWidth = stack.mallocInt(1);
      IntBuffer pHeight = stack.mallocInt(1);

      glfwGetWindowSize(windowID, pWidth, pHeight);

      GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());

      glfwSetWindowPos( // Center the window
          windowID, 
          (vidmode.width() - pWidth.get(0)) / 2,
          (vidmode.height() - pHeight.get(0)) / 2
          );
    }

    glfwMakeContextCurrent(windowID); // Make the window current
    glfwSwapInterval(0); // Sets the min num of pushed frames before buffers are swaped (Likely prevents horizontal tearing)
    glfwShowWindow(windowID); // Unhides the window
  }

  private void loop() {
    GL.createCapabilities();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // The color to clear the buffers with

    while(!glfwWindowShouldClose(windowID)) { // If the window is allowed to live
      glClear(GL_COLOR_BUFFER_BIT); // The OR is nessesary for some reason

      FloatBuffer vBuff = BufferUtils.createFloatBuffer(6);
      vBuff.put(tri);
      glEnableClientState(GL_VERTEX_ARRAY);
      glVertexPointer(2, GL_FLOAT, 0, vBuff);
      glDrawArrays(GL_TRIANGLES, 0, 6);
      glDisableClientState(GL_VERTEX_ARRAY);

      glfwSwapBuffers(windowID);
      glfwPollEvents();
    } 
  }
}

共有1个答案

顾超
2023-03-14

您错过了<code>vBuff。flip()在缓冲区装箱并填充后。

vBuff.put(tri) 将数据传输到缓冲区,从当前位置开始(在本例中为缓冲区的开始)。缓冲区位置按数据大小递增。因此,新的缓冲区位置位于新数据的末尾。

flip() 将缓冲区的极限(长度)设置为当前位置,然后将该位置设置为零。

此外,没有必要在循环中连续创建和填充缓冲区,在循环之前这样做一次就足够了:

FloatBuffer vBuff = BufferUtils.createFloatBuffer(6);
vBuff.put(tri);
vBuff.flip();

while(!glfwWindowShouldClose(windowID)) {
    glClear(GL_COLOR_BUFFER_BIT);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_FLOAT, 0, vBuff);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glDisableClientState(GL_VERTEX_ARRAY);

    glfwSwapBuffers(windowID);
    glfwPollEvents();
}
 类似资料:
  • 我们当前的任务要求我们在openGL中使用较旧的固定管道方法。我们使用的是LWJGL 2.9.3。下面的代码显示一个三角形。问题是,它会疯狂地闪烁。显示器。swapBuffers()方法不会引发异常,并且无论是否包含它都没有任何区别。我根据这个问题创建了这个示例: gluPerspective、GluViewport、gluLookAt以及GL_投影和GL_MODELVIEW矩阵 编辑 还有一件事

  • 我是最新版本的OpenGL的新手,我试图通过以下教程来学习它:http://open.gl/drawing 然而,我正在使用LWJGL的最新版本,并尽最大努力将其OpenGL与教程一样使用。然而,应该绘制的白色三角形却不是。 这是我的代码: 我的着色器与本教程的着色器相同,但无论如何都会为了便于阅读而发布它们: 。蓄意杀伤 .vert 代码运行,但都是黑色的。有什么想法吗?

  • 我试图用DXUT11画一个简单的三角形,但是我在窗口中看不到三角形。 我努力工作,但仍然找不到问题所在-_- 我检查了D3D函数的每个返回值,它们都返回了S_OK<我可以看到我的窗口显示出来,背景色是我设置为清除窗口的颜色,因此看起来d3d设备是当前创建的,并且后缓冲区被渲染到窗口,但是黄色三角形在哪里 T\u T。。。。。。。。。。。。。。。 我的代码如下:(为了简化问题,我已经删除了所有的检查

  • 本文向大家介绍用CSS绘制一个三角形相关面试题,主要包含被问及用CSS绘制一个三角形时的应答技巧和注意事项,需要的朋友参考一下

  • 手指任意点击屏幕三点,绘制三角形。 [Code4App.com]

  • 我必须在正方形上画一个三角形,带星号,预期输出如下图所示。 指令是这样的:编写一个C程序,从用户那里读取一个数字n,并允许使用“*”字符打印一个带有屋顶的房子。房子应该是一个n×n正方形和屋顶两条45度的对角线形成屋顶(如果n是奇数,屋顶在顶部完美地关闭)。我创建了一个三角形和正方形,但我不能把它们结合起来。三角形