如何在 OpenGL ES2.0 着色器中使用 UBO
How to use UBO in OpenGL ES2.0 shaders
1.I 需要将 opengl 中的着色器移动到 Opengles 2。0.so 我有一个问题,我不知道如何转移这个名为 UBO 的结构。
2.What转账成功是否要给程序赋值?
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)之间变化。
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。
但是自 OpenGL ES 3.1 和 GLSL ES 3.10 以来提供了 binding
布局限定符。
参见 GLSL ES 3.10 specification - 4.4 Layout Qualifiers; page 51。
在 OpenGL ES 3.0 中,可以通过 glUniformBlockBinding
and the uniform block index of the program can be get by glGetUniformBlockIndex
设置统一块的绑定。在这两种情况下,程序都必须在之前成功链接。请注意,不要将统一块索引与统一位置混淆,这是不同的东西。
在 OpenGL ES 2.0 中,唯一的可能性是使用传统的 Uniform 变量。
1.I 需要将 opengl 中的着色器移动到 Opengles 2。0.so 我有一个问题,我不知道如何转移这个名为 UBO 的结构。 2.What转账成功是否要给程序赋值?
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)之间变化。
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。
但是自 OpenGL ES 3.1 和 GLSL ES 3.10 以来提供了 binding
布局限定符。
参见 GLSL ES 3.10 specification - 4.4 Layout Qualifiers; page 51。
在 OpenGL ES 3.0 中,可以通过 glUniformBlockBinding
and the uniform block index of the program can be get by glGetUniformBlockIndex
设置统一块的绑定。在这两种情况下,程序都必须在之前成功链接。请注意,不要将统一块索引与统一位置混淆,这是不同的东西。
在 OpenGL ES 2.0 中,唯一的可能性是使用传统的 Uniform 变量。