opengl-es - 如何在OpenGL ES2.0着色器中使用UBO

标签 opengl-es glsl shader opengl-es-2.0

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)之间变化。

最佳答案

OpenGL ES 2.0 中未提供统一 block 。请参阅GLSL ES 1.0 specification .

OpenGL ES 3.0 和 GLSL ES 3.00 支持统一 block 。
请参阅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 中,统一 block 的绑定(bind)可以通过 glUniformBlockBinding 设置程序的统一 block 索引可以通过 glGetUniformBlockIndex 得到。在这两种情况下,程序之前都必须成功链接。请注意,统一 block 索引不要与统一位置混淆,这是不同的事情。

在 OpenGL ES 2.0 中,唯一的可能性是使用传统的 Uniform变量。

关于opengl-es - 如何在OpenGL ES2.0着色器中使用UBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55933021/

相关文章:

opengl - 为什么在 OpenGL 中需要 TBN 矩阵?

opengl - 如何使用索引和顶点缓冲区在 LWJGL 中实现平面着色?

android - Android NDK OpenGL 应用程序的 float 或定点数?

Android - 使用 opengl 为应用程序创建动画背景

android - OpenGL ES 2.0 PNG alpha channel

opengl - GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO

使用余弦函数的 OpenGL 颜色插值?

graphics - 如何通过 iPhone SDK 在 OpenGL ES 中使用着色器

Android OpenGL ES 2.0 多重纹理和相机

android - 速度较快的 Android 设备上的 FPS 较慢