标签: depth-testing

glDepthRange如何工作?

我的顶点线是:

GLfloat vertices[]=
    {
        0.5f,0.5f,0.5f,                                   
        -0.5f,0.5f,0.5f,
        -0.5f,-0.5f,0.5f,
        0.5f,-0.5f,0.5f,//face 1

        0.5f,-0.5f,-0.5f,
        -0.5f,-0.5f,-0.5f,
        -0.5f,0.5f,-0.5f,
        0.5f,0.5f,-0.5f,//face 2

        0.5f,0.5f,0.5f,
        0.5f,-0.5f,0.5f,
        0.5f,-0.5f,-0.5f,
        0.5f,0.5f,-0.5f,//face 3                

        -0.5f,0.5f,0.5f,
        -0.5f,0.5f,-0.5f,
        -0.5f,-0.5f,-0.5f,
        -0.5f,-0.5f,0.5f,//face 4

        0.5f,0.5f,0.5f,
        0.5f,0.5f,-0.5f,
        -0.5f,0.5f,-0.5f,
        -0.5f,0.5f,0.5f,//face 5

        -0.5f,-0.5f,0.5f,
        -0.5f,-0.5f,-0.5f,
        0.5f,-0.5f,-0.5f,
        0.5f,-0.5f,0.5f//face 6     

    };
Run Code Online (Sandbox Code Playgroud)

现在,我正在改变z绳索:

for(int i=0;i<24;i++)
    vertices[i*3+2]*=10
glDepthRange(0,10.0);
Run Code Online (Sandbox Code Playgroud)

现在,我期待由于glDepthRange调用,z线将被映射到-0.5到0.5范围,并且我可以看到一个合适的立方体,但是它给出o/p,就像我在上面用变形几何注释glDepthRange一样.

opengl depth-buffer depth depth-testing

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

OpenGL:Radeon驱动程序似乎搞乱了深度测试

我在这里遇到了一个非常奇怪的深度测试问题.我在Windows上的OpenGL 3.3核心配置文件上下文中渲染一个简单的网格,启用深度测试并将glDepthFunc设置为GL_LESS.在我的机器上(配备nVidia Geforce GTX 660M的笔记本电脑),一切都按预期工作,深度测试正在运行,这就是它的样子:

在此输入图像描述

现在,如果我在不同的PC上运行程序,一个带有Radeon R9 280的塔,它看起来更像是这样的:

在此输入图像描述

奇怪的是,真正奇怪的是,当我在绘制之前每帧调用glEnable(GL_DEPTH_TEST)时,结果在两台机器上都是正确的.当我这样做时,我认为在两台机器上都正确创建了深度缓冲区,看起来深度测试在渲染之前以某种方式被禁用,当我在初始化时只启用它一次.以下是可能以某种方式成为问题一部分的最小代码:

在创建上下文并使其成为当前之后,在初始化时调用代码:

glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
Run Code Online (Sandbox Code Playgroud)

代码在缓冲区交换之前调用每个帧:

