在绿色表面显示红光 LWJGL
Showing Red Light on Green Surfaces LWJGL
大家好,我在 2D Tile Based 游戏中处理光照,运行 我的光照计算有问题,在我的游戏中,我拍摄灰度图像,然后使用着色器为它们着色,无论我喜欢什么颜色无论是绿色(rgb=(0,1,0))还是红色(rgb=(1,0,0))或任何颜色。因此,我将我的照明计算应用于该纹理和彩色像素。当灯光为白色 (rgb=(1,1,1)) 时,照明效果很好,但当它是红色或绿色时,它不会显示我想要的方式。我当然知道为什么会发生这种情况,因为在纯绿色的房间里,现实的纯红光不会反射红光,所以房间会保持黑暗。我真正想要的是看到绿色表面上出现红光。所以我的问题是如何在绿色表面上清楚地显示红光?(或者任何表面上的任何其他颜色)
这是我的片段着色器的代码,其中 attenuation 只是光的衰减,lightColor 显然是灯的 rgb 值,distance 是给定向量到该灯的距离(在顶点着色器中计算)最后颜色是应用于纹理的 rgb 值。
在此先感谢您的帮助!
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);
这是目前纯红光在表面上的图像,它应该在白色圆圈内,你可能会看到它对水有一点影响,因为我给了水一个小的红色成分-
Light Demo Image
一种可能是改变光照计算。
计算光色和表面颜色的灰度。表面颜色乘以光色灰度,光色乘表面颜色灰度,最后求和:
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);
请注意,此算法以牺牲表面颜色为代价来强调光的颜色。但这就是您想要的,将绿色区域浸入红光中。当然,这与用自己的颜色照亮一个区域的愿望相矛盾。如果光线是白色的,那么表面也会发白。
如果你想要一些光源具有上面描述的效果,而其他光源却具有问题的原始效果,那么我建议引入一个混合两种效果的参数:
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,则使用"new"光照计算,设置为0.0,则使用原始光照计算。两种算法都可以通过u_lightTint
.
进行线性插值
或者,u_lightTint
参数可以在浅色的 alpha 通道中编码:
mixCol = mix(texCol.rgb * color.rgb, mixCol.rgb, color.a);
大家好,我在 2D Tile Based 游戏中处理光照,运行 我的光照计算有问题,在我的游戏中,我拍摄灰度图像,然后使用着色器为它们着色,无论我喜欢什么颜色无论是绿色(rgb=(0,1,0))还是红色(rgb=(1,0,0))或任何颜色。因此,我将我的照明计算应用于该纹理和彩色像素。当灯光为白色 (rgb=(1,1,1)) 时,照明效果很好,但当它是红色或绿色时,它不会显示我想要的方式。我当然知道为什么会发生这种情况,因为在纯绿色的房间里,现实的纯红光不会反射红光,所以房间会保持黑暗。我真正想要的是看到绿色表面上出现红光。所以我的问题是如何在绿色表面上清楚地显示红光?(或者任何表面上的任何其他颜色)
这是我的片段着色器的代码,其中 attenuation 只是光的衰减,lightColor 显然是灯的 rgb 值,distance 是给定向量到该灯的距离(在顶点着色器中计算)最后颜色是应用于纹理的 rgb 值。
在此先感谢您的帮助!
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);
这是目前纯红光在表面上的图像,它应该在白色圆圈内,你可能会看到它对水有一点影响,因为我给了水一个小的红色成分- Light Demo Image
一种可能是改变光照计算。
计算光色和表面颜色的灰度。表面颜色乘以光色灰度,光色乘表面颜色灰度,最后求和:
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);
请注意,此算法以牺牲表面颜色为代价来强调光的颜色。但这就是您想要的,将绿色区域浸入红光中。当然,这与用自己的颜色照亮一个区域的愿望相矛盾。如果光线是白色的,那么表面也会发白。
如果你想要一些光源具有上面描述的效果,而其他光源却具有问题的原始效果,那么我建议引入一个混合两种效果的参数:
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,则使用"new"光照计算,设置为0.0,则使用原始光照计算。两种算法都可以通过u_lightTint
.
进行线性插值
或者,u_lightTint
参数可以在浅色的 alpha 通道中编码:
mixCol = mix(texCol.rgb * color.rgb, mixCol.rgb, color.a);