使用单通道纹理(OpenGL 2)?

时间:2016-10-09 12:09:23

标签: c++ opengl textures

短片:

当我使用像这样加载的纹理渲染任何东西时

glTexImage2D   ( GL_TEXTURE_2D, 0, GL_R8, width,  height, 0, GL_RED,   GL_UNSIGNED_BYTE, pixels );

我只得到黑色

长篇大论:

我可以使用alpha通道获取RGBA纹理(例如使用此代码的透明backgorund文本):

此代码有效:

// === load
#define GL_ABGR 0x8000
SDL_Surface * surf = SDL_LoadBMP( "common_resources/dejvu_sans_mono_RGBA.bmp" );
glGenTextures  ( 1, &itex );
glBindTexture  ( GL_TEXTURE_2D, itex );
glTexImage2D   ( GL_TEXTURE_2D, 0, GL_RGBA, surf->w,  surf->h, 0, GL_ABGR,   GL_UNSIGNED_BYTE, surf->pixels );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
// ....
// === render
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, itex );
glColor3f(1.0f,1.0f,1.0f);
glEnable(GL_BLEND);
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
drawString ( caption,             xmin, ymin+12, 6 );

呈现enter image description here

但我试图只使用一个通道(8位;灰度)图像/纹理而不是RGBA。这些我无论是否有透明度都无法呈现。无论我做什么,我只得到黑色图像。

这不是

// === load
#define GL_ABGR 0x8000
SDL_Surface * surf = SDL_LoadBMP( "common_resources/dejvu_sans_mono_Alpha.bmp" );
glGenTextures  ( 1, &itex );
glBindTexture  ( GL_TEXTURE_2D, itex );
glTexImage2D   ( GL_TEXTURE_2D, 0, GL_R8, surf->w,  surf->h, 0, GL_RED,   GL_UNSIGNED_BYTE, surf->pixels );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
// ....
// === render
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, itex );
glColor3f(1.0f,1.0f,1.0f);
//glEnable(GL_BLEND);
//glEnable(GL_ALPHA_TEST);
//glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
drawString ( caption,             xmin, ymin+12, 6 );

呈现enter image description here

注意:

  1. 我知道我应该以某种方式使用glTexEnv根据例如here但我的主要问题是显然单色纹理根本无法呈现
  2. 我在GL_LUMINANCE中尝试了其他GL_INTENSITYGL_RED代替glTexImage2D而没有区别
  3. 还有其他问题,例如herehere,但主要是使用OpenGL> 3.0和片段着色器
  4. 另外,我的显卡或驱动程序是否可能不支持此功能?我在ubuntu 16.04

    GL_VENDOR:     Intel Open Source Technology Center
    GL_RENDERER:   Mesa DRI Intel(R) HD Graphics 530 (Skylake GT2) 
    GL_VERSION:    3.0 Mesa 11.2.0
    
    完整性

    - 虽然它不是重要的,drawString看起来像这样:

    drawString ( caption,             xmin, ymin+12, 6 ){
      const int nchars = 95;
      float persprite = 1.0f/nchars;
      glBegin(GL_QUADS);
      for(int i=0; i<65536; i++){
        if( str[i] == 0 ) break; // 0-terminated string
        int isprite = str[i] - 33; // 33 is offset of meaningfull ASCII characters
        float offset  = isprite*persprite+(persprite*0.57);
        float xi = i*sz + x;
        glTexCoord2f( offset          , 1.0f ); glVertex3f( xi,    y,    3.0f );
        glTexCoord2f( offset+persprite, 1.0f ); glVertex3f( xi+sz, y,    3.0f );
        glTexCoord2f( offset+persprite, 0.0f ); glVertex3f( xi+sz, y+sz*2, 3.0f );
        glTexCoord2f( offset          , 0.0f ); glVertex3f( xi,    y+sz*2, 3.0f );
      }
      glEnd();
    

    }

1 个答案:

答案 0 :(得分:-1)

我想尽力帮助你。在我的项目中,我使用这些参数从灰度源图像生成纹理:

glTexImage2D(GL_TEXTURE_2D, 0, 1, width, height, 0, GL_RED,
             GL_UNSIGNED_BYTE, pixels);

documentation中所述,第三个参数 - 颜色分量的数量(在我们的例子中为1)。需要检查GL_R8的整数值或明确替换它。

GL_RED表示您将亮度置于红色通道中(不是每个红色,绿色,蓝色通道都与灰度图像相同)。

相关问题