Я пытаюсь преобразовать свой фиксированный конвейерный код (OpenGL ES 1.1) в один, используя шейдерный конвейер (OpenGL ES 2.0). Однако кажется, что работает только одна текстура, и я получаю ошибку:
Validation Failed: Sampler error:
Samplers of different types use the same texture image unit.
- or -
A sampler's texture unit is out of range (greater than max allowed or negative).
В моем фрагментном шейдере у меня одинаковый идентификатор текстуры и координаты текстуры, поступающие из моего вершинного шейдера:
varying lowp vec4 colorVarying;
varying lowp vec2 texCoordsVarying;
uniform sampler2D texID;
void main()
{
lowp vec4 colour = texture2D(texID, texCoordsVarying);
gl_FragColor = colour * colorVarying;
}
Насколько я понимаю, поскольку я использую только одну текстуру, мне нужен только один активный текстурный блок. Поэтому в моем конвейере я настраиваю текстуры, активируя соответствующий текстурный блок, привязывая текущую текстуру и устанавливая единообразное значение для идентификатора текстуры в текстурный блок. Затем я продолжаю рисовать вершины.
Вот часть текстурирования моего конвейера:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, ((MNTexturedRect*)object).texID);
glUniform1i(uniforms[UNIFORM_TEXTURE], GL_TEXTURE0);
glVertexAttribPointer(ATTRIB_TEXTURE_COORDS, 2, GL_FLOAT, GL_FALSE, object.dataPerPoint*sizeof(GLfloat), &points[((MNTexturedRect*)object).texCoordOffset]);
glEnableVertexAttribArray(ATTRIB_TEXTURE_COORDS);
У меня есть идея, что фактический идентификатор текстуры является причиной проблемы, но я не уверен, как ее решить. У меня есть несколько объектов, и кажется, что только первая загруженная текстура действительно работает. У меня есть только сэмплер, и я не совсем уверен, почему он будет жаловаться на использование того же текстурного блока, а мой текстурный блок находится в диапазоне, так как это просто GL_TEXTURE0.
У кого-нибудь есть идеи относительно того, почему это происходит?