openGL中的完全透明对象
full transparent object in openGL
我需要创建一个完全透明的曲面,该曲面穿过轴的原点并始终与屏幕平行。我试图使用这个代码(在c++
中),但结果是50%的混合(不完全):
glPushMatrix();
glLoadIdentity();
glBlendFunc(1, 1);
glBegin(GL_QUADS);
glVertex3f(-100, -100, -0.003814);
glVertex3f(100, -100, -0.003814);
glVertex3f(100, 100, -0.003814);
glVertex3f(-100, 100, -0.003814);
glEnd();
glPopMatrix();
其他信息:我需要这个透明表面,用函数gluUnProject(winX, winY, winZ, model, proj, view, &ox, &oy, &oz);
在上面取一个点
如果您只想填充深度缓冲区,可以通过glColorMask()
:禁用颜色写入
glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
drawQuad();
glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
doUnproject();
附加信息:我需要这个透明的表面上得到一个点与函数gluUnProject(winX,winY,winZ,模型,proj,视图,&ox,&oy,&oz);
不,你没有。OpenGL不是一个场景图,没有义务使用从OpenGL获得的gluUnProject值。您可以简单地为winZ
传递您想要的任何内容。如果对近剪裁平面感兴趣,请使用0,对远剪裁平面使用1。你也可以很好地计算每个点的屏幕位置。OpenGL并不神奇,它所做的转换都有很好的文档记录,而且很容易自己执行。
您使用的混合函数称为添加剂混合:
nbsp 最终颜色=(源颜色*1.0)+(目标色彩*1.0)。
这是任何但完全透明的东西,除非帧缓冲区在您混合的位置已经是全白色的(DestinationColor==(1.0,1.0,1.0))。即使这样,这种行为也只能在您使用定点渲染目标时起作用,因为默认情况下,混合后的值会被钳制为[0.0,1.0]。
相反,考虑
glBlendFunc (GL_ZERO, GL_ONE)
:
nbsp 最终颜色=(源颜色*0.0)+(目标色彩*1.0)。
nbsp nbsp nbsp nbsp […]
nbsp 最终颜色=原始颜色
也就是说,如果你像genpfault建议的那样简单地使用颜色掩码来禁用颜色写入,你可能会得到更好的性能。使用混合函数来放弃曲面的颜色是不必要的复杂。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 仅在某些对象上透明
- SWIG共享_ptr会导致不透明的对象
- openGL中的完全透明对象
- BSP树在单个透明对象上工作吗
- 如何在OpenGL中分离不透明对象和透明对象
- 我应该为我的不透明对象使用整数ID还是指针?
- OpenGL,将透明纹理与对象颜色混合