glClearColor(0.4f, 0.6f, 0.8f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// mShaderProgram->getID() simply returns the handle of a simple shader program
glUseProgram(mShaderProgram->getID());  

glm::vec3 myColor = glm::vec3(0.7f, 0.5f, 0.4f);
GLuint colorLocation = glGetUniformLocation(mShaderProgram->getID(), "uColor");
glUniform3fv(colorLocation, 1, glm::value_ptr(myColor));

glm::mat4 modelMatrix = glm::mat4(1.0f);
glm::mat4 viewMatrix = glm::lookAt(glm::vec3(0.0f, 3.0f, 5.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 projectionMatrix = glm::perspectiveFov(60.0f, (float)mWindow->getProperties().width, (float)mWindow->getProperties().height, 1.0f, 100.0f);
glm::mat4 inverseTransposeMVMatrix = glm::inverseTranspose(viewMatrix*modelMatrix);

GLuint mMatrixLocation = glGetUniformLocation(mShaderProgram->getID(), "uModelMatrix"); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl nvidia opengl-3 depth-testing

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

OpenGL优化Skybox渲染

我正在从以下资源中学习如何使用立方体贴图绘制天空盒。

我已经到了他谈到如何优化天空盒渲染的部分。我得到的不是代替先渲染天空盒,而是先width*height计算视口片段,然后才被其他对象覆盖,最好是最后绘制它,并1.0f通过分配gl_Position天空盒的伪造其深度值顶点着色器由于透视划分而gl_Position = pos.xyww实质上使每个gl_FragCoord.z相等1.0f

现在,我们得到一个天空盒,其中每个片段的最大深度值为,1.0f他将深度函数更改GL_LEQUALGL_LESS

这是我有些困惑的地方。
如果我们最后渲染天空盒并且其深度值等于1.0f为什么我们需要将深度函数更改为GL_LEQUAL?将其设置为还不够,GL_LESS因为如果我们在场景中渲染所有其他对象,则深度值可能会小于,1.0f因此会将其值写入z-buffer小于的值1.0f。现在,如果我们为天空盒设置了depth函数,GL_LESS那么它将仅传递深度值小于实际值的片段,而z-buffer这些片段可能仅传递其他对象未覆盖的片段,那么为什么需要GL_LEQUAL??

opengl zbuffer depth-testing skybox

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

如何在OpenGL上使立方体面不透明?

我正在编写一个程序在OpenGL上绘制一个立方体,并在单击鼠标时不断旋转它。在特定角度下,我可以透视立方体(透明)。我启用了深度测试,所以我不知道为什么会这样。我不确定是否已正确启用它。

在此图像中,隐藏的面孔仍然可见

#include <math.h>
#include <vector>
#include <Windows.h>
#include <gl\glut.h>

using namespace std;


void myInit() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0, 0, 0, 1);
    glOrtho(-2, 2, -2, 2, 2, -2);
    glMatrixMode(GL_MODELVIEW);
}

float Cube[][3] = { {-1, -1, -1}, {1, -1, -1}, {1, 1, -1}, {-1, 1, -1}, {-1, -1, 1}, {1, -1, 1}, {1, 1, 1}, {-1, 1, 1} };
float Colors[][3] = { {0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {1, 1, 0}, {0, 1, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glut depth-testing

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

WebGL如何在深度缓冲区中设置值?

在OpenGL中,深度缓冲值是基于场景的近剪裁平面和远剪裁平面计算的.(参考:从深度缓冲区获取真实的z值)

这在WebGL中如何工作?我的理解是WebGL不知道我的场景远近剪裁平面.近剪裁平面和远剪裁平面用于计算我的投影矩阵,但我从不告诉WebGL它们是明确的,因此它不能使用它们来计算深度缓冲值.

在渲染场景时,WebGL如何在深度缓冲区中设置值?

depth-buffer webgl depth-testing

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

在GTX 980上进行深度预先通过后Z战斗

我正在OpenGL中实现深度预处理.在Intel HD Graphics 5500上,此代码工作正常,但在Nvidia GeForce GTX 980上却没有(下图显示了由此产生的z-fighting).我正在使用以下代码生成图像.(省略了与问题无关的所有内容.)

// ----------------------------------------------------------------------------
// Depth Prepass
// ----------------------------------------------------------------------------

glEnable(GL_DEPTH_TEST);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthFunc(GL_LESS);
glDepthMask(GL_TRUE);

glUseProgam(program1); // The problem turned out to be here!

renderModel(...);

// ----------------------------------------------------------------------------
// Scene Rendering
// ----------------------------------------------------------------------------

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glDepthMask(GL_FALSE);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

glUseProgam(program2); // The problem turned out to be here!

renderModel(...);
Run Code Online (Sandbox Code Playgroud)

似乎glDepthFunc没有更改为GL_LEQUAL.但是,当我逐步完成RenderDoc中的GL调用时,glDepthFunc会设置为correnctly.

这听起来像是一个驱动程序错误,或者你有什么建议我可能做错了吗?当这是一个驱动程序错误时,我怎么能实现深度预先通过呢?

在Nvidia GeForce GTX 980上进行战斗

opengl rendering depth-testing

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

在OpenGL中反转深度测试?

如果希望正常渲染,渲染最近的相机对象,则按如下方式设置OpenGL标志:

glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)

所以我认为这样做:

glDepthFunc(GL_GREATER);
glEnable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)

也可以让我渲染距离相机最远的碎片.但是在设置这样的标志时我看不到输出.(我的申请没有进行任何其他修改)

如何渲染最远离相机的碎片?

opengl fragment-shader depth-testing

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

了解Depth_Test opengl

我是 opengl 的新手,我很难学习 opengl 中的深度测试。有人可以解释一下什么是吗DEPTH_TEST?我正在阅读我的文献,其中写道:

“它可以隐藏被其他对象覆盖的对象(按深度隐藏)。如果未启用,则先前绘制的对象将被覆盖。”

我根本不明白第一句话。例如,如果我必须在一些文本前面放置一些文本quad,该文本的面积比该文本大,我该怎么做?如果DEPTH_TEST未启用,我会先绘制那个quad,然后是文本,然后文本会在它前面quad..但是何时启DEPTH_TEST用?我不知道其中涵盖了什么,我不知道显示顺序是否重要......这可能只是关于有背面的 3D 物体,并且这些背面可以被覆盖?我应该什么时候使用DEPTH_TEST
提前致谢!:)

c# opengl depth-testing

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