标签: depth-buffer

如何禁用深度缓冲区?

我没有RenderStateGraphicsDevice类中看到一个成员,这是禁用深度缓冲区的函数.任何人都知道这个新的4.0 API是如何完成的?

如果我能以某种方式在RenderState某个地方访问一个完整的类,那将是很好的.. GraphicsDevice似乎已经得到了一些,但几乎没有!

c# xna depth-buffer windows-phone-7 xna-4.0

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

OpenGL:我可以从深度缓冲区中屏蔽完全透明的片段吗?

有没有办法告诉OpenGL不要将完全透明的片段深度写入深度缓冲区?

可以肯定的是,我想渲染的纹理永远不会是半透明的; 它的alpha值只有1.0或0.0,我使用GL_NEAREST过滤器,所以它永远不会插入到它们之间的任何值.

我认为当一个片段的alpha值为0.0时,OpenGL能够简单地不写入深度缓冲区是合理的(这样我可以按任意顺序渲染具有这种纹理的图元),但是我找不到让OpenGL做到这一点的方法.有谁知道它是否可能,在这种情况下,它是如何完成的?

opengl transparency depth-buffer

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

使用GLSL创建深度缓冲直方图纹理

我正在使用当前上下文的深度缓冲区来影响我正在显示的纹理.纹理是1维的并且是灰度的.从左到右代表从近到远.在一定深度处的像素越多,纹理在该点处越亮,黑色没有像素在该深度处,并且白色是所有像素都在该深度处.

现在我有一个glReadPixels()深度缓冲区的解决方案,在CPU上进行分析,然后将其写回纹理.当然,这是应用程序中的真正瓶颈.

我正在寻找一个全GPU解决方案,在着色器或某些东西中分析深度缓冲区并以这种方式更新纹理.我考虑创建一个片段着色器,它读取深度值并增加到纹理中的相应像素,但这需要片段着色器可以写入其他纹理.我学到的东西是禁忌,特别是如果他们必须写同一个像素.

有没有我缺少的技巧或技术,或者我被迫参与CPU?

opengl performance glsl histogram depth-buffer

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

glReadPixels不读取iOS上的深度缓冲区值

我似乎无法在iOS 4.3上读取OpenGL ES2中的深度缓冲区值

afDepthPixels = (float*)malloc(sizeof(float) * iScreenWidth * iScreenHeight);
glReadPixels(0, 0, iScreenWidth, iScreenHeight, GL_DEPTH_COMPONENT, GL_FLOAT, afDepthPixels);
Run Code Online (Sandbox Code Playgroud)

我的深度缓冲区当前绑定到位并且可操作,但是该函数只读取0值,并且它似乎几乎立即返回.如果我给它一个GL_RGBA,它将需要一段时间,并且确实会返回结果.iOS上的ES2是否不支持此功能?

谢谢!

opengl-es depth-buffer ios

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

为什么GL_LEQUAL推荐用于GL深度函数(为什么它对我不起作用)?

GL维基上,他们建议使用GL_LEQUAL作为深度函数.此外,深度函数默认为GL_LESS.当我使用这些功能中的任何一个时,我得到了奇怪的结果.在这张图片中,红色方块应位于蓝色方块的前面(两个方块的大小相同): 与GL_LESS

但是,如果我使用glClearDepth(0.0)然后glDepthFunc(GL_GREATER)运行其他未更改的程序,我会得到: 使用GL_GREATER

稍微考虑一下,GL_LESS会给出它所做的结果是有意义的:如果传入的深度值小于存储的深度值,则写入片段.

如果我将相机放在(1, 0, 0)并朝向(0, 0, 0)我的方向望去,我希望物体在物体(0.5, 0, 0)前面(0, 0, 0).使用GL_LESS,对象(0, 0, 0)不会是其片段被写入的对象吗?

编辑:尼科尔,谢谢你提到投影矩阵.好像它设置不正确.我正在关注arcsynthesis.org上的教程一段时间并将代码调整到我自己的项目中,但是我偏离了你的投影矩阵并使用了glFrustum手册页中描述的数学来实现我自己的函数版本,然后使用了NeHe的gluPerspective更换以取代gluPerspective.我不知道为什么替换不起作用,因为我的矩阵数学是正确的(我已经对各种在线计算器进行了检查).使用矩阵我用GL_LESS得到正确的结果.

c++ opengl depth-buffer

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

Cuda Render Buffer Interop用于深度组件

我想要做的是使用OpenGL执行一些渲染,然后使用CUDA直接对渲染的RGB和深度组件执行一些只读后处理(计算),而不将数据复制到PBO.

为此,我创建了一个FBO并将两个RBO连接到它(一个用于RGBA,另一个用于DEPTH).

然后,我使用GL_RENDERBUFFER作为参数为每个RBO调用cudaGraphicsGLRegisterImage.对于颜色RBO cudaGraphicsGLRegisterImage返回cudaSuccess,但对于深度RBO,我收到一个cudaErrorInvalidValue.

