Opengl es OpenGL ES 2.0无法实现标准线性雾函数

Opengl es OpenGL ES 2.0无法实现标准线性雾函数,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,我一直在尝试实现一个基本的雾函数,我发现的一些资源让我尝试了一个线性雾函数,我的理解让我相信它是基于原始的固定函数雾方程的(尽管我可能在这方面错了)。然而,当我尝试实现它时,我的所有曲面都变成黑色。我很确定我的问题在于如何(尝试)计算眼睛的距离,因为等式的其余部分非常简单 我的顶点着色器: precision mediump float; attribute vec4 position; attribute vec3 normal; attribute vec2 texCoordIn; va

我一直在尝试实现一个基本的雾函数,我发现的一些资源让我尝试了一个线性雾函数,我的理解让我相信它是基于原始的固定函数雾方程的(尽管我可能在这方面错了)。然而,当我尝试实现它时,我的所有曲面都变成黑色。我很确定我的问题在于如何(尝试)计算眼睛的距离,因为等式的其余部分非常简单

我的顶点着色器:

precision mediump float;

attribute vec4 position;
attribute vec3 normal;
attribute vec2 texCoordIn;

varying vec3 eyeNormal;
varying vec4 eyePos;
varying vec2 texCoordOut;
varying float eyeDistance;

uniform mat4 modelViewProjectionMatrix;
uniform mat4 modelViewMatrix;
uniform mat3 normalMatrix;
uniform vec3 cameraPosition;

void main()
{
    eyeNormal = (normalMatrix * normal);
    eyePos = modelViewMatrix * position;      
    eyeDistance = sqrt((eyePos.x - cameraPosition.x) * (eyePos.x - cameraPosition.x) + (eyePos.y - cameraPosition.y) * (eyePos.y - cameraPosition.y) + (eyePos.z - cameraPosition.z) * (eyePos.z - cameraPosition.z));
    texCoordOut = texCoordIn;
    gl_Position = modelViewProjectionMatrix * position;
}
我的片段着色器:

precision mediump float;

varying vec3 eyeNormal;
varying vec4 eyePos;
varying vec2 texCoordOut;
varying float eyeDistance;
uniform sampler2D texture;

uniform vec3 flashlightPosition;
uniform vec3 diffuseLightPosition;
uniform vec4 diffuseComponent;
uniform float shininess;
uniform vec4 specularComponent;
uniform vec4 ambientComponent;
uniform float maxFogDistance;
uniform float minFogDistance;
uniform vec4 fogColor;

void main()

{
    vec4 ambient = ambientComponent;

    vec3 N = normalize(eyeNormal);
    float nDotVP = max(0.0, dot(N, normalize(diffuseLightPosition)));
    vec4 diffuse = diffuseComponent * nDotVP;

    vec3 E = normalize(-eyePos.xyz);
    vec3 L = normalize(flashlightPosition - eyePos.xyz);
    vec3 H = normalize(L+E);
    float Ks = pow(max(dot(N, H), 0.0), shininess);
    vec4 specular = Ks*specularComponent;
    if( dot(L, N) < 0.0 ) {
        specular = vec4(0.0, 0.0, 0.0, 1.0);
    }

    float factor = (maxFogDistance - eyeDistance) / (maxFogDistance - minFogDistance);
    factor = clamp(factor, 0.0, 1.0);
    vec4 finalFogColor = factor * fogColor;

    vec4 finalColor = (ambient + specular) * texture2D(texture, texCoordOut);
    gl_FragColor = finalColor * factor + fogColor * (1.0 - factor);
    gl_FragColor.a = 1.0;
}
precision mediump float;
可变vec3眼正常;
可变vec4眼位;
可变vec2-texCoordOut;
可变浮动视距;
二维纹理均匀;
均匀vec3闪光灯位置;
均匀vec3漫射光位置;
均匀vec4扩散元件;
均匀的浮光度;
均匀vec4镜面组件;
均匀vec4环境分量;
均匀浮动距离;
均匀浮动距离;
颜色均匀;
void main()
{
vec4环境=环境成分;
vec3 N=正常化(眼正常);
float nDotVP=max(0.0,点(N,归一化(漫射光位置));
vec4漫反射=漫反射组件*nDotVP;
vec3 E=标准化(-eyePos.xyz);
vec3 L=标准化(闪光灯位置-eyePos.xyz);
vec3 H=标准化(L+E);
浮子Ks=功率(最大值(点(N,H),0.0),光泽度);
vec4镜面反射=Ks*镜面反射组件;
if(点(L,N)<0.0){
镜面反射=vec4(0.0,0.0,0.0,1.0);
}
浮动系数=(maxFogDistance-眼距)/(maxFogDistance-minFogDistance);
系数=夹具(系数,0.0,1.0);
vec4 finalFogColor=因子*雾色;
vec4最终颜色=(环境光+镜面反射)*纹理2d(纹理,texCoordOut);
gl_FragColor=最终颜色*系数+雾色*(1.0-系数);
gl_FragColor.a=1.0;
}
此外,最小雾距设置为1f,最大雾距设置为10f(我的移动空间很小,目前为5x5,因此这应该是合适的),雾色设置为白色


任何人能提供的任何帮助都将不胜感激。如果问题不在着色器中,我可以发布其他代码(尽管我无法预测其他任何地方会出现问题,在此之前着色器的其他方面工作得很好)。

视线距离绝对是错误的。我真的看不出你在那里想干什么。我认为应该包括眼睛位置的一致性,接下来这个“eyePos=modelViewMatrix*position;”不是眼睛位置而是顶点位置。因此,您需要找到眼睛位置(均匀位置)和顶点位置(当前称为eyePos)之间的距离。当前的等式有一些真正意想不到的情况,例如,如果你的模型矩阵是恒等式,那么距离将始终为零。阅读你的评论使我意识到我犯了一个错误。我混淆了着色器中的位置和相机/眼睛的位置(也称为位置,但在我的主代码中)。是啊,那真是太蠢了。但是,把摄像机的位置作为一个统一的标准传递到方程中并不能解决这个问题。请看我的新顶点代码。好的,看看你的片段着色器,你只会将fogColor部分添加到你声称它曾经工作过的原始颜色中。你能不能试着从你的着色器中删除“+fogColor*(1.0-factor)”部分,并确认你收到了合适的结果,因为我看不出这段代码是如何产生黑色的。另一个问题可能是着色器未编译。您有任何错误吗?没有编译错误。去掉“+fogColor*(1.0-因子)”仍然会产生黑色。还删除了“*因子”,只是运行了我的初始照明计算,以确认我没有破坏沿途的东西。原始结果仍然正确。因此,如果您只使用“gl\u FragColor=finalColor”,它会正常工作吗?