OpenGL中完全透明的环面

时间:2014-10-17 10:05:15

标签: c++ opengl

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

源图像将是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;
    }
}

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

  1. 为输入图像添加透明度(并找到加载此类图像的代码)。
  2. 在顶点着色器中执行某些操作(请参阅Fully transparent OpenGL model)。
  3. 排序可以解决我的问题,但如果我正确地解决了,我必须自己实现它。我必须找到每个三角形的中心(简单),用我的矩阵投影并比较z值。
  4. 以某种方式改变混合和深度处理:

    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);
    
  5. 我需要一个建议,如何继续。


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

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

    我想写一下,它并没有区分前后运动,但后来我发现它们几乎是白色的,与白色混合并没有什么不同。

    具有彩色纹理的圆环新图像是: colorful

    剩下的问题是:

    1. 红点是蓝色的 - 它与加载BMP的功能有关(没关系)
    2. 在输入图像中,所有斑点都具有相同的大小,较大的斑点应该在顶部,因此饱和并且不与环面的白体混合。似乎订单与它应该是相反的。如果将它与上一张图像进行比较,则会正确绘制出外观上的大点,并隐藏小点(环面的背面)。
    3. 如何修复后者?

1 个答案:

答案 0 :(得分:0)

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

通过手动排序所有三角形的数组来解决第二个问题。它甚至可以在20000个三角形中实时工作,这对我来说已经足够了

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

它基于并使用来自OpenGL教程的内容:http://www.opengl-tutorial.org/download/