完全透明的OpenGL模型

xci*_*cix 3 c++ opengl

解释一下我做错了什么.我已经将3d模型加载到自编码的opengl渲染(v 3.3)并尝试使用顶点着色器使其像xray效果一样透明:

#version 330

attribute vec3 coord3d;
attribute vec2 texcoord;
varying vec2 f_texcoord;

uniform mat4 projectionMatrix; 
uniform mat4 modelViewMatrix; 

layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec4 inColor;

smooth out vec4 theColor;

void main()
{
    gl_Position = projectionMatrix*modelViewMatrix*vec4(inPosition, 1.0);
    theColor = vec4(0.0,0.2,0.4,0.4);
    f_texcoord = texcoord;

}
Run Code Online (Sandbox Code Playgroud)

该模型在编辑器中进行了三角测量并绘制:

glDrawArrays(GL_TRIANGLE_FAN, 0, (vertices.at(i)->size()/3));
Run Code Online (Sandbox Code Playgroud)

如果我使用

glEnable(GL_ALPHA_TEST);
glEnable( GL_BLEND );
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glEnable(GL_DEPTH_TEST);
glClearDepth(1.0); 
Run Code Online (Sandbox Code Playgroud)

我看到一些不需要的三角形或线条:

如果我没有深度测试,我看到多个triangless内部面孔(我不想要):

如何摆脱不必要的影响并实施像Google Sketchup这样的X射线效果

如果我希望所有模型都透明,我应该实施深度排序吗?

我该如何实现这个:

GS

tho*_*kra 10

问题1:

首先,不要禁用深度测试.混合之前执行深度测试以确保正确地丢弃片段,即使启用了混合也是如此.有关每个片段操作及其执行顺序的更多信息,请参阅核心OpenGL 4.4规范的第17.3节.

当您禁用深度测试时,除非绘制调用的顺序绝对正确,否则您将获得意外的结果,从而无视深度缓冲的目的.即使您获得正确的订单,您也不能指望所有副作用都消失,并且尝试按照您需要的方式订购每个命令并不适用于除最简单程序之外的任何其他任何操作.

请考虑以下非常简单的示例:

在此输入图像描述

您可以看到3个四边形,最远可视化通常的tex坐标空间(s,t E [0,1]),一个与后者混合的蓝色四边形,以及一个应该在前面的不透明红色四边形.显然,红色四边形不在前面,尽管深度值表示不同.同样显而易见的是,目的是将蓝色四边形与红色四边形混合.蓝四后呈现红四看似可以解决问题,但如果你画这被认为是背后另有四的蓝色红色的四,它只会出现在与残疾人深度测试顶部.这都错了.

在此输入图像描述

黄色四边形掩盖了一切,虽然它应该落后于红色和蓝色四边形.正确的图像如下,纯粹通过启用深度测试获得:

在此输入图像描述

我的一般建议是:除非您有充分的理由禁用深度测试,例如在渲染叠加层并且不想使用深度缓冲区时,请启用深度测试.

注意:深度缓冲不能解决您通常必须从前到后排列非透明几何体以获得正确结果的问题!如果您想在尝试模拟透明度时完全独立于排序,请在许多论文中寻找关于订单独立透明度的常见嫌疑.

问题2:

从它的外观来看,我假设您使用以下混合函数:

gl::BlendFunc (gl::ONE, gl::ONE);

或任何导致稳定,连续积累价值的东西,如

gl::BlendFunc (gl::SRC_ALPHA, gl::ONE);

和RGB和alpha组件的默认混合方程:

gl::BlendEquation (gl::FUNC_ADD);

如果不是这种情况,请添加说明实际值的注释,以便我可以重新检查并可能编辑我的建议.以下仍然适用,因为颜色不会说谎.;)

你的第二个问题是由于投射下的z-fighting.有些片段被正确丢弃,有些片段则没有.由于您显然在某些地方具有完全重合的重复面,因此对于一个片段,可能会为第一个面生成稍高的深度值.渲染第二个面时,会产生略低的深度值并且片段通过,从而导致过度绘制,而实际上应该没有.

第一个片段已经完成了所有魔法,并且混合值被写入帧缓冲区并且深度值被写入深度缓冲区,即您有一个面部片段通过了所有测试并且与背景混合.现在出现了第二个片段,它没有被丢弃,因为深度值略低,并再次与帧缓冲区中已经混合的颜色混合.由于添加剂混合,您可以获得观察到的结果.我在以下示例中使用您使用的相同颜色和alpha值重现了此案例:

在此输入图像描述

问题3:你的模型似乎有很多重复的面孔,一般来说,三角测量看起来很糟糕.你应该重做它.理解和使用混合很难实现.不要将其与次优数据复杂化.