我目前一直在学习顶点数组和VBO的b/c,我目前了解到它比“立即”渲染更好/更快(比如使用glBegin),尽管这要容易得多。我做了一个小程序(实际上只是一个测试),它创建了一个按钮,当你将鼠标悬停在按钮上时,它会改变颜色,但是每当我启动它时,程序就会崩溃,并出现以下错误消息:
A fatal error has been detected by the Java Runtime Environment:
EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006875c490, pid=5708, tid=7148
JRE version: 7.0_21-b11
Java VM: Java HotSpot(TM) 64-Bit Server VM (23.21-b01 mixed mode windows-amd64 compressed oops)
Problematic frame:
C [atio6axx.dll+0x20c490] DrvPresentBuffers+0x1cb680
Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
An error report file with more information is saved as:
C:\Users\UserNameHere\Desktop\Java\workspace\LWJGL Tutorials\hs_err_pid5708.log
If you would like to submit a bug report, please visit:
http://bugreport.sun.com/bugreport/crash.jsp
The crash happened outside the Java Virtual Machine in native code.
See problematic frame for where to report the bug.
package testandothertutorials;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import java.nio.FloatBuffer;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public class VBOMenu {
int WIDTH = 640;
int HEIGHT = 480;
float button[] = {
//Left bottom triangle
30, 60, 0,
30, 30, 0,
60, 30, 0,
//Right top triangle
60, 30, 0,
60, 60, 0,
30, 60, 0
};
public VBOMenu() {
try {
Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
Display.setTitle("Vertex Arrays Demo");
Display.create();
} catch(LWJGLException e) {
Display.destroy();
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 640, 480, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
final int amountOfVertices = 4;
final int colorSize = 4;
final int vertexSize = 4;
FloatBuffer firstVertexData = BufferUtils.createFloatBuffer(button.length);
firstVertexData.put(button);
firstVertexData.flip();
FloatBuffer unselColorData = BufferUtils.createFloatBuffer(colorSize); //The color that will be set when the menu is launched
unselColorData.put(new float[] {0, 1, 0});
unselColorData.flip();
FloatBuffer selColorData = BufferUtils.createFloatBuffer(colorSize); //The color that will be set when the mouse hovers over the button
selColorData.put(new float[] {0, 2, 0});
selColorData.flip();
int firstVertexHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, firstVertexHandle);
glBufferData(GL_ARRAY_BUFFER, firstVertexData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
int unselColorHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, unselColorHandle);
glBufferData(GL_ARRAY_BUFFER, unselColorData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
int selColorHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, selColorHandle);
glBufferData(GL_ARRAY_BUFFER, selColorData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
boolean isRunning = true;
while(isRunning) {
glClear(GL_COLOR_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, firstVertexHandle);
glVertexPointer(vertexSize, GL_FLOAT, 0, 0l);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, amountOfVertices);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
Display.update();
Display.sync(60);
if(Display.isCloseRequested())
isRunning = false;
}
glDeleteBuffers(firstVertexHandle);
Display.destroy();
}
public static void main(String[] args) {
new VBOMenu();
}
}
这是因为你告诉OpenGL你想要使用一个颜色数组,所以当OpenGL试图使用顶点和颜色缓冲区进行渲染时,它失败了,因为你没有绑定颜色缓冲区。
这就是你所缺少的。
glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glColorPointer(vertexSize, GL_FLOAT, 0, 0l);
您需要用自己的颜色句柄id替换vbo\u color\u句柄。
另外,仅通过查看您的代码,我可以看出您并没有完全理解VBO的工作原理,因此这里有一个VBO存储三角形的顶点和颜色并进行渲染的小示例!
这是创建实际顶点和颜色缓冲区并将其绑定到VBO的代码。
int vertices = 3;
int vertex_size = 3; // X, Y, Z
int color_size = 3; // R, G, B
FloatBuffer vertex_data = BufferTools.createFloatBuffer(vertices * vertex_size);
vertex_data.put(new float[] { -1f, -1f, 0f, });
vertex_data.put(new float[] { 1f, -1f, 0f, });
vertex_data.put(new float[] { 1f, 1f, 0f, });
vertex_data.flip();
FloatBuffer color_data = BufferTools.createFloatBuffer(vertices * color_size);
color_data.put(new float[] { 1f, 0f, 0f, });
color_data.put(new float[] { 0f, 1f, 0f, });
color_data.put(new float[] { 0f, 0f, 1f, });
color_data.flip();
vbo_vertex_handle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex_handle);
glBufferData(GL_ARRAY_BUFFER, vertex_data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vbo_color_handle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glBufferData(GL_ARRAY_BUFFER, color_data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
这是渲染VBO时需要调用的代码。
glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex_handle);
glVertexPointer(vertex_size, GL_FLOAT, 0, 0l);
glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glColorPointer(color_size, GL_FLOAT, 0, 0l);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, vertices);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
经过大量的谷歌搜索,我在LWJGL渲染VBO立方体时遇到了这个问题。基本上,当我启用法线时,JVM会崩溃。这很可能与我在Plane.java中设置常态的方式有关。由于我仍在学习VBO,我似乎不知道如何解决这个问题。你能看一看,让我知道我可能在哪里出错了吗? Cube.java: 平面. java: 让我知道你们的想法。我已经在三台独立的计算机上测试了代码,每一台都有相同的结果。
我到处都找过了,我似乎无法让OpenGL绘制一个简单的四边形。窗口在正确的颜色背景下显示得很好,但OpenGL就是不会绘制框。我正在使用OpenGL 4.4.0-构建20.19.15.4463窗口大小为1920x1080 这是我目前拥有的代码: 在Main.java: 在实体框中:
我最近发现了如何使用LWJGL和OpenGL渲染3D立方体,我非常激动,我渲染了2000个立方体,并有效地冻结了我的计算机。我听说过诸如显示列表和VBO之类的东西,但即使在谷歌搜索之后,我也不知道如何使用它们。 目前,我有 渲染我的立方体。调用只是渲染一个立方体 其中cap是顶部纹理,side是侧面纹理。 我真正需要的帮助是弄清楚如何使我的代码VBO和/或显示列表兼容,以提高性能。我还认为,如果可
每次我尝试运行我的 LWJGL 应用程序时,JVM 都会崩溃。这似乎与向我的 VBO 添加多个三角形有关。 这是我的初始化代码 这是我的渲染代码 当我删除顶点数组中的最后9个值时,它工作得很好,但是如果我保留这些值,或者添加更多的值,JVM就会崩溃。
我是最新版本的OpenGL的新手,我试图通过以下教程来学习它:http://open.gl/drawing 然而,我正在使用LWJGL的最新版本,并尽最大努力将其OpenGL与教程一样使用。然而,应该绘制的白色三角形却不是。 这是我的代码: 我的着色器与本教程的着色器相同,但无论如何都会为了便于阅读而发布它们: 。蓄意杀伤 .vert 代码运行,但都是黑色的。有什么想法吗?
注意:很抱歉链接/图片只不过是文本-作为一个新用户,我不能张贴图片,也不能张贴 所以我一直在使用被弃用的OpenGL,并在几周前决定最终转向更现代的方法。我使用Open.gl作为资源(我发现LWJGL教程是不一致和稀疏的),并且能够渲染到本教程的最后一幅图像。然而,我在下一页遇到了一些严重的问题(渲染一个立方体)。 我在这个问题上做了很多研究,并多次改进/重新组织我的代码,以便完全理解每个组件的用