#java #opengl-es #lwjgl
#java #opengl-es #lwjgl
Вопрос:
Приведенный ниже код LWJGL 3 настраивает буферы и т.д. Для рендеринга треугольника. Я могу видеть треугольник. Теперь я пытаюсь точно понять, что происходит.
Вот мое понимание приведенного ниже кода. Сначала мы создаем объект vertex buffer, который является просто контейнером для массива чисел. glBindBuffer() и glBufferData() заполняют объект буфера вершин массивом вершин. Мы делаем это снова для второго массива вершин. Затем мы компилируем шейдеры вершин и фрагментов и добавляем их в шейдерную программу. Каким-то образом эта программа обращается к данным во втором объекте буфера вершин.
Итак, затем мы привязываем объект массива вершин. Мы заполняем его выводом шейдерной программы, которая обработала данные вершины из второго объекта vertex buffer.
Вопрос
Похоже, что эта настройка позволяет обрабатывать несколько фрагментов данных вершин одним и тем же набором команд. Какие команды я бы разместил в конце кода, чтобы передавать данные первой вершины, а не второй. Должен ли я создавать отдельный объект массива вершин для каждого объекта буфера вершин или я могу отправлять разные буферы по каналу и сохранять один и тот же объект массива вершин?
Код
Вот код, на который я ссылался выше: Во-первых, переменные:
//The vertices of a triangle
float[] vertices = new float[] {
0.0f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f
};
//Vertices of the second triangle
float[] vertices2 = new float[] {
0.0f, 0.9f,
0.5f, -0.5f,
-0.5f, -0.5f
};
//The source for the vertex shader
String vertexShaderSrc =
"#version 300 esnn"
"precision mediump float;n"
"in vec2 position;nn"
"void main()n"
"{n"
"gl_Position = vec4(position, 0.0, 1.0);n"
"}";
int vertexShader;
//The source for the fragment shader
String fragmentShaderSrc =
"#version 300 esnn"
"precision mediump float;n"
"out vec4 outColor;nn"
"void main()n"
"{n"
"outColor = vec4(1.0, 1.0, 1.0, 1.0);n"
"}";
int fragmentShader;
int shaderProgram;
//The position attribute
int posAttrib;
//A vertex buffer object handle.
int vbo;
//A second vertex buffer object handle.
int vbo2;
//A vertex array object handle.
int vao;
Сегмент кода, который их использует, является:
vbo = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);
vbo2 = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glBufferData(GL_ARRAY_BUFFER, vertices2, GL_STATIC_DRAW);
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, vertexShaderSrc);
glCompileShader(vertexShader);
System.out.println(glGetShaderInfoLog(vertexShader));
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, fragmentShaderSrc);
glCompileShader(fragmentShader);
System.out.println(glGetShaderInfoLog(fragmentShader));
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glBindFragDataLocation(shaderProgram, 0, "outColor");
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
vao = glGenVertexArrays();
glBindVertexArray(vao);
posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(posAttrib);
Ответ №1:
«Похоже, что эта настройка позволяет обрабатывать несколько фрагментов данных вершин одним и тем же набором команд» — Да, вы можете выполнить один вызов визуализации объекта Vertex Arrays, добавив больше объектов Vertex Buffer, которые содержат такие данные, как положения вершин, координаты текстуры, цвет вершины и многое другое. Если вы хотите изменить данные вершин, отправляемые в положение, подобное шейдеру, вы можете использовать матрицу преобразования, передаваемую как единообразную, для перемещения, масштабирования и поворота объекта. Однако, если объекты представляют собой разные модели, вам следует использовать разные vaos.