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_Libgdx_Glsl_Shader_Lwjgl - Fatal编程技术网

Opengl 如何使法线贴图着色器具有有限的范围?

Opengl 如何使法线贴图着色器具有有限的范围?,opengl,libgdx,glsl,shader,lwjgl,Opengl,Libgdx,Glsl,Shader,Lwjgl,我有7个灯光的简单法线贴图着色器,它可以在整个屏幕上工作。怎么才能让它只在有限的距离内工作?我试着计算光线和像素之间的距离,如果距离太大,简单的“如果”,但这对我不起作用 varying vec4 v_color; varying vec2 v_texCoords; uniform vec3 lightColor[7]; uniform vec3 light[7]; uniform sampler2D u_texture; un

我有7个灯光的简单法线贴图着色器,它可以在整个屏幕上工作。怎么才能让它只在有限的距离内工作?我试着计算光线和像素之间的距离,如果距离太大,简单的“如果”,但这对我不起作用

    varying vec4 v_color;
    varying vec2 v_texCoords;
    
    uniform vec3 lightColor[7];
    uniform vec3 light[7];
    
    uniform sampler2D u_texture;
    uniform sampler2D u_normals;
    uniform vec2 resolution;
    uniform bool useNormals;
    uniform bool useShadow;
    uniform float strength;
    uniform bool yInvert;
    uniform bool xInvert;
    uniform vec4 ambientColor;
    
    void main() {
    
    // sample color & normals from our textures
    vec4 color = texture2D(u_texture, v_texCoords.st);
    vec3 nColor = texture2D(u_normals, v_texCoords.st).rgb;
    
    // some bump map programs will need the Y value flipped..
    nColor.g = yInvert ? 1.0 - nColor.g : nColor.g;
    nColor.r = xInvert ? 1.0 - nColor.r : nColor.r;
    
    // this is for debugging purposes, allowing us to lower the intensity of our bump map
    vec3 nBase = vec3(0.5, 0.5, 1.0);
    nColor = mix(nBase, nColor, strength);
    
    // normals need to be converted to [-1.0, 1.0] range and normalized
    vec3 normal = normalize(nColor * 2.0 - 1.0);
    
    vec3 sum = vec3(0.0);
    
    for ( int i = 0; i < 7; ++i ){
    
    vec3 currentLight = light[i];
    vec3 currentLightColor = lightColor[i];
    // here we do a simple distance calculation
    
    vec3 deltaPos = vec3( (currentLight.xy - gl_FragCoord.xy) / resolution.xy, currentLight.z );
    
    vec3 lightDir = normalize(deltaPos * 1);
    float lambert = clamp(dot(normal, lightDir), 0.0, 1.0);
    
    vec3 result = color.rgb;
    result = (currentLightColor.rgb * lambert);
    result *= color.rgb;
    sum += result;
    }
    
    
    vec3 ambient = ambientColor.rgb * ambientColor.a;
    vec3 intensity = min(vec3(1.0), ambient + sum); // don't remember if min is critical, but I think it might be to avoid shifting the hue when multiple lights add up to something very bright.
    vec3 finalColor = color.rgb * intensity;
    
    
    //finalColor *= (ambientColor.rgb * ambientColor.a);
    gl_FragColor = v_color * vec4(finalColor, color.a);
    }
改变vec4 v_颜色;
可变矢量2 v_texCoords;
均匀的vec3浅色[7];
均匀vec3光[7];
均匀的二维u_纹理;
均匀采样2D u_法线;
均匀vec2分辨率;
均匀布尔正态分布;
均匀布勒阴影;
均匀浮力;
均匀布尔-因维特;
均匀布尔-辛维特;
均匀的vec4环境色;
void main(){
//从我们的纹理中采样颜色和法线
vec4颜色=纹理2D(u_纹理,v_texCoords.st);
vec3 nColor=texture2D(u_法线,v_texCoords.st).rgb;
//某些凹凸贴图程序需要翻转Y值。。
nColor.g=yInvert?1.0-nColor.g:nColor.g;
nColor.r=xInvert?1.0-nColor.r:nColor.r;
//这是为了调试目的,允许我们降低凹凸贴图的强度
vec3-nBase=vec3(0.5,0.5,1.0);
nColor=混合物(nBase、nColor、强度);
//法线需要转换为[-1.0,1.0]范围并进行规格化
vec3正常=正常化(nColor*2.0-1.0);
vec3总和=vec3(0.0);
对于(int i=0;i<7;++i){
vec3 currentLight=灯[i];
vec3 currentLightColor=lightColor[i];
//这里我们做一个简单的距离计算
vec3 deltaPos=vec3((currentLight.xy-gl_FragCoord.xy)/resolution.xy,currentLight.z);
vec3-lightDir=标准化(deltaPos*1);
浮动lambert=夹紧(点(正常,lightDir),0.0,1.0);
vec3结果=color.rgb;
结果=(currentLightColor.rgb*lambert);
结果*=color.rgb;
总和+=结果;
}
vec3环境=ambientColor.rgb*ambientColor.a;
vec3 intensity=min(vec3(1.0),ambient+sum);//我不记得min是否很关键,但我认为这可能是为了避免在多个灯光加起来非常明亮时改变色调。
vec3最终颜色=color.rgb*强度;
//最终颜色*=(ambientColor.rgb*ambientColor.a);
gl_FragColor=v_color*vec4(最终颜色,color.a);
}
编辑:


您需要测量光三角矢量的长度,并使用该长度进行衰减

lightDir
行之后,可以放置类似的内容,但必须调整
FALLOFF
常量才能获得所需的距离<代码>衰减必须大于0。作为起点,值为0.1将为您提供约4个单位的灯光半径。值越小,半径越大。您甚至可以将其定义为每个灯光的参数(使其成为
vec4
s)

该衰减公式具有钟形曲线。如果希望曲线有一个尖尖的尖端,这可能更真实(尽管对于二维照明可能没有意义),可以添加第二个参数(最初可以将该参数的值设置为0.1,然后从该值开始增加):

有人张贴你可以玩,以直观地看到参数如何改变曲线

另外,不要乘以整数。这将导致着色器无法在某些设备上编译:

vec3 lightDir = normalize(deltaPos * 1); // The integer 1 is unsupported.
“[…]但这对我不起作用。”-什么不起作用?实际结果是什么?预期结果是什么?你太棒了!:)这个答案真的很有帮助。我使用这个衰减公式:
1.0/(衰减.x+(衰减.y*distance)+(衰减.z*distance*distance)
,它的工作非常完美:)
float attenuation = 1.0 / (1.0 + SHARPNESS * distance + FALLOFF * distance * distance);
vec3 lightDir = normalize(deltaPos * 1); // The integer 1 is unsupported.