我在这里遇到了一个非常奇怪的深度测试问题.我在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)