【问题标题】:OpenGL GLSL Shadows not working correctlyOpenGL GLSL 阴影无法正常工作
【发布时间】:2015-08-31 10:42:42
【问题描述】:

我正在尝试使用 GLSL 在 Java/OpenGL 中实现阴影贴图。 使用 Java/OpenGL 创建阴影贴图似乎是不可能的,几乎没有透视投影的工作示例。

我的想法是,矩阵计算效果不佳。

这是我的阴影结果(相机视图/项目 = 阴影视图/项目):

在这里,我将线性化深度缓冲区映射到一个矩形上,它有点旋转:

深度缓冲区似乎被翻转了,因为在我映射的每个表面上,它都是 x 或/和 y 翻转的。但也许它只是一个紫外线错误。

所以主要的问题是:你能告诉我可能会发生什么吗?

这里有一些代码sn-ps:

最终着色器:深度和阴影计算(uSamplerShadow 是 sampler2D)

float shadowValue=0.0;
vec4 lightVertexPosition2=vShadowCoord;
lightVertexPosition2/=lightVertexPosition2.w;
for(float x=-0.001;x<=0.001;x+=0.0005)
    for(float y=-0.001;y<=0.001;y+=0.0005)
    {
        if(texture2D(uSamplerShadow,lightVertexPosition2.xy+vec2(x,y)).r>=lightVertexPosition2.z)
            shadowValue+=1.0;
    }
shadowValue/=16.0;

float f = 100.0;
float n = 0.1;
float z = (2 * n) / (f + n - texture2D(uSamplerShadow,vTexCoords).x * (f - n));

outColor = vec4(vec3(z) , 1.0);

最终着色器:阴影坐标计算:(尚未实现偏置矩阵)

vShadowCoord = uProjectionMatrix * uShadowViewMatrix * uWorldMatrix * vec4(aPosition,1.0);

深度着色器

fragmentdepth = gl_FragCoord.z;

你也可以检查我的纹理属性,但我已经尝试了我在谷歌上找到的所有组合:)

            shadowTextureProperties.setMagFilter(EnumTextureFilter.NEAREST);
    shadowTextureProperties.setMinFilter(EnumTextureFilter.NEAREST);
    shadowTextureProperties.setWrapS(EnumTextureWrap.CLAMP_TO_EDGE);
    shadowTextureProperties.setWrapT(EnumTextureWrap.CLAMP_TO_EDGE);
    shadowTextureProperties.setInternalColorFormat(EnumTextureColorFormat.DEPTH_COMPONENT16);
    shadowTextureProperties.setSrcColorFormat(EnumTextureColorFormat.DEPTH_COMPONENT);
    shadowTextureProperties.setValueFormat(EnumValueFormat.FLOAT);
    shadowTextureProperties.setPname(new int[]{GL14.GL_TEXTURE_COMPARE_MODE, GL14.GL_TEXTURE_COMPARE_FUNC});
    shadowTextureProperties.setParam(new int[]{GL11.GL_NONE, GL11.GL_LEQUAL});

【问题讨论】:

  • 您尝试插入阴影的方式在技术上是错误的,但这并不能解释为什么一切都是黑色的。这可能是因为您没有偏差和偏差矩阵,请尝试使用谷歌搜索阴影贴图偏差以了解您需要它的原因。基本上从比较语句中的 lightVertexPosition2.z 中减去一个小值,然后移动坐标。我对此有点生疏,所以你必须相信谷歌。尝试遵循单个阴影贴图教程,而不是盲目尝试。不过,你快到了,GJ。

标签: opengl mapping glsl shader shadow


【解决方案1】:

第一件事:

shadowTextureProperties.setPname(new int[]{GL14.GL_TEXTURE_COMPARE_MODE, GL14.GL_TEXTURE_COMPARE_FUNC});

GL_TEXTURE_COMPARE_FUNC 不是GL_TEXTURE_COMPARE_MODE 的有效参数。根据reference,只允许GL_NONEGL_COMPARE_R_TO_TEXTURE

GL_COMPARE_R_TO_TEXTURE

必须使用阴影采样器 (sampler2DShadow) 和相应的 texture 重载:

float texture( sampler2DShadow sampler, vec3 P)

在这里,采样器在位置 P.xy 进行采样,并将读取值与 P.z 进行比较。此操作的结果是闪电因子(完全阴影时为 0.0,无阴影时为 1.0)。

GL_NONE

当您想自己进行比较时,您必须将GL_COMPARE_R_TO_TEXTURE设置为GL_NONE

【讨论】:

  • 我不认为它是这样工作的。看起来设置这些参数的 API 需要两个单独的数组。 setPname (...) 基本上是键,setParam (...) 是值。如果你把这两个数组排成一行,它们就可以工作。当GL_TEXTURE_COMPARE_MODE 设置为GL_NONE 时,将GL_TEXTURE_COMPARE_FUNC 设置为GL_LEQUAL 是毫无意义的,但这完全是另一回事。
猜你喜欢
  • 2013-12-27
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 2014-04-05
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多