【发布时间】:2016-01-16 04:52:42
【问题描述】:
我正在为我正在开发的游戏编写关卡编辑器。我使用 JOGL,但似乎有问题。我习惯于 LWJGL openGL 调用,调整到核心 opengl 有点令人困惑,因为 lwjgl 似乎简化了很多东西。
所以我的问题是我创建了一个包含 vao ID/名称和顶点数的模型以及一个创建模型和渲染器的模型加载器。渲染器目前不是批处理的。我稍后会处理它。问题是opengl 抛出一个GL_INVALID_OPERATION 错误。不确定是什么原因造成的。包括我为测试环境而绘制的基本三角形在内的其他所有内容都可以正常工作,因此我的加载器或渲染器中的某个地方似乎存在问题。
代码如下: 型号:
public class JoglModel {
private int vaoID;
private int vertexCount;
public JoglModel(int vertexCount, int vaoID) {
this.vertexCount = vertexCount;
this.vaoID = vaoID;
}
public int getVertexCount() {
return vertexCount;
}
public int getVaoID() {
return vaoID;
}
}
加载器:
public class ModelLoader {
private GL2 gl;
private List<int[]> vaos = new ArrayList<int[]>();
private List<int[]> vbos = new ArrayList<int[]>();
public ModelLoader(GL2 gl){
this.gl = gl;
}
public JoglModel loadToVao(float[] positions){
int vaoID = createVAO();
storeDataInAttributeList(0,positions);
unbind();
return new JoglModel(vaoID,positions.length/3);
}
private int createVAO(){
int[] vaoID = new int[1];
gl.glGenVertexArrays(vaoID.length, vaoID, 0);
vaos.add(vaoID);
gl.glBindVertexArray(vaoID[0]);
return vaoID[0];
}
private void storeDataInAttributeList(int attributeNumber,float[] data){
int[] vboID = new int[1];
gl.glGenBuffers(vboID.length,vboID,0);
vbos.add(vboID);
gl.glBindBuffer(gl.GL_ARRAY_BUFFER,vboID[0]);
FloatBuffer floatBuffer = createFloatBuffer(data);
gl.glBufferData(gl.GL_ARRAY_BUFFER,floatBuffer.remaining(),floatBuffer,gl.GL_STATIC_DRAW);
gl.glVertexAttribPointer(attributeNumber,3,gl.GL_FLOAT,false,0,0);
gl.glBindBuffer(gl.GL_ARRAY_BUFFER,0);
}
private FloatBuffer createFloatBuffer(float[] data){
FloatBuffer floatBuffer = FloatBuffer.allocate(data.length);
floatBuffer.put(data);
floatBuffer.flip();
return floatBuffer;
}
private void unbind(){}
public void clear(){
for(int[] vao : vaos){
gl.glDeleteVertexArrays(vao.length,vao,0);
}
for(int[] vbo: vbos){
gl.glDeleteBuffers(vbo.length,vbo,0);
}
vaos.clear();
vbos.clear();
}
}
渲染器:
public class JoglRenderer {
私有 GL2 gl;
public JoglRenderer(GL2 gl){
this.gl = gl;
}
public void begin(){
gl.glClearColor(1f,0f,0f,1f);
gl.glClear(gl.GL_CLEAR_BUFFER);
}
public void render(JoglModel joglModel){
gl.glBindVertexArray(joglModel.getVaoID());
gl.glEnableVertexAttribArray(0);
gl.glDrawArrays(gl.GL_TRIANGLES,0,joglModel.getVertexCount());
gl.glDisableVertexAttribArray(0);
gl.glBindVertexArray(0);
/*
gl.glBegin(gl.GL_TRIANGLES);
gl.glColor3f(1, 0, 0);
gl.glVertex2f(-1, -1);
gl.glColor3f(0, 1, 0);
gl.glVertex2f(0, 1);
gl.glColor3f(0, 0, 1);
gl.glVertex2f(1, -1);
gl.glEnd();
*/
}
public void checkError() {
String errorString = "";
int error = gl.glGetError();
if (error != GL.GL_NO_ERROR) {
switch (error) {
case GL.GL_INVALID_ENUM:
errorString = "GL_INVALID_ENUM";
break;
case GL.GL_INVALID_VALUE:
errorString = "GL_INVALID_VALUE";
break;
case GL.GL_INVALID_OPERATION:
errorString = "GL_INVALID_OPERATION";
break;
case GL.GL_INVALID_FRAMEBUFFER_OPERATION:
errorString = "GL_INVALID_FRAMEBUFFER_OPERATION";
break;
case GL.GL_OUT_OF_MEMORY:
errorString = "GL_OUT_OF_MEMORY";
break;
default:
errorString = "UNKNOWN";
break;
}
}
System.out.println(errorString);
}
}
注释掉的三角形部分工作得很好。清除屏幕方法似乎也有错误,但这不是我现在关心的问题。谁能指出问题出在哪里?
谢谢
(编辑) 所以我发现了opengl错误。我不小心将 vaoID 作为顶点数传递,反之亦然。所以我修复了错误消失了。但是什么都没有被渲染。有什么想法吗?
【问题讨论】:
-
GL_CLEAR_BUFFER不允许作为glClear的参数。看看docu。您应该找出导致无效操作的 opengl 函数。只需在每次 opengl 调用之后放置 checkError 函数,您就会看到问题出在哪里。 -
谢谢。这是个好主意。关于颜色缓冲区。 JOGL 似乎没有 GL_COLOR_BUFFER_BIT。不知道为什么。(编辑)没关系。我这样做的方式是错误的。忘了它是一个静态整数。 GL.GL_COLOR_BUFFER_BIT 是要走的路。现在我正在诊断导致错误的 gl 函数。
-
我们错过了着色器程序吗?而且,您看到显示的颜色清晰了吗?
-
是的,清晰的颜色正在显示,现在可以正常工作了。但不是它应该渲染的四边形。