Альтернативные значения gl_FragColor из двух текстур в GLSL - PullRequest
1 голос
/ 22 мая 2011

У меня есть две текстуры: облако и холм, каждая с размером 512 x 512, и я намерен создать вывод gl_FragColor, который будет получать значения пикселей из предыдущих текстур.В этом случае я хочу получить 1-й пиксель в gl_FragColor из 1-го пикселя в 1-й текстуре, 2-й пиксель в gl_FragColor из 2-го пикселя во 2-й текстуре, 3-й пиксель в gl_FragColor из3-й пиксель в 1-й текстуре и так далее.Вот мой код фрагмента шейдера:

 uniform sampler2D tex0;
 uniform sampler2D tex1;

 void main() {
     vec4 cloud = texture2D(tex0, gl_TexCoord[0].st);
     vec4 hill = texture2D(tex1, gl_TexCoord[0].st);
     for (int i=0;i<512;i++) {
       for (int j=0;j<512;j++) {
            if ( j%2 == 0)
                gl_FragColor =  cloud;
            else
                gl_FragColor =  hill;
          }
     }
  }

Вот установка блока текстуры:

t1 = loadTexture("pY.raw", 512, 512);
t2 = loadTexture("pZ.raw", 512, 512);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, t2);
glEnable(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, t1);
glEnable(GL_TEXTURE_2D);

А вот унифицированная настройка: glUseProgram (program);

GLuint t1Location = glGetUniformLocation(program, "tex0");
GLuint t2Location = glGetUniformLocation(program, "tex1");

glUniform1i(t1Location, 0);
glUniform1i(t2Location, 1);

Проблема в том, что для программы выводится только текстура холма, и я не знаю, как это исправить.Любое предложение?

1 Ответ

7 голосов
/ 22 мая 2011

Вам не нужно делать никаких итераций в вашем шейдере. Пиксельный шейдер будет вызываться один раз для каждого пикселя в вашем объекте. Вместо этого используйте gl_TexCoord [0], чтобы получить текущие координаты текстуры. Ваш код должен выглядеть примерно так:

uniform sampler2D tex0;
uniform sampler2D tex1;

void main()
{
    vec4 cloud = texture2D(tex0, gl_TexCoord[0].st);
    vec4 hill = texture2D(tex1, gl_TexCoord[0].st);

    if ( int(gl_TexCoord[0].x*512)%2 == 0)
        gl_FragColor =  cloud;
    else
        gl_FragColor =  hill;

    }
}

Это должно работать, даже с более старым opengl:

#ifdef GL_ES
precision highp float;
#endif

uniform sampler2D tex0;
uniform sampler2D tex1;

void main(void)
{

    if((gl_FragCoord/32.0- vec4(ivec4(gl_FragCoord/32.0))).x<0.5)
        gl_FragColor = texture2D(tex0, gl_FragCoord.xy/512.0);
    else
        gl_FragColor = texture2D(tex1, gl_FragCoord.xy/512.0);
}

Вы можете попробовать это с WebGL по адресу: http://www.iquilezles.org/apps/shadertoy/

...