【发布时间】:2010-11-21 16:08:45
【问题描述】:
我有一个纹理,它的某些部分是透明的,我想将其应用在一个对象上,该对象的面是一些不透明的材料(或者颜色,如果更简单的话),但最终的对象变得透明。我希望最终的对象完全不透明。
这是我的代码:
首先我设置材质:
glDisable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);
glColor4f(0.00, 0.00, 0.00, 1.00);
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
glColor4f(0.80, 0.80, 0.80, 1.00);
glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR);
glColor4f(0.01, 0.01, 0.01, 1.00);
glEnable(GL_COLOR_MATERIAL);
然后我设置 VBO
glBindTexture(GL_TEXTURE_2D, object->texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBindBuffer(GL_ARRAY_BUFFER, object->object);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), ver_offset);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), tex_offset);
glNormalPointer(GL_FLOAT, sizeof(Vertex), nor_offset);
最后我画了对象
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
glBlendFunc(GL_ONE, GL_ZERO);
glDrawArrays(GL_TRIANGLES, 0, object->num_faces);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDrawArrays(GL_TRIANGLES, 0, object->num_faces);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
我尝试将不同的参数传递给 glBlendFunc() 没有占上风。我在这里上传了源代码:http://dpaste.com/83559/
更新 我得到 this,但我想要 this(或没有纹理this)。
第二张和第三张图片是用glm制作的。我研究了来源,但由于我对 OpenGL 的了解有限,所以我不太了解。
【问题讨论】:
-
你想达到什么目的?一个带有一些实心像素的透明物体?还是一个带有一些透明纹理的实体对象,下面是纯色?
-
后者:一个带有一些透明纹理的实体对象,下面显示出纯色?
-
感谢您的更新...并按照我的建议明确整理您的 Z-Buffering。
-
更新了我的答案以包含 Z 缓冲修复。
标签: opengl textures alphablending