OpenGL:传递具有外部格式GL_RED但内部格式GL_RGBA的纹理

时间:2018-07-10 14:25:13

标签: opengl

所以我的纹理具有外部格式GL_RED和内部格式GL_RGBA

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap->width, bitmap->height, 0, layout, GL_UNSIGNED_BYTE, bitmap->data);

我想将纹理存储为(1,1,1,r)而不是(r,0,0,0)。 我不想将整个位图重新计算为RGBA,并且我不想创建一个新的着色器。可以告诉OpenGL如何解释上传的数据吗?

2 个答案:

答案 0 :(得分:4)

您应该避免内部格式和传递的数据之间出现这种差异。如果您希望纹理具有一个单一的彩色通道,该通道是一个标准化的无符号字节,则使用GL_R8作为内部格式的正确拼写方法。纹理将被存储为单个红色值,其他通道在纹理访问时以0、0、1的顺序填充。

您可以修改如何使用texture swizzle setting访问纹理数据。这是每个纹理的设置。如果您想以(1, 1, 1, r)的形式在着色器中接收数据,可以使用以下复杂设置进行设置:

GLint swizzleMask[] = {GL_ONE, GL_ONE, GL_ONE, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

请注意,这不会改变数据的“存储”方式;纹理将始终是单通道8位无符号归一化纹理。它会影响着色器访问纹理数据的方式。

请注意,您可以在着色器本身中执行此操作,但实际上,使用渐变蒙版会更容易。

答案 1 :(得分:2)

只需使用GL_RED作为内部格式。

在着色器中采样纹理时,用所需的值填充其余组件(GBA,无R)。