我一定要问一个非常基本的问题。我刚刚学会了如何应用纹理。
基本上,我有一个场景(一个平面)和一个立方体。我将纹理应用于立方体的一个面。我试图将纹理应用到立方体的面是红色的,但我希望纹理颜色覆盖它,但它们以某种方式混合在一起,虽然 我没有启用混合,也没有纹理图像透明 !
这是我的纹理(.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.
所以,请你帮助我保持纹理的颜色保持不变红色?如果需要我的代码的任何其他部分来理解我做错了什么,那就说,我会编辑。非常感谢你提前。
答案 0 :(得分:3)
如果您打算使用纹理绘制立方体的一侧,而没有纹理的另一侧绘制,那么对于具有纹理的边需要glEnable(GL_TEXTURE_2D)
,对于没有它的边需要glDisable(GL_TEXTURE_2D)
。这不是你的问题,但仍需要完成。
如果您尝试仅使用纹理进行渲染,则可以传递(1,1,1)颜色。然而,这只是描绘了这个问题。
如果你真的想坚持使用固定功能OpenGL,那么你需要使用texture environment。每个纹理单元(glActiveTexture(GL_TEXTURE0 + texture_unit)
)具有“纹理环境”,其本质上是一种数学运算,其将从纹理获取的特定值与每顶点内插颜色或先前纹理环境命令组合。它们以纹理单元顺序执行。默认值为GL_MODULATE
,它将颜色与纹理相乘。你想要GL_REPLACE
。
答案 1 :(得分:0)
我刚看了你的.png,我找不到那里的alpha通道。如果没有,您正在接受GL_RGBA
并假设每个像素有4个字节。这可能会导致您明显的颜色混合。
答案 2 :(得分:0)
您可以使用白色作为要应用纹理贴图的构面,在这种情况下,颜色不会搞乱。