【问题标题】:GLSL Shader multi-texture lookup with different texCoord (iPad)具有不同texCoord(iPad)的GLSL Shader多纹理查找
【发布时间】:2011-04-24 07:04:44
【问题描述】:

我在 GLSL 纹理地狱中:我在片段着色器的统一 sampler2D 变量中加载了 4 个相同大小的不同纹理,并尝试使用不同的纹理坐标访问它们:

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(!!不是 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"];

我期望 GPU 查找纹理的方式一定有什么非常错误的地方,但我不知道它是什么。

有人能发光吗?

【问题讨论】:

    标签: opengl-es glsl textures shader


    【解决方案1】:

    当然,在第一种情况下,您会从同一个纹理中获得 5 个切片。

    想想你在做什么。

    取 0.6 的 y 坐标。

    (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

    【讨论】:

    • +1,虽然我认为 image1 未显示只是采样器设置代码中的错误(因此我们在未注释的代码中看到 image2)
    • 哦,天哪,你当然是对的,这就是为什么我每次都看到 image1,这对我来说很傻。我已经修复了该部分,我确实在每个切片中看到了不同的图像,但不是正确的,我将编辑问题以详细说明我如何加载图像。
    • 为什么我没有看到正确的纹理?任何人?我已经查看这段代码很长时间了,我可能遗漏了另一个明显的错误,但我就是看不到它。
    【解决方案2】:

    glUniform1i 修改当前程序的统一值。确保在调用 linkTexture 之前调用 glUseProgram(myProgram)。

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多