[英]How do color and textures work together?
我必须问一个非常基本的问题。 我刚刚学习了如何应用纹理。
基本上,我有一个场景(一个平面)和一个立方体。 我将纹理应用于立方体的其中一个面。 我要应用纹理的立方体的表面是红色,但是我希望纹理颜色覆盖它,但是它们以某种方式融合在一起,尽管我没有启用融合,纹理图像也不透明 !
这是我的texture(.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.
因此,能否请您帮助我保持纹理的颜色而不发红? 如果需要代码的其他任何部分来了解我在做什么错,请说,我将进行编辑。 提前非常感谢您。
如果打算用纹理绘制立方体的一侧,而没有纹理的另一侧,则需要为带有纹理的一侧glEnable(GL_TEXTURE_2D)
为没有纹理的一侧glDisable(GL_TEXTURE_2D)
。 那不是您的问题,但是仍然需要完成。
如果您尝试仅使用纹理进行渲染,则可以传递(1、1、1)颜色。 但是,这仅仅是解决问题的方法。
如果您真的要坚持使用固定功能OpenGL,则需要使用Texture Environment 。 每个纹理单元( glActiveTexture(GL_TEXTURE0 + texture_unit)
)都有一个“纹理环境”,它本质上是一种数学运算,它将从纹理中获取的特定值与每个顶点插值的颜色或先前的纹理环境命令结合在一起。 它们以纹理单元顺序执行。 默认值为GL_MODULATE
,它将颜色与纹理相乘。 您需要GL_REPLACE
。
我只是快速浏览了您的.png文件,但在其中找不到Alpha通道。 如果没有,则表示您接受GL_RGBA
并假设每个像素4个字节。 这可能会导致您出现明显的颜色混合。
您可以对要应用纹理贴图的构面使用白色,在这种情况下,颜色不会混乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.