我的顶点线是:
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一样.
我在这里遇到了一个非常奇怪的深度测试问题.我在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) 我正在从以下资源中学习如何使用立方体贴图绘制天空盒。
我已经到了他谈到如何优化天空盒渲染的部分。我得到的不是代替先渲染天空盒,而是先width*height计算视口片段,然后才被其他对象覆盖,最好是最后绘制它,并1.0f通过分配gl_Position天空盒的伪造其深度值顶点着色器由于透视划分而gl_Position = pos.xyww实质上使每个gl_FragCoord.z相等1.0f。
现在,我们得到一个天空盒,其中每个片段的最大深度值为,1.0f他将深度函数更改GL_LEQUAL为GL_LESS。
这是我有些困惑的地方。
如果我们最后渲染天空盒并且其深度值等于1.0f为什么我们需要将深度函数更改为GL_LEQUAL?将其设置为还不够,GL_LESS因为如果我们在场景中渲染所有其他对象,则深度值可能会小于,1.0f因此会将其值写入z-buffer小于的值1.0f。现在,如果我们为天空盒设置了depth函数,GL_LESS那么它将仅传递深度值小于实际值的片段,而z-buffer这些片段可能仅传递其他对象未覆盖的片段,那么为什么需要GL_LEQUAL??
我正在编写一个程序在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) 在OpenGL中,深度缓冲值是基于场景的近剪裁平面和远剪裁平面计算的.(参考:从深度缓冲区获取真实的z值)
这在WebGL中如何工作?我的理解是WebGL不知道我的场景远近剪裁平面.近剪裁平面和远剪裁平面用于计算我的投影矩阵,但我从不告诉WebGL它们是明确的,因此它不能使用它们来计算深度缓冲值.
在渲染场景时,WebGL如何在深度缓冲区中设置值?
我正在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.
这听起来像是一个驱动程序错误,或者你有什么建议我可能做错了吗?当这是一个驱动程序错误时,我怎么能实现深度预先通过呢?
如果希望正常渲染,渲染最近的相机对象,则按如下方式设置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 的新手,我很难学习 opengl 中的深度测试。有人可以解释一下什么是吗DEPTH_TEST?我正在阅读我的文献,其中写道:
“它可以隐藏被其他对象覆盖的对象(按深度隐藏)。如果未启用,则先前绘制的对象将被覆盖。”
我根本不明白第一句话。例如,如果我必须在一些文本前面放置一些文本quad,该文本的面积比该文本大,我该怎么做?如果DEPTH_TEST未启用,我会先绘制那个quad,然后是文本,然后文本会在它前面quad..但是何时启DEPTH_TEST用?我不知道其中涵盖了什么,我不知道显示顺序是否重要......这可能只是关于有背面的 3D 物体,并且这些背面可以被覆盖?我应该什么时候使用DEPTH_TEST?
提前致谢!:)