【问题标题】:OpenGL ES 2.0. GLSL - cannot use two sampled colors at the same time in fragment shaderOpenGL ES 2.0。 GLSL - 不能在片段着色器中同时使用两种采样颜色
【发布时间】:2019-09-04 23:26:27
【问题描述】:

我有一个片段着色器,它可以进行视差映射和光照计算。我已经设法将问题追溯到纹理采样和/或光照计算,所以我只会发布代码以保持简短:

// sample maps
vec3 albedo = texture2D(u_albedo_texture_1, p_texc).rgb;
vec3 ao = texture2D(u_ambientocclusion_texture, v_texcoord).rgb - 0.5; // ambient occlusion
vec3 normalT = texture2D(u_normalmap_texture, p_texc).rgb * 2.0 - 1.0; // tangent space normal

vec4 normalW = vec4(normalize(TBN * normalT).xyz, 1.0); // world space normal

vec3 color = vec3(0.0);
vec3 ambient = textureCube(u_cubemap_texture, -normalW.xyz).rgb; // get ambient lighting from cubemap
color += ambient * ao;

float d = length(light_vector);
float atten = 1.0 / dot(light_attenuation, vec3(1.0, d, d * d)); // compute attenuation of point light

// diffuse term
float ndotl = max(dot(normalW.xyz, light_vector), 0.0);
color += atten * ndotl * light_diffuse.rgb * albedo;

// specular term
float hdotn = max(0.0, dot(half_vector, normalW.xyz));
color += atten * ((shininess + 8.0) / 8.0 * 3.1416) * light_specular.rgb * p_ks * pow(hdotn, shininess);

gl_FragColor = vec4(color.rgb, 1.0);

我有这段代码在其他着色器中工作,但在视差映射着色器中它只是丢弃了像素,我不明白为什么。因此,它不是显示对象,而是简单地丢弃像素,并且对象根本不显示。没有错误或凌乱的颜色,什么都没有。

我设法将问题追溯到反照率和环境采样颜色。它们都被正确采样。如果我打印出来

gl_FragColor = vec4(ambient.rgb, 1.0);

gl_FragColor = vec4(albedo.rgb, 1.0);

它们都可以正确显示,但如果我尝试用两种颜色做某事,像素就会被丢弃。以下都不起作用:

gl_FragColor = vec4(ambient + albedo, 1.0);
gl_FragColor = vec4(ambient * albedo, 1.0);
gl_FragColor = vec4(ambient.r, albedo.g, ambient.b, 1.0);

环境是从立方体贴图中采样的,反照率是从 2D 纹理中采样的。我还有其他用于环境光遮蔽和法线贴图的采样器,它们可以工作,而且它们也可以与环境光或反照率结合使用。 因此,ambient + ao 有效,albedo + ao 有效。

所以,这是我的问题,我不知道是什么原因造成的。就像我说的,我在另一个着色器中有相同的代码,并且那个代码有效。

值得一提的是,它在 OpenGL ES 2.0 的 PowerVR 模拟器上运行。 GPU是nVidia GT220。 也可以随意指出我的代码中的其他错误,比如低效的东西。如有必要,我将发布完整的片段着色器代码。对不起,很长的帖子:P

已解决

哇,不敢相信原因如此愚蠢,但我完全错过了。基本上,我忘记为该特定模型加载立方体贴图,并且它没有发送到着色器。不过,它到底是如何对某些东西进行采样的呢?我的意思是,它是单独工作的,那么纹理单元采样了什么?之前处理后遗留在缓存中的立方体贴图?

【问题讨论】:

  • 我有一种预感,你正在达到着色器中纹理数量的一些实现限制,并且在你使用环境 albedo 的情况下(但不是同时使用) 另一个被优化掉了,所以不是问题。

标签: glsl shader opengl-es-2.0 sampling


【解决方案1】:

不过,它到底是如何对某样东西进行采样的呢?

通常当我的着色器没有产生预期的结果但看起来很“正常”时,这是因为着色器编译丢弃了它(我在某处犯了错误)并决定使用“固定管道”着色器来代替......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多