【发布时间】:2015-12-04 07:14:11
【问题描述】:
所以我在手机上设置了一个简单的模拟。目标是在屏幕上以各种透明度显示红色、白色和蓝色的圆圈。我有大部分工作,除了一件事,虽然透明度有点工作,但唯一的混合发生在黑色背景上。结果,中心的圆圈显示为深红色,而不是在其下方显示白色圆圈。我做错了什么?
注意我正在使用正交二维投影矩阵。所有对象的 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?
这是片段着色器:
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));
}
【问题讨论】:
-
我在回答类似问题时写了一些基本透明度渲染方法的概述:stackoverflow.com/q/23280692/3530129。
标签: swift opengl-es opengl-es-2.0 glkit