OpenGL中的完全透明圆环

Posted

技术标签:

【中文标题】OpenGL中的完全透明圆环【英文标题】:Fully transparent torus in OpenGL 【发布时间】:2014-10-17 10:05:15 【问题描述】:

我有一个由 OpenGL 渲染的圆环,可以映射纹理;只要纹理不透明就没有问题。但是当我在片段着色器中使颜色选择性透明时它不起作用。或者更确切地说:它只在某些区域有效,具体取决于顶点缓冲区中三角形的顺序;看看沿外赤道的差异。 圆环应被斑点均匀覆盖。

源图像将是 png,但是现在我使用 bmp,因为它更容易加载(纹理加载功能是教程的一部分)。 图像背景为白色,顶部有不同颜色的斑点;它不透明。 所需的结果是几乎透明的带有斑点的圆环。正面和背面的两个点都必须可见。 渲染将离线完成,所以我不需要速度;我只需要从其表面图像生成环面图像。

到目前为止,我的代码如下所示(它是两个示例的合并): https://gist.github.com/juriad/ba66f7184d12c5a29e84

片段着色器是:

#version 330 core

// Interpolated values from the vertex shaders
in vec2 UV;

// Ouput data
out vec4 color;

// Values that stay constant for the whole mesh.
uniform sampler2D myTextureSampler;

void main()

    // Output color = color of the texture at the specified UV
    color.rgb = texture2D( myTextureSampler, UV ).rgb;
    if (color.r == 1 && color.g == 1 && color.b == 1) 
        color.a = 0.2;
     else 
        color.a = 1;
    

我知道这个问题与订单有关。 我能做什么(但不知道什么会起作用):

    为输入图像添加透明度(并找到加载此类图像的代码)。 在顶点着色器中做一些事情(见Fully transparent OpenGL model)。 排序可以解决我的问题,但如果我得到正确,我必须自己实现它。我必须找到每个三角形的中心(简单),用我的矩阵投影它并比较 z 值。

    以某种方式改变混合和深度处理:

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glDepthFunc(GL_LEQUAL);
    glDepthRange(0.0f, 1.0f);
    

我需要一个建议,如何继续。


更新,这几乎解决了问题:

glDisable(GL_DEPTH_TEST);
//glDepthMask(GL_TRUE);
glDepthFunc(GL_NEVER);
//glDepthRange(0.0f, 1.0f);

我想写它不区分正面和背面的运动,但后来我意识到它们几乎是白色的,与白色混合没有任何区别。

带有彩色纹理的环面的新图像是:

剩下的问题是:

    红点是蓝色的——和加载BMP的函数有关(没关系) 因为在输入图像中所有的光点大小相同,较大的光点应该在顶部,因此是饱和的,不会与圆环的白体混合。似乎顺序与应有的相反。如果将其与上一张图像进行比较,则外观上的大点被正确绘制,而小点被隐藏(圆环的背面)。

如何解决后一个问题?

【问题讨论】:

您是否尝试禁用深度测试? 既然你在玩 alpha,Order Independent Transparency 可能会对你有所帮助。 是的,它会对我有所帮助,但是快速搜索我认为我必须从头开始实现它,因为它不是 OpenGL 的一部分。我对么?是否有任何易于使用且易于合并到我现有代码中的库?最后,手动排序可能是最好的主意,因为我不需要实时处理。这是一个一次性项目,我做了不同类型的事情,但现在我需要将结果可视化。 是的,你是。我没有找到任何库,但如果您想从头开始构建,link 可能会对您有所帮助。 我看到了那个链接;它肯定会使用超过 50 行代码。还是谢谢。 【参考方案1】:

通过禁用深度测试解决了第一个问题(请参阅问题中的更新)。

第二个问题通过手动排序所有三角形的数组来解决。即使实时处理 20000 个三角形,它也能很好地工作,这对我的目的来说已经绰绰有余了

生成的源代码:https://gist.github.com/juriad/80b522c856dbd00d529c

它基于 OpenGL 教程并使用包括:http://www.opengl-tutorial.org/download/。

【讨论】:

以上是关于OpenGL中的完全透明圆环的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL透明与混色效果

OpenGL ES - 两种颜色最有效的纹理格式:白色和完全透明

OpenGL 使纹理透明 VBO

Pangolin中opengl的混合(gl_blend)

体素中的 OpenGL 3D 透明度

opengl 中的透明度(使用 FLTK)