尽管输入具有正确的值,但GLSL Computed Fragment颜色仍为黑色

时间:2017-12-20 23:11:46

标签: c++ opengl glsl

我的片段着色器如下:

#version 330 core
out vec3 color;
in float U;
in vec2 UV;
in vec4 vertexNormal_worldSpace;
uniform sampler1D TextureSampler;
uniform sampler2D SandSampler;
uniform vec4 LightPos;
void main()
{
    float cosT = 0.3+clamp(dot(normalize(vertexNormal_worldSpace.xyz),normalize(LightPos.xyz)),0.0,0.7);
    vec3 t = texture(SandSampler,UV).rgb;
    vec3 t2 = texture(TextureSampler,U).rgb;
    color= cosT * t.rgb*t2.rgb;
}

在此代码中,TextureSampler是256x1纹理,SandSampler是512x512纹理。

我希望得到的颜色是tt2的颜色之间的混合,乘以cosT的值(计算照明的值)。相反,我全黑了。我测试了cosTt.rgbt2.rgb以确认它们包含正确的值并按预期​​独立显示,我还检查了我的UV坐标是否正确。我可以合并cosTt2.rgb来生成正确的结果:color= cosT * t2.rgb;或者我可以简单地color = t.rgb;生成正确的结果,但是包括t.rgb in任何方式都会导致全黑的结果。

代码color = vec3(cosT,t.g,0);在红色组件中生成正确的cosT值,但无论如何都不会显示绿色。代码color = vec3(0,t.g,0);然后生成纹理的正确绿色组件。

2 个答案:

答案 0 :(得分:0)

您说您已经对cosTt.rgbt2.rgb进行了测试。如果这些确实是正确的,我们需要查看最后一行:

color= cosT * t.rgb*t2.rgb;

您的颜色为黑色的原因必须因为RGB值设置为零 或者,可能是因为没有发布的代码导致这些片段失败per-sample operations & tests,或者您可能会遇到其中一个古怪的特定于供应商的限制你的片段着色器。但是我相信这个问题出现在片段着色器中......

cosT的第一个作业是将其值限制在0和1之间。这很好。

我的意思是你的问题在于这个乘法:

t.rgb*t2.rgb;

根据GLSL operators,您正在执行分量向量乘法,因此:

t.rgb*t2.rgb = (t.r * t2.r, t.g * t2.g, t.b *t2.b)

现在,这会是什么?假设您的RGB颜色落在[0..1]范围内,那么您总是会得到一个较小的值(例如0.1 * 0.7 = 0.07)。

此外,如果您将该较小的值乘以另一个数字cosT,它将在[0..1]之间,则结果更接近0.如果还不是黑色,则它将关闭。

<小时/> 当你说你需要混合你的颜色时,我的信念是组件式矢量乘法是 NOT 你想要的。

而是考虑使用mix function或使用加权平均值。这将插入您的颜色。

答案 1 :(得分:0)

我自己解决了这个问题,问题在于我的代码用于绑定纹理而不是着色器本身,它以某种方式一次使用一个纹理但不使用2个纹理。代码:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_1D,TextureID);
glUniform1i(TextureID,0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,SandTextureID);
glUniform1i(SandTextureID,1);

更改glBindTexture中的值:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_1D,Texture);
glUniform1i(TextureID,0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,SandTexture);
glUniform1i(SandTextureID,1);

代码现在有效。我将统一位置传递给纹理,而不是纹理位置,这导致了奇怪的行为。