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
C++ OpenGL中的二维环境光_C++_Opengl_2d_Lighting - Fatal编程技术网

C++ OpenGL中的二维环境光

C++ OpenGL中的二维环境光,c++,opengl,2d,lighting,C++,Opengl,2d,Lighting,我正在制作一个2D侧滚游戏,目前正在实现灯光。灯光只是一个在地形顶部渲染的灯光渐变纹理,它可以使该区域变亮。然而,我不知道如何也不知道如何做环境照明。下面的图片总结了我所拥有的,下面的部分是我想要的 我愿意回答有关着色器的问题,因为我知道如何使用它们。我最终创建了一个与屏幕大小相同的FBO纹理,用环境的颜色将其清除,并在所有附近的灯光中绘制。然后,我把它通过我制作的一个着色器,该着色器为制服引入了两种纹理。要绘制的纹理和灯光FBO本身。着色器将使用FBO绘制的纹理相乘,效果很好 氛围 unif

我正在制作一个2D侧滚游戏,目前正在实现灯光。灯光只是一个在地形顶部渲染的灯光渐变纹理,它可以使该区域变亮。然而,我不知道如何也不知道如何做环境照明。下面的图片总结了我所拥有的,下面的部分是我想要的


我愿意回答有关着色器的问题,因为我知道如何使用它们。

我最终创建了一个与屏幕大小相同的FBO纹理,用环境的颜色将其清除,并在所有附近的灯光中绘制。然后,我把它通过我制作的一个着色器,该着色器为制服引入了两种纹理。要绘制的纹理和灯光FBO本身。着色器将使用FBO绘制的纹理相乘,效果很好

氛围

uniform sampler2D texture1;
uniform sampler2D texture2;
varying vec2 texCoord;

void main( void ) {
    vec4 color1 = vec4(texture2D(texture1, gl_TexCoord[0].st));
    vec4 color2 = vec4(texture2D(texture2, texCoord));
    gl_FragColor = color1*vec4(color2.r,color2.g,color2.b,1.0);
}
氛围

varying vec2 texCoord;
uniform vec2 screen;
uniform vec2 camera;

void main(){
    gl_Position = ftransform();
    gl_TexCoord[0] = gl_MultiTexCoord0;
    vec2 temp = vec2(gl_Vertex.x,gl_Vertex.y)-camera;
    texCoord = temp/screen;
}

环境照明很简单,它是在没有任何光源的情况下的基本照明颜色。它在整个材质中都是均匀的,因为它没有方向,所以可以将其与照明模型中累积的漫反射项组合。如果要进行多次光照,首先要进行一次光照,其中地形由恒定的环境光项进行调制,然后对每个附加灯光的漫反射/镜面反射贡献进行加法混合。因此,当我渲染地形原始纹理的三角形时,我需要将其通过环境光着色器(某种程度上)。实际上,您要做的是累积每个灯光的所有照明项(加上全局环境光项),然后在最后按此值调制基本纹理颜色。因此,您将按照以下顺序进行加法混合:环境光、Light0、Light1、Light2、…、Light N,然后使用基本纹理颜色进行最后一次乘法混合。它是:(环境光+漫反射)*基础色,只是为了澄清术语。环境光是间接照明的粗略近似值。因为间接光只能增加亮度,所以你不想让它达到底部图像。要使图像中的某个区域变暗,只需减少光照贴图中的相应因子即可。这非常有帮助。您应该学会在GLSL中使用旋转。实际上,您可以使用vec4(color2.r、color2.g、color2.b、1.0)代替vec4(color2.rgb、1.0)。同样,在顶点着色器中,可以使用
gl_vertex.xy
而不是vec2(gl_vertex.x,gl_vertex.y)。此外,如果纹理2是3通道纹理格式,则当您对其进行采样时,GLSL会自动将第4个分量的值指定为1.0。另一个相关注意事项是,如果要以这种方式进行照明,请确保在将FBO纹理拉伸到屏幕上时使用
正交
投影。您需要像素中心与纹理中心对齐,否则会出现纹理过滤问题(模糊(线性)或锯齿(最近)。透视校正通常会错误对齐纹理坐标。我在这里回答了一个类似的问题:最近。