Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何渲染GL_ALPHA纹理?_Opengl_Ftgl - Fatal编程技术网

Opengl 如何渲染GL_ALPHA纹理?

Opengl 如何渲染GL_ALPHA纹理?,opengl,ftgl,Opengl,Ftgl,我正在尝试使用FTGL字体库,创建纹理贴图字体并将其渲染到屏幕上。库以GL_ALPHA格式创建一个纹理来保存字体图示符,然后当您告诉它渲染字符串时,它会执行并glBegin(GL_QUADS)并渲染每个图示符,这正是您所期望的方式 唯一的问题是,我没有收到任何短信。在一个场景中,我得到的是实心黑框而不是文本,在另一个场景中,我什么也得不到。我已经在gDEBugger下运行了代码,以确保纹理被正确上传和设置,并且一切看起来都正常,但我仍然没有看到任何输出 我试过一些显而易见的东西。事先调用glCo

我正在尝试使用FTGL字体库,创建纹理贴图字体并将其渲染到屏幕上。库以
GL_ALPHA
格式创建一个纹理来保存字体图示符,然后当您告诉它渲染字符串时,它会执行并
glBegin(GL_QUADS)
并渲染每个图示符,这正是您所期望的方式

唯一的问题是,我没有收到任何短信。在一个场景中,我得到的是实心黑框而不是文本,在另一个场景中,我什么也得不到。我已经在gDEBugger下运行了代码,以确保纹理被正确上传和设置,并且一切看起来都正常,但我仍然没有看到任何输出

我试过一些显而易见的东西。事先调用
glColor
以尝试设置文本颜色不会产生任何效果。尝试确保alpha混合正常工作也是如此,例如:

glEnable(GL_ALPHA_TEST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

为了使从
GL_ALPHA
纹理到屏幕的渲染正确显示,有人知道我遗漏了什么吗?

在检查了FTGL的代码后,很清楚API是设计用来自己进行文本渲染的。您需要调用它的渲染函数,这将在内部进行OpenGL调用

换句话说,FTGL的设计目的不是将字体加载到纹理中,然后给你纹理对象,让你自己绘制字形。这并不意味着你不能,因为API不会帮助你做到这一点

变为黑色的原因是
GL_ALPHA
纹理在访问时为RGB组件返回零。由于您在纹理环境中使用了
GL_MODULATE
,因此将用颜色的RGB部分乘以0

要执行所需操作,需要将
GL\u纹理环境模式
设置为
GL\u组合
,而不是
GL\u调制
。这意味着您需要使用,这并不简单。自从着色器的固定函数存在以来,我就放弃了它们,很长时间没有接触组合器了。因此,采取什么与一粒盐。以下是环境代码应该是什么样子的猜测:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
您要做的是生成一种颜色,其中RGB部分来自
glColor
,Alpha部分来自纹理。你就是这样做的

在英语中,第一行表示纹理环境模式为“组合”,这将激活更复杂的操作模式。接下来的三行指定如何生成颜色的RGB部分。
GL\u COMBINE\u RGB
设置为
GL\u REPLACE
意味着源RGB值0将是输出RGB的值。将
GL\u SRC0\u RGB
设置为
GL\u PRIMARY\u COLOR
意味着源RGB值0是原色,这是顶点处理生成的颜色(即:除非您使用照明,否则这正是您通过
glColor
传递的颜色)。将
GL\u operandor0\u RGB
设置为
GL\u SRC\u COLOR
意味着采用原样的颜色(可以执行一些特殊操作,如采用
1-颜色
或其他任何操作)

接下来的3行设置输出颜色的alpha部分的来源。
GL\u COMBINE\u ALPHA
设置为
GL\u REPLACE
意味着源ALPHA值0(不同于源RGB值0)将是输出ALPHA的值。将
GL_SRC0_ALPHA
设置为
GL_TEXTURE
意味着源ALPHA值0来自当前纹理单元的纹理。将
GL\u operator\u ALPHA
设置为
GL\u SRC\u ALPHA
意味着将ALPHA保持原样(如前所述,您可以在此处对ALPHA应用一些变换)


或者,如果您的OpenGL实现可用,您可以设置swizzle掩码,以有效地将
GL\u ALPHA
格式转换为
GL\u强度
。然后您可以使用
GL\u MODULATE
作为
GL\u纹理\u ENV\u模式
。但是,您必须确保您的混合模式是
glBlendMode(GL\u ONE,GL\u ONE\u减去SRC\u ALPHA)
。这是必要的,因为
GL_MODULATE
会将颜色乘以alpha。如果您使用
GL_SRC_ALPHA
而不是
GL_ONE
,您将进行两次乘以ALPHA(一次在纹理环境阶段,一次在混合阶段)。

“库以GL_ALPHA格式创建纹理以保存字体图示符”真的吗?它不允许您选择要使用的格式吗?如果没有,那就太不幸了,因为GL 3.1 core和更高版本不再有GL_ALPHA纹理了。@Nicol:是的,真的,那又怎么样?我不知道有哪种视频卡的驱动程序只实现核心功能而忽略向后兼容性。这将是一个非常愚蠢的举动,制造商知道这一点。MacOSX 10.7没有实现兼容性。您可以选择2.1或3.2核心。即使忽略它依赖于删除的内容这一事实,它仍然应该为您提供一些关于所需格式的选项。因为它们使用GL_ALPHA,所以您必须付出大量的努力才能使其与纹理环境和颜色一起工作(见下文)。如果他们像大多数人所期望的那样使用GL_强度,你可以使用GL_调制和混合模式
GL_ONE
GL_ONE_减号-SRC_ALPHA
。我正在调用它的渲染函数,并让它在内部进行OpenGL调用。它只是不能很好地呈现事物。我昨晚花了几个小时,今天早上在代码中到处乱窜(一个糟糕的经历,我不是一个C++的家伙!)只是试图使纹理设置正确,因为我有一个边缘情况,它处理不正确。我确实计划将渲染移到基于着色器的代码中,但首先我要确保它在固定函数中正常工作,因为库是为固定函数设计的,这给了我一个健全性检查。