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

显示屏上闪烁的黑白条纹

江宏放
2023-03-14

我在Eclipse中导入了lwjgl。老师也给了我们一个BaseWindow应用程序来导入Eclipse。应用程序应显示1024x768黑色窗口。但我看到的不是黑色的窗口,而是黑白条纹在显示屏上闪烁。截图:http://i.stack.imgur.com/JHsMC.png我无法显示条纹的图片,因为它们在屏幕截图上不可见。但还有一个明显的错误。

这是BaseWindow的源代码。java文件:

import org.lwjgl.*;
import org.lwjgl.opengl.*;
import org.lwjgl.input.*;
import java.nio.*;

public class BaseWindow
{

  protected static boolean isRunning = false;

  public static void main(String[] args)
  {
    // What version of OpenGL is supported?

    // Start our program
    (new BaseWindow()).execute();
  }

  /**
   * Initializes display and enters main loop
   */
  protected void execute()
  {
    try
    {
      initDisplay();
    } catch (LWJGLException e)
    {
      System.err.println("Can't open display.");
      System.exit(0);
    }

    BaseWindow.isRunning = true;
    mainLoop();
    Display.destroy();
  }

  /**
   * Main loop: renders and processes input events
   */
  protected void mainLoop()
  {
    // setup camera and lights
    setupView();

    while (BaseWindow.isRunning)
    {
      // reset view
      resetView();

      // let subsystem paint
      renderFrame();

      // process input events
      processInput();

      // update window contents and process input messages
      Display.update();
    }
  }

  /**
   * Initial setup of projection of the scene onto screen, lights, etc.
   */
  protected void setupView()
  {

  }

  /**
   * Resets the view of current frame
   */
  protected void resetView()
  {

  }

  /**
   * Renders current frame
   */
  protected void renderFrame()
  {
  }

  /**
   * Processes Keyboard and Mouse input and spawns actions
   */
  protected void processInput()
  {
    if (Display.isCloseRequested() || Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
    {
      BaseWindow.isRunning = false;
    }
  }

  /**
   * Finds best 1024x768 display mode and sets it
   * 
   * @throws LWJGLException
   */
  protected void initDisplay() throws LWJGLException
  {
    DisplayMode bestMode = null;
    DisplayMode[] dm = Display.getAvailableDisplayModes();
    for (int nI = 0; nI < dm.length; nI++)
    {
      DisplayMode mode = dm[nI];
      System.out.println(mode.getFrequency() + " " + mode.getWidth() + " " + mode.getHeight());
      if (mode.getWidth() == 1024 && mode.getHeight() == 768
          && mode.getFrequency() <= 85)
      {
        if (bestMode == null
            || (mode.getBitsPerPixel() >= bestMode.getBitsPerPixel() && mode
                .getFrequency() > bestMode.getFrequency()))
          bestMode = mode;
      }
    }
    System.out.println("Best\n" + bestMode.getFrequency() + " " + bestMode.getWidth() + " " + bestMode.getHeight());
    Display.setDisplayMode(bestMode);
//    FSAA
    Display.create(new PixelFormat(8, 8, 8, 4));
//    No FSAA
//    Display.create();
    Display.setTitle(this.getClass().getName());

    System.out.println("GL_VERSION: "+GL11.glGetString(GL11.GL_VERSION));
    System.out.println("GL_VENDOR: "+GL11.glGetString(GL11.GL_VENDOR));
    System.out.println("GL_RENDERER: "+GL11.glGetString(GL11.GL_RENDERER));
  }

  /**
   * Utils for creating native buffers
   * 
   * @throws LWJGLException
   */
  public static ByteBuffer allocBytes(int howmany)
  {
    return ByteBuffer.allocateDirect(howmany).order(ByteOrder.nativeOrder());
  }

  public static IntBuffer allocInts(int howmany)
  {
    return ByteBuffer.allocateDirect(howmany).order(ByteOrder.nativeOrder())
    .asIntBuffer();
  }

  public static FloatBuffer allocFloats(int howmany)
  {
    return ByteBuffer.allocateDirect(howmany).order(ByteOrder.nativeOrder())
    .asFloatBuffer();
  }

  public static ByteBuffer allocBytes(byte[] bytearray)
  {
    ByteBuffer bb = ByteBuffer.allocateDirect(bytearray.length * 1).order(
        ByteOrder.nativeOrder());
    bb.put(bytearray).flip();
    return bb;
  }

  public static IntBuffer allocInts(int[] intarray)
  {
    IntBuffer ib = ByteBuffer.allocateDirect(intarray.length * 4).order(
        ByteOrder.nativeOrder()).asIntBuffer();
    ib.put(intarray).flip();
    return ib;
  }

  public static FloatBuffer allocFloats(float[] floatarray)
  {
    FloatBuffer fb = ByteBuffer.allocateDirect(floatarray.length * 4).order(
        ByteOrder.nativeOrder()).asFloatBuffer();
    fb.put(floatarray).flip();
    return fb;
  }
}

这个应用程序对每个人都很有效,除了我。老师没能帮助我。

我的电脑:

>

