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();
}
}
”这个类似问题的答案揭示了LWJGL中的抗锯齿必须通过后处理来实现“它说没有这样的事情。它*用*来表示,直到有人真正知道他们在谈论什么时才删除那些无稽之谈。 –
@NicolBolas啊,是的,我明白了。在我的研究中,我发掘了一个[java-gaming.org线程](http://www.java-gaming.org/topics/lwjgl-antialiased-lines/30894/msg/285878/view.html#msg285878)多重采样,并且无法适应我的代码。我会更努力:) – Jigsawblue