【发布时间】: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