使用 VBO 使用 LWJGL 对 3D 立方体进行纹理处理
Posted
技术标签:
【中文标题】使用 VBO 使用 LWJGL 对 3D 立方体进行纹理处理【英文标题】:Texturing 3D cubes with LWJGL using VBOs 【发布时间】:2013-12-29 20:17:25 【问题描述】:我在使用 OpenGL 时遇到了一个大问题。我试图得到一个简单的盒子来渲染纹理。然而,即使是这个应该只是绘制框的代码也会崩溃。如何使用 VBO 向 3D 框添加纹理以及如何让此代码不崩溃?
class Box
Location start, end;
...... More Code Here .....
public Location[] getVertices()
return new Location[]
start, new Location(start).add(width, 0, 0),
new Location(start).add(0, 0, depth), new Location(start).add(width, 0, depth),
end, new Location(end).subtract(width, 0, 0),
new Location(end).subtract(0, 0, depth), new Location(end).subtract(width, 0, depth)
;
public void draw()
Location[] vertices = getVertices();
FloatBuffer verts = BufferUtils.createFloatBuffer(vertices.length * 3);
for(Location l : vertices)
verts.put(l.toArray());
int vertHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vertHandle);
glBufferData(GL_ARRAY_BUFFER, verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glDrawArrays(GL_QUADS, 0, 4);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
编辑: 这是位置类。
public class Location
public float x, y, z;
//.......... Code here.......
public Location(Location l)
this.x = l.x;
this.y = l.y;
this.z = l.z;
public Location(float x, float y, float z)
this.x = x;
this.y = y;
this.z = z;
//... Code here.......
// Sets
public Location add(Location l)
this.x += l.x;
this.y += l.y;
this.z += l.z;
return this;
public Location add(float x, float y, float z)
this.x += x;
this.y += y;
this.z += z;
return this;
// Sets
public Location subtract(Location l)
this.x -= l.x;
this.y -= l.y;
this.z -= l.z;
return this;
public Location subtract(float x, float y, float z)
this.x -= x;
this.y -= y;
this.z -= z;
return this;
//..Code Here.....
public float[] toArray()
return new float[]
x, y, z
;
//... Code Here....
编辑:这是我的 initGL() 方法:
void initGL()
// Initialize OpenGL
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, Display.getWidth(), Display.getHeight());
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Enable Depth Testing
glEnable(GL_DEPTH_TEST);
// Enable client states
//glEnableClientState(GL_VERTEX_ARRAY); Do I need this???
//glEnableClientState(GL_COLOR_ARRAY);
// Are these right for drawing textures?
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// enable alpha blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
这是我的 renderGL() 方法:
public void renderGL()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
for(Box b : boxes)
b.draw();
//System.out.println(player.midpoint());
Display.update();
// Camera stuff. This has been working and so I don't think it's causing an issue
glLoadIdentity();
player.lookThrough();
编辑: 这就是我自己的堆栈跟踪:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000013b5cda0, pid=5844, tid=5824
#
# JRE version: 7.0_11-b21
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.6-b04 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [ig75icd64.dll+0x7cda0] RegisterProcTableCallback+0x74cd0
#
# 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\Christian\Documents\JM3\BasicGame\hs_err_pid5844.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.
#
Java Result: 1
【问题讨论】:
崩溃的那部分可能是l.toArray()
在你的 for 循环中,因为 start
和 end
是 null
在你的数组中,或者?
No l.toArray() 返回一个大小为 3 的数组,其格式等同于 new float[] x, y, z
来表示一个 3D 位置(相当于一个 3D 向量)。
我将包含位置类。
嗯,是的,我可以猜到,但是Location
中的两个对象是空的。
不,我有更多的代码进入Box
类。我只是把它留了下来。其中一些代码初始化了两个Location
对象并设置了height
、width
和depth
的值。
【参考方案1】:
您需要在渲染立方体之前绑定纹理。除了verts
浮动缓冲区之外,您还需要一个来存储纹理坐标(0 到 1)。对于纹理坐标,您对顶点所做的工作非常出色,但将glVertexAttribPointer
替换为glTexCoordAttribPointer
(只要您有vertex
替换为texCoord
几乎)。
【讨论】:
你能举个例子吗?这并不能解释为什么它会崩溃。 @thejava 我们需要一个堆栈跟踪来做某事,我们无法通过“它崩溃”的信息很好地弄清楚它 我添加了堆栈跟踪。 @thejava 这不是堆栈跟踪。这意味着你在某个地方搞砸了 lwjgl,也许与本地人有关? :L 你的意思是我弄乱了lwjgl的源代码吗?我没有。我以前收到过这条消息,但是当我解决我的问题时它就消失了。我很确定我只是对我用opengl做的事情有问题。您能否举例说明我将如何实现我正在尝试做的事情?我认为这是我搞砸的概念或其他什么。以上是关于使用 VBO 使用 LWJGL 对 3D 立方体进行纹理处理的主要内容,如果未能解决你的问题,请参考以下文章