J.D*_*Doe 0 opengl-es opengl-es-2.0 glkit swift
所以我在手机上设置了一个简单的模拟.目标是在屏幕上显示带有各种透明度的红色,白色和蓝色圆圈.我有大部分工作,除了一件事,而透明度的工作,唯一的混合发生在黑色背景.结果,中心的圆圈显示为深红色,而不是在其下方显示白色圆圈.我究竟做错了什么?
注意我正在使用正交2d投影矩阵.所有对象z位置都相同,并以特定顺序呈现.
以下是我如何设置透明度的方法:
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?
Run Code Online (Sandbox Code Playgroud)
这是片段着色器:
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;
}
Run Code Online (Sandbox Code Playgroud)
以下是我将每个圆圈传递给着色器的方法:
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));
}
Run Code Online (Sandbox Code Playgroud)
以下是我如何设置透明度的方法:
Run Code Online (Sandbox Code Playgroud)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(或任何其他基于深度测试的算法)无法自动对不同深度层进行排序并适当地混合它们.
您要做的是订单独立透明度,这仍然是如何有效解决问题的研究中的问题.
对于你想要达到的目标,你必须:
归档时间: |
|
查看次数: |
347 次 |
最近记录: |