Any samples on how to get texture arrays working?
I have tried declaring a uniform sampler2d array but it does not seem to pick anything but the first image which i suspect is default behaviour. I am binding my textures to different texture units using ->bind(0), ->bind(1)
I guess this might not work?
i might have to declare a separate uniform sampler2d for each texture i bind, then set those every update using ->uniform( “uTex0”, NUMBER_OF_TEXTURE_UNIT );?
Here my batch setup code…
m_VboRef = ci::gl::Vbo::create(GL_ARRAY_BUFFER, m_aInfo.size() * sizeof(CInfo), m_aInfo.data(), GL_STATIC_DRAW);
ci::geom::BufferLayout instanceDataLayout;
instanceDataLayout.append(ci::geom::Attrib::CUSTOM_0, 2, sizeof(CInfo), offsetof(CInfo, m_vDstRect_getUpperLeft), 1 /* per instance*/);
instanceDataLayout.append(ci::geom::Attrib::CUSTOM_1, 2, sizeof(CInfo), offsetof(CInfo, m_vDstRect_getSize), 1 /* per instance*/);
instanceDataLayout.append(ci::geom::Attrib::CUSTOM_2, 2, sizeof(CInfo), offsetof(CInfo, m_vTexRect_getUpperLeft), 1 /* per instance*/);
instanceDataLayout.append(ci::geom::Attrib::CUSTOM_3, 2, sizeof(CInfo), offsetof(CInfo, m_vTexRect_getSize), 1 /* per instance*/);
instanceDataLayout.append(ci::geom::Attrib::CUSTOM_4, ci::geom::DataType::INTEGER, 1, sizeof(CInfo), offsetof(CInfo, m_iTextureUnit), 1 /* per instance*/);
try {
m_GlslProgRef = ci::gl::GlslProg::create(ci::app::loadAsset("shader.vert"), ci::app::loadAsset("shader.frag"));
} catch (const std::exception &e) {
ci::app::console() << "Failed to load object:" << e.what() << std::endl;
}
ci::Rectf rect(0.f, 0.f, 1.f, 1.f);
m_MeshRef = ci::gl::VboMesh::create(ci::geom::Rect(rect));
m_MeshRef->appendVbo(instanceDataLayout, m_VboRef);
m_BatchRef = ci::gl::Batch::create(m_MeshRef, m_GlslProgRef, { { ci::geom::Attrib::CUSTOM_0, "vPositionOffset" }, { ci::geom::Attrib::CUSTOM_1, "vPositionScale" }, { ci::geom::Attrib::CUSTOM_2, "vTexCoordOffset" }, { ci::geom::Attrib::CUSTOM_3, "vTexCoordScale" }, { ci::geom::Attrib::CUSTOM_4, "iTex0" } });
Here is my vertex shader…
#version 150
uniform mat4 ciModelViewProjection;
in vec4 ciPosition;
in vec2 vPositionOffset;
in vec2 vPositionScale;
in vec2 vTexCoordOffset;
in vec2 vTexCoordScale;
in int iTex0;
in vec2 ciTexCoord0;
out highp vec2 TexCoord;
flat out int iTexID;
void main( void )
{
gl_Position = ciModelViewProjection * ( vec4( vPositionOffset, 0, 0 ) + vec4( vPositionScale, 1, 1 ) * ciPosition );
TexCoord = vTexCoordOffset + vTexCoordScale * ciTexCoord0;
iTexID = iTex0;
}
Fragment Shader
#version 150
//uniform sampler2D uTex0;
uniform sampler2D uTempTex0[16];
in vec2 TexCoord;
flat in int iTexID;
out vec4 oColor;
void main( void )
{
oColor = vec4( 1 ) * texture( uTempTex0[iTexID], TexCoord.st );
}