簡體   English   中英

OpenGL:渲染到FBO時是否支持紋理組合器功能?

[英]OpenGL: are texture combiner functions supported when rendering to FBO?

我有一個OpenGL紋理渲染到第一個FBO,我需要編輯它的亮度,渲染到第二個FBO,然后在屏幕上繪制它。

如果我將紋理渲染到第二個FBO(不修改其亮度)然后在屏幕上繪制它,它會正確顯示。

如果我嘗試編輯渲染紋理的亮度(使用像glTexEnv這樣的紋理glTexEnv器函數),我會得到錯誤的輸出,如所有黑色或全白色紋理,改變對比度,ecc ..

如果我在屏幕而不是FBO上繪制時應用亮度調節,則效果很好。亮度按預期修改。

所以我的問題是:當我渲染到FBO時,我可以使用像glTexEnv這樣的紋理glTexEnv器函數嗎?

這是我用來在繪制到FBO時修改亮度的代碼(它不起作用):

// "secondFBO" is the FBO I'm intended to render to after brightness regulation.
// "textureId" is the OpenGL texture attached to the first FBO that contains
// the unmodified texture.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, secondFBO);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textureId);

// apply alpha filter
double t = brightnessValue;     
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
if (t > 1.0f)
{
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,      GL_ADD);
    glColor4f(t-1, t-1, t-1, t-1);
}
else
{
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,      GL_SUBTRACT);
    glColor4f(1-t, 1-t, 1-t, 1-t);
}
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB,         GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB,         GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA,    GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA,       GL_TEXTURE);

// ... draw texture ...

glDisable(GL_TEXTURE_RECTANGLE_ARB);

// restore previous state
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);

// draw on screen
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
// "textureId2" is the texture attached to the second FBO
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textureId2);

// ... draw texture ...

glDisable(GL_TEXTURE_RECTANGLE_ARB);

你為什么不使用着色器? 我認為編寫代碼要容易得多

您正在使用FBO,這意味着您的硬件支持着色器 - 至少GLSL 1.2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM