到目前为止,我已经创建了一个窗口和一个将图像绘制到窗口的方法。但是,当我在渲染函数中调用它来绘制屏幕时;它什么都不做,只是显示一个黑屏。
这是我的密码:
package io.rkshah;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryUtil.NULL;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import javax.imageio.ImageIO;
import org.lwjgl.BufferUtils;
import org.lwjgl.glfw.GLFWVidMode; // again used for primary monitor stuff.
import org.lwjgl.opengl.GL;
public class PixelGame implements Runnable
{
public static final String TITLE = "PixelGame";
private Thread mainThread;
private boolean isRunning = true;
private long window;
private int width = 600, height = 400;
public void start() {
isRunning = true;
mainThread = new Thread(this, TITLE);
mainThread.start();
}
public void init() {
if(glfwInit() != GL_TRUE)
System.err.println("GLFW initialization failed!");
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
window = glfwCreateWindow(width, height, TITLE, NULL, NULL);
if(window == NULL)
System.err.println("Could not create our Window!");
GLFWVidMode vidMode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(window, (vidMode.width() / 2) - (width / 2), (vidMode.height() / 2) - (height / 2));
glfwMakeContextCurrent(window);
glfwShowWindow(window);
GL.createCapabilities();
}
public void update() {
glfwPollEvents(); // Polls for window events such as closing
}
public void render() {
drawBackgroundLayer();
glfwSwapBuffers(window); // Swaps out our buffers
}
@Override
public void run() {
init();
while(isRunning) {
update();
render();
if(glfwWindowShouldClose(window) == GL_TRUE)
isRunning = false;
}
}
public void drawBackgroundLayer() {
BufferedImage img = null;
try {
img = ImageIO.read(new File("res/bg.png"));
drawImage(img);
} catch(IOException e) {
e.printStackTrace();
}
}
public void drawImage(BufferedImage image) {
int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4); // 4 bytes per pixel for rgba
for(int y = 0; y < image.getHeight(); y++) {
for(int x = 0; x < image.getWidth(); x++) {
int pixel = pixels[y * image.getWidth() + x];
buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component
buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component
buffer.put((byte) (pixel & 0xFF)); // Blue component
buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component
}
}
buffer.flip(); // Flip the byte buffer for OpenGL
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
}
public static void main(String args[]) {
PixelGame pg = new PixelGame();
pg.start();
}
}
我所有的导入工作和图像肯定是在那里,否则会抛出一个错误。
1条答案
按热度按时间8aqjt8rx1#
你试过创建一个四边形,纹理你的图像,然后渲染你的图像吗?我会先创建一个空白的四边形。接下来,我将图像绑定到四边形。以下是我用于呈现GUI的代码,大致上是相同的概念:
以下是我引用的加载程序:
Package 所有必要渲染信息的GuitTexture如下所示:
为了让它渲染,我使用以下方法:
我将在此处将链接附加到我的着色器:顶点:https://github.com/dragonslayer0531/luminos/blob/master/res/shaders/gui.vert 碎片:https://github.com/dragonslayer0531/luminos/blob/master/res/shaders/gui.frag
我的整个项目位于这里,如果你想参考它在未来。正在改进文档,很抱歉。
https://github.com/dragonslayer0531/luminos