1.Мне нужно перенести шейдер в opengl на Opengles 2.0.так что у меня проблема,я не знаю как перенести эту структуру под названием UBO. 2.Что я должен назначить программе, если перенос прошел успешно?
1.1 Чтобы перейти на код opengles2.0:
layout(binding = 0) uniform UniformBufferObject
{
mat4 model;
mat4 normal;
mat4 view;
mat4 proj;
vec3 eyepos;
material_struct material;
light_struct lights[8];
} ubo;
2.1 Я хочу преобразовать данные вершины. Как мне привязать этот UBO к программе?
//vertex
int mPositionHandle = GLES20.GetAttribLocation(_program, "vPosition");
GLES20.EnableVertexAttribArray(mPositionHandle);
GLES20.VertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, _buffer);
//color
int mColorHandle = GLES20.GetAttribLocation(_program, "aColor");
GLES20.EnableVertexAttribArray(mColorHandle);
GLES20.VertexAttribPointer(mColorHandle, 4, GLES20.GL_FLOAT, false, 0, _color);
//UBO???
В настоящее время все данные вершин, индекс и цвет есть, но данные вершин слишком велики. Я надеюсь измениться между (-1 ~ 1).
@ Rabbid76 Можете ли вы преобразовать этот комментарий в ответ, чтобы этот вопрос отображался как ответ.
@solidpixel Я превратил комментарий в ответ. Но я не уверен, что это меня удовлетворяет.
Юниформ-блоки не предусмотрены в OpenGL ES 2.0. См. Спецификация GLSL ES 1.0.
Юниформ-блоки поддерживаются OpenGL ES 3.0 соответственно GLSL ES 3.00.
См. Спецификация GLSL ES 3.00 — 4.3.7 Интерфейсные блоки; стр. 43.
Но квалификатор макета binding
предоставляется, начиная с OpenGL ES 3.1 и GLSL ES 3.10.
См. Спецификация GLSL ES 3.10 — 4.4 Квалификаторы макета; стр. 51.
В OpenGL ES 3.0 привязка универсального блока может быть установлена с помощью glUniformBlockBinding
, а индекс универсального блока программы может быть получен с помощью glGetUniformBlockIndex
. В обоих случаях программа должна быть успешно слинкована. Обратите внимание, что универсальный блочный индекс не следует путать с единым расположением, это разные вещи.
В OpenGL ES 2.0 единственная возможность — использовать обычные переменные Униформа.
Юниформ-блоки не предусмотрены в OpenGL ES 2.0. Вы должны использовать отдельные униформы.