Я пытаюсь визуализировать ландшафт, используя свой собственный шейдер и используя методы open gl низкого уровня. Но другие части игры используют SpriteBatch и другие классы рендеринга GDXlib.
Мой код openGL для ландшафта отображается правильно, пока я не вызову:
spriteBatch.draw(...);
или что-то подобное, например:
stage.draw();
После этого вызова мой код openGL больше не рисовался. Никаких ошибок, просто ничего на экране. Но SpriteBatch работает нормально.
Спустя долгое время я понял, что мне нужно позвонить
glEnableVertexAttribArray(...);
и
Gdx.gl.glBindBuffer(GL20.GL_ARRAY_BUFFER, posVertexBufferLoc);
Gdx.gl.glVertexAttribPointer(positionAttribLoc, 4, GL20.GL_FLOAT, false, 0, 0);
МНЕ НУЖНО ВЫЗВАТЬ ЭТО ПЕРЕД ВЫЗОВОМ --> glDrawArrays(...);
КАЖДЫЙ РАЗ ПЕРЕД ИСПОЛЬЗОВАНИЕМ glDraw... , -› КАЖДЫЙ КАДР
Если я не вызываю первый, ничего не отображается.
Если я не вызываю второй, он отображается в неправильных позициях.
Похоже, каждый раз, когда я использую классы GDXlib для рендеринга, это каким-то образом портит мои атрибуты.
Код инициализации:
shaderProgram = new ShaderProgram(baseVertexShader, baseFragmentShader);
if (!shaderProgram.isCompiled()) {
Gdx.app.error("TerrainRenderer - Cannot compile shader", shaderProgram.getLog());
}
shaderProgram.begin();
//vertexBuffers
vertexBuffer = BufferUtils.newFloatBuffer(quadPosVertices.length);
vertexBuffer.put(quadPosVertices);
vertexBuffer.rewind();
//VBOs
//generate buffers
posVertexBufferLoc = Gdx.gl.glGenBuffer();
//pass data into buffers
Gdx.gl.glBindBuffer(GL20.GL_ARRAY_BUFFER, posVertexBufferLoc);
Gdx.gl.glBufferData(GL20.GL_ARRAY_BUFFER, vertexBuffer.capacity()*4, vertexBuffer, GL20.GL_STATIC_DRAW);
//attributes
//locations
positionAttribLoc = shaderProgram.getAttributeLocation("position");
//attributes specifications
Gdx.gl.glBindBuffer(GL20.GL_ARRAY_BUFFER, posVertexBufferLoc);
Gdx.gl.glVertexAttribPointer(positionAttribLoc, 4, GL20.GL_FLOAT, false, 0, 0);
//enabling attributes
shaderProgram.enableVertexAttribute(positionAttribLoc);
//end shader
shaderProgram.end();
Gdx.gl.glBindBuffer(GL20.GL_ARRAY_BUFFER, 0); //unbind
Нарисовать код:
Gdx.gl.glBindBuffer(GL20.GL_ARRAY_BUFFER, posVertexBufferLoc);
Gdx.gl.glVertexAttribPointer(positionAttribLoc, 4, GL20.GL_FLOAT, false, 0, 0);
shaderProgram.enableVertexAttribute(positionAttribLoc);
shaderProgram.begin();
Gdx.gl.glDrawArrays(GL20.GL_TRIANGLES, 0, 6);
shaderProgram.end();
Gdx.gl.glBindBuffer(GL20.GL_ARRAY_BUFFER, 0);
Как правильно использовать методы openGL с классами GDXlib? Мне действительно нужно вызывать эти атрибутивные функции в каждом кадре?
Mesh.class
вызывает:glBindBuffer(GL20.GL_ARRAY_BUFFER, location)
glVertexAttribPointer(...)
иglEnableVertexAttribArray(...)
перед каждым вызовом отрисовки. Мне кажется, что GDXlib по какой-то причине не использует VAO, и поэтому его нужно вызывать каждый кадр. Я прав? Влияет ли вызов производительности перед каждым вызовом отрисовки? - person Jerry Lundegaard   schedule 08.07.2020mesh.draw(...)
может уничтожить мою настройку атрибута? Он даже не использует тот же шейдер? - person Jerry Lundegaard   schedule 10.07.2020glGetAttribLocation(program, name)
возвращает другой номер местоположения для атрибута, потому что он использует другой шейдер, но вы правы, это не так. Теперь это имеет смысл для меня. Сетка использует те же номера местоположений для своих атрибутов. - person Jerry Lundegaard   schedule 11.07.2020