You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL中无法显示矩形3D视图的技术求助

3D矩形显示空白问题排查与解决方案

Hey there! Let's dig into why your rectangle isn't showing up in 3D mode—this is a common gotcha with OpenGL uniform setup, so you're not alone.

核心问题:Uniform设置时机错误

你的代码违反了OpenGL的一个关键规则:设置Uniform变量时,必须先激活对应的Shader程序。

看这段main函数代码:

Shader ourShader("vertexshader.vs", "fragmentshader.fs");
initializeVertex();
initializeTexture();
glm::mat4 projection(1);
projection = glm::perspective(glm::radians(45.0f), (float)screenwidth / (float)screenheight, 0.1f, 100.0f);
ourShader.setMat4("projection", projection); // 这里没有激活Shader!

当你调用ourShader.setMat4时,ourShader.use()还没被执行,OpenGL不知道要把这个uniform值传给哪个程序。结果就是projection矩阵在Shader里还是默认的全0矩阵,所有顶点经过变换后都被裁剪到视锥体之外,自然显示空白。

解决方案:调整Uniform设置的位置

你有两种简单的修复方式,核心都是确保设置Uniform前激活Shader:

方案1:在循环外先激活Shader再设置projection

Shader ourShader("vertexshader.vs", "fragmentshader.fs");
initializeVertex();
initializeTexture();
ourShader.use(); // 先激活Shader程序
glm::mat4 projection(1);
projection = glm::perspective(glm::radians(45.0f), (float)screenwidth / (float)screenheight, 0.1f, 100.0f);
ourShader.setMat4("projection", projection);

方案2:把projection设置移到循环内(和model、view矩阵统一)

虽然projection矩阵不会随帧变化,但放在循环里和其他矩阵设置保持一致,代码逻辑更清晰:

while (!glfwWindowShouldClose(window)) {
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    ourShader.use(); // 先激活Shader
    
    // 在这里统一设置所有矩阵
    glm::mat4 projection(1);
    projection = glm::perspective(glm::radians(45.0f), (float)screenwidth / (float)screenheight, 0.1f, 100.0f);
    ourShader.setMat4("projection", projection);
    
    glm::mat4 model(1);
    model = glm::rotate(model, glm::radians(-55.f), glm::vec3(1.0f, 0.0f, 0.0f));
    ourShader.setMat4("model", model);
    
    glm::mat4 view(1);
    view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
    ourShader.setMat4("view", view);
    
    glBindTexture(GL_TEXTURE_2D, texture);
    glBindVertexArray(VAO);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    
    glfwSwapBuffers(window);
    glfwPollEvents();
}

关于单位矩阵时仍显示空白的疑问

当你把三个矩阵都设为单位矩阵却还是看不到矩形,原因和上面完全一致:你设置projection矩阵时没有激活Shader,导致Shader里的projection uniform始终是默认的全0矩阵。

即使你把projection初始化为单位矩阵,只要设置Uniform的时机不对,Shader就不会接收到这个值。全0矩阵乘以任何顶点坐标都会得到零向量,这个点会被OpenGL的裁剪器直接丢弃,所以屏幕还是空白。

额外小提示

  • 可以添加Uniform位置检查,比如用glGetUniformLocation(ourShader.ID, "projection")获取位置,如果返回-1,说明名字拼错或者Shader编译失败。
  • 你可以把view矩阵的z平移改成-5.0f,让相机离矩形更远一点,旋转后的3D效果会更明显。

内容的提问来源于stack exchange,提问作者Deepansh Pandey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:02:27