我没有RenderState在GraphicsDevice类中看到一个成员,这是禁用深度缓冲区的函数.任何人都知道这个新的4.0 API是如何完成的?
如果我能以某种方式在RenderState某个地方访问一个完整的类,那将是很好的.. GraphicsDevice似乎已经得到了一些,但几乎没有!
有没有办法告诉OpenGL不要将完全透明的片段深度写入深度缓冲区?
可以肯定的是,我想渲染的纹理永远不会是半透明的; 它的alpha值只有1.0或0.0,我使用GL_NEAREST过滤器,所以它永远不会插入到它们之间的任何值.
我认为当一个片段的alpha值为0.0时,OpenGL能够简单地不写入深度缓冲区是合理的(这样我可以按任意顺序渲染具有这种纹理的图元),但是我找不到让OpenGL做到这一点的方法.有谁知道它是否可能,在这种情况下,它是如何完成的?
我正在使用当前上下文的深度缓冲区来影响我正在显示的纹理.纹理是1维的并且是灰度的.从左到右代表从近到远.在一定深度处的像素越多,纹理在该点处越亮,黑色没有像素在该深度处,并且白色是所有像素都在该深度处.
现在我有一个glReadPixels()深度缓冲区的解决方案,在CPU上进行分析,然后将其写回纹理.当然,这是应用程序中的真正瓶颈.
我正在寻找一个全GPU解决方案,在着色器或某些东西中分析深度缓冲区并以这种方式更新纹理.我考虑创建一个片段着色器,它读取深度值并增加到纹理中的相应像素,但这需要片段着色器可以写入其他纹理.我学到的东西是禁忌,特别是如果他们必须写同一个像素.
有没有我缺少的技巧或技术,或者我被迫参与CPU?
我似乎无法在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是否不支持此功能?
谢谢!
在GL维基上,他们建议使用GL_LEQUAL作为深度函数.此外,深度函数默认为GL_LESS.当我使用这些功能中的任何一个时,我得到了奇怪的结果.在这张图片中,红色方块应位于蓝色方块的前面(两个方块的大小相同):

但是,如果我使用glClearDepth(0.0)然后glDepthFunc(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得到正确的结果.
我想要做的是使用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) 我的程序必须显示一个旋转的立方体,用简单的灯光照亮.问题是立方体正在闪烁.当我撤回调用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) 我想以一种稍微不正统的方式使用深度缓冲区,我对所有规范化,缩放以及那里发生的事情感到非常困惑.
我的计划是由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吗?
谢谢
我需要清除glClear(GL_DEPTH_BUFFER_BIT)在OpenGL中使用的深度缓冲区,在金属中怎么做?我浏览了Apple的文档,没有任何提示。
什么是抵消OpenGL深度的最佳方法?我目前每个多边形都有索引顶点属性,我将其传递给OpenGL中的顶点着色器.我的目标是在深度偏移多边形,其中最高指数始终位于较低指数的前方.我目前有这种简单的方法修改gl_Position.z.
gl_Position.z += -index * 0.00001;
Run Code Online (Sandbox Code Playgroud) depth-buffer ×10
opengl ×7
glsl ×3
ios ×2
opengl-es ×2
c# ×1
c++ ×1
cuda ×1
fbo ×1
histogram ×1
metal ×1
objective-c ×1
performance ×1
sdl ×1
shader ×1
transparency ×1
xna ×1
xna-4.0 ×1