  • MacBook Pro(2011年底)
  • AMD Radeon HD6750M512 MB
  • 10.8.2(12C60)

    GL_版本:2.1 ATI-1.0.29

    有人有什么想法吗?可能出了什么问题?

  • 共有2个答案

    缑高朗
    2023-03-14

    在开始渲染之前调用GL11.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    陶星渊
    2023-03-14

    您似乎没有在任何时候清除帧缓冲区(通过glClear())。在这种情况下,GL实现完全允许给你垃圾。

     类似资料:
    • 这是我的代码,请记住,我在几天前学习了python,所以我的代码可能制作不正确,等等。我正在尝试制作一个窗口,该窗口将显示一些文本(测试版),并将显示两个小矩形,我想成为按钮。

    • 因此,我正在制作一个游戏,在60秒结束时,我想让屏幕改变颜色并显示一些结束文本。我这样设置计时器: 屏幕上显示的很好,但是当结束屏幕出现时,它会在原来的白色屏幕和结束屏幕之间闪烁。由于某种原因,如果我在屏幕上挥动鼠标,它不会闪烁。 “end”是我的游戏中的文本变量 如果这有帮助的话,这也是我在结尾的部分 有没有一种方法可以使它稳定地出现,而不必更改计时器?

    • 实现屏幕闪烁效果,有点类似拍照闪烁时的flash light。 [Code4App.com]

    • 我试图通过Jenkins在UBUNTU AWS/VM上使用XVFB执行无头铬硒测试。 预构建执行外壳程序: 当构建开始时,我看到: 最后: 现在,通过 MAC 上的终端,我使用 命令连接到 VM。 并使用 VNC 查看器,我正在连接到本地主机:5900。它连接了,但我只看到一个黑屏。我期待屏幕上的Chrome浏览器窗口。 我该如何解决这个问题并在vncviewer上观看Chrome window?

    • 我目前正在为我的libgdx游戏开发一个简单的加载屏幕,但是它有一个问题。加载屏幕完美地工作在android项目,但当它涉及到桌面版本它不工作。目前,加载屏幕应该显示“加载”- 渲染(浮点增量)函数: 以及show()函数: 最终解决方案:更改渲染()函数:公共无效渲染(浮点增量){

    • 我正在使用LWJGL 2.8.5开发一个3D可视化应用程序。在阅读了项目主页上的第一个教程后,我还阅读了一本OpenGL书籍,进行了更深入的分析。我看到OpenGL中的典型过程是在init函数中绘制场景,然后简单地在一个循环中调用显示的更新。 但是,当我尝试使用LWJGL时,我在显示屏中得到了闪烁效果。消除闪烁的唯一方法是在显示更新周期中重绘场景。为什么会发生这种情况? 为了更好地解释我的问题,我