Tuesday, April 7, 2015

OpenGL ESでのUniform Bufferのバインドの仕方(DX11比較付き)

Unifrom BufferはDirectX11のConstant Bufferとほぼ同じものです。OpenGL ES 3.1では使い方もよく似ていて、以下のようにGLSLの"binding"で指定するbinding pointがほぼHLSLの"register"と同じ概念です。

// HLSL (DirectX11)
cbuffer MyContantBuffer : register(b2)
{
float4x4 matW;
}
view raw my_cb.fx hosted with ❤ by GitHub
// GLSL
layout (std140, binding = 2) uniform MyUBO {
mat4 matW;
};
view raw my_ubo.glsl hosted with ❤ by GitHub


C側からバッファを"register"に指定するID3D11DeviceContext::VSSetConstantBuffers に相当するのは、glBindBufferBaseです。

// DirectX11
#define POS 2
pDeviceContext->VSSetConstantBuffers(POS, 1, &buffer);
view raw DX.cpp hosted with ❤ by GitHub
// OpenGL
#define POS 2
glBindBufferBase(GL_UNIFORM_BUFFER, POS, ubo);
view raw GL.cpp hosted with ❤ by GitHub


OpenGL ES 3.1はここまでで動作します。

GLSLで"binding"が使えないOpenGL ES 3.0では以下のそれ相当の処理をC側から行う必要があります。これはOpenGL ES 3.1でも有効で、"binding"で指定するのと同じ結果になります。更には、既に"binding"指定があってもC側から上書きすることもできます。

#define POS 2
glUniformBlockBinding(program, glGetUniformBlockIndex(program, "MyUBO"), POS);
view raw layout.cpp hosted with ❤ by GitHub

No comments:

Post a Comment