我正在阅读一本关于 LWJGL3 的教程书,我尝试制作自己的图像加载代码(该书代码不使用 STB 库),当项目正常运行时(IntelliJ IDE,直接从build 文件夹),它将图像从 ByteBuffer 加载并stbi_load_from_memory工作正常,但是一旦编译并放入 jar 文件,它就停止工作,即使图像已成功加载到 ByteBuffer,就好像该stbi_load_from_memory函数只是如果它在 Jar 中,则返回 null。
代码:
public static ByteBuffer loadImage(String fileName, IntBuffer w,
IntBuffer h, IntBuffer comp) throws Exception
{
ByteBuffer image;
//the class name is Utils
InputStream imageFile =
Utils.class.getResourceAsStream(fileName);
//The image data gets put into the byte array no matter if
//its a jar or not
byte[] imageData = new byte[imageFile.available()];
imageFile.read(imageData);
ByteBuffer imageBuffer =
BufferUtils.createByteBuffer(imageData.length);
imageBuffer.put(imageData);
imageBuffer.flip();
//imageBuffer is the right size and …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用计算着色器写入 SSBO 并在 CPU 上读回数据。
计算着色器只是一个写入 24 个浮点的 1x1x1 玩具示例:
#version 450 core
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout (std430, binding = 0) buffer particles {
float Particle[];
};
void main() {
for (int i = 0; i < 24; ++i) {
Particle[i] = i + 1;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我运行着色器并读取数据的方式:
val bufferFlags = GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT
val bufferSize = 24 * 4
val bufferId = glCreateBuffers()
glNamedBufferStorage(bufferId, bufferSize, bufferFlags)
val mappedBuffer = glMapNamedBufferRange(bufferId, …Run Code Online (Sandbox Code Playgroud) 我想使用slick-util的教程在我的openGL应用程序之上呈现一串文本:http:// lwjgl.org/wiki/index.php?title=Slick-Util_Library_-_Part_3_-_TrueType_Fonts_for_LWJGL
这是我的初始代码:
private void init() {
try {
Display.setDisplayMode(new DisplayMode(640, 480));
Display.setVSyncEnabled(true);
Display.setTitle(this.windowTitle);
Display.create();
Keyboard.create();
} catch (LWJGLException e) {
Sys.alert("Error", "Initialization failed!\n\n" + e.getMessage());
System.exit(0);
}
/* OpenGL */
int width = Display.getDisplayMode().getWidth();
int height = Display.getDisplayMode().getHeight();
GL11.glViewport(0, 0, width, height); // Reset The Current Viewport
GL11.glMatrixMode(GL11.GL_PROJECTION); // Select The Projection Matrix
GL11.glLoadIdentity(); // Reset The Projection Matrix
GLU.gluPerspective(45.0f, ((float) width / (float) height), 0.1f, 100.0f); // Calculate The Aspect Ratio Of The Window
GL11.glMatrixMode(GL11.GL_MODELVIEW); // Select The …Run Code Online (Sandbox Code Playgroud) 我是LWJGL/OpenGL的新手,我遇到过这个问题,无法解决,无论我尝试什么:
当我在屏幕上绘制多个立方体时,无论多维数据集与"相机"的距离有多远,它在点亮时都会达到相同的亮度.这意味着当我在屏幕上绘制大量立方体时,它们会获得相同数量的光线并且看起来很奇怪.
我的源代码:http://pastebin.com/qd5dsZ89
如何修复它以使光线在所有区域中混合而不会突然中断?
我在命令行中使用java并在gedit中编码,但导入lwjgl时遇到问题.
我的源代码在src/uk/co/gossfunkel下,并且lib> jars中的lwjgl.jar和lib> natives下的本机.如何让编译器知道该import org.lwjgl.*;语句引用了lib> jars中的org.lwjgl?
我正在尝试使用顶点缓冲区对象.
起初,在我遇到这种令人讨厌的情况之前没有任何问题:
glPointSize(2.0f);
glBegin(GL_POINTS);
for (Entity p : points) {
glVertex3f(p.x, p.y, p.z);
}
glEnd();
Run Code Online (Sandbox Code Playgroud)
如何将其转换为Vertex缓冲区对象渲染?
我的意思是,你可以看到,数据(x,y,z)每次都为每个点改变(它是一个循环).
那么我如何实现Vertex缓冲区对象渲染呢?
所以我一直想知道如何在lwjgl中更改openGL版本..我知道我可以用维基上的PixelFormat和ContextAttribs更改版本 http://lwjgl.org/wiki/index.php?title=Version_selection
但是如果我想把它降到更低的话,那只能把我降到最低3.2?喜欢2.1甚至1.1?有没有办法做到这一点?
我想弄清楚在渲染简单方块时openGL(LWJGL)和swing之间有什么区别.不出所料,openGL赢了,但在某些测试中,结果很接近,甚至有利于摆动.为什么会这样?
我的测试结果:
Testing for a total of 500000 rectangles
Swing time: 0.16367821
OpenGL time: 0.06317429
OpenGL relative to SWING is faster by 159.0899%
Testing for a total of 750000 rectangles
OpenGL time: 0.066062525
Swing time: 0.16988374
OpenGL relative to SWING is faster by 157.156%
Testing for a total of 1000000 rectangles
OpenGL time: 0.0907693
Swing time: 0.15694521
OpenGL relative to SWING is faster by 72.90561%
Testing for a total of 1250000 rectangles
OpenGL time: 0.09591239
Swing time: 0.17011923
OpenGL relative …Run Code Online (Sandbox Code Playgroud) 我试图实现位图字体渲染.唯一令我困惑的是,我必须在这里问一下,当我为每个焦点绘制四边形时,每次渲染一个新的四边形时,UV都绝对会被破坏.如果我只渲染一个四边形,一切都OK.
(瓦片x = 3,y = 4)
这是多少字母的样子.

这是我的代码来渲染这些东西:
...
rc.translate(getTransform().getPos());
drawTileAt(3, 4);
rc.translate(100, 0, 0);
drawTileAt(5, 5);
rc.translate(200, 0, 0);
drawTileAt(2,6);
rc.translate(300,0,0);
drawTileAt(1, 7);
...
public void drawTileAt(int x, int y)
{
float w = 1f / 16f;
float _x = 1f / 16f * x;
float _y = 1f / 16f * y;
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(0, 100);GL11.glTexCoord2f(_x,_y);
GL11.glVertex2f(0, 0);GL11.glTexCoord2f(_x + w,_y);
GL11.glVertex2f(100,0);GL11.glTexCoord2f(_x + w,_y + w);
GL11.glVertex2f(100, 100);
GL11.glTexCoord2f(_x,_y + w);
GL11.glEnd();
}
Run Code Online (Sandbox Code Playgroud)
我也用tex-coords绘制VBO四边形,一切看起来都很好......
假设我的屏幕是(800*600)并且我使用Triangle_Strip(在NDC中)使用以下顶点位置绘制了Quad(2D ):
float[] vertices = {-0.2f,0.2f,-0.2f,-0.2f,0.2f,0.2f,0.2f,-0.2f};
Run Code Online (Sandbox Code Playgroud)
我以这种方式设置了转换矩阵:
Vector2f position = new Vector2f(0,0);
Vector2f size = new Vector2f(1.0f,1.0f);
Matrix4f tranMatrix = new Matrix4f();
tranMatrix.setIdentity();
Matrix4f.translate(position, tranMatrix, tranMatrix);
Matrix4f.scale(new Vector3f(size.x, size.y, 1f), tranMatrix, tranMatrix);
Run Code Online (Sandbox Code Playgroud)
我的顶点着色器:
#version 150 core
in vec2 in_Position;
uniform mat4 transMatrix;
void main(void) {
gl_Position = transMatrix * vec4(in_Position,0,1.0);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我应该使用哪个公式来修改我的四边形的坐标转换(以像素为单位)?
例如 :
- 设置比例:(50px,50px)=>Vector2f(width,height)
- 设置位置:(100px,100px)=>Vector2f(x,y)
为了更好地理解,我将创建一个函数将我的像素数据转换为NDC,将它们发送到顶点着色器旁边.我被建议使用正交投影,但我不知道如何正确创建它,你可以看到我的顶点着色器我不使用任何投影矩阵.谢谢 !
这是一个类似于我的主题,但不是很清楚:
我按照公式创建了我的正交投影矩阵但似乎没有出现,这是我继续进行的方式:
public static Matrix4f glOrtho(float left, float right, float bottom, …Run Code Online (Sandbox Code Playgroud)