0

我无法理解如何使用 sampler2DAprayShadows 以及它是如何工作的。得到其中的一部分,我们需要使用深度纹理值(GL_DEPTH_COMPONENT)来获得与参考深度的比较结果。但是接下来如何使用返回的浮点值来获取纹素。

参考来自: http ://www.khronos.org/opengles/sdk/docs/manglsl/xhtml/texture.xml

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

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

}

创建 3D 纹理(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);
4

1 回答 1

1

也许这可以帮助你: 深度立方体贴图制作教程

坦率地说,您应该制作一个帧缓冲区对象,该对象绑定 2D 深度纹理而不是 Cubemap 纹理。如果要使用采样器:sampler2DArrayShadow,则只需重载glsl函数texture,即texture(Sampler2DArrayShadow gSampler, Vec4 P, [float bias]) .Pz为2D tex的个数,Pw为参考深度值。默认偏差为 0,如果不需要,可以忽略它。

于 2018-04-26T08:49:46.193 回答