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

OpenGL双程序Framebuffer渲染在NVIDIA RTX2080上运行异常

问题描述

使用LWJGL和Clojure编写了一套基于Framebuffer的OpenGL渲染测试套件,程序需在帧缓冲中渲染两个四边形。核心代码如下:

(def vertex-passthrough
"#version 410 core
in vec3 point;
void main()
{
  gl_Position = vec4(point, 1);
}")

(def fragment-blue
"#version 410 core
out vec3 fragColor;
void main()
{
  fragColor = vec3(0.0, 0.0, 1.0);
}")

(def fragment-red
"#version 410 core
out vec3 fragColor;
void main()
{
  fragColor = vec3(1.0, 0.0, 0.0);
}")

(fact "Correct switching between two vertex array objects and shader programs"
  (offscreen-render 160 120
    (let [indices   [0 1 3 2]
          vertices1 [-1.0 -1.0 0.1, 0.5 -1.0 0.1, -1.0 0.5 0.1, 0.5 0.5 0.1]
          vertices2 [-0.5 -0.5 0.2, 1.0 -0.5 0.2, -0.5 1.0 0.2, 1.0 1.0 0.2]
          program1  (make-program :sfsim.render/vertex [vertex-passthrough] :sfsim.render/fragment [fragment-red])
          program2  (make-program :sfsim.render/vertex [vertex-passthrough] :sfsim.render/fragment [fragment-blue])
          vao1      (make-vertex-array-object program1 indices vertices1 ["point" 3])
          vao2      (make-vertex-array-object program2 indices vertices2 ["point" 3])]
      (clear (vec3 0.0 0.0 0.0))
      (use-program program1)
      (render-quads vao1)
      (use-program program2)
      (render-quads vao2)
      (destroy-vertex-array-object vao2)
      (destroy-vertex-array-object vao1)
      (destroy-program program2)
      (destroy-program program1))) => (is-image "test/sfsim/fixtures/render/objects.png" 0.0))

离屏渲染通过自定义的offscreen-render逻辑实现。该程序在AMD/ATI显卡上能正常显示红、蓝两个四边形,但在搭载专有驱动的NVIDIA GeForce RTX2080上,第一个红四边形无法显示。

可能的问题原因
  • 深度缓冲未正确清除:代码中clear (vec3 0.0 0.0 0.0)仅清除了颜色缓冲,未清除深度缓冲。NVIDIA驱动对未初始化的深度缓冲初始值处理与AMD不同(例如默认初始为0.0),而红四边形的Z值为0.1,大于初始深度值,导致深度测试失败无法绘制;AMD驱动可能默认将深度缓冲初始为1.0,因此红四边形能通过深度测试。
  • VAO未显式绑定:NVIDIA驱动对VAO的绑定状态检查更严格,若render-quads函数内部未显式绑定传入的VAO,仅依赖创建时的绑定状态,可能导致渲染第一个四边形时无有效VAO绑定;AMD驱动可能允许隐式使用最近创建的VAO,因此能正常渲染。
  • 着色器程序与VAO的绑定兼容性问题:创建VAO时绑定了对应程序,但切换程序后渲染时,NVIDIA驱动可能要求重新确认VAO与当前程序的属性兼容性。若make-vertex-array-object未正确记录属性布局与程序的关联,可能导致第一个四边形的顶点属性无法被正确读取。
  • 帧缓冲格式匹配问题:NVIDIA驱动对帧缓冲颜色附件格式与片段着色器输出格式的匹配要求更严格。若帧缓冲使用RGBA格式,但片段着色器输出vec3(RGB),可能导致颜色写入异常,而AMD驱动对此兼容性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:35:38