2015-12-22 46 views
1

我正在试图在LWJGL 3中绘制一个抗锯齿的方块。我只绘制2D精灵并且我没有绘制纹理。 This对类似问题的回答表明,LWJGL中的消除锯齿必须通过后期处理来实现,但实际上并没有给出示例或任何资源来说明如何实现此目的。下面是一些代码的例子。 This is what is rendered on screen from the code.请告诉我如何修改此代码以使抗锯齿成为可能。LWJGL 3中的抗锯齿3

import java.nio.FloatBuffer; 
import java.nio.IntBuffer; 

import org.lwjgl.*; 
import org.lwjgl.glfw.*; 
import org.lwjgl.opengl.*; 

import static org.lwjgl.glfw.GLFW.*; 
import static org.lwjgl.opengl.GL11.*; 
import static org.lwjgl.system.MemoryUtil.*; 
import static org.lwjgl.opengl.GL15.*; 

public class LWJGLTest { 

    private GLFWErrorCallback errorCallback; 
    private GLFWKeyCallback keyCallback; 

    private long window; 

    public void run() { 

     try { 
      init(); 
      loop(); 

      glfwDestroyWindow(window); 
      keyCallback.release(); 
     } finally { 

      glfwTerminate(); 
      errorCallback.release(); 
     } 
    } 

    int WIDTH = 300; 
    int HEIGHT = 300; 

    private void init() { 

     glfwSetErrorCallback(errorCallback = GLFWErrorCallback.createPrint(System.err)); 

     if (glfwInit() != GLFW_TRUE) 
      throw new IllegalStateException("Unable to initialize GLFW"); 

     glfwDefaultWindowHints(); 
     glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); 
     glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); 

     window = glfwCreateWindow(WIDTH, HEIGHT, "Hello World!", NULL, NULL); 
     if (window == NULL) 
      throw new RuntimeException("Failed to create the GLFW window"); 

     glfwSetKeyCallback(window, keyCallback = new GLFWKeyCallback() { 
      @Override 
      public void invoke(long window, int key, int scancode, int action, int mods) { 
       if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) 
        glfwSetWindowShouldClose(window, GLFW_TRUE); 
      } 
     }); 

     GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); 

     glfwSetWindowPos(
      window, 
      (vidmode.width() - WIDTH)/2, 
      (vidmode.height() - HEIGHT)/2 
     ); 

     glfwMakeContextCurrent(window); 
     glfwSwapInterval(1); 

     glfwShowWindow(window); 
    } 

    private void loop() { 
     GL.createCapabilities(); 

     glClearColor(1.0f, 1.0f, 1.0f, 0.0f); 

     while (glfwWindowShouldClose(window) == GLFW_FALSE) { 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

      draw(); 

      glfwSwapBuffers(window); 

      glfwPollEvents(); 
     } 
    } 

    private static void draw(){ 

     int vertices = 4; 
     int colorSize = 3; 
     int vertexSize = 3; 

     FloatBuffer cBuffer = BufferUtils.createFloatBuffer(vertices * colorSize); 
     cBuffer.put(0).put(0).put(0); 
     cBuffer.put(0).put(0).put(0); 
     cBuffer.put(0).put(0).put(0); 
     cBuffer.put(0).put(0).put(0); 
     cBuffer.flip(); 

     FloatBuffer vBuffer = BufferUtils.createFloatBuffer(vertices * vertexSize); 
     vBuffer.put(0.4056f).put(0.5792f).put(0.0f); 
     vBuffer.put(-0.5792f).put(0.4056f).put(0.0f); 
     vBuffer.put(-0.4056f).put(-0.5792f).put(0.0f); 
     vBuffer.put(0.5792f).put(-0.4056f).put(0.0f); 
     vBuffer.flip(); 



     IntBuffer ib = BufferUtils.createIntBuffer(2); 

     glGenBuffers(ib); 

     int vHandle = ib.get(0); 
     int cHandle = ib.get(1); 

     glEnableClientState(GL_VERTEX_ARRAY); 
     glEnableClientState(GL_COLOR_ARRAY); 

     glBindBuffer(GL_ARRAY_BUFFER, vHandle); 
     glBufferData(GL_ARRAY_BUFFER, vBuffer, GL_STATIC_DRAW); 
     glVertexPointer(vertexSize, GL_FLOAT, vertexSize*4, 0); 

     glBindBuffer(GL_ARRAY_BUFFER, cHandle); 
     glBufferData(GL_ARRAY_BUFFER, cBuffer, GL_STATIC_DRAW); 
     glColorPointer(colorSize, GL_FLOAT, colorSize*4, 0); 

     glDrawArrays(GL_POLYGON, 0, vertices); 

     glBindBuffer(GL_ARRAY_BUFFER, 0); 

     glDisableClientState(GL_COLOR_ARRAY); 
     glDisableClientState(GL_VERTEX_ARRAY); 

     ib.put(0, vHandle); 
     ib.put(1, cHandle); 
     glDeleteBuffers(ib); 

    } 

    public static void main(String[] args){ 

     new LWJGLTest().run(); 

    } 

} 
+0

”这个类似问题的答案揭示了LWJGL中的抗锯齿必须通过后处理来实现“它说没有这样的事情。它*用*来表示,直到有人真正知道他们在谈论什么时才删除那些无稽之谈。 –

+0

@NicolBolas啊,是的,我明白了。在我的研究中,我发掘了一个[java-gaming.org线程](http://www.java-gaming.org/topics/lwjgl-antialiased-lines/30894/msg/285878/view.html#msg285878)多重采样,并且无法适应我的代码。我会更努力:) – Jigsawblue

回答

2

您可以启用多重采样(MSAA)在GLFW这应该给你你想要的效果。使用查找GL_SAMPLES就可以了。

例如

glfwWindowHint(GLFW_STENCIL_BITS, 4); 
glfwWindowHint(GLFW_SAMPLES, 4); 

在创建窗口之前。 “