c++ - OpenGL 中的 2D 环境照明

标签 c++ opengl 2d lighting

我正在制作一款 2D 横向卷轴游戏,目前正在实现灯光。灯光只是渲染在地形之上的光渐变纹理,相乘以使其照亮该区域。但是,我不知道如何也不了解如何进行环境照明。下图总结了我所拥有的,底部是我想要的。

enter image description here

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

最佳答案

我最终创建了一个屏幕大小的 FBO 纹理,用环境颜色清除它并绘制附近的所有灯光。然后,我将它传递给我制作的着色器,该着色器采用 2 种制服纹理。要绘制的纹理和灯光 FBO 本身。着色器将使用 FBO 绘制的纹理相乘,结果很好。

氛围.frag

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;
}

关于c++ - OpenGL 中的 2D 环境照明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18198168/

相关文章:

c - 当您使用负参数调用 glClearColor 时会发生什么?

javascript - 仅 vis graph2d y 轴整数

c++ - 为什么从流中提取字符串会设置 eof 位?

c++ - 说 xvalues 具有身份并且是可移动的是正确的吗?

c++ - glAttribLocation 返回 -1,即使顶点着色器正在积极使用它

delphi - 计算行和列

c# - 厚壁二维迷宫中的碰撞检测

c++ - (2d Square Collision Detection) 碰撞时移动物体

c++ - QGL小部件: overpainting with QPainter

c++ - 在 C++/G++ 中是否有*任何*方法来获取 C 样式数组的长度?