Поиск нескольких текстур GLSL Shader с разными texCoord (iPad)

Я в аду текстур GLSL: я загружаю 4 разные текстуры одинакового размера в единые переменные sampler2D в моем фрагментном шейдере и пытаюсь получить к ним доступ с разными координатами текстуры:

uniform sampler2D image0, image1, image2, image3;
varying highp vec2 texCoord;

void main()
{   
highp vec2 tc = vec2(texCoord.x, mod(1.0-texCoord.y, 0.2) + 0.2);

lowp vec4 color0 = texture2D(image0, tc);
lowp vec4 color1 = texture2D(image1, tc);
lowp vec4 color2 = texture2D(image2, tc);
lowp vec4 color3 = texture2D(image3, tc);

if (texCoord.y < 0.2) { gl_FragColor = color0; }
else if (texCoord.y < 0.4) { gl_FragColor = color1; }
else if (texCoord.y < 0.6) { gl_FragColor = color2; }
else if (texCoord.y < 0.8) { gl_FragColor = color3; }
else { gl_FragColor = vec4(0.0); }
}

TexCoord, конечно же, исходит из вершинного шейдера:

uniform lowp float ratio;
attribute highp vec4 vertex;
varying highp vec2 texCoord;

void main()
{
gl_Position = vertex;
texCoord.x = ((vertex.x * 0.5) + 0.5) * ratio;
texCoord.y = (vertex.y * 0.5) + 0.5;
}

Я получаю 5 отдельных фрагментов: image0, image2 (!! not image1), image3, image3 (снова!) И черного (это будет содержать слияние различных текстур, что не важно в данном контексте, моя проблема заключается в правильном выборе текстуры в первую очередь). Я проверял код загрузки изображения несколько раз, загружаю 4 разных изображения:

- (void)linkTexture:(GLenum)tex image:(Image *)image varName:(const char *)varName
{
GLint texLocation;

texLocation = glGetUniformLocation(program, varName);
glUniform1i(texLocation, tex-GL_TEXTURE0);
glActiveTexture(tex);
glBindTexture(GL_TEXTURE_2D, image->texID);
}

и далее вниз:

    loadTexture("new_york_0.jpg", &image0, &renderer);
    [self linkTexture:GL_TEXTURE0 image:&image0 varName:"image0"];

    loadTexture("new_york_1.jpg", &image1, &renderer);
    [self linkTexture:GL_TEXTURE1 image:&image1 varName:"image1"];

    loadTexture("new_york_2.jpg", &image2, &renderer);
    [self linkTexture:GL_TEXTURE2 image:&image2 varName:"image2"];

    loadTexture("new_york_3.jpg", &image3, &renderer);
    [self linkTexture:GL_TEXTURE3 image:&image3 varName:"image3"];

Должно быть что-то очень неправильное в том, как я ожидаю, что графический процессор будет искать текстуры, но я понятия не имею, что это такое.

Кто-нибудь может пролить свет?


person Guy Moreillon    schedule 12.10.2010    source источник


Ответы (2)


В первом случае, конечно, вы получите 5 кусочков одной текстуры.

Подумайте о том, что вы делаете.

Возьмем координату y равной 0,6.

(1 - 0.6)       = 0.4
mod( 0.4, 0.2 ) = 0.0
0.0 + 0.2       = 0.2

Обычно вы заставляете координату y находиться в диапазоне от 0,2 до 0,4, который всегда будет image1. Я не уверен, почему вы видите image2 ...

Что касается второго случая ... это в значительной степени означает, что текстурные координаты, которые вы получаете, неверны. Итак ... вы хотите показать нам вершинный шейдер, а также этот фрагментный шейдер?

Однако должен признать, я не могу понять, почему вы просто не складываете 5 кусочков в одну текстуру и просто визуализируете ее ...

Вы можете проверить это:

http://www.vis.uni-stuttgart.de/glsldevil/index.html#downloads

person Goz    schedule 12.10.2010
comment
+1, хотя я думаю, что изображение 1 не отображается - это просто ошибка в коде настройки сэмплера (поэтому мы видим изображение 2 в коде без комментариев) - person Bahbar; 12.10.2010
comment
О боже, ты, конечно, прав, поэтому я каждый раз вижу image1, это было довольно глупо с моей стороны. Я исправил эту часть, и я вижу разные изображения в каждом фрагменте, но не те, которые нужны, я отредактирую вопрос, чтобы подробно описать, как я загружаю изображения. - person Guy Moreillon; 12.10.2010
comment
Идея, почему я не вижу нужных текстур? Кто угодно? Я так долго смотрел на этот код, что могу упустить еще одну из этих очевидных ошибок, но я просто не вижу ее. - person Guy Moreillon; 13.10.2010

glUniform1i изменяет универсальные значения для текущей программы. Убедитесь, что вы вызываете glUseProgram (myProgram) перед вызовом linkTexture.

person Jay    schedule 03.02.2012