首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在绿色表面显示红光

在绿色表面显示红光
EN

Stack Overflow用户
提问于 2018-10-27 21:34:43
回答 1查看 92关注 0票数 1

嘿,大家好,我在一个基于2D Tile的游戏中使用照明技术,我的照明计算遇到了问题,在我的游戏中,我拍摄灰度图像,然后使用任何我喜欢的颜色,无论是绿色(rgb=(0,1,0))还是红色(rgb=(1,0,0)或任何颜色)。然后我把我的照明计算应用到那个纹理和彩色像素上。当灯是白色的(rgb=(1,1,1))时,灯光工作得很好,但是当它是红色或绿色的时候,它不会显示我想要的方式。我知道为什么会发生这种情况,当然,因为在一个纯绿色的房间里,一个纯粹的红灯会反射不出红光,所以房间会保持黑暗。我真正想要的是看到红灯出现在绿色的表面上。所以我的问题是,我怎样才能在绿色的表面上清楚地显示红灯?(或者任何表面上的任何其他颜色)

这是我的片段着色器的代码,其中衰减只是光的衰减,lightColor显然是灯的rgb值,距离是从给定的矢量到该光的距离(在顶点着色器中计算),最后颜色是应用于纹理的rgb值。

提前感谢您的帮助!

代码语言:javascript
复制
vec3 totalDiffuse = vec3(0.0);

for(int i = 0; i < 4; i++)
{
    float attFactor = attenuation[i].x + (attenuation[i].y * distance[i]) + (attenuation[i].z * distance[i] * distance[i]);
    totalDiffuse = totalDiffuse + (lightColor[i])/attFactor;
}
totalDiffuse = max(totalDiffuse,0.2);

out_Color = texture(textureSampler, pass_textureCoords)*vec4(color,alpha)*vec4(totalDiffuse,1);

这是一张目前表面上纯粹的红光是什么样子的图片,它应该在白色的圆圈内,你可以看到它对水有一点影响,因为我给了水一个小的红色成分-- 光演示图像

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-27 21:56:48

一种可能是改变光的计算。

计算浅色和表面颜色的灰度。将表面颜色乘以浅色的灰度,将光色乘以表面颜色的灰度,最后将它们相加:

代码语言:javascript
复制
vec4  texCol  = texture(textureSampler, pass_textureCoords);
float grayTex = dot(texCol.rgb,  vec3(0.2126, 0.7152, 0.0722));
float grayCol = dot(colGray.rgb, vec3(0.2126, 0.7152, 0.0722));

vec3  mixCol  = texCol.rgb * grayCol + color.rgb * grayTex;

out_Color     = vec4(mixCol * totalDiffuse, texCol.a * alpha); 

注意,这个算法强调光的颜色,而牺牲了表面的颜色。但这正是你想要的,在红灯下浸泡一片绿地。当然,这与用自己的颜色照亮一个区域的愿望相矛盾。如果光线是白色的,那么表面也会亮成白色。

如果您想要一些具有上述效果的光源,其他光源但具有问题的原始效果,那么我建议引入一个参数,将这两种效果混合在一起:

代码语言:javascript
复制
uniform float u_lightTint;

void main()
{
    .....

    vec3 mixCol = texCol.rgb * grayCol + color.rgb * grayTex;

    mixCol      = mix(texCol.rgb * color.rgb, mixCol.rgb, u_lightTint);

    out_Color   = vec4(mixCol * totalDiffuse, texCol.a * alpha); 
} 

如果u_lightTint设置为1.0,则使用“新”光计算,将其设置为0.0,则使用原始光计算。这两种算法都可以用u_lightTint线性插值。

或者,u_lightTint参数可以在浅色的alpha通道中编码:

代码语言:javascript
复制
mixCol = mix(texCol.rgb * color.rgb, mixCol.rgb, color.a);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53026481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档