0

在我的应用程序中,我需要将两个纹理相乘,然后将结果乘以大于 2 的因子。我为此使用 GL_MODULATE 和 GL_RGB_SCALE。我为此使用以下代码

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Input.texID);
glEnable(GL_TEXTURE_2D);


glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, Temp64.texID);
glEnable(GL_TEXTURE_2D);
// glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Temp64.wide, Temp64.high, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);   
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);

glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE,   4.0);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, SystemFBO);
glViewport(0, 0, wide, high);
//glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

根据我对 OpenGL ES 1.1 规范的理解,首先在纹理之间进行调制,然后乘以 4,然后钳制到 [0 1]。

这就是规范所说的

“如果 TEXTURE ENV MODE 的值为 COMBINE,则纹理函数的形式取决于 COMBINE RGB 和 COMBINE ALPHA 的值,根据表 3.17。然后将纹理函数的 RGB 和 ALPHA 结果乘以RGB SCALE 和 ALPHA SCALE 的值。结果被限制在 [0, 1]。

但我注意到的是不同的。它首先将纹理单元 1 乘以 4 并夹在 [0 1] 中,然后用纹理单元 0 进行调制。但我希望在调制后应用 RGB_SCALE。

我尝试将调制结果写入 FBO,然后使用缩放,但它不起作用。

我想要做的是将一个图像与另一个图像相乘,然后将结果乘以一个高于 2 的值。在第二次乘法之前不应该有钳位。有人能帮帮我吗?

4

1 回答 1

0

在过去,我遇到了几个与纹理组合器相关的问题,类似于你提到的那些。现代硬件没有固定的功能管道,因此它的所有功能都是通过着色器实现的,其中一些实现会产生意想不到的结果。

你的目标平台是什么?我的建议是完全摆脱纹理组合器并将所有代码移动到着色器(如果您的目标平台允许的话)。

另外,如果我正确阅读了您的代码,则需要在绑定第一个纹理后放置 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE),以便在调用 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS) 时使用它。

glEnable(GL_TEXTURE_2D) 也放错了位置,应该在任何其他与纹理相关的函数之前调用它。

于 2013-04-29T00:59:27.647 回答