相关疑难解决方法(0)

OpenGL ES深度缓冲android,无法上班

我无法让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"中调用.

android opengl-es opengl-es-2.0

5
推荐指数
2
解决办法
1万
查看次数

OpenGl alpha测试 - 如何替换AlphaFunc已被弃用?

我正在尝试使用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的情况下进行正确的渲染?有人知道一个技巧,或通过着色器做到这一点的方法?

opengl alpha depth-testing

4
推荐指数
1
解决办法
5386
查看次数

OpenGL-如何创建与订单无关的透明度?

我一直在为教育目的开发游戏引擎,但遇到了这个问题,但我似乎找不到答案:

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测试的制作方式有关,或类似的东西。

有人可以帮我解决这个问题吗?

c++ opengl graphics glsl

4
推荐指数
2
解决办法
3678
查看次数

Android上的OpenGL深度缓冲区

我目前正在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)

当我启用背面剔除时,一切看起来都是正确的.但背面剔除只是一种速度优化,所以它也应该只与深度缓冲区一起使用?那么这里缺少什么?

android opengl-es

3
推荐指数
1
解决办法
4438
查看次数

现代游戏和其他3D应用程序的跨性别

我已经学习了一段时间的OpenGL和3D图形,我遇到了众所周知的问题:透明度,半透明度和绘制顺序依赖性.

我知道不同的alpha混合算法:减法,这是最好的,但需要正确的排序; 加法或乘法,与顺序无关,但结果不佳; 禁用z缓冲技术; 等等.

所以,我得到的主要结论是:没有神奇的方法来做透明度.

问题是:如何在现代游戏中实施透明度?我的意思是,在它们中有明确的反对物体:窗户,眼镜等.我想学习这个问题的最佳实践 - 这是如何在"大联盟"中完成的,但我还没有找到任何关于此的论文学科.

opengl directx

2
推荐指数
1
解决办法
111
查看次数

OpenGL ES透明度不起作用,而是只是与背景混合

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

注意我正在使用正交2d投影矩阵.所有对象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?
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)

opengl-es opengl-es-2.0 glkit swift

0
推荐指数
1
解决办法
347
查看次数