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

问题描述 投票:1回答:1

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 glsl shader opengl-es-2.0
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和OpenGL ES 3.10以来提供了binding布局限定符。 见GLSL ES 3.10 specification - 4.4 Layout Qualifiers; page 51

在OpenGL ES 3.0中,统一块的绑定可以由glUniformBlockBinding设置,程序的统一块索引可以通过glGetUniformBlockIndex获得。在这两种情况下,该程序必须先成功链接。请注意,统一块索引不要与统一位置混淆,这是不同的事情。

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

© www.soinside.com 2019 - 2024. All rights reserved.