所以我的纹理具有外部格式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如何解释上传的数据吗?
答案 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)。