我已经在论坛中的某个地方读到过nvidia目前不支持CUDA为深度组件渲染缓冲区互操作,尽管它在文档中很好地存在.

我正在使用CUDA Toolkit 5.0,我有一张Quadro 2000卡.

有人成功地做了这个,怎么样?

以下是一些代码提取:

glGenRenderbuffers(1, &rbo_color);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_color);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, WIDTH, HEIGHT);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

if (cudaGraphicsGLRegisterImage(&resource_color, rbo_color, GL_RENDERBUFFER, cudaGraphicsMapFlagsReadOnly) != cudaSuccess)
    fprintf(stderr, "Error in registering rbo color with cuda\n");

glGenRenderbuffers(1, &rbo_depth);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, WIDTH, HEIGHT);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

if (cudaGraphicsGLRegisterImage(&resource_depth, rbo_depth, GL_RENDERBUFFER, cudaGraphicsMapFlagsReadOnly) != cudaSuccess)
    fprintf(stderr, "Error in registering rbo depth with cuda\n");
Run Code Online (Sandbox Code Playgroud)

opengl fbo cuda depth-buffer

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

使用glEnable(GL_DEPTH_TEST)显示不正确

我的程序必须显示一个旋转的立方体,用简单的灯光照亮.问题是立方体正在闪烁.当我撤回调用glEnable(GL_DEPTH_TEST)时,立方体不闪烁,但我可以看到它内部的面(这是正常的,因为没有深度测试).但是这个电话是必不可少的 所以我不明白为什么这个函数的调用不能正常工作.

这是我的代码:

#include <iostream>
#include <SDL/SDL.h>
#include <gl/glut.h>

const static int    WIDTH = 640;
const static int    HEIGHT = 480;

GLfloat angle = 0.0f;

static GLfloat  position[4] = {0.0, 50.0, -50.0, 1.0};
static GLfloat diffuse[3] = {0.64, 0.64, 0.64};
static GLfloat specular[3] = {0.64, 0.64, 0.64};
static GLfloat emissive[3] = {0.0, 0.0, 1.0};

static GLfloat vertices[72] =
{
    1.000000, -1.000000, -1.000000,     //V1
    1.000000, -1.000000, 1.000000,      //V2
    -1.000000, -1.000000, 1.000000,     //V3
    -1.000000, -1.000000, -1.000000,    //V4

    1.000000, 1.000000, -0.999999,      //V5
    -1.000000, …
Run Code Online (Sandbox Code Playgroud)

opengl sdl depth-buffer depth-testing

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

如何使用深度缓冲区来存储索引

我想以一种稍微不正统的方式使用深度缓冲区,我对所有规范化,缩放以及那里发生的事情感到非常困惑.

我的计划是由AMD的一些人实现空间哈希算法(链接到pdf).

tl; dr-version:通过将3D顶点离散化为(平面2D)深度纹理数组来加速最近邻搜索,将深度设置为VertexID.使用深度纹理的原因是,有一些智能深度测试甚至可以按排序顺序获得结果,但这里不太重要.

我的问题是VertexID显然是一个整数,范围从0顶点的总量ParticleCount,但不能直接使用,因为顶点着色器的输出必须[-1..1)在OpenGL(或[0..1)在DirectX)中规范化.

我的顶点着色器因此做了类似的事情:

float depth = 2.0 * gl_VertexID / ParticleCount - 1.0;
gl_Position = vec4(flatCoords, depth, 1.0);
Run Code Online (Sandbox Code Playgroud)

这有点工作,但实际存储到绑定到当前帧缓冲区的深度纹理的值会让我感到困惑.我没有完全理解浮点深度缓冲区和整数版本之间的区别,如果我甚至无法输出实数整数,并且从深度纹理读取后,[0..1]无论我设置的是什么内部格式,所有内容似乎都被标准化(DepthComponent24,32,32f).

有人可以给我一些建议如何从这些深度纹理中获取VertexIDs吗?

谢谢

opengl shader glsl depth-buffer

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

iOS-Metal:如何清除深度缓冲区?类似于OpenGL中的glClear(GL_DEPTH_BUFFER_BIT)

我需要清除glClear(GL_DEPTH_BUFFER_BIT)在OpenGL中使用的深度缓冲区,在金属中怎么做?我浏览了Apple的文档,没有任何提示。

opengl-es objective-c depth-buffer ios metal

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

OpenGL中的深度偏移

什么是抵消OpenGL深度的最佳方法?我目前每个多边形都有索引顶点属性,我将其传递给OpenGL中的顶点着色器.我的目标是在深度偏移多边形,其中最高指数始终位于较低指数的前方.我目前有这种简单的方法修改gl_Position.z.

gl_Position.z += -index * 0.00001;
Run Code Online (Sandbox Code Playgroud)

opengl glsl depth-buffer

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