Opengl 预滤波卷积中求解亮点的错误结果

Opengl 预滤波卷积中求解亮点的错误结果,opengl,glsl,pbr,Opengl,Glsl,Pbr,在中,为了解决预滤波卷积中的亮点,教程参考和预滤波计算如下: float3预滤器envMap(TextureCube envMap,采样器samEnv,float粗糙度,float3 R) { float3 res=(float3)0.0f; 浮子总重量=0.0f; 浮动3正常=正常化(R); float3-toEye=正常; //粗糙度=最大值(0.02f,粗糙度); 静态consuint NUM_SAMPLES=512; 对于(uint i=0;i 0) { 浮点数D=D系数(粗糙度,Ndo

在中,为了解决预滤波卷积中的亮点,教程参考和预滤波计算如下:

float3预滤器envMap(TextureCube envMap,采样器samEnv,float粗糙度,float3 R)
{
float3 res=(float3)0.0f;
浮子总重量=0.0f;
浮动3正常=正常化(R);
float3-toEye=正常;
//粗糙度=最大值(0.02f,粗糙度);
静态consuint NUM_SAMPLES=512;
对于(uint i=0;i 0)
{
浮点数D=D系数(粗糙度,NdotH);
浮动pdf=(D*NdotH/(4*HdotV))+0.0001f;
浮动坐标=4.0f*Chu PI/(6.0f*CONV\u SPEC\u TEX\u WIDTH*CONV\u SPEC\u TEX\u WIDTH);
浮动样本=1.0f/(样本数*pdf+0.00001f);
浮点数=粗糙度==0.0f?0.0f:0.5f*log2(saSample/saTexel);
res+=envMap.SampleLevel(samEnv、lightVec、mipLevel).rgb*NdotL;
总重量+=NdotL;
}
}
返回分辨率/最大值(总重量,0.001f);
} 
这是我的密码:

#版本330核心
out vec4 FragColor;
在vec3localpos中;
均匀浮动粗糙度;
统一环境地图;
常量浮点Pi=3.14159265359;
浮动径向反转(uint位){
位=(位>16u);
位=((位和0x55U)>1u);
位=((位&0x33333U)>2u);
位=((位&0x0F0FU)>4u);
位=((位&0x00FF00FFu)>8u);
返回浮点(位)*2.3283064365386963e-10;///0x100000000
}
vec2 Hammersley(一区、北区){
返回向量2(浮动(i)/浮动(N),径向反转(i));
}
VEC3重要的SpuleGGX(VEC2席,VEC3 N,浮点粗糙度){
浮子a=粗糙度*粗糙度;
浮席φ=2×π*X.x;
浮点Cox(= 1席席)/(1 +(A*A—1)*XI.Y);
浮点数sinTheta=sqrt(1.0-cosTheta*cosTheta);
vec3h;
H.x=sinTheta*cos(φ);
H.y=sinTheta*sin(φ);
H.z=科斯特塔;
vec3-up=N.z<0.999?vec3(0.0,0.0,1.0):vec3(1.0,0.0,0.0);
vec3切线=规格化(交叉(向上,N));
vec3 bitangent=规格化(交叉(N,切线));
vec3 sampleVec=切线*H.x+双切线*H.y+N*H.z;
返回标准化(sampleVec);
}
浮子分布Gx(vec3 N,vec3 H,浮子粗糙度){
float a=粗糙度*粗糙度;//根据迪斯尼和Epic游戏,平方看起来更正确
浮点数a2=a*a;
浮点数NdotH=最大值(点(N,H),0.0);
浮点数NdotH2=NdotH*NdotH;
浮点数=NdotH2*(a2-1.0)+1.0;
denom=Pi*denom*denom;
返回a2/最大值(单位:0.00000001);
//返回a2/denom;
}
vec3预滤器环境图(vec3 N、vec3 V、浮动粗糙度){
常量样本计数=512u;
vec3预滤器颜色=vec3(0.0);
浮动总重量=0.0;
对于(uint i=0u;i0.0){
浮动D=分布Gx(N,H,粗糙度);
浮动pdf=(D*NdotH/(4.0*HdotV))+0.0001;
浮点分辨率=512.0;//源立方体贴图的分辨率(每个面)
浮点saTexel=4.0*Pi/(6.0*分辨率*分辨率);
浮动样本=1.0/(浮动(样本计数)*pdf+0.0001);
浮点数=粗糙度==0.0?0.0:0.5*log2(saSample/saTexel);
//prefilterColor+=纹理(environmentMap,L).rgb*NdotL;
prefilterColor+=textureLod(environmentMap,L,mipLevel).rgb;
总重量+=NdotL;
}
}
返回预过滤器颜色/最大值(总重量,0.0);
}
void main(){
vec3 N=标准化(localPos);
vec3r=N;
vec3v=R;
vec3颜色=预过滤环境图(N、V、粗糙度);
FragColor=vec4(颜色,1.0);
}
当我仅在球体上显示预过滤颜色时,它看起来如下所示: 如果我使用
consuint SAMPLE\u COUNT=4096u,它的绿色会变少prefilterColor+=textureLod(environmentMap,L,0.0).rgb时,代码>和无绿色带亮点

在这段代码中,我应该在哪里发出警报以获得无绿色和无亮点的结果?

我将环境贴图的mipmap级别从5设置为10,并解决了这个问题