标签: depth-buffer

Android OpenGL ES Framebuffer对象 - 渲染深度缓冲到纹理

我正在使用运行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状态是它不完整.


感谢片段着色器建议 - 我现在明白了.如果我不能让另一个解决方案工作,请看看.我的理想是同时获得深度和颜色 - 如果我能帮助它,不要分别渲染颜色和深度.

android opengl-es depth-buffer

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

为什么我们必须在渲染过程中清除OpenGL中的深度缓冲区?

我试图运行一个OpenGL代码,它没有在glClear()中清除GL_DEPTH_BUFFER_BIT,因为我无法渲染我的场景.我添加了这个位,然后渲染了场景.为什么有必要使用这个清除位?

我可能知道这个的原因,以清除之前GPU使用的深度缓冲区值,但我只是想确认一下.

c++ opengl depth-buffer

10
推荐指数
1
解决办法
5187
查看次数

Direct2D深度缓冲区

我需要绘制一个形状列表,我正在使用Direct2D.我从文件中获取形状列表.列表已排序,文件中元素的顺序表示将绘制这些形状的顺序.所以,如果例如文件指定在相同的位置和相同大小的两个矩形,只有第二个将是可见的(因为第一将被覆盖).

鉴于我的形状列表,我按以下方式进行绘图:

list<Shape> shapes;

for (const auto& shape : shapes)
   shape.draw();
Run Code Online (Sandbox Code Playgroud)

很容易看出,如果我有两个形状,我无法反转绘图操作的顺序,这意味着我必须确保shape2将始终绘制shape1,依此类推.接下来我无法使用多个线程来绘制我的形状,这在性能方面是一个巨大的劣势.

我读到Direct3D支持深度缓冲区(或z缓冲区),它为每个像素指定了它的z坐标,这样只会绘制"可见"像素(更接近观察者的on),无论顺序如何形状是绘制的.当我读取文件时,我有每个形状的深度信息.

有没有办法在Direct2D中使用深度缓冲区,或类似的技术允许我使用多个线程来绘制我的形状?

c++ directx direct3d direct2d depth-buffer

10
推荐指数
1
解决办法
513
查看次数

景深:将点着色器与模糊着色器组合(处理3)

我想在具有景深效果的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)

processing shader depth-buffer fragment-shader gaussianblur

10
推荐指数
1
解决办法
878
查看次数

如何在片段着色器中使用gl_FragCoord.z在现代OpenGL中线性渲染深度?

我阅读了很多关于使用片段着色器获取深度的信息.

http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=234519

但我还是不知道这是否gl_FragCoord.z是线性的.

GLSL规范称屏幕上的范围为[0,1]而未提及线性与否.

我认为线性是至关重要的,因为我将使用渲染模型来匹配Kinect的深度图.

那么如果它不是线性的,那么如何在世界空间中线性化呢?

opengl shader glsl depth-buffer depth

9
推荐指数
3
解决办法
9822
查看次数

如何在OpenGL(ES)中正确渲染重合多边形

我知道通过在OpenGL ES中设置深度函数,可以控制在3D场景中渲染重叠几何的方式.我gl.depthFunc(gl.LEQUAL)在我的代码中使用(webgl).

然而,当两组多边形重合并且具有不同颜色时,所得到的表面变成两种颜色的任意混合图案(随着相机位置改变而改变,因此导致闪烁).看看这张图片:

在此输入图像描述

我怎样才能解决这个问题?我尝试了不同的depthFunc值,但没有一个能解决这个问题.我希望巧合的多边形有单一的颜色,哪一个没关系.

opengl-es depth-buffer webgl

9
推荐指数
1
解决办法
6904
查看次数

OpenGL,如何使用framebuffer中的depthbuffer作为通常的深度缓冲区

我有帧缓冲区,深度组件和4个颜色附件与4纹理

我在其中绘制了一些东西,然后取消绑定缓冲区,使用4个纹理进行片段着色器(延迟光照).后来我想在屏幕上绘制更多东西,使用我的帧缓冲区中的深度缓冲区,是否可能?

我尝试再次绑定framebuffer并指定glDrawBuffer(GL_FRONT),但它不起作用.

opengl framebuffer depth-buffer

9
推荐指数
2
解决办法
6854
查看次数

glPolygonOffset中factor参数的含义和用法

我很难理解glPolygonOffset函数中第一个参数的含义.

void glPolygonOffset(GLfloat  factor, GLfloat units);
Run Code Online (Sandbox Code Playgroud)

官方文件说明了这个因素

指定用于为每个多边形创建变量深度偏移的比例因子.

然后

在从适当顶点的深度值插值后,每个片段的深度值将被偏移.偏移的值是因子×DZ + r×单位,其中DZ是相对于多边形的屏幕区域的深度变化的度量,并且r是保证给定给定的可解析偏移的最小值实现.

我明白了什么runit是.我不明白的是什么DZ,即"测量多边形屏幕区域的深度值变化"是什么意思,为什么我需要将因子设置为0以外的任何值.

如果我想让我的线框偏移,我只需要在深度值上添加/减少几个单位,不是吗?factor参数(以及文档中提到的DZ)的含义,用途和用法示例是什么?

c opengl graphics depth-buffer depth-testing

9
推荐指数
1
解决办法
6956
查看次数

OpenGL ES2 Alpha测试问题

我在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测试深度缓冲区工作?

java 3d android depth-buffer opengl-es-2.0

9
推荐指数
1
解决办法
5743
查看次数

如何在渲染到屏幕外缓冲区然后渲染到纹理时使用深度测试

我正在将场景渲染为纹理.这工作正常,但深度测试不起作用.如果渲染到屏幕外纹理,如何启用深度测试?我正在使用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)

opengl graphics framebuffer depth-buffer

8
推荐指数
1
解决办法
3522
查看次数