Непонимание работы указателей атрибутов вершин.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Непонимание работы указателей атрибутов вершин.

Сообщение Anonymous »

Моя проблема в том, что у меня есть 2 VAO, и каждый из них имеет разные VBO с разными вершинами, и для обоих из них у меня есть шейдер фрагмента вершинной рекламы.

Код: Выделить всё

bufferGen.VaoVboSet(2);

bufferGen.setBuffers(0, 0, vertices.verticesofLight);
GL46.glVertexAttribPointer(0, 3, GL46.GL_FLOAT, false, 5 * Float.BYTES, 0);
GL46.glEnableVertexAttribArray(0);

// Set up the second VAO and VBO for the light
bufferGen.setBuffers(1, 1, vertices.verticesofLight);
GL46.glVertexAttribPointer(1, 3, GL46.GL_FLOAT, false, 3 * Float.BYTES, 0);
GL46.glEnableVertexAttribArray(1);
это в моем цикле инициализации, эти методы взяты из моего класса создания пользовательского буфера:

Код: Выделить всё

int[] VAO;
int[] VBO;
Vertices vertices = new Vertices();

public void VaoVboSet(int size) {
VBO = new int[size];
VAO = new int[size];
GL46.glGenVertexArrays(getVAO());
GL46.glGenBuffers(getVBO());
}
public int[] getVAO(){
return VAO;
}
public int[] getVBO(){
return VBO;
}
public void setBuffers(int VaoId, int VboId,float vertices[]){
GL46.glBindVertexArray(VAO[VaoId]);
GL46.glBindBuffer(GL46.GL_ARRAY_BUFFER, VBO[VboId]);
GL46.glBufferData(GL46.GL_ARRAY_BUFFER, vertices, GL46.GL_STATIC_DRAW);

}
public void bindVAO(int VaoId){
GL46.glBindVertexArray(VAO[VaoId]);

}
и я рисую оба куба в цикле рендеринга:

Код: Выделить всё

//some shaderprogram0 starting and matrixes

bufferGen.bindVAO(VAO[0]);
GL46.glDrawArrays(GL_TRIANGLES, 0, 36);

//some shaderprogram1 starting and matrixes

bufferGen.bindVAO(VAO[1]);

GL46.glDrawArrays(GL_TRIANGLES, 0, 36);
в обоих вершинных шейдерах для обоих макетов vaos местоположение равно 0, и проблема в том, что, как вы можете видеть в начале кода, первый указатель атрибута для vao0 установлен на шаг 5, что неверно (должно быть 3) и должен повредить куб, и это так, но второй указатель имеет шаг 3, что правильно, и он должен отображать обычный куб, но вместо этого он отображает поврежденный куб
первый указатель - шаг 5, однако, когда Я меняю указатели, поэтому сначала используется шаг 3, а второй - 5, оба рисуются хорошо. Я предполагаю, что оба шейдера используют один и тот же указатель, но я не понимаю, почему первый шаг указателя 3.
Что я пробовал:
  • Изменение макета местоположение равно 1 в шейдере белого куба и указатель на индекс 1. Результат: белый куб не отображается.
  • Отвязка VAO перед привязкой следующего VAO. Результат: ничего не меняется.
  • Создание и привязка VAO в цикле инициализации. Результат: ничего не нарисовано, но нет ошибок

Код: Выделить всё

int[] VAO = new int[2];
int[] VBO = new int[2];
VAO[0] = GL46.glGenVertexArrays();
VAO[1] = GL46.glGenVertexArrays();
VBO[0] = GL46.glGenBuffers();
VBO[1] = GL46.glGenBuffers();

GL46.glBindVertexArray(VAO[0]);
GL46.glBindBuffer(GL46.GL_ARRAY_BUFFER, VBO[0]);
GL46.glBufferData(GL46.GL_ARRAY_BUFFER, vertices.verticesofCube, GL46.GL_STATIC_DRAW);
GL46.glVertexAttribPointer(0, 3, GL46.GL_FLOAT, false, 3 * Float.BYTES, 0);
GL46.glEnableVertexAttribArray(0);

GL46.glBindVertexArray(VAO[1]);
GL46.glBindBuffer(GL46.GL_ARRAY_BUFFER, VBO[1]);
GL46.glBufferData(GL46.GL_ARRAY_BUFFER, vertices.verticesofLight, GL46.GL_STATIC_DRAW);
GL46.glVertexAttribPointer(0, 3, GL46.GL_FLOAT, false, 3 * Float.BYTES, 0);
GL46.glEnableVertexAttribArray(0);
используя этот код и внося изменения в цикл Redner, чтобы адаптироваться к нему.

Подробнее здесь: https://stackoverflow.com/questions/792 ... e-pointers
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»