GLSL中两个纹理的交替gl_FragColor值

时间:2011-05-22 00:02:38

标签: opengl glsl textures

我有两个纹理,云和山,每个都有512 x 512大小,我打算创建一个gl_FragColor输出,它将从以前的纹理中获取像素值。在这种情况下,我想从第一个纹理中的第一个像素获取gl_FragColor中的第一个像素,从第二个纹理中的第二个像素获取gl_FragColor中的第二个像素,在{中获取第三个像素{1}}来自第一个纹理中的第3个像素,依此类推。这是我的片段着色器代码:

gl_FragColor

这是纹理单元设置:

 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;
          }
     }
  }

以下是统一设置:     glUseProgram(程序);

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);

问题是,程序的输出只是山纹理,我不知道如何解决这个问题。有什么建议吗?

1 个答案:

答案 0 :(得分:7)

您不需要在着色器中进行任何迭代。对象中的每个像素都会调用一次像素着色器。而是使用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/

进行试用