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)之间切换。
答案 0 :(得分:1)
OpenGL ES 2.0中未提供统一块。参见GLSL ES 1.0 specification。
OpenGL ES 3.0和GLSL ES 3.00分别支持统一块。
参见GLSL ES 3.00 specification - 4.3.7 Interface Blocks; page 43。
但是binding
布局限定符是从OpenGL ES 3.1和OpenGL ES 3.10开始提供的。
参见GLSL ES 3.10 specification - 4.4 Layout Qualifiers; page 51。
在OpenGL ES 3.0中,统一块的绑定可以通过glUniformBlockBinding
设置,程序的统一块索引可以通过glGetUniformBlockIndex
来获取。在两种情况下,都必须先成功链接程序。请注意,统一块索引不要与统一位置混淆,这是不同的。
在OpenGL ES 2.0中,唯一的可能性是使用常规的Uniform变量。