GLSL текстурирование нескольких фрагментов - PullRequest
1 голос
/ 02 ноября 2010

Я пытаюсь преобразовать свой фиксированный конвейерный код (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.

У кого-нибудь есть идеи относительно того, почему это происходит?

1 Ответ

5 голосов
/ 02 ноября 2010

Параметр для glUniform1i для сэмплеров находится в диапазоне [0:MAX[, а не [GL_TEXTURE0:GL_TEXTURE0+MAX[.

поэтому измените свой код на:

glUniform1i(..., 0);
...