Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL阴影立方体贴图-查找问题_Opengl_Glsl_Shader_Shadow - Fatal编程技术网

OpenGL阴影立方体贴图-查找问题

OpenGL阴影立方体贴图-查找问题,opengl,glsl,shader,shadow,Opengl,Glsl,Shader,Shadow,我正在尝试使用立方体贴图为点光源创建阴影 我找到了各种帮助我(,…)的教程,但我在立方体地图查找方面仍然存在问题 此着色器创建立方体贴图(格式:GL\u DEPTH\u COMPONENT,GL\u UNSIGNED\u BYTE): lightPosition是灯光在世界空间中的位置,lightRange基本上是灯光投影矩阵的zFar 使用gDEBugger调试应用程序时,生成的多维数据集映射看起来不错 主着色器中的阴影查找: float shadowValue(int i) { ve

我正在尝试使用立方体贴图为点光源创建阴影

我找到了各种帮助我(,…)的教程,但我在立方体地图查找方面仍然存在问题

此着色器创建立方体贴图(格式:GL\u DEPTH\u COMPONENT,GL\u UNSIGNED\u BYTE):

lightPosition
是灯光在世界空间中的位置,
lightRange
基本上是灯光投影矩阵的zFar

使用gDEBugger调试应用程序时,生成的多维数据集映射看起来不错

主着色器中的阴影查找:

float shadowValue(int i)
{
    vec3 lookup_vector = vertexModel - lightPosition;
    float dist = texture(shadowMap, lookup_vector).r; 

    float curr_fragment_dist_to_light = length(lookup_vector) / lightRange;

    float result = 1.0; 
    if (dist < curr_fragment_dist_to_light)
        result = 0.0;
    return result;

}
float shadowValue(int i)
{
vec3查找_矢量=顶点模型-光位置;
float dist=纹理(阴影贴图,查找向量).r;
float curr_fragment_dist_to_light=长度(查找向量)/光范围;
浮动结果=1.0;
if(距离<当前碎片距离到灯光)
结果=0.0;
返回结果;
}
此函数的结果与灯光计算中的frum值相乘。问题是它总是返回1.0


有人知道我做错了什么吗?

您需要反转查找向量的y坐标。渲染时(我假定)y坐标点向上,但对于OpenGL纹理,y坐标点向下。你的场景是对称的,所以你的纹理一开始看起来是正确的,但它需要被反射——或者只需旋转你的
查找向量

vec3 new_vec = vec3(lookup_vector .x, -lookup_vector .y, lookup_vector .z);
然后,只需像之前一样查找渲染到阴影贴图的距离:

float dist = texture(shadowMap, new_vec);
测试深度的计算方法如下:

vec3 abs_vec = abs(new_vec);
float local_z_comp = max(abs_vec .x, max(abs_vec .y, abs_vec .z));
float norm_z_comp = (z_far + z_near) /
    (z_far - z_near) - (2 * z_far * z_near) / (z_far - z_near) / local_z_comp;
float curr_fragment_dist_to_light = (norm_z_comp + 1.0) * 0.5;
z_far
是您的
lightRange
z_near
是近平面等效物。最后,返回您的结果:

float result = 1.0; 
if (dist < curr_fragment_dist_to_light)
    result = 0.0;
return result;
float结果=1.0;
if(距离<当前碎片距离到灯光)
结果=0.0;
返回结果;

我根据这个问题的答案进行了这些计算:

你是否尝试过只返回
dist
curr\u fragment\u dist\u to\u light
来查看这对场景的影响?是的<代码>当前片段到灯光的距离很好-它离灯光越远越好。问题是
dist
-立方体映射查找。它总是1.0(或者至少是一个非常高的值),并且总是常量。这是生成的阴影贴图:(我切换到屏幕截图的背面消隐,通常我使用正面消隐渲染阴影贴图。)因为我无法回答编辑建议:我使用samplerCube而不是samplerCubeShadow。SamplerCube查找采用3分量向量(float dist=纹理(阴影贴图,new_vec);)。
float result = 1.0; 
if (dist < curr_fragment_dist_to_light)
    result = 0.0;
return result;