受彩色矩形影响的所有纹理颜色 - OpenGL

Posted

技术标签:

【中文标题】受彩色矩形影响的所有纹理颜色 - OpenGL【英文标题】:All texture colors affected by colored rectangle - OpenGL 【发布时间】:2018-11-06 22:04:49 【问题描述】:

我目前正在尝试为一些矩形着色以代表我的游戏角色的碰撞框。问题是我试图仅应用于矩形的颜色也应用于我的角色和背景纹理。因此,如果我使用以下代码绘制一个矩形:

void DrawRect(v2f MinPoint, v2f MaxPoint) 
    
        glBegin(GL_QUADS);

        glColor3f(1.0f, 0.0f, 0.0f); //Red color
        glVertex2f(MaxPoint.x, MaxPoint.y);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex2f(MinPoint.x, MaxPoint.y);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex2f(MinPoint.x, MinPoint.y);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex2f(MaxPoint.x, MinPoint.y);

        glEnd();
        glFlush();
    

然后在绘制我的背景纹理之后:

void DrawBackground(ui32 TextureID, Drawable_Rect BackgroundImage, v2f MinUV, v2f MaxUV)
    
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, TextureID);

        glBegin(GL_QUADS);
        glTexCoord2f(MinUV.x, MinUV.y);
        glVertex2f(BackgroundImage.BottomLeft.x, BackgroundImage.BottomLeft.y);

        glTexCoord2f(MaxUV.x, MinUV.y);
        glVertex2f(BackgroundImage.BottomRight.x, BackgroundImage.BottomRight.y);

        glTexCoord2f(MaxUV.x, MaxUV.y);
        glVertex2f(BackgroundImage.TopRight.x, BackgroundImage.TopRight.y);

        glTexCoord2f(MinUV.x, MaxUV.y);
        glVertex2f(BackgroundImage.TopLeft.x, BackgroundImage.TopLeft.y);

        glEnd();
        glFlush();

        glDisable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, 0);
    

然后我的矩形和我的背景都是红色的,而不仅仅是我的矩形。为什么颜色会同时应用于我的矩形和纹理?

【问题讨论】:

【参考方案1】:

如果启用纹理,则默认情况下纹理元素的颜色乘以当前颜色,因为默认情况下纹理环境模式 (GL_TEXTURE_ENV_MODE) 为GL_MODULATE。见glTexEnv

这会导致纹理的纹理像素的颜色与glColor3f 设置的最后一种颜色“混合”:

在渲染纹理之前设置“白色”颜色,以解决您的问题:

glColor3f(1.0f, 1.0f, 1.0f); 

同样您可以将环境模式更改为GL_REPLACE,而不是:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

【讨论】:

就是这样。谢谢!

以上是关于受彩色矩形影响的所有纹理颜色 - OpenGL的主要内容,如果未能解决你的问题,请参考以下文章

如何在白色背景上的Open GL ES中显示彩色纹理画笔?

图像检索基于matlab GUI综合颜色和形状特征图像检索含Matlab源码 1370期

图像检索基于matlab GUI综合颜色和形状特征图像检索含Matlab源码 1370期

OpenGL中的调色板动画

OpenGL ES纹理

SKSpriteNode 纹理 alpha 是不是影响触摸区域?