颜色和纹理如何协同工作?
Posted
技术标签:
【中文标题】颜色和纹理如何协同工作?【英文标题】:How do color and textures work together? 【发布时间】:2011-08-20 20:07:56 【问题描述】:我一定是在问一个非常基本的问题。我刚刚学会了如何应用纹理。
基本上,我有一个场景(一架飞机)和一个立方体。我将纹理应用到立方体的一个面。我尝试将纹理应用到的立方体的面是红色的,但我希望纹理颜色覆盖它,但它们以某种方式混合在一起,虽然 我没有启用混合,纹理图像也没有透明!
这是我的纹理(.png)。
这是渲染图:
这是我的代码的一些相关部分(我知道我做错了很多事情,比如使用三角形条而不是四边形,不使用 HLSL 等 - 我是新手 :)
初始化部分:
//glInit
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glDisable(GL_BLEND); //<-- blending is disabled!
纹理部分:
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
绘图部分:
glBegin(GL_TRIANGLE_STRIP);
glColor3f(1, 0, 0); //red front face
glTexCoord2d(0, 0);
glVertex3d(-a, -a, -a);
glTexCoord2d(0, 1);
glVertex3d(-a, -a, a);
glTexCoord2d(1, 0);
glVertex3d(a, -a, -a);
glTexCoord2d(1, 1);
glVertex3d(a, -a, a);
glEnd();
glBegin(GL_TRIANGLE_STRIP);
glColor3f(0, 1, 0); //green back face
glVertex3d(-a, a, -a);
glVertex3d(-a, a, a);
glVertex3d(a, a, -a);
glVertex3d(a, a, a);
glEnd();
glBegin(GL_TRIANGLE_STRIP);
glColor3f(0, 0, 1); //blue right face
glVertex3d(a, -a, -a);
glVertex3d(a, -a, a);
glVertex3d(a, a, -a);
glVertex3d(a, a, a);
glEnd();
//etc.
那么,你能帮我让我的纹理的颜色保持不变而不是变红吗?如果需要我的代码的任何其他部分来理解我做错了什么,只要说,我会编辑。非常感谢您。
【问题讨论】:
【参考方案1】:如果你打算绘制立方体的一侧有纹理,而另一侧没有纹理,那么你需要glEnable(GL_TEXTURE_2D)
用于有纹理的一侧,glDisable(GL_TEXTURE_2D)
用于没有纹理的一侧。这不是你的问题,但仍然需要完成。
如果您尝试仅使用纹理进行渲染,则可以传递 (1, 1, 1) 作为颜色。但是,这只是掩盖了问题。
如果你真的要坚持使用固定功能的 OpenGL,那么你需要使用texture environment。每个纹理单元 (glActiveTexture(GL_TEXTURE0 + texture_unit)
) 都有一个“纹理环境”,它本质上是一种数学运算,它将从纹理中获取的特定值与逐顶点插值颜色或先前的纹理环境命令相结合。它们按纹理单元顺序执行。默认值为GL_MODULATE
,它将颜色与纹理相乘。你想要GL_REPLACE
。
【讨论】:
是的!那是为我做的!也感谢您的所有其他 cmets,真的很有帮助! 您可能想要使用glBindTexture(GL_TEXTURE_2D, 0)
而不是glDisable(GL_TEXTURE_2D)
(以恢复您的旧纹理调用glBindTexture(GL_TEXTURE_2D, textureId)
)
@fintalia:那行不通。您仍然需要显式禁用纹理,否则,您只是在访问纹理 0。如果您没有更改它,它是一个 1x1 白色纹理。【参考方案2】:
我刚刚快速浏览了您的 .png,但在其中找不到 Alpha 通道。如果没有,并且您接受 GL_RGBA
并假设每个像素 4 个字节。这可能会导致您出现明显的颜色混合。
【讨论】:
问题是我正在使用QImage
类,当传递给QGLWidget::convertToGLFormat
时,它会返回一个具有RGBA 格式像素的QImage。我该怎么办?【参考方案3】:
您可以为要应用纹理贴图的构面使用白色,这样颜色就不会乱七八糟。
【讨论】:
以上是关于颜色和纹理如何协同工作?的主要内容,如果未能解决你的问题,请参考以下文章