gpt4 book ai didi

c++ - 使用单 channel 纹理(OpenGL 2)?

转载 作者:太空宇宙 更新时间:2023-11-04 14:30:13 24 4
gpt4 key购买 nike

短篇小说:

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

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

我只有黑色


长话短说:

我可以获得带有 alpha channel 的 RGBA 纹理(例如使用此代码的具有透明背景的文本):

此代码有效:

// === 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

但我试图只使用一个 channel (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. 我还在 glTexImage2D 中尝试了其他 GL_LUMINANCEGL_INTENSITY 而不是 GL_RED 没有区别
  3. 还有其他问题,例如 herehere但主要是使用 OpenGL>3.0 和片段着色器

另外,有没有可能是我的显卡或驱动不支持这个?我在 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();

最佳答案

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

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

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

GL_RED 表示您将亮度置于红色 channel 中(而不是像灰度图像那样置于每个红色、绿色、蓝色 channel 中)。

关于c++ - 使用单 channel 纹理(OpenGL 2)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39943456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com