我正在使用运行Froyo的Android设备,支持OpenGL ES 1.1和OpenGL ES 2.0
我想将深度缓冲区渲染到纹理.在其他平台(包括iPhone)上看过OpenGL ES OpenGL ES的一些例子后,我尝试了很多FBO配置.
我似乎能够使用颜色纹理获得FBO设置,但每次我附加深度纹理时它都会失败.
我当前的代码基于此示例,但也创建了颜色纹理,而不是将绘制和读取缓冲区设置为无.
是否有一个在Android上配置OpenGL ES FBO以向纹理渲染深度的简单示例?或者是否有一个描述支持和不支持的文档?
感谢您的评论 - 我特别需要ES 1.1的解决方案,如果它可以找到并在Android上运行.我也想看看ES 2 - 我不确定我理解将深度信息打包到色彩缓冲区的想法 - 你有一个参考我可以看看更好地理解这个想法吗?
关于代码 - 我的来源与我上面发布的链接几乎没有什么不同.Framebuffer状态是它不完整.
感谢片段着色器建议 - 我现在明白了.如果我不能让另一个解决方案工作,请看看.我的理想是同时获得深度和颜色 - 如果我能帮助它,不要分别渲染颜色和深度.
我试图运行一个OpenGL代码,它没有在glClear()中清除GL_DEPTH_BUFFER_BIT,因为我无法渲染我的场景.我添加了这个位,然后渲染了场景.为什么有必要使用这个清除位?
我可能知道这个的原因,以清除之前GPU使用的深度缓冲区值,但我只是想确认一下.
我需要绘制一个形状列表,我正在使用Direct2D.我从文件中获取形状列表.列表已排序,文件中元素的顺序表示将绘制这些形状的顺序.所以,如果例如文件指定在相同的位置和相同大小的两个矩形,只有第二个将是可见的(因为第一将被覆盖).
鉴于我的形状列表,我按以下方式进行绘图:
list<Shape> shapes;
for (const auto& shape : shapes)
shape.draw();
Run Code Online (Sandbox Code Playgroud)
很容易看出,如果我有两个形状,我无法反转绘图操作的顺序,这意味着我必须确保shape2将始终绘制shape1,依此类推.接下来我无法使用多个线程来绘制我的形状,这在性能方面是一个巨大的劣势.
我读到Direct3D支持深度缓冲区(或z缓冲区),它为每个像素指定了它的z坐标,这样只会绘制"可见"像素(更接近观察者的on),无论顺序如何形状是绘制的.当我读取文件时,我有每个形状的深度信息.
有没有办法在Direct2D中使用深度缓冲区,或类似的技术允许我使用多个线程来绘制我的形状?
我想在具有景深效果的3D画布(处理中)上显示数千个点.更具体地说,我想使用z缓冲区(深度缓冲)来调整point基于其与相机的距离的模糊水平.
到目前为止,我可以提出以下点着色器:
pointfrag.glsl
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
varying vec4 vertColor;
uniform float maxDepth;
void main() {
float depth = gl_FragCoord.z / gl_FragCoord.w;
gl_FragColor = vec4(vec3(vertColor - depth/maxDepth), 1) ;
}
Run Code Online (Sandbox Code Playgroud)
pointvert.glsl
uniform mat4 projection;
uniform mat4 modelview;
attribute vec4 position;
attribute vec4 color;
attribute vec2 offset;
varying vec4 vertColor;
varying vec4 vertTexCoord;
void main() {
vec4 pos = modelview * position;
vec4 clip = projection * pos;
gl_Position = clip + projection * …Run Code Online (Sandbox Code Playgroud) 我阅读了很多关于使用片段着色器获取深度的信息.
如
http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=234519
但我还是不知道这是否gl_FragCoord.z是线性的.
GLSL规范称屏幕上的范围为[0,1]而未提及线性与否.
我认为线性是至关重要的,因为我将使用渲染模型来匹配Kinect的深度图.
那么如果它不是线性的,那么如何在世界空间中线性化呢?
我知道通过在OpenGL ES中设置深度函数,可以控制在3D场景中渲染重叠几何的方式.我gl.depthFunc(gl.LEQUAL)在我的代码中使用(webgl).
然而,当两组多边形重合并且具有不同颜色时,所得到的表面变成两种颜色的任意混合图案(随着相机位置改变而改变,因此导致闪烁).看看这张图片:

我怎样才能解决这个问题?我尝试了不同的depthFunc值,但没有一个能解决这个问题.我希望巧合的多边形有单一的颜色,哪一个没关系.
我有帧缓冲区,深度组件和4个颜色附件与4纹理
我在其中绘制了一些东西,然后取消绑定缓冲区,使用4个纹理进行片段着色器(延迟光照).后来我想在屏幕上绘制更多东西,使用我的帧缓冲区中的深度缓冲区,是否可能?
我尝试再次绑定framebuffer并指定glDrawBuffer(GL_FRONT),但它不起作用.
我很难理解glPolygonOffset函数中第一个参数的含义.
void glPolygonOffset(GLfloat factor, GLfloat units);
Run Code Online (Sandbox Code Playgroud)
官方文件说明了这个因素
指定用于为每个多边形创建变量深度偏移的比例因子.
然后
在从适当顶点的深度值插值后,每个片段的深度值将被偏移.偏移的值是因子×DZ + r×单位,其中DZ是相对于多边形的屏幕区域的深度变化的度量,并且r是保证给定给定的可解析偏移的最小值实现.
我明白了什么r和unit是.我不明白的是什么DZ,即"测量多边形屏幕区域的深度值变化"是什么意思,为什么我需要将因子设置为0以外的任何值.
如果我想让我的线框偏移,我只需要在深度值上添加/减少几个单位,不是吗?factor参数(以及文档中提到的DZ)的含义,用途和用法示例是什么?
我在3D中渲染具有alpha纹理的多个对象.所有纹理加载都很好但是当我尝试将它们呈现在彼此前面时,我得到以下结果:

左边是我的.它应该是正确的.网格只是为了帮助可视化透视.
红色圆圈纹理前面的纹理被剪裁.我四处寻找答案,它告诉我使用:
GLES20.glEnable( GLES20.GL_BLEND );
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA );
Run Code Online (Sandbox Code Playgroud)
但我使用它仍然无法正常工作.我在onSurfaceCreated()函数中正确放置的设置是:
GLES20.glClearColor( 0.75f, 0.85f, 1f, 1.0f );
GLES20.glEnable( GLES20.GL_BLEND );
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA );
GLES20.glEnable( GLES20.GL_DEPTH_TEST );
GLES20.glDepthFunc( GLES20.GL_LEQUAL );
GLES20.glDepthMask( true );
GLES20.glClearDepthf( 1f );
Run Code Online (Sandbox Code Playgroud)
我的片段着色器是:
uniform sampler2D texture;
varying vec2 texCoord;
void main(){
gl_FragColor = texture2D( texture, texCoord );
}
Run Code Online (Sandbox Code Playgroud)
我是否必须在Android清单中包含任何内容才能启用Alpha测试?我不想最终必须手动组织我的多边形或使用alpha discard(),因为我需要并希望一些像素是半透明的.
如何让3D alpha测试深度缓冲区工作?
我正在将场景渲染为纹理.这工作正常,但深度测试不起作用.如果渲染到屏幕外纹理,如何启用深度测试?我正在使用FrameBuffer类http://www.opengl.org/news/comments/framebuffer_object_fbo_c_class_available_with_example_application/
glGetIntegerv(GL_DRAW_BUFFER, &drawBuffer);
frameBuffer->Bind();
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
rAngle += 0.3f;
glUseProgram(0);
drawSpinningTeapot();
FramebufferObject::Disable();
glDrawBuffer(drawBuffer);
glViewport(0, 0, WINDOW_WIDTH,WINDOW_HEIGHT);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(g_program);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,tex1);
texSampler = glGetUniformLocation(g_program,"texture");
glUniform1f(texSampler, 0);
glActiveTexture(GL_TEXTURE0);
glBegin(GL_QUADS);
{
glTexCoord2f(0, 0); glVertex3f(-1, -1, -0.5f);
glTexCoord2f(1, 0); glVertex3f( 1, -1, -0.5f);
glTexCoord2f(1, 1); glVertex3f( 1, 1, -0.5f);
glTexCoord2f(0, 1); glVertex3f(-1, 1, -0.5f);
}
glEnd();
glDisable(GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud) depth-buffer ×10
opengl ×5
android ×2
c++ ×2
framebuffer ×2
graphics ×2
opengl-es ×2
shader ×2
3d ×1
c ×1
depth ×1
direct2d ×1
direct3d ×1
directx ×1
gaussianblur ×1
glsl ×1
java ×1
processing ×1
webgl ×1