Я пытаюсь написать скрипт для отображения основных трехмерных объектов / многоугольников, используя JOGL 2 с OpenGL 3.3, однако, когда элемент компилируется, я не получаю ошибки и получаю пустое окно, где появляется объект. Итак, мой вопрос, есть ли что-то конкретное, что я пропускаю при добавлении, чтобы заставить объект появляться … Мой код выглядит следующим образом …
public void init(GL3 gl)
{
gl.glGenVertexArrays(1, IntBuffer.wrap(temp));
//create vertice buffers
int vao = temp[0];
gl.glBindVertexArray(vao);
gl.glGenBuffers(1, IntBuffer.wrap(temp));
int[] temp2 = new int[]{1,1};
gl.glGenBuffers(2, IntBuffer.wrap(temp2));
vbo = temp2[0];
ebo = temp2[1];
//creates vertex array
float vertices[] = {
-0.5f, 0.5f, 0.0f,//1,0,0, // Top-left
0.5f, 0.5f, 0.0f,//0,1,0, // Top-right
0.5f, -0.5f, 0.0f,//0,0,1, // Bottom-right
-0.5f, -0.5f, 0.0f//1,1,0 // Bottom-left
};
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo);
gl.glBufferData(GL.GL_ARRAY_BUFFER, vertices.length * 4,
FloatBuffer.wrap(vertices), GL.GL_STATIC_DRAW);
//creates element array
int elements[] = {
0,1,2,
2,3,0
};
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, ebo);
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, elements.length * 4,
IntBuffer.wrap(elements), GL.GL_STATIC_DRAW);
gl.glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 3*4, 0* 4);
gl.glEnableVertexAttribArray(0);}
public void draw(GL3 gl)
{
gl.glBindVertexArray(vao);
gl.glDrawElements(GL.GL_TRIANGLES, 2, GL.GL_UNSIGNED_INT, 0);
}
Что касается того, где мои шейдеры инициируются, то это в другом классе, который выглядит следующим образом ..
//Matrix4 view = new Matrix4(MatrixFactory.perspective(scene.camera.getHeightAngle(),scene.camera.getAspectRatio(),scene.camera.getPosition());
projection = MatrixFactory.perspective(scene.camera.getHeightAngle(), scene.camera.getAspectRatio(), 0.01f, 100f);
view = MatrixFactory.lookInDirection(scene.camera.getPosition(), scene.camera.getDirection(), scene.camera.getUp());
try {
shader = new Shader(new File("shaders/Transform.vert"), new File("shaders/Transform.frag"));
shader.compile(gl);
shader.enable(gl);
shader.setUniform("projection", projection, gl);
shader.setUniform("view", view, gl);
}
catch (Exception e) {
System.out.println("message " + e.getMessage());
}
for (Shape s : scene.shapes) {
s.init(gl);
}
И, наконец, мои файлы шейдеров
#version 330out vec4 fragColour;
//in vec3 outColour;
void main() {
fragColour = vec4(1,0,0,1);
}
#version 330
uniform mat4 projection;
uniform mat4 view;
layout(location=0) in vec3 pos;
//layout(location=2) in vec2 texCoord;
//layout(location=1) in vec3 colours;
out vec2 fragTex;
out vec3 outColour;
vec4 newPos;
void main() {
newPos = vec4(pos,1.0);
gl_Position = projection * view * newPos;
//fragTex = texCoord;
//outColour = colours;
}
я не уверен, где я иду не так, будь то файлы шейдеров или сам код на самом деле ..
Я не опыт в JOGL, я привык к C ++ GL. Однако есть несколько проблем: во-первых, как сказал Рето Коради, вы используете то же значение для ebo, vbo and vao
, Это должно быть как,
gl.glGenVertexArrays(1, IntBuffer.wrap(tempV));
int vao = tempV[0];gl.glGenBuffers(2, IntBuffer.wrap(tempB));
int vbo = tempB[0];
int ebo = tempB[1];
Наконец, ваше рисование кажется немного проблематичным, вы, кажется, пропускаете шаг: «привязать массив к желанию рисовать». Тогда нарисуй.
gl.glBindVertexArray (vao);
gl.glDrawElements(GL.GL_TRIANGLES, 2, GL.GL_UNSIGNED_INT, 0);
Я надеюсь, что это поможет.
Хорошо, после многих разочаровывающих часов. кто-то помог мне с решением. Проблема заключалась не в создании отдельных буферов, а в том, чтобы не очищать их каждый раз, то есть мне нужно было сделать
gl.glGenVertexArrays (1, IntBuffer.wrap (temp));
//create vertice buffers
vao = temp[0];gl.glGenBuffers(1, IntBuffer.wrap(temp));
vbo = temp[0];
gl.glGenBuffers(1, IntBuffer.wrap(temp));
ebo = temp[0];
что похоже на то, как Хэйкс, однако, мне не нужна была отдельная временная температура, мне просто нужно было каждый раз очищать буфер. еще одна вещь, которую мне нужно было сделать, это также поставить
gl.glBindVertexArray (ВАО);
в init, а также в ничьей.
(редактировать)
я на самом деле не слишком уверен, gl.glBindVertexArray (vao); нужно быть в методе розыгрыша