gpt4 book ai didi

swift - OpenGL ES 透明度不起作用,而是与背景融为一体

转载 作者:行者123 更新时间:2023-11-28 09:57:54 32 4
gpt4 key购买 nike

所以我在手机上设置了一个简单的模拟。目标是在屏幕上出现不同透明度的红色、白色和蓝色圆圈。我有大部分工作,除了一件事,虽然透明度有点工作,但唯一的混合发生在黑色背景上。结果,中心的圆圈显示为深红色,而不是显示其下方的白色圆圈。我做错了什么?

请注意,我正在使用正交二维投影矩阵。所有对象的 z 位置都相同,并按特定顺序呈现。

UH OH

以下是我如何设置透明度:

glEnable(GLenum(GL_DEPTH_TEST))
glEnable(GLenum(GL_POINT_SIZE));
glEnable(GLenum(GL_BLEND))
glBlendFunc(GLenum(GL_SRC_ALPHA), GLenum(GL_ONE_MINUS_SRC_ALPHA))
glEnable(GLenum(GL_POINT_SMOOTH))
//Note some of these things aren't compatible with OpenGL-es but they can hurt right?

这是片段着色器:

precision mediump float;
varying vec4 outColor;
varying vec3 center;
varying float o_width;
varying float o_height;
varying float o_pointSize;
void main()
{
vec4 fc = gl_FragCoord;
vec3 fp = vec3(fc);


vec2 circCoord = 2.0 * gl_PointCoord - 1.0;


if (dot(circCoord, circCoord) > 1.0) {
discard;
}

gl_FragColor = outColor;//colorOut;
}

下面是我如何将每个圆圈传递给着色器:

func drawParticle(part: Particle,color_loc: GLint, size_loc: GLint)
{
//print("Drawing: " , part)
let p = part.position
let c = part.color

glUniform4f(color_loc, GLfloat(c.h), GLfloat(c.s), GLfloat(c.v), GLfloat(c.a))
glUniform1f(size_loc, GLfloat(part.size))

glVertexAttribPointer(0, GLint(3), GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0, [p.x, p.y, p.z]);
glEnableVertexAttribArray(0);
glDrawArrays(GLenum(GL_POINTS), 0, GLint(1));
}

最佳答案

Here is how I set it so transparency works:

glEnable(GLenum(GL_DEPTH_TEST))
glEnable(GLenum(GL_POINT_SIZE));
glEnable(GLenum(GL_BLEND))
glBlendFunc(GLenum(GL_SRC_ALPHA), GLenum(GL_ONE_MINUS_SRC_ALPHA))
glEnable(GLenum(GL_POINT_SMOOTH))

这不是透明度的工作原理。 OpenGL 不是场景图,它只是按照您指定的顺序绘制几何图形。如果您首先绘制的是红色圆圈,它们将与背景融为一体。一旦绘制了红色圆圈“后面”的东西,由于深度测试,“被遮挡”的部分将被简单地丢弃。 OpenGL(或任何其他基于深度测试的算法)无法自动对不同的深度层进行排序并适本地混合它们。

你正在尝试做的是独立于顺序的透明度,这个问题仍在研究如何有效地解决它。

对于你想要实现的目标,你必须:

  • 将你的几何图形从远到近排序并按此顺序绘制
  • 渲染时禁用深度测试

关于swift - OpenGL ES 透明度不起作用,而是与背景融为一体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34082859/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com