【问题标题】:Alternate gl_FragColor values from two textures in GLSLGLSL 中两个纹理的备用 gl_FragColor 值
【发布时间】:2011-08-30 10:08:33
【问题描述】:

我有两个纹理,云和山,每个都有 512 x 512 大小,我打算创建一个 gl_FragColor 输出,它将从以前的纹理中获取像素值。在这种情况下,我想从第一个纹理中的第一个像素获得gl_FragColor 中的第一个像素,从第二个纹理中的第二个像素获得gl_FragColor 中的第二个像素,从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;
          }
     }
  }

这是纹理单元设置:

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(程序);

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

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

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

【问题讨论】:

  • 发布您的纹理单元和统一设置代码。
  • 发表在问题部分^^
  • 这两种纹理都可以在 GLSL 中访问。例如,gl_FragColor = cloud; 不带 if 条件的命令将输出云纹理,而gl_FragColor = hill; 不带 if 条件将输出山纹理。

标签: opengl glsl textures


【解决方案1】:

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

【讨论】:

  • 谢谢,我刚刚意识到这一点。但是,我仍然遇到问题:仅访问了山丘纹理。我认为以前的片段着色器 sn-p 用于区分奇偶坐标不起作用。
  • @snowball147 你确定你的着色器能正常工作吗?你在检查编译错误吗?一些琐碎的着色器有用吗?
  • 是的,着色器工作。这是应用您提供的着色器后的结果:screenshot。我想知道这个条件的含义是什么:` if((gl_FragCoord/32.0- vec4(ivec4(gl_FragCoord/32.0))).x
  • 更新,通过将 if 条件修改为 if((gl_FragCoord/2.0 - vec4(ivec4(gl_FragCoord/2.0))).x&lt;0.5),着色器已经正常工作。由于我对 GLSL 的理解很差,我不知道这个条件是什么意思以及为什么 gl_FragCoord.xy 必须除以 512,但是谢谢,我将了解有关 gl_FragCoord 的更多信息。谢谢你,@Banthar! :)
  • (gl_FragCoord/2.0 - vec4(ivec4(gl_FragCoord/2.0))).x 只是做模的另一种方式。您可以对if(mod(gl_FragCoord.x,2.0)&lt;1.0) 执行相同的操作。 gl_FragCoord.xy 除以512.0 因为texture2D 使用从0.01.0 的值,而不是实际的纹理尺寸。根据您的操作,您可能希望将 gl_FragCoord 替换为 gl_TexCoord[0],您将在移动对象时看到差异。
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
相关资源
最近更新 更多