我无法让Android OpenGL ES 2.0上的深度缓冲区正常工作.无论我做什么,对象总是按照提供的顺序渲染,并完全忽略深度缓冲区.
根据我的阅读,默认设置应该有一个深度缓冲区,但我仍然尝试了我能想到的所有功能,以使其工作:
//setup
setEGLContextClientVersion(2);
setEGLConfigChooser( true );
GLES20.glEnable( GLES20.GL_DEPTH_TEST );
GLES20.glDepthFunc( GLES20.GL_LEQUAL );
GLES20.glDepthMask( true );
//render
GLES20.glClearColor(0.8f, 0.5f, 0.8f, 1.0f);
GLES20.glClearDepthf(1.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)
我将对象放在z轴的0.5,0.0,-0.5处.我可以验证这是否有效,因为如果我使用透视图,它将正确地改变对象的大小(较远的较小) - 我的顶点着色器除了应用视图矩阵之外什么都不做.如果我是正确的,我无法在ES中改变片段着色器中的深度,这样就不会出错.
我很难过.我真的不知道还能检查什么.我所做的每一次搜索(在网络上或此处)都给出了似乎无法解决问题的答案(尽管它表明人们因其他原因而遇到了问题).ES 2.0中的大多数示例实际上没有足够的对象来测试深度缓冲区,因此我不能肯定示例代码也是正确的.
注释:在设置渲染器之前,在我的派生GLSurfaceView中调用"super"之后调用我的"setup"部分."渲染"部分首先在我的渲染"onDrawFrame"中调用.
我正在尝试使用alpha绘制球体,但我的Z缓冲区存在问题.有些像素是透明的,但在Zbuffer中写入,因此隐藏在后面的不透明像素.
这是我的设置:
gl Enable: gl DEPTH_TEST.
gl DepthFunc: gl LEQUAL.
gl Disable: gl CULL_FACE.
gl Enable: gl BLEND.
gl BlendFunc: gl SRC_ALPHA with: gl ONE_MINUS_SRC_ALPHA.
Run Code Online (Sandbox Code Playgroud)
我知道这个函数glAlphaFunc(GREATER, aFloat)并且enable(ALPHA_TEST)可以做到这一点,但我读到它是自3.1版OpenGL以来的一个不推荐使用的函数.如何在不使用ALPHAFunc的情况下进行正确的渲染?有人知道一个技巧,或通过着色器做到这一点的方法?
我一直在为教育目的开发游戏引擎,但遇到了这个问题,但我似乎找不到答案:
Alpha通道仅适用于在具有Alpha通道的对象之前已绘制的对象(例如:在具有3个对象的场景中,假设猫,狗和瓶子(透明)。猫和狗)在瓶子后面;首先拉狗,然后拉瓶子,然后是猫,然后从瓶子中看到只狗)。
我使用C ++作为引擎,使用Win32 API作为编辑器,使用GLSL作为阴影:
// some code here
vec4 alpha = texture2D(diffuse, texCoord0).aaaa;
vec4 negalpha = alpha * vec4(-1,-1,-1,1) + vec4(1,1,1,0);
vec4 textureComponentAlpha = alpha*textureComponent+negalpha*vec4(1,1,1,0);//(texture2D ( diffuse, texCoord0 ) ).aaaa;
gl_FragColor = (textureComponentAlpha + vec4(additiveComponent.xyz, 0)) * vec4(lightingComponent.xyz, 1);
Run Code Online (Sandbox Code Playgroud)
在C ++中:
glEnable(GL_ALPHA_TEST);
glDepthFunc(GL_EQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
我认为它与alpha测试的制作方式有关,或类似的东西。
有人可以帮我解决这个问题吗?
我目前正在Android(2.1)上学习OpenGL ES编程.我从强制旋转立方体开始.它旋转正常,但我不能让深度缓冲区工作.多边形始终按GL命令渲染它们的顺序显示.我在初始化GL时这样做:
gl.glClearColor(.5f, .5f, .5f, 1);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearDepthf(1f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
Run Code Online (Sandbox Code Playgroud)
在表面变化上我这样做:
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, 100f);
Run Code Online (Sandbox Code Playgroud)
当我启用背面剔除时,一切看起来都是正确的.但背面剔除只是一种速度优化,所以它也应该只与深度缓冲区一起使用?那么这里缺少什么?
我已经学习了一段时间的OpenGL和3D图形,我遇到了众所周知的问题:透明度,半透明度和绘制顺序依赖性.
我知道不同的alpha混合算法:减法,这是最好的,但需要正确的排序; 加法或乘法,与顺序无关,但结果不佳; 禁用z缓冲技术; 等等.
所以,我得到的主要结论是:没有神奇的方法来做透明度.
问题是:如何在现代游戏中实施透明度?我的意思是,在它们中有明确的反对物体:窗户,眼镜等.我想学习这个问题的最佳实践 - 这是如何在"大联盟"中完成的,但我还没有找到任何关于此的论文学科.
所以我在手机上设置了一个简单的模拟.目标是在屏幕上显示带有各种透明度的红色,白色和蓝色圆圈.我有大部分工作,除了一件事,而透明度的工作,唯一的混合发生在黑色背景.结果,中心的圆圈显示为深红色,而不是在其下方显示白色圆圈.我究竟做错了什么?
注意我正在使用正交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) …Run Code Online (Sandbox Code Playgroud)