片段着色器始终使用1.0作为Alpha通道

时间:2014-01-07 05:10:29

标签: opengl glsl

我有一个加载了

的2D纹理
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, gs.width(), gs.height(), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, gs.buffer());

其中gs是使用返回正确类型的方法的对象。

在片段着色器中,我从纹理中进行采样,并尝试将其用作结果颜色的Alpha通道。如果我在输出纹理中使用其他通道的采样值,它会产生我所期望的。我用于Alpha通道的任何值似乎都会被忽略,因为它总是绘制Color

我正在使用以下方式清除屏幕:

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

任何人都可以建议我可能做错了吗?我得到一个OpenGL 4.0上下文,有8个红色,8个绿色,8个蓝色和8个alpha位。

顶点着色器:

#version 150

in vec2 position;
in vec3 color;
in vec2 texcoord;

out vec3 Color;
out vec2 Texcoord;

void main()
{
    Texcoord = texcoord;
    Color = color;
    gl_Position = vec4(position, 0.0, 1.0);
}

Fragment Shader:

#version 150

in vec3 Color;
in vec2 Texcoord;

out vec4 outColor;

uniform sampler2D tex;

void main()
{
    float t = texture(tex, Texcoord);
    outColor = vec4(Color, t);
}

2 个答案:

答案 0 :(得分:3)

坦率地说,我很惊讶这实际上是有效的。 texture (...)返回vec4(除非您使用的是影子/整数采样器,否则不是)。如果您打算将其存储在float中, 真的 应该将该纹理调整为单个组件。

我猜你想要你的纹理的alpha组件,但是谁真的知道 - 试试这个:

float t = texture (tex, Texcoord).a; // Get the alpha channel of your texture

一个中等体面的GLSL编译器会警告/错误你做你现在想做的事情。我怀疑你的也是,但是你在编译着色器时没有检查着色器信息日志。


更新

原始答案甚至没有开始解决您使用GL_DEPTH_COMPONENT内部格式纹理所做的疯狂。我完全错过了,因为代码不适合屏幕。

为什么使用gs.rgba()将数据传递给内部和像素传输格式正好为1个组件的纹理?此外,如果您打算在着色器中使用深度纹理,那么它总是返回 a = 1.0 的原因实际上是 非常 简单:< / p>


从GLSL 1.30开始,当使用texture (...)进行采样时,会自动设置深度纹理以返回以下vec4

vec4(r,r,r,1.0)

RGB 组件替换为 R (浮点深度)的值, A 替换为常量值 1.0

答案 1 :(得分:0)

您的问题是,当您需要vec3时,您只需传递vec4。 RGBA - 4个组件,而不仅仅是三个组件。