Opengl 通用GLSL照明着色器

Opengl 通用GLSL照明着色器,opengl,glsl,Opengl,Glsl,基于像素的照明是许多OpenGL应用程序中的常见问题,因为标准OpenGL照明质量非常差 我想使用GLSL程序在我的OpenGL程序中使用基于每像素的照明,而不是逐顶点。只是漫射照明,但至少有雾、纹理和纹理alpha 我从以下几点开始: texture.vert: 改变vec3位置; 可变vec3正常; 真空总管(真空) { gl_位置=gl_模型视图投影矩阵*gl_顶点; gl_FrontColor=gl_Color; gl_TexCoord[0]=gl_MultiTexCoord0; 法线=

基于像素的照明是许多OpenGL应用程序中的常见问题,因为标准OpenGL照明质量非常差

我想使用GLSL程序在我的OpenGL程序中使用基于每像素的照明,而不是逐顶点。只是漫射照明,但至少有雾、纹理和纹理alpha

我从以下几点开始:

texture.vert:

改变vec3位置;
可变vec3正常;
真空总管(真空)
{
gl_位置=gl_模型视图投影矩阵*gl_顶点;
gl_FrontColor=gl_Color;
gl_TexCoord[0]=gl_MultiTexCoord0;
法线=归一化(gl_法线矩阵*gl_法线);
位置=vec3(gl_模型视图矩阵*gl_顶点);
}
纹理.frag:

均匀取样器0;
均匀照明;
可变vec3位置;
可变vec3正常;
真空总管(真空)
{
vec3-lightDir;
浮点数;
vec3 eyeDir=normalize(-position);//相机位于模型视图空间中的(0,0,0)
vec4 lightAmbientDiffuse=vec4(0.0,0.0,0.0,0.0);
vec4 lightSpecular=vec4(0.0,0.0,0.0,0.0);
//迭代所有灯光

对于(int i=0;i我强烈建议您阅读,了解标准ADS lightning在GLSL中是如何实现的。这是GL 4.0,但调整到您的版本并不是问题:

此外,还可以在视图(摄影机)空间中操作,因此不要对眼睛向量求反:

    vec3 eyeDir  = normalize(-position); 
我的问题与你的问题非常相似,因为我也否定了眼向量,忘记了它被转换到视图空间。在当前场景中,你的漫反射和镜面反射计算似乎也是错误的。在你的位置上,我根本不会使用固定管道中的数据,否则在着色器中这样做有什么意义? 以下是计算每碎片ADS点闪电中漫反射和镜面反射的方法:

void ads( int lightIndex,out vec3 ambAndDiff, out vec3 spec )
{


vec3 s =  vec3(lights[lightIndex].Position -  posOut) ;
vec3 v = normalize( posOut.xyz );
vec3 n = normalize(normOut); 
vec3 h = normalize(v+s) ;// half vector (read in the web on what it is )


    vec3 diffuse =  ((Ka+ lights[lightIndex].Ld) * Kd *  max( 0.0,dot(n, v) )) ;
     spec =  Ks *  pow( max(0.0, dot(n,h) ), Shininess ) ;  


 ambAndDiff =   diffuse ;

/// Ka-material ambient factor
/// Kd-material diffuse factor
/// Ks-material specular factor.
/// lights[lightIndex].Ld-lights diffuse factor;you may also add La and Ls if you want to have even more control of the light shading.
}
我也不建议你使用这里的衰减方程,这很难控制。如果你想添加基于光半径的衰减

显而易见的第一点:你绑定了采样器吗?你的纹理坐标和法线是否正确?如果你将gl_FragColor设置为固定颜色,它是否会显示几何体?使用着色器,我发现在没有能够进入和跟踪的情况下,通过使用和添加一个小特征,一次一个,更容易让我的头脑围绕它们:p.采样器Is TEXTURE_2D并绑定渲染多边形。纹理坐标正确,因为正常openGL照明性能完美。法线完美(如前所述)是的,它显示了当将GL*FraceLoice设置为固定颜色或仅为ToCCORE时的几何图形。GLSL没有通用功能或模板元编程,尽管可以将C++模板转换为GLSL函数。