Opengl es glsl中的Sampler2ArrayShadow是如何工作的

Opengl es glsl中的Sampler2ArrayShadow是如何工作的,opengl-es,opengl-3,fragment-shader,glsles,Opengl Es,Opengl 3,Fragment Shader,Glsles,我无法理解如何使用sampler2DAprrayShadows以及它是如何工作的。我们需要使用深度纹理值(GL_depth_分量)来获得与ref depth的比较结果。 但是接下来如何使用返回浮点值来获取texel 从以下地址获得参考: 我编写了一个小代码来测试它,如下所示: 我的片段着色器为: in highp vec2 texcoord; in highp vec4 basecolor; out highp vec4 myFragColor; uniform highp sampler2

我无法理解如何使用sampler2DAprrayShadows以及它是如何工作的。我们需要使用深度纹理值(GL_depth_分量)来获得与ref depth的比较结果。 但是接下来如何使用返回浮点值来获取texel

从以下地址获得参考:

我编写了一个小代码来测试它,如下所示: 我的片段着色器为:

in highp vec2 texcoord;
in highp vec4 basecolor;
out highp vec4 myFragColor;

uniform highp sampler2DArrayShadow basetexture;

void main(void)
{
    highp vec3 coords = (vec3(texcoord, 0.0) + vec3(1.0, 1.0, 1.0)) / 2.0;
    highp float depth = texture(basetexture, vec4(coords.x, coords.y, coords.z, -0.5));
    myFragColor = vec4(depth * basecolor);

}
创建三维纹理(texdata),并将其绑定为:

glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE,  GL_COMPARE_REF_TO_TEXTURE);
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH_COMPONENT16, TEX_SIZE, TEX_SIZE, TEX_SIZE, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, texdata);
也许这可以帮助你:


坦率地说,你应该制作一个帧缓冲区对象,它绑定2D深度纹理而不是立方体贴图。如果要使用sampler:sampler2DArrayShadow,则只需重载glsl函数纹理,即纹理(sampler2DArrayShadow gSampler,Vec4 P,[float bias])。P.z是2D纹理的编号,P.w是参考深度值。默认偏差为0,如果不需要,您可以忽略它。

在OpenGL ES 2.0中您不能这样做。您的问题已在OpenGL论坛上得到回答。请在此处写入解决方案,而不是包含将来可能会断开的链接。谢谢@IgnacioAra这是一个很好的链接,链接的帖子不太可能被删除(只有版主可以这样做,他们不会)。这应该是一个评论,而不是一个答案。如果这是重复的问题,因此,和/或留下评论,一旦你足够。如果没有,请根据具体问题定制